diff --git a/docs/API.md b/docs/API.md index 4abcc55d4..45da18900 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1329,6 +1329,61 @@ updates node configuration and reloads it gracefully (admin only) --- +## Get Escrow Events + +### `HTTP` GET /api/services/escrow/events? + +### `HTTP` POST /directCommand + +### `P2P` command: getEscrowEvents + +#### Description + +Returns indexed Escrow contract events. The indexer matches Escrow logs by topic hash, verifies they came from the chain's `Escrow` contract (`Deposit`/`Withdraw`/`Lock` are generic signatures), and stores one row per event in the append-only `escrow` collection keyed by `${txHash}-${logIndex}`. All filters are optional. + +#### Parameters + +| name | type | required | description | +| --------- | ------ | --------- | --------------------------------------------------------- | +| command | string | POST only | command name (`getEscrowEvents`) | +| chainId | number | | chain id | +| eventType | string | | one of `Auth, Lock, Claimed, Canceled, Deposit, Withdraw` | +| payer | string | | payer address (case-insensitive) | +| payee | string | | payee address (case-insensitive) | +| token | string | | token address (case-insensitive) | +| jobId | string | | compute job id | +| txId | string | | transaction hash | +| offset | number | | rows to skip (default 0) | +| size | number | | page size (default 100, max 250) | + +#### Request (POST /directCommand) + +```json +{ "command": "getEscrowEvents", "chainId": 8996, "eventType": "Deposit", "offset": 0, "size": 50 } +``` + +#### Response + +Every row has `id, eventType, chainId, contract, block, txHash` plus event-specific fields (`payer, payee, token, jobId, amount, expiry, proof, maxLockedAmount, maxLockSeconds, maxLockCounts`). + +```json +[ + { + "id": "0x39f3...6575-3", + "eventType": "Deposit", + "chainId": 8996, + "contract": "0x282d...a1a1", + "block": 55, + "txHash": "0x39f3...6575", + "payer": "0xbe54...ab5e", + "token": "0x282d...a1a1", + "amount": "100000000000000000000" + } +] +``` + +--- + # Compute For starters, you can find a list of algorithms in the [Ocean Algorithms repository](https://github.com/oceanprotocol/algo_dockers) and the docker images in the [Algo Dockerhub](https://hub.docker.com/r/oceanprotocol/algo_dockers/tags). @@ -1464,7 +1519,7 @@ starts a free compute job and returns jobId if succesfull | queueMaxWaitTime | number | | optional max time in seconds a job can wait in the queue before being started | | encryptedDockerRegistryAuth | string | | Ecies encrypted docker auth schema for image (see [Private Docker Registries with Per-Job Authentication](../env.md#private-docker-registries-with-per-job-authentication)) | | output | string | | Ecies encrypted with instructions for uploading compute results (see [C2D result upload to remote storage](../Storage.md#c2d-result-upload-to-remote-storage)) | - +| outputBucketId | string | | persistent-storage bucket id; the bucket is mounted at /data/outputs and results are stored there as individual files. Mutually exclusive with `output` (see [persistent storage](../persistentStorage.md#using-a-bucket-for-compute-job-outputs)) | #### Request ```json diff --git a/docs/Arhitecture.md b/docs/Arhitecture.md index 8b4e47c55..80a9e9f3b 100644 --- a/docs/Arhitecture.md +++ b/docs/Arhitecture.md @@ -80,6 +80,7 @@ An off-chain, multi-chain metadata & chain events cache. It continually monitors - validates DDO, according to multiple SHACL schemas - provides proof for valid DDOs - monitors datatokens contracts & stores orders + - monitors the Escrow contract events (Auth, Lock, Claimed, Canceled, Deposit, Withdraw) and stores them for querying - allows querys for all the above - supports graceful shutdown and chain-specific reindexing diff --git a/docs/Storage.md b/docs/Storage.md index 24c7ba7bf..c6fb02865 100644 --- a/docs/Storage.md +++ b/docs/Storage.md @@ -211,6 +211,8 @@ FTPStorage supports `upload(filename, stream)`. If the file object’s `url` end Compute-to-Data jobs can upload their output archive to a remote backend instead of keeping it only on local node disk. +Alternatively, results can be stored as individual files in a node persistent-storage bucket via the `outputBucketId` start parameter — see [persistent storage](./persistentStorage.md#using-a-bucket-for-compute-job-outputs). The two options are mutually exclusive. + ### How it works 1. You build a `ComputeOutput` JSON object with: diff --git a/docs/persistentStorage.md b/docs/persistentStorage.md index 0b78c0f63..06404e246 100644 --- a/docs/persistentStorage.md +++ b/docs/persistentStorage.md @@ -186,6 +186,49 @@ Upload uses the raw request body as bytes and forwards it to the handler as a st --- +## Using a bucket for compute job outputs + +Compute jobs (free and paid) can store their results directly in a persistent storage bucket instead of the default `outputs.tar` archive. Pass the bucket id as `outputBucketId` in the start compute command: + +```json +{ + "command": "freeStartCompute", + "...": "...", + "outputBucketId": "a4ad237d-dfd8-404c-a5d6-b8fc3a1f66d3" +} +``` + +How it works: + +- The bucket directory is bind-mounted **read-write** at `/data/outputs` inside the job container, so everything the algorithm writes there lands directly in the bucket as **individual files** (no archive, no copy step). Files appear in the bucket as the job writes them. +- No local `outputs.tar` is produced and the job's results index contains no `output` entry; logs (`imageLog`, `configurationLog`, `algorithmLog`) behave as usual. Results are retrieved via the persistent storage list/get APIs. +- The consumer starting the job must be the bucket owner or on the bucket access list, otherwise the start request is rejected with `403`. +- `outputBucketId` is **mutually exclusive** with the `output` (remote storage upload) parameter — sending both returns `400`. +- Files keep the names the algorithm gives them; writing an existing name **overwrites** it, so pipelines can re-run jobs with stable filenames. +- Nested directories created by the algorithm under `/data/outputs` are not visible through the bucket API (bucket filenames are flat); algorithms should write top-level files. + +### Chaining jobs + +Because results are regular bucket files, they can feed the next compute job without any intermediate download — use the standard `nodePersistentStorage` file object as a dataset: + +```json +{ + "command": "freeStartCompute", + "...": "...", + "datasets": [ + { + "fileObject": { + "type": "nodePersistentStorage", + "bucketId": "a4ad237d-dfd8-404c-a5d6-b8fc3a1f66d3", + "fileName": "result-from-previous-job.csv" + } + } + ], + "outputBucketId": "a4ad237d-dfd8-404c-a5d6-b8fc3a1f66d3" +} +``` + +--- ## Limitations and notes - The bucket registry is local to the node (SQLite file). If you run multiple nodes, each node’s registry is independent unless you externalize/replicate it. diff --git a/package-lock.json b/package-lock.json index 578e1e0fa..ac8b1e806 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ocean-node", - "version": "3.2.1", + "version": "3.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ocean-node", - "version": "3.2.1", + "version": "3.2.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -22,7 +22,7 @@ "@libp2p/crypto": "^5.1.13", "@libp2p/dcutr": "^3.0.9", "@libp2p/identify": "^4.0.9", - "@libp2p/kad-dht": "^16.1.2", + "@libp2p/kad-dht": "16.3.4", "@libp2p/keychain": "^6.0.9", "@libp2p/mdns": "^12.0.10", "@libp2p/peer-id": "^6.0.4", @@ -34,21 +34,21 @@ "@libp2p/tls": "^3.0.10", "@libp2p/upnp-nat": "^4.0.9", "@libp2p/websockets": "^10.1.2", - "@multiformats/multiaddr": "^12.2.3", - "@oceanprotocol/contracts": "^2.7.0", + "@multiformats/multiaddr": "^13.0.3", + "@oceanprotocol/contracts": "^2.9.0", "@oceanprotocol/ddo-js": "^0.4.0", "axios": "^1.15.0", "base58-js": "^2.0.0", "basic-ftp": "^5.3.1", "cors": "^2.8.5", - "datastore-level": "^12.0.2", + "datastore-level": "^13.0.1", "delay": "^5.0.0", "dockerode": "^4.0.5", "dotenv": "^16.3.1", "eciesjs": "^0.4.5", "eth-crypto": "^2.6.0", "ethers": "^6.16.0", - "express": "^4.21.1", + "express": "^4.22.2", "humanhash": "^1.0.4", "hyperdiff": "^2.0.16", "ipaddr.js": "^2.3.0", @@ -60,8 +60,9 @@ "node-cron": "^3.0.3", "sqlite3": "^6.0.1", "stream-concat": "^1.0.0", - "tar": "^7.5.11", + "tar": "^7.5.16", "uint8arrays": "^4.0.6", + "unique-names-generator": "^4.7.1", "url-join": "^5.0.0", "winston": "^3.11.0", "winston-daily-rotate-file": "^4.7.1", @@ -96,7 +97,7 @@ "prettier": "^3.7.4", "release-it": "^20.0.0", "sinon": "^19.0.2", - "tsx": "^4.19.3", + "tsx": "^4.22.4", "typescript": "^5.9.3" } }, @@ -109,10 +110,16 @@ "uint8arrays": "^5.1.0" } }, + "node_modules/@achingbrain/http-parser-js/node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/@achingbrain/http-parser-js/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.1.tgz", + "integrity": "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "multiformats": "^13.0.0" @@ -148,273 +155,43 @@ } }, "node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", "license": "MIT" }, - "node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "node_modules/@aws-sdk/checksums": { + "version": "3.1000.16", + "resolved": "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1000.16.tgz", + "integrity": "sha512-EKnvkXSmz3IpA99tCNuI+dLFXyZyClSm8zns9sB/elvkU+MTuomAs6toJMPMBf98/fICG/urXDkzGz0/c3yyAQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.1009.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1009.0.tgz", - "integrity": "sha512-luy8CxallkoiGWTqU86ca/BbvkWJjs0oala7uIIRN1JtQxMb5i4Yl/PBZVcQFhbK9kQi0PK0GfD8gIpLkI91fw==", + "version": "3.1084.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1084.0.tgz", + "integrity": "sha512-W8KZlbU3vL4N0rZnXqryH5Ft3fkBnGypaorZmFxBoZRMGkwtvRBGiSnNXu1/1a/j/qZNwwt6LLNBWQQysB/pRg==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/credential-provider-node": "^3.972.21", - "@aws-sdk/middleware-bucket-endpoint": "^3.972.8", - "@aws-sdk/middleware-expect-continue": "^3.972.8", - "@aws-sdk/middleware-flexible-checksums": "^3.973.6", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-location-constraint": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.8", - "@aws-sdk/middleware-sdk-s3": "^3.972.20", - "@aws-sdk/middleware-ssec": "^3.972.8", - "@aws-sdk/middleware-user-agent": "^3.972.21", - "@aws-sdk/region-config-resolver": "^3.972.8", - "@aws-sdk/signature-v4-multi-region": "^3.996.8", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@aws-sdk/util-user-agent-browser": "^3.972.8", - "@aws-sdk/util-user-agent-node": "^3.973.7", - "@smithy/config-resolver": "^4.4.11", - "@smithy/core": "^3.23.11", - "@smithy/eventstream-serde-browser": "^4.2.12", - "@smithy/eventstream-serde-config-resolver": "^4.3.12", - "@smithy/eventstream-serde-node": "^4.2.12", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/hash-blob-browser": "^4.2.13", - "@smithy/hash-node": "^4.2.12", - "@smithy/hash-stream-node": "^4.2.12", - "@smithy/invalid-dependency": "^4.2.12", - "@smithy/md5-js": "^4.2.12", - "@smithy/middleware-content-length": "^4.2.12", - "@smithy/middleware-endpoint": "^4.4.25", - "@smithy/middleware-retry": "^4.4.42", - "@smithy/middleware-serde": "^4.2.14", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.4.16", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.41", - "@smithy/util-defaults-mode-node": "^4.2.44", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", - "@smithy/util-waiter": "^4.2.13", + "@aws-sdk/checksums": "^3.1000.16", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/credential-provider-node": "^3.972.66", + "@aws-sdk/middleware-sdk-s3": "^3.972.62", + "@aws-sdk/signature-v4-multi-region": "^3.996.39", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/fetch-http-handler": "^5.6.4", + "@smithy/node-http-handler": "^4.9.4", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -422,36 +199,18 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.20.tgz", - "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/xml-builder": "^3.972.11", - "@smithy/core": "^3.23.11", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/crc64-nvme": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.5.tgz", - "integrity": "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==", + "version": "3.975.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.975.1.tgz", + "integrity": "sha512-8qh/6EYb7hl/ZwVfQufhbMEZs1gQIc7GbdrIf4eprQJ7cv042+74nE6l3YDfyWNzb9iPXb8fRyYSHkNIk5eE6Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.974.0", + "@aws-sdk/xml-builder": "^3.972.34", + "@aws/lambda-invoke-store": "^0.3.0", + "@smithy/core": "^3.29.2", + "@smithy/signature-v4": "^5.6.3", + "@smithy/types": "^4.16.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { @@ -459,15 +218,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.18.tgz", - "integrity": "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==", + "version": "3.972.57", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.57.tgz", + "integrity": "sha512-1RfJaF7SW1TOnvNGU7kaYjwUf5H3sfm+synGH1bHhRlqcnxCt3szebH3dmKEyY4tuGcbQ6ffzUT89cRitBV8OQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -475,20 +234,17 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.20.tgz", - "integrity": "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==", + "version": "3.972.59", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.59.tgz", + "integrity": "sha512-sRCkpTiFnCdQvuaRVjQ6SVoHu6i7RUpurVo1c4F81HWhPvUJ7Wdp5MNtSdX1O29CNXc8em3O5m52hCjVtAD9SA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.4.16", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-stream": "^4.5.19", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/fetch-http-handler": "^5.6.4", + "@smithy/node-http-handler": "^4.9.4", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -496,24 +252,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.20.tgz", - "integrity": "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==", + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.1.tgz", + "integrity": "sha512-6d8H6ZAh3ZPKZ6fe1nG2OWeZEZPtt9ravoD1dezPdPtsSkJRoxGAnFSHwKT3E/Te6fHE30zRzjV6TD12rvF6yQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/credential-provider-env": "^3.972.18", - "@aws-sdk/credential-provider-http": "^3.972.20", - "@aws-sdk/credential-provider-login": "^3.972.20", - "@aws-sdk/credential-provider-process": "^3.972.18", - "@aws-sdk/credential-provider-sso": "^3.972.20", - "@aws-sdk/credential-provider-web-identity": "^3.972.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/types": "^3.973.6", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/credential-provider-env": "^3.972.57", + "@aws-sdk/credential-provider-http": "^3.972.59", + "@aws-sdk/credential-provider-login": "^3.972.63", + "@aws-sdk/credential-provider-process": "^3.972.57", + "@aws-sdk/credential-provider-sso": "^3.973.1", + "@aws-sdk/credential-provider-web-identity": "^3.972.63", + "@aws-sdk/nested-clients": "^3.997.31", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/credential-provider-imds": "^4.4.7", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -521,18 +276,16 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz", - "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==", + "version": "3.972.63", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.63.tgz", + "integrity": "sha512-GREWRrMj0XnNKMaVa/Mauoaui26qBEHu71WWqXbwZOu/jFQOnPZjTf7u0KtGKC8VGa6VUs9kDWGgocrKNLS9vw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/nested-clients": "^3.997.31", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -540,22 +293,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.21", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.21.tgz", - "integrity": "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==", + "version": "3.972.66", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.66.tgz", + "integrity": "sha512-f+qjRXZpz7sgzbc4QB+6nLKfyKFgRRXzWdXbsKPv/VhVRyHsDyq4yBWC/B75BAJpFIcUeI2XR/3gdWJ677zB4A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.18", - "@aws-sdk/credential-provider-http": "^3.972.20", - "@aws-sdk/credential-provider-ini": "^3.972.20", - "@aws-sdk/credential-provider-process": "^3.972.18", - "@aws-sdk/credential-provider-sso": "^3.972.20", - "@aws-sdk/credential-provider-web-identity": "^3.972.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/credential-provider-env": "^3.972.57", + "@aws-sdk/credential-provider-http": "^3.972.59", + "@aws-sdk/credential-provider-ini": "^3.973.1", + "@aws-sdk/credential-provider-process": "^3.972.57", + "@aws-sdk/credential-provider-sso": "^3.973.1", + "@aws-sdk/credential-provider-web-identity": "^3.972.63", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/credential-provider-imds": "^4.4.7", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -563,16 +315,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.18.tgz", - "integrity": "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==", + "version": "3.972.57", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.57.tgz", + "integrity": "sha512-TiVQhuU0pbhIZAUZacbPHMyzrIdiH+lnx+PMY/Pu/b93dJrq3wdZwzUJ0TPpvNxaqbHsxJvQZW3/h/beLiKq7Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -580,18 +331,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.20.tgz", - "integrity": "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==", + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.1.tgz", + "integrity": "sha512-3foTZUJ4821Ij60X7K3NJroygiZLnbBmarN+T//O2cjkISan90zElN3NBmgSlDrTQ7Gs6z/yO8V7h60QNcDZHQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/token-providers": "3.1009.0", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/nested-clients": "^3.997.31", + "@aws-sdk/token-providers": "3.1083.0", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -599,17 +349,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.20.tgz", - "integrity": "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==", + "version": "3.972.63", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.63.tgz", + "integrity": "sha512-8qZLFhM69eKcS37m459ctPR05Qimycm/74OPVioe6wNZabMT54GYhwBju0+J656RkMasNSawWQu+c8CmBe3TUQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/nested-clients": "^3.997.31", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { @@ -617,14 +366,13 @@ } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.1009.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.1009.0.tgz", - "integrity": "sha512-gHQh1sNeTuxZxPSMSQWOq/Xli8I5499uWyRKMakMSv8N7IYfoyDdyT52Ul6697qcqVaoPHixmYTllfEWMo1AKg==", + "version": "3.1084.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.1084.0.tgz", + "integrity": "sha512-17tuO6+VyzQpBzAXKu1TisfZw7hdgiHN/sAOuvhL2jFWD9LD3fP0c7HozN9MUfrAwGJp7FAdepKuBUmxwBi3QA==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.12", - "@smithy/middleware-endpoint": "^4.4.25", - "@smithy/smithy-client": "^4.12.5", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -634,545 +382,260 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.1009.0" + "@aws-sdk/client-s3": "^3.1084.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz", - "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.62", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.62.tgz", + "integrity": "sha512-k8JJwYXVYlOOjWnPZDThQS1xDFJgi5Dokt73qFlDtrZAbdcint5aIdjB9XgJAAQVP5OoqcefQmh1FYXiPpvsvw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/signature-v4-multi-region": "^3.996.39", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz", - "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", + "node_modules/@aws-sdk/nested-clients": { + "version": "3.997.31", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.31.tgz", + "integrity": "sha512-BDHTpwcsZHEBNEJzOg/B1BkFYJxAXY50dau/NyVWs3d51F0WgIUGSWZot/Os+N3KpDhXeaXnz37mWffAvduREw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/signature-v4-multi-region": "^3.996.39", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/fetch-http-handler": "^5.6.4", + "@smithy/node-http-handler": "^4.9.4", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.973.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.6.tgz", - "integrity": "sha512-0nYEgkJH7Yt9k+nZJyllTghnkKaz17TWFcr5Mi0XMVMzYlF4ytDZADQpF2/iJo36cKL5AYSzRsvlykE4M/ErTA==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.39.tgz", + "integrity": "sha512-8+srXqYIF8KYMLC4FxMLEM5Ek7kUNibJu1R4m8/fUhhNYIZZz26oGtKkCr8I/HiG2fFQxBvaGgQZT4/mqRCSnA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/crc64-nvme": "^3.972.5", - "@aws-sdk/types": "^3.973.6", - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", + "@aws-sdk/types": "^3.974.0", + "@smithy/signature-v4": "^5.6.3", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", - "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", + "node_modules/@aws-sdk/token-providers": { + "version": "3.1083.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1083.0.tgz", + "integrity": "sha512-s0woKnxuHrExLc5L2ArIH5BMkbonHPtt+5hSBM8oknp9M6QTuUmmAmJ2E0EdzCGONrO+8+ADPqvv6UX0nNcc7A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.975.1", + "@aws-sdk/nested-clients": "^3.997.31", + "@aws-sdk/types": "^3.974.0", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz", - "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", + "node_modules/@aws-sdk/types": { + "version": "3.974.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.0.tgz", + "integrity": "sha512-QIBrw90CDm4O0UaIIzkU6DrFdeJzEb2Va5EPEVpyldj6sHJxB6cshhStJuhZxk3wR3PmjJlYsjPmY1kNb+KGBg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", - "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.34", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.34.tgz", + "integrity": "sha512-wHhWL1y7sN3enBA8POrPpQM5jCcmu2ozyhbRei4c8OjVcEaEs6yLucLa/pla457ggS/ysuy7bosagz3HaJkZXA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", - "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", + "node_modules/@aws/lambda-invoke-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.3.0.tgz", + "integrity": "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==", "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, "engines": { - "node": ">=20.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.20.tgz", - "integrity": "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==", - "license": "Apache-2.0", + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.11", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz", - "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.21", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz", - "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==", - "license": "Apache-2.0", + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@smithy/core": "^3.23.11", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-retry": "^4.2.12", - "tslib": "^2.6.2" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.996.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz", - "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==", - "license": "Apache-2.0", + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.8", - "@aws-sdk/middleware-user-agent": "^3.972.21", - "@aws-sdk/region-config-resolver": "^3.972.8", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@aws-sdk/util-user-agent-browser": "^3.972.8", - "@aws-sdk/util-user-agent-node": "^3.973.7", - "@smithy/config-resolver": "^4.4.11", - "@smithy/core": "^3.23.11", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/hash-node": "^4.2.12", - "@smithy/invalid-dependency": "^4.2.12", - "@smithy/middleware-content-length": "^4.2.12", - "@smithy/middleware-endpoint": "^4.4.25", - "@smithy/middleware-retry": "^4.4.42", - "@smithy/middleware-serde": "^4.2.14", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.4.16", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.41", - "@smithy/util-defaults-mode-node": "^4.2.44", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.12", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", - "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", - "license": "Apache-2.0", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/config-resolver": "^4.4.11", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.8.tgz", - "integrity": "sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg==", - "license": "Apache-2.0", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" + "yallist": "^3.0.2" } }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.1009.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1009.0.tgz", - "integrity": "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/types": { - "version": "3.973.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", - "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", - "license": "Apache-2.0", + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", - "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-endpoints": "^3.3.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.965.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", - "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", - "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz", - "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.21", - "@aws-sdk/types": "^3.973.6", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.11", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz", - "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "fast-xml-parser": "5.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws/lambda-invoke-store": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", - "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/generator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", - "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1182,9 +645,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -1192,9 +655,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -1202,9 +665,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -1212,27 +675,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1242,9 +705,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, "license": "MIT", "engines": { @@ -1252,33 +715,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -1286,14 +749,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1312,9 +775,9 @@ "license": "Apache-2.0" }, "node_modules/@chainsafe/as-sha256": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-1.2.0.tgz", - "integrity": "sha512-H2BNHQ5C3RS+H0ZvOdovK6GjFAyq5T6LClad8ivwj9Oaiy28uvdsGVS7gNJKuZmg0FGHAI+n7F0Qju6U0QkKDA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-1.2.4.tgz", + "integrity": "sha512-3GXDysZOKD6cTYbm48lEdXdUbS7cafjXQZfgHOspTByhoGR/JM3KBXyF3vE6bf63ImjNPyoEZwnQcpYPQ6k3bQ==", "license": "Apache-2.0" }, "node_modules/@chainsafe/is-ip": { @@ -1344,10 +807,16 @@ "wherearewe": "^2.0.1" } }, + "node_modules/@chainsafe/libp2p-noise/node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/@chainsafe/libp2p-noise/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.1.tgz", + "integrity": "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "multiformats": "^13.0.0" @@ -1434,9 +903,9 @@ } }, "node_modules/@elastic/elasticsearch": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.19.1.tgz", - "integrity": "sha512-+1j9NnQVOX+lbWB8LhCM7IkUmjU05Y4+BmSLfusq0msCsQb1Va+OUKFCoOXjCJqQrcgdRdQCjYYyolQ/npQALQ==", + "version": "8.19.2", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.19.2.tgz", + "integrity": "sha512-LMJCju/+AZkDlJArd/MYABWTDrHi4U7j3qGTKi1hYC7+67SaiYmYFItiueACQVrj2j3ECPMcguZ+7WrZeB+Z5g==", "license": "Apache-2.0", "dependencies": { "@elastic/transport": "^8.9.6", @@ -1444,13 +913,13 @@ "tslib": "^2.4.0" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/@elastic/transport": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.10.1.tgz", - "integrity": "sha512-xo2lPBAJEt81fQRAKa9T/gUq1SPGBHpSnVUXhoSpL996fPZRAfQwFA4BZtEUQL1p8Dezodd3ZN8Wwno+mYyKuw==", + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.10.2.tgz", + "integrity": "sha512-hjkrWvmVpCQiy2Km7LpVUmky8MbinNc2DzbpBaXSjgQYIXRK9LJ5BOfqldSBjp9E+U1I539LYAaSxxikQdXLLQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "1.x", @@ -1467,9 +936,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -1484,9 +953,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -1501,9 +970,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -1518,9 +987,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -1535,9 +1004,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -1552,9 +1021,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -1569,9 +1038,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -1586,9 +1055,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -1603,9 +1072,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -1620,9 +1089,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -1637,9 +1106,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -1654,9 +1123,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -1671,9 +1140,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -1688,9 +1157,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -1705,9 +1174,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -1722,9 +1191,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -1739,9 +1208,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -1756,9 +1225,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -1773,9 +1242,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -1790,9 +1259,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -1807,9 +1276,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -1824,9 +1293,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -1841,9 +1310,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -1858,9 +1327,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -1875,9 +1344,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -1892,9 +1361,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -1962,9 +1431,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -1973,9 +1442,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -2174,9 +1643,9 @@ } }, "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", "license": "MIT" }, "node_modules/@ethersproject/bytes": { @@ -2578,9 +2047,9 @@ } }, "node_modules/@ethersproject/signing-key/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", "license": "MIT" }, "node_modules/@ethersproject/solidity": { @@ -2764,20 +2233,10 @@ "node": ">=14" } }, - "node_modules/@gar/promise-retry": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", - "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==", - "license": "MIT", - "optional": true, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@grpc/grpc-js": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", - "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", + "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.8.0", @@ -2788,14 +2247,14 @@ } }, "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.5.3", + "protobufjs": "^7.5.5", "yargs": "^17.7.2" }, "bin": { @@ -2840,9 +2299,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -2851,9 +2310,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -2886,29 +2345,29 @@ "license": "BSD-3-Clause" }, "node_modules/@inquirer/ansi": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.5.tgz", - "integrity": "sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, "node_modules/@inquirer/checkbox": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.1.4.tgz", - "integrity": "sha512-w6KF8ZYRvqHhROkOTHXYC3qIV/KYEu5o12oLqQySvch61vrYtRxNSHTONSdJqWiFJPlCUQAHT5OgOIyuTr+MHQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz", + "integrity": "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.9", - "@inquirer/figures": "^2.0.5", - "@inquirer/type": "^4.0.5" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -2920,17 +2379,17 @@ } }, "node_modules/@inquirer/confirm": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.12.tgz", - "integrity": "sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -2942,22 +2401,22 @@ } }, "node_modules/@inquirer/core": { - "version": "11.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.9.tgz", - "integrity": "sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.5", - "@inquirer/figures": "^2.0.5", - "@inquirer/type": "^4.0.5", + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -2969,18 +2428,18 @@ } }, "node_modules/@inquirer/editor": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.1.1.tgz", - "integrity": "sha512-6y11LgmNpmn5D2aB5FgnCfBUBK8ZstwLCalyJmORcJZ/WrhOjm16mu6eSqIx8DnErxDqSLr+Jkp+GP8/Nwd5tA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.2.2.tgz", + "integrity": "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/external-editor": "^3.0.0", - "@inquirer/type": "^4.0.5" + "@inquirer/core": "^11.2.1", + "@inquirer/external-editor": "^3.0.3", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -2992,17 +2451,17 @@ } }, "node_modules/@inquirer/expand": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.13.tgz", - "integrity": "sha512-dF2zvrFo9LshkcB23/O1il13kBkBltWIXzut1evfbuBLXMiGIuC45c+ZQ0uukjCDsvI8OWqun4FRYMnzFCQa3g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.1.tgz", + "integrity": "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3014,9 +2473,9 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.0.tgz", - "integrity": "sha512-lDSwMgg+M5rq6JKBYaJwSX6T9e/HK2qqZ1oxmOwn4AQoJE5D+7TumsxLGC02PWS//rkIVqbZv3XA3ejsc9FYvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==", "dev": true, "license": "MIT", "dependencies": { @@ -3024,7 +2483,7 @@ "iconv-lite": "^0.7.2" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3036,9 +2495,9 @@ } }, "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3053,27 +2512,27 @@ } }, "node_modules/@inquirer/figures": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.5.tgz", - "integrity": "sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", + "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", "dev": true, "license": "MIT", "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, "node_modules/@inquirer/input": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.12.tgz", - "integrity": "sha512-uiMFBl4LqFzJClh80Q3f9hbOFJ6kgkDWI4LjAeBuyO6EanVVMF69AgOvpi1qdqjDSjDN6578B6nky9ceEpI+1Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz", + "integrity": "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3085,17 +2544,17 @@ } }, "node_modules/@inquirer/number": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.12.tgz", - "integrity": "sha512-/vrwhEf7Xsuh+YlHF4IjSy3g1cyrQuPaSiHIxCEbLu8qnfvrcvJyCkoktOOF+xV9gSb77/G0n3h04RbMDW2sIg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.1.1.tgz", + "integrity": "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3107,18 +2566,18 @@ } }, "node_modules/@inquirer/password": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.12.tgz", - "integrity": "sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.1.1.tgz", + "integrity": "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3130,22 +2589,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.3.2.tgz", - "integrity": "sha512-yFroiSj2iiBFlm59amdTvAcQFvWS6ph5oKESls/uqPBect7rTU2GbjyZO2DqxMGuIwVA8z0P4K6ViPcd/cp+0w==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.4.2.tgz", + "integrity": "sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^5.1.2", - "@inquirer/confirm": "^6.0.10", - "@inquirer/editor": "^5.0.10", - "@inquirer/expand": "^5.0.10", - "@inquirer/input": "^5.0.10", - "@inquirer/number": "^4.0.10", - "@inquirer/password": "^5.0.10", - "@inquirer/rawlist": "^5.2.6", - "@inquirer/search": "^4.1.6", - "@inquirer/select": "^5.1.2" + "@inquirer/checkbox": "^5.1.4", + "@inquirer/confirm": "^6.0.12", + "@inquirer/editor": "^5.1.1", + "@inquirer/expand": "^5.0.13", + "@inquirer/input": "^5.0.12", + "@inquirer/number": "^4.0.12", + "@inquirer/password": "^5.0.12", + "@inquirer/rawlist": "^5.2.8", + "@inquirer/search": "^4.1.8", + "@inquirer/select": "^5.1.4" }, "engines": { "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" @@ -3160,17 +2619,17 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.8.tgz", - "integrity": "sha512-Su7FQvp5buZmCymN3PPoYv31ZQQX4ve2j02k7piGgKAWgE+AQRB5YoYVveGXcl3TZ9ldgRMSxj56YfDFmmaqLg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.1.tgz", + "integrity": "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3182,18 +2641,18 @@ } }, "node_modules/@inquirer/search": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.8.tgz", - "integrity": "sha512-fGiHKGD6DyPIYUWxoXnQTeXeyYqSOUrasDMABBmMHUalH/LxkuzY0xVRtimXAt1sUeeyYkVuKQx1bebMuN11Kw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.2.1.tgz", + "integrity": "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/figures": "^2.0.5", - "@inquirer/type": "^4.0.5" + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3205,19 +2664,19 @@ } }, "node_modules/@inquirer/select": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.1.4.tgz", - "integrity": "sha512-2kWcGKPMLAXAWRp1AH1SLsQmX+j0QjeljyXMUji9WMZC8nRDO0b7qquIGr6143E7KMLt3VAIGNXzwa/6PXQs4Q==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz", + "integrity": "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.9", - "@inquirer/figures": "^2.0.5", - "@inquirer/type": "^4.0.5" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3229,13 +2688,13 @@ } }, "node_modules/@inquirer/type": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.5.tgz", - "integrity": "sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", + "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", "dev": true, "license": "MIT", "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3247,9 +2706,9 @@ } }, "node_modules/@ipshipyard/libp2p-auto-tls": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@ipshipyard/libp2p-auto-tls/-/libp2p-auto-tls-2.0.1.tgz", - "integrity": "sha512-zpDXVMY1ZgB6o30zFocXUzrD9+tz1bbEdgewFoBf4olDh5/CwjDi/k9v2RrJqujWKYWyRuHRg6Q+VRpvtGrpuw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@ipshipyard/libp2p-auto-tls/-/libp2p-auto-tls-2.0.2.tgz", + "integrity": "sha512-jnGqf/eif9GpjH03PaenekRWRvlJgoVZ1JsAawW0dJxcIW8qHiSMIbVh49xOjUGTK8vUbN26bsO+Rustg0n72A==", "license": "Apache-2.0 OR MIT", "dependencies": { "@chainsafe/is-ip": "^2.0.2", @@ -3261,46 +2720,39 @@ "@libp2p/utils": "^7.0.4", "@multiformats/multiaddr": "^13.0.1", "@multiformats/multiaddr-matcher": "^3.0.1", - "@peculiar/x509": "^1.12.3", + "@peculiar/x509": "^2.0.0", "acme-client": "^5.4.0", "any-signal": "^4.1.1", - "delay": "^6.0.0", - "interface-datastore": "^9.0.2", - "multiformats": "^13.3.1", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@ipshipyard/libp2p-auto-tls/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "delay": "^7.0.0", + "interface-datastore": "^10.0.1", + "multiformats": "^14.0.2", + "reflect-metadata": "^0.2.2", + "uint8arrays": "^6.1.1" } }, "node_modules/@ipshipyard/libp2p-auto-tls/node_modules/delay": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", - "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-7.0.0.tgz", + "integrity": "sha512-C3vaGs818qzZjCvVJ98GQUMVyWeg7dr5w2Nwwb2t5K8G98jOyyVO2ti2bKYk5yoYElqH3F2yA53ykuEnwD6MCg==", "license": "MIT", - "engines": { - "node": ">=16" - }, + "dependencies": { + "random-int": "^3.1.0", + "unlimited-timeout": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@ipshipyard/libp2p-auto-tls/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@isaacs/cliui": { @@ -3335,13 +2787,13 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -3404,9 +2856,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", + "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", "dev": true, "license": "MIT", "dependencies": { @@ -3470,9 +2922,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -3540,9 +2992,9 @@ } }, "node_modules/@kikobeats/time-span": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@kikobeats/time-span/-/time-span-1.0.11.tgz", - "integrity": "sha512-S+msolgD9aPVoJ+ZomVD0WSKm+qJBKvJimzwq8dMvlGKbIPsAyEWhHHdSRuQT3g2VpDIctvbi9nU++kN/VPZaw==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@kikobeats/time-span/-/time-span-1.0.13.tgz", + "integrity": "sha512-CfBK4/EZ73uN/6b5/wOfvWju1Ev/6H+uXqS2Vqd7/dEQTyOsvv4BdOHDqESp4Efa9YyrPPvN3IHU+C4z9FAo3Q==", "license": "MIT", "engines": { "node": ">= 18" @@ -3555,177 +3007,180 @@ "license": "MIT" }, "node_modules/@libp2p/autonat": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/autonat/-/autonat-3.0.10.tgz", - "integrity": "sha512-JGU2+sKU/6J4lxjNePjfcpus7fw1zf9STFr1MFHp0K8suyb3y3wvMPULNOPEVL4HlQqTkEH7J0PD3LWRnedtOQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@libp2p/autonat/-/autonat-3.0.23.tgz", + "integrity": "sha512-yIdBe/rxmk/H9dItpqczMlua7ZB1VpxXBnQ+aRHIO/rDqjLexWrYauAx6QM3Hws3QvnYUruOVkjG7l1oyfiE8Q==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/peer-collections": "^7.0.23", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", "any-signal": "^4.1.1", "main-event": "^1.0.1", - "multiformats": "^13.4.0", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/autonat/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "multiformats": "^14.0.0", + "protons-runtime": "^7.0.0", + "uint8arraylist": "^3.0.2" } }, - "node_modules/@libp2p/autonat/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "node_modules/@libp2p/autonat/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" } }, - "node_modules/@libp2p/bootstrap": { - "version": "12.0.11", - "resolved": "https://registry.npmjs.org/@libp2p/bootstrap/-/bootstrap-12.0.11.tgz", - "integrity": "sha512-ZIG8QKS+4w7ugK7a1ftdopjIA+NvOPKUq7JY1OsRxaiLdCdxgghPTiNIbinYsVv5iHULBnFZe4o5l+5L7+Hssw==", + "node_modules/@libp2p/autonat/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-id": "^6.0.4", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "main-event": "^1.0.1" + "uint8arrays": "^6.0.0" } }, - "node_modules/@libp2p/bootstrap/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/autonat/node_modules/uint8arrays": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "multiformats": "^14.0.0" } }, - "node_modules/@libp2p/bootstrap/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "node_modules/@libp2p/bootstrap": { + "version": "12.0.26", + "resolved": "https://registry.npmjs.org/@libp2p/bootstrap/-/bootstrap-12.0.26.tgz", + "integrity": "sha512-GdKy01AXxfSO55njcMWTPvd4OWVAxe/oYf2vOojE7sk6/ktW6W1o36c1zNr7fF9bbfwetslKtP8p++wJZPCJjw==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/peer-id": "^6.0.12", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", + "main-event": "^1.0.1" } }, "node_modules/@libp2p/circuit-relay-v2": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@libp2p/circuit-relay-v2/-/circuit-relay-v2-4.1.3.tgz", - "integrity": "sha512-XDgzXu/zMjwHyRSh8xiWlsQk3vGDVSdlukFxb0Eg1VXB2c0ytWgIF5JoynyrNpwXa6Pe0SgGEcUMt9wMaF6/HQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@libp2p/circuit-relay-v2/-/circuit-relay-v2-4.2.8.tgz", + "integrity": "sha512-fJpe85+ZCCXJ/Ig1pCrkJoalwJJhKWHCr9BGQvG21pWxOcjrlk3jZ0Bu7w6dOBQ11+oHx+UfpHgeU8yJLdPe2A==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/peer-record": "^9.0.5", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/peer-collections": "^7.0.23", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/peer-record": "^9.0.13", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", "any-signal": "^4.1.1", "main-event": "^1.0.1", - "multiformats": "^13.4.0", + "multiformats": "^14.0.0", "nanoid": "^5.1.5", - "progress-events": "^1.0.1", - "protons-runtime": "^5.6.0", + "progress-events": "^1.1.0", + "protons-runtime": "^7.0.0", "retimeable-signal": "^1.0.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/circuit-relay-v2/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/circuit-relay-v2/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" + } + }, + "node_modules/@libp2p/circuit-relay-v2/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/circuit-relay-v2/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/crypto": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.1.13.tgz", - "integrity": "sha512-8NN9cQP3jDn+p9+QE9ByiEoZ2lemDFf/unTgiKmS3JF93ph240EUVdbCyyEgOMfykzb0okTM4gzvwfx9osJebQ==", + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.1.21.tgz", + "integrity": "sha512-GipsBinthJuk7DpwthTUixZHSaKogcxm2glPCP0VkYkEpzZrfEvBEekRvlP5+1Ak8pReaHcz4gPKFA9X6MG0WQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", + "@libp2p/interface": "^3.2.5", "@noble/curves": "^2.0.1", "@noble/hashes": "^2.0.1", - "multiformats": "^13.4.0", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "multiformats": "^14.0.0", + "protons-runtime": "^7.0.0", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/crypto/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "node_modules/@libp2p/crypto/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" } }, - "node_modules/@libp2p/dcutr": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/dcutr/-/dcutr-3.0.10.tgz", - "integrity": "sha512-rMBstMznxLgIGNvHFlEHo9Lvx0/+wD2RXB+H7VU58ov1CRQNwlSix38BaQ6PI94LOmVzDPHKl8x3mG6YKp5GEw==", + "node_modules/@libp2p/crypto/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "delay": "^7.0.0", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8" + "uint8arrays": "^6.0.0" } }, - "node_modules/@libp2p/dcutr/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/crypto/node_modules/uint8arrays": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "multiformats": "^14.0.0" + } + }, + "node_modules/@libp2p/dcutr": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@libp2p/dcutr/-/dcutr-3.0.23.tgz", + "integrity": "sha512-d7r2p0xWXKT1nKgwBWcT2aunAnITZeKYEn5leU/tSQH9qf+NR+7Xt9Vi/TCyyzVljSkH15FUFkUmE7AKb+fbcw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", + "delay": "^7.0.0", + "protons-runtime": "^7.0.0", + "uint8arraylist": "^3.0.2" } }, "node_modules/@libp2p/dcutr/node_modules/delay": { @@ -3744,315 +3199,292 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@libp2p/dcutr/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" + } + }, + "node_modules/@libp2p/dcutr/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" + } + }, "node_modules/@libp2p/dcutr/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/http/-/http-2.0.1.tgz", - "integrity": "sha512-NjTvXdpwlGNvPsjiumRWJ3jm+9euQkKLXzdHnE+cPCEjPWo6cyGGB541161Jgi8CZ5tNTudddlriwkZRb8Z6KQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@libp2p/http/-/http-2.0.6.tgz", + "integrity": "sha512-z3RRdZP/+/kjYREY9MyZ5E90bKrGThQAw9sTZyv0ahxzUM+7I0/JPFLj98Wu0tgI9LStA6vtweVi0Ffwp0u9bA==", "license": "Apache-2.0 OR MIT", "dependencies": { "@libp2p/http-fetch": "^4.0.0", "@libp2p/http-peer-id-auth": "^2.0.0", "@libp2p/http-utils": "^2.0.0", "@libp2p/http-websocket": "^2.0.0", - "@libp2p/interface": "^3.0.2", - "@libp2p/interface-internal": "^3.0.4", - "@multiformats/multiaddr": "^13.0.1", - "cookie": "^1.0.2", - "undici": "^7.16.0" + "@libp2p/interface": "^3.2.0", + "@libp2p/interface-internal": "^3.1.0", + "@multiformats/multiaddr": "^13.0.3", + "cookie": "^1.1.1", + "undici": "^8.0.3" } }, "node_modules/@libp2p/http-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/http-fetch/-/http-fetch-4.0.1.tgz", - "integrity": "sha512-7vtJVOfyGol6CWrNm9HhjlYOmCsJVLKWYdhpmjdpS6pGWtpkTMrHJLznSJ7PYkMq7OnhzhXNFq0FhWygP6mmPQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/http-fetch/-/http-fetch-4.0.4.tgz", + "integrity": "sha512-MHROqwXP4KnRIZguzUIyrexRWuEF6InXKzUCFktergqgkkkkkt45ZiGx8wOa/1xbdUEZmiDoOITpHsNhU5GWBQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "@achingbrain/http-parser-js": "^0.5.9", "@libp2p/http-utils": "^2.0.0", - "@libp2p/interface": "^3.0.2", - "uint8arrays": "^5.1.0" + "@libp2p/interface": "^3.2.0", + "uint8arrays": "^6.1.1" } }, "node_modules/@libp2p/http-fetch/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/http-peer-id-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@libp2p/http-peer-id-auth/-/http-peer-id-auth-2.0.0.tgz", - "integrity": "sha512-GKs0DXK/JVKKH57IGQDiWsC6hYsLY+cwKNRMuX1FY6FZo09zc1QPwvgr0FNtIB2c5WJFf/vja4M4QekLsWU+xw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/http-peer-id-auth/-/http-peer-id-auth-2.0.3.tgz", + "integrity": "sha512-lBzwbnqIJa4SnMssseEtbgdGHB+sH2CQr3HxhSwEhLRRpU1iCmkUR1L9X+FTH6A5Xo62y/JYnnhBO7CG3YTSdg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.12", - "@libp2p/interface": "^3.0.2", - "@libp2p/peer-id": "^6.0.3", - "uint8-varint": "^2.0.4", - "uint8arrays": "^5.1.0" + "@libp2p/crypto": "^5.1.15", + "@libp2p/interface": "^3.2.0", + "@libp2p/peer-id": "^6.0.6", + "uint8-varint": "^3.0.0", + "uint8arrays": "^6.1.1" } }, "node_modules/@libp2p/http-peer-id-auth/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/http-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/http-utils/-/http-utils-2.0.1.tgz", - "integrity": "sha512-dJFRV2gAzPkF5NOnGMdWXXO3PFK0cMSn5uDbW55n5Usnrx6hHQmDCRfKh3ClQUzjG66pFjXM3zFXLKORyasl3A==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@libp2p/http-utils/-/http-utils-2.0.6.tgz", + "integrity": "sha512-WIYT1luITS4AZl0/b3tB5c7Kw9MKHAX2Lumx83oKImBPI9lPpRNafOmVVVRvwfjPq77t5nVt4ha8y1UDEtRN6g==", "license": "Apache-2.0 OR MIT", "dependencies": { "@achingbrain/http-parser-js": "^0.5.9", - "@libp2p/interface": "^3.0.2", - "@libp2p/peer-id": "^6.0.3", - "@libp2p/utils": "^7.0.4", - "@multiformats/multiaddr": "^13.0.1", + "@libp2p/interface": "^3.2.0", + "@libp2p/peer-id": "^6.0.6", + "@libp2p/utils": "^7.0.15", + "@multiformats/multiaddr": "^13.0.3", "@multiformats/multiaddr-to-uri": "^12.0.0", "@multiformats/uri-to-multiaddr": "^10.0.0", - "it-to-browser-readablestream": "^2.0.12", - "multiformats": "^13.4.1", + "it-to-browser-readablestream": "^2.0.14", + "multiformats": "^14.0.0", "race-event": "^1.6.1", "readable-stream": "^4.7.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/http-utils/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/http-utils/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/http-utils/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/http-websocket": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/http-websocket/-/http-websocket-2.0.1.tgz", - "integrity": "sha512-hMMWVKAK3P3oAmatUB8SQ4mUMhkkLdERAjgZUoKdohIPumPGQ6ADFSJMYsSWv9ZwyBiXMHBbwluYEBZUw85GCw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/http-websocket/-/http-websocket-2.0.4.tgz", + "integrity": "sha512-AEATJ6MERtxY/UZkFWCgNpB7bhcVTmeeBKZkVl2RJbVYTk8CSv3fO3uXLcYFQ9W4rOa0eG4Gvr/USBU+41xB8A==", "license": "Apache-2.0 OR MIT", "dependencies": { "@achingbrain/http-parser-js": "^0.5.9", "@libp2p/http-utils": "^2.0.0", - "@libp2p/interface": "^3.0.2", - "@libp2p/interface-internal": "^3.0.4", - "@libp2p/utils": "^7.0.4", - "@multiformats/multiaddr": "^13.0.1", - "multiformats": "^13.4.1", + "@libp2p/interface": "^3.2.0", + "@libp2p/interface-internal": "^3.1.0", + "@libp2p/utils": "^7.0.15", + "@multiformats/multiaddr": "^13.0.3", + "multiformats": "^14.0.0", "race-event": "^1.6.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/http-websocket/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/http-websocket/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/http-websocket/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/http/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/http/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/http/node_modules/undici": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.20.0.tgz", - "integrity": "sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.7.0.tgz", + "integrity": "sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ==", "license": "MIT", "engines": { - "node": ">=20.18.1" + "node": ">=22.19.0" } }, "node_modules/@libp2p/identify": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/identify/-/identify-4.0.10.tgz", - "integrity": "sha512-DROyV+bZIlz9czCCHJdeVtm1+hEOKUigJHyTzzA/cuwwyvtm8Dco8F+VRYcrwpafuVtjv7yN7CskN4oIys56jw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@libp2p/identify/-/identify-4.1.9.tgz", + "integrity": "sha512-S0nsemvyCgwT5Q0JP2uKMEUBU1WF9PrLUmKyKNjm/QRr39/rFT5FxL/B88J39hdJL24xVAN9iyCuNLTsMJr+OQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/peer-record": "^9.0.5", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/peer-record": "^9.0.13", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", "it-drain": "^3.0.10", "it-parallel": "^3.0.13", "main-event": "^1.0.1", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "protons-runtime": "^7.0.0", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/identify/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/identify/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" + } + }, + "node_modules/@libp2p/identify/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/identify/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/interface": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-3.1.0.tgz", - "integrity": "sha512-RE7/XyvC47fQBe1cHxhMvepYKa5bFCUyFrrpj8PuM0E7JtzxU7F+Du5j4VXbg2yLDcToe0+j8mB7jvwE2AThYw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-3.2.5.tgz", + "integrity": "sha512-RdTchTdakBBc4ShKKsvoME/bJYsrCoVDpdYQVdd4TQ30TCb8QwWKGClqAtw7gfLNuaUKm41xz06kASW6AZpbDA==", "license": "Apache-2.0 OR MIT", "dependencies": { "@multiformats/dns": "^1.0.6", - "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr": "^13.0.3", "main-event": "^1.0.1", - "multiformats": "^13.4.0", - "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8" + "multiformats": "^14.0.0", + "progress-events": "^1.1.0", + "uint8arraylist": "^3.0.2" } }, "node_modules/@libp2p/interface-internal": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-3.0.10.tgz", - "integrity": "sha512-Gd/eQAoAlXqeCRJ6wOwcnTQ/SDe95bQow8osY8zq0nbfFBu26aChQHjAd+CjcCADJRh+Sd+7+dYG7BrhpxGt1A==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-3.1.8.tgz", + "integrity": "sha512-MJ/DR+H8xdhRIdDSh/BzHIxgmBQ9HoVoBwISOb582IDd5ZXF6xrtaVzC6Vn4n/OMwUDPfda3OD/aMNAlygtoEw==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-collections": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", + "@libp2p/interface": "^3.2.5", + "@libp2p/peer-collections": "^7.0.23", + "@multiformats/multiaddr": "^13.0.3", "progress-events": "^1.0.1" } }, - "node_modules/@libp2p/interface-internal/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/interface-internal/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/interface/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/interface/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/interface/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/kad-dht": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@libp2p/kad-dht/-/kad-dht-16.1.3.tgz", - "integrity": "sha512-yM9UumHkN8Dd+nFUllOio3/0uuzzpPgc/+PouDAABWs2ut36VfizhWVWAiqlLpzkpCquIzPUd0doRu0GKztdXA==", + "version": "16.3.4", + "resolved": "https://registry.npmjs.org/@libp2p/kad-dht/-/kad-dht-16.3.4.tgz", + "integrity": "sha512-/deVcwDnqkqzWI6uX2ki3EpLI5V68GuMIVYITjn2mbLIpwNnxYKYmPkqPMW2AQ0LUTdMczSv6ebSYwMWxVCeQQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/ping": "^3.0.10", - "@libp2p/record": "^4.0.9", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/peer-collections": "^7.0.23", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/ping": "^3.1.8", + "@libp2p/record": "^4.0.15", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", "any-signal": "^4.1.1", - "interface-datastore": "^9.0.1", + "interface-datastore": "^10.0.1", "it-all": "^3.0.9", "it-drain": "^3.0.10", "it-length": "^3.0.9", @@ -4063,179 +3495,177 @@ "it-pushable": "^3.2.3", "it-take": "^3.0.9", "main-event": "^1.0.1", - "multiformats": "^13.4.0", + "multiformats": "^14.0.0", "p-defer": "^4.0.1", "p-event": "^7.0.0", "progress-events": "^1.0.1", - "protons-runtime": "^5.6.0", + "protons-runtime": "^7.0.0", "race-signal": "^2.0.0", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/kad-dht/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/kad-dht/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" + } + }, + "node_modules/@libp2p/kad-dht/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/kad-dht/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/keychain": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/keychain/-/keychain-6.0.10.tgz", - "integrity": "sha512-f80yJSzKb3Vh8KtdNCxiPUu8qjyT6b+nQlS+jSmSDnMGXI8z49wdtfKuigQsKft64qt2mKMNq/9OBWyhUMYPFQ==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@libp2p/keychain/-/keychain-6.1.4.tgz", + "integrity": "sha512-vExk59BOOoOafgPpnARFxacFvtiotOzJ/UZKdmZLGP9e0J1rJPm+Aqbek7aP4oA7JX0q2OjLK/skJSzbwUk9sQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", "@noble/hashes": "^2.0.1", "asn1js": "^3.0.6", - "interface-datastore": "^9.0.1", - "multiformats": "^13.4.0", + "interface-datastore": "^10.0.1", + "multiformats": "^14.0.0", "sanitize-filename": "^1.6.3", - "uint8arrays": "^5.1.0" + "uint8arrays": "^6.1.1" } }, "node_modules/@libp2p/keychain/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/logger": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-6.2.2.tgz", - "integrity": "sha512-XtanXDT+TuMuZoCK760HGV1AmJsZbwAw5AiRUxWDbsZPwAroYq64nb41AHRu9Gyc0TK9YD+p72+5+FIxbw0hzw==", + "version": "6.2.10", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-6.2.10.tgz", + "integrity": "sha512-recRqNABHG32YXvpMvNepFCuU14d51dF5hs+vR2C/tkqXBQc0Sqg5LtWB2NYPoIJV+JUB50iWLrvBXZUOjLc9Q==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@multiformats/multiaddr": "^13.0.1", - "interface-datastore": "^9.0.1", - "multiformats": "^13.4.0", + "@libp2p/interface": "^3.2.5", + "@multiformats/multiaddr": "^13.0.3", + "interface-datastore": "^10.0.1", + "multiformats": "^14.0.0", "weald": "^1.1.0" } }, - "node_modules/@libp2p/logger/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/logger/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, "node_modules/@libp2p/mdns": { - "version": "12.0.11", - "resolved": "https://registry.npmjs.org/@libp2p/mdns/-/mdns-12.0.11.tgz", - "integrity": "sha512-OB6am5A21Yc5c7KBZONQhTao4BHRDc3MurZ1qHzqU4FQidi719cNRw4ac6TVk4dcdtOYx+1ef8pvvLX+57hXAQ==", + "version": "12.0.26", + "resolved": "https://registry.npmjs.org/@libp2p/mdns/-/mdns-12.0.26.tgz", + "integrity": "sha512-VLGqchcezGMCmzp4VhSbJXuhaTseIDsN9M3jNfM2FfISuyY1ikXBpKnGvIRCCqVQayw2/wv7GmSBphQXpBFOLg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", "@types/multicast-dns": "^7.2.4", "dns-packet": "^5.6.1", "main-event": "^1.0.1", "multicast-dns": "^7.2.5" } }, - "node_modules/@libp2p/mdns/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/multistream-select": { + "version": "7.0.23", + "resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-7.0.23.tgz", + "integrity": "sha512-kj1J3tj0LLPDgVXxxv2S1hRk4zs6XGaLnbRkyxIArrifocH+58WVGx+2+9T1goYtJYEs98lpER+GJxsYADDXNA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "@libp2p/interface": "^3.2.5", + "@libp2p/utils": "^7.2.4", + "it-length-prefixed": "^11.0.1", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/mdns/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "node_modules/@libp2p/multistream-select/node_modules/it-length-prefixed": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-11.0.1.tgz", + "integrity": "sha512-0Cy4RHFiL2CH060Lkigq0N37VaPg7oSylG6YjXErq+ccJFYcNEWNzxNjbqceio/sY1C+q84vZXOCE6/C0flYfQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "it-reader": "^7.0.0", + "it-stream-types": "^2.0.1", + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.1", + "uint8arrays": "^6.1.0" } }, - "node_modules/@libp2p/multistream-select": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-7.0.10.tgz", - "integrity": "sha512-6RAFctqWzwQ/qPaN3CxoueSs1b7pBVMZ+0n6G0kcsqVBj0wc4eB+dcJyUNrTV1NGgMCAl6tVAGztZaE8XZc9lw==", + "node_modules/@libp2p/multistream-select/node_modules/it-reader": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-7.0.0.tgz", + "integrity": "sha512-bTWQPHH1if8N1K9XeidDjhTDm51ALbOksMa9uCZVVsQkoIPXP0XVKM88/Ynqr7HS18La/P1Kvu7C73j4rRoKWQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/utils": "^7.0.10", - "it-length-prefixed": "^10.0.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "it-stream-types": "^2.0.1", + "uint8arraylist": "^3.0.1" + } + }, + "node_modules/@libp2p/multistream-select/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/multistream-select/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/peer-collections": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-7.0.10.tgz", - "integrity": "sha512-OvlSY5N3J6q8U+EbTrQGbW8zdyOa3y7nz9Y3IbuE55tIiMd7pwm1U3Lknfb6IPkOWkHNfQDfCGGfGVQcMRodvQ==", + "version": "7.0.23", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-7.0.23.tgz", + "integrity": "sha512-m7KX5Z4l+kd9JRGthFJyxuO9/1JfrVg+5H83oQcn1C0juboroijCVe6GoX1kWdKKyVDWtliDjvK7ZyA/+LilPQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", - "multiformats": "^13.4.0" + "@libp2p/interface": "^3.2.5", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/utils": "^7.2.4", + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/peer-id": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-6.0.4.tgz", - "integrity": "sha512-Z3xK0lwwKn4bPg3ozEpPr1HxsRi2CxZdghOL+MXoFah/8uhJJHxHFA8A/jxtKn4BB8xkk6F8R5vKNIS05yaCYw==", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-6.0.12.tgz", + "integrity": "sha512-U44MeKs+U1SqZPqS0RDzjjcS9ERix2zJsJkTcqi8I+5flEz4uVAObBDxvkkaTaqRFRXCXEPjL5kA4UbgVubCZQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "multiformats": "^13.4.0", - "uint8arrays": "^5.1.0" + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", + "multiformats": "^14.0.0", + "uint8arrays": "^6.1.1" } }, "node_modules/@libp2p/peer-id-factory": { @@ -4293,6 +3723,21 @@ "uint8arrays": "^5.1.0" } }, + "node_modules/@libp2p/peer-id-factory/node_modules/@multiformats/multiaddr": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz", + "integrity": "sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "@chainsafe/netmask": "^2.0.0", + "@multiformats/dns": "^1.0.3", + "abort-error": "^1.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, "node_modules/@libp2p/peer-id-factory/node_modules/@noble/curves": { "version": "1.9.7", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", @@ -4320,140 +3765,167 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@libp2p/peer-id-factory/node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/@libp2p/peer-id-factory/node_modules/uint8-varint": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.5.tgz", + "integrity": "sha512-jeFLbL/x30wBRnWjKE1qVBXeumG46r7XmYkpis955lTQ+blccGKFrOsSMHlxePwYB1pI7L8YPHz1t4jLxEs3nA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" + } + }, "node_modules/@libp2p/peer-id-factory/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.1.tgz", + "integrity": "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "multiformats": "^13.0.0" } }, "node_modules/@libp2p/peer-id/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/peer-record": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-9.0.5.tgz", - "integrity": "sha512-disk23OO00yD52O4VmItbDkjJZ/YZJsKbMsqNgVhr+D3PcM+KRpu9VVbiCnN5Tzn9XvFEHhrMJY7BPE+rvT5MQ==", + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-9.0.13.tgz", + "integrity": "sha512-lkdZUNC6h86YECpRE3dB4GLYSiLLuXFBleiM01oEmWtAdTCfRd+vRqNkguSoC6R3tGk/YWRm7cfz39ATPuq7zQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-id": "^6.0.4", - "@multiformats/multiaddr": "^13.0.1", - "multiformats": "^13.4.0", - "protons-runtime": "^5.6.0", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", + "@libp2p/peer-id": "^6.0.12", + "@multiformats/multiaddr": "^13.0.3", + "multiformats": "^14.0.0", + "protons-runtime": "^7.0.0", + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/peer-record/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/peer-record/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" + } + }, + "node_modules/@libp2p/peer-record/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/peer-record/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/peer-store": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-12.0.10.tgz", - "integrity": "sha512-fe/6m0vXny9pvCyaSjg2GisdSVgxtHYZtp6op1WNm8dBvYqRXLuqSYi0QGEbLtSDSL4SeE8BKZyadyk/tYAqfg==", + "version": "12.0.23", + "resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-12.0.23.tgz", + "integrity": "sha512-RFBlMZYSXC1MBQbyCI5MQ3/9RNWjnsTSg2f5iQ6WUoMqO3p6pBQnDKxC3ur45iBt/SfR4hNUEM7Cd4m0ThCgWg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/peer-record": "^9.0.5", - "@multiformats/multiaddr": "^13.0.1", - "interface-datastore": "^9.0.1", + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", + "@libp2p/peer-collections": "^7.0.23", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/peer-record": "^9.0.13", + "@multiformats/multiaddr": "^13.0.3", + "interface-datastore": "^10.0.1", "it-all": "^3.0.9", "main-event": "^1.0.1", "mortice": "^3.3.1", - "multiformats": "^13.4.0", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "multiformats": "^14.0.0", + "protons-runtime": "^7.0.0", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/peer-store/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/peer-store/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" + } + }, + "node_modules/@libp2p/peer-store/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/peer-store/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/ping": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/ping/-/ping-3.0.10.tgz", - "integrity": "sha512-XkwQOOrmIa1/9t2xq0+Zm3rWkyO+Q0SavlM3t6WkDjxC4F3h0MaYep2CX5BBWD2mZWyy8YdeQTF3N9YhRr4irg==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@libp2p/ping/-/ping-3.1.8.tgz", + "integrity": "sha512-jcqIAyULOP5e0zSo9XQkeUAfoVgzmcJGDoSKYyDKoZDGvw35h+IR7Kkn/lU1h4imS7HlZkcPvgPOl3p1gGppWw==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@multiformats/multiaddr": "^13.0.1", + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", "p-event": "^7.0.0", "race-signal": "^2.0.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/ping/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/ping/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/ping/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/pubsub": { @@ -4494,22 +3966,16 @@ "uint8arrays": "^5.0.2" } }, - "node_modules/@libp2p/pubsub-peer-discovery/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } + "node_modules/@libp2p/pubsub-peer-discovery/node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" }, "node_modules/@libp2p/pubsub-peer-discovery/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.1.tgz", + "integrity": "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "multiformats": "^13.0.0" @@ -4611,6 +4077,21 @@ "uint8arrays": "^5.1.0" } }, + "node_modules/@libp2p/pubsub/node_modules/@multiformats/multiaddr": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz", + "integrity": "sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "@chainsafe/netmask": "^2.0.0", + "@multiformats/dns": "^1.0.3", + "abort-error": "^1.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, "node_modules/@libp2p/pubsub/node_modules/delay": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", @@ -4651,175 +4132,198 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@libp2p/pubsub/node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/@libp2p/pubsub/node_modules/race-signal": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-1.1.3.tgz", "integrity": "sha512-Mt2NznMgepLfORijhQMncE26IhkmjEphig+/1fKC0OtaKwys/gpvpmswSjoN01SS+VO951mj0L4VIDXdXsjnfA==", "license": "Apache-2.0 OR MIT" }, + "node_modules/@libp2p/pubsub/node_modules/uint8-varint": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.5.tgz", + "integrity": "sha512-jeFLbL/x30wBRnWjKE1qVBXeumG46r7XmYkpis955lTQ+blccGKFrOsSMHlxePwYB1pI7L8YPHz1t4jLxEs3nA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" + } + }, "node_modules/@libp2p/pubsub/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.1.tgz", + "integrity": "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "multiformats": "^13.0.0" } }, "node_modules/@libp2p/record": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@libp2p/record/-/record-4.0.9.tgz", - "integrity": "sha512-ITxntqQ2GDK/yA1NhzEQc2dXpxgox96xZ1cqO507choY5z5Czhz2BxfyElVO/XYjOXvylu1XN66uh3VuGHrfkQ==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@libp2p/record/-/record-4.0.15.tgz", + "integrity": "sha512-EaHFtQAlZuM9vCpd+0KnZhTVgV26Uzje7DkyUseGNKTy+Wit9Q94C/+wDThpZuRHnK1FH/CvPxJ4kLj7AoQ1WA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "protons-runtime": "^7.0.0", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" + } + }, + "node_modules/@libp2p/record/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" + } + }, + "node_modules/@libp2p/record/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/record/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/tcp": { - "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/tcp/-/tcp-11.0.10.tgz", - "integrity": "sha512-vp1XvbRUU6JyVZMDfrr8UX+xs1sybT2r3PFoN5m07r3GSrMMPOKpWN2HkhT2pCBZWJG6ADQOy5+K0tBRE782oA==", + "version": "11.0.23", + "resolved": "https://registry.npmjs.org/@libp2p/tcp/-/tcp-11.0.23.tgz", + "integrity": "sha512-c9ozk/DhFcL9Oa/MSxOM/DdZPTdqkuayQUPFzE0i46+HpSLrXuGtc02IhiT32Uxsh2GmfBr+ITyprIFz9YCcdQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "@types/sinon": "^20.0.0", + "@libp2p/interface": "^3.2.5", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", "main-event": "^1.0.1", "p-event": "^7.0.0", "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8" + "uint8arraylist": "^3.0.2" } }, - "node_modules/@libp2p/tcp/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/tcp/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/tcp/node_modules/@types/sinon": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-20.0.0.tgz", - "integrity": "sha512-etYGUC6IEevDGSWvR9WrECRA01ucR2/Oi9XMBUAdV0g4bLkNf4HlZWGiGlDOq5lgwXRwcV+PSeKgFcW4QzzYOg==", - "license": "MIT", - "dependencies": { - "@types/sinonjs__fake-timers": "*" + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/tcp/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/tls": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/tls/-/tls-3.0.10.tgz", - "integrity": "sha512-O/e/kEzXZPgHb1asyN1P4hCcECQnFEiGAQCgjkKU/nTjHYCvWG0CAU5uJuJkj9RXLpDFPVZ38FMN3dSzx0Ny7Q==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@libp2p/tls/-/tls-3.1.5.tgz", + "integrity": "sha512-Y3APGfPINvDwCeutiPdlUYm3eESa9b5v5GZWTbTgNztyB5y4EcRE8jmhcZzq5US1Z3QOLSugBHpap0PfOD+gBQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/utils": "^7.2.4", "@peculiar/asn1-schema": "^2.4.0", "@peculiar/asn1-x509": "^2.4.0", "@peculiar/webcrypto": "^1.5.0", - "@peculiar/x509": "^1.13.0", + "@peculiar/x509": "^2.0.0", "asn1js": "^3.0.6", "p-event": "^7.0.0", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "protons-runtime": "^7.0.0", + "reflect-metadata": "^0.2.2", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, - "node_modules/@libp2p/tls/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "node_modules/@libp2p/tls/node_modules/protons-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.0.0.tgz", + "integrity": "sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.0", + "uint8arrays": "^6.0.0" } }, - "node_modules/@libp2p/upnp-nat": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/upnp-nat/-/upnp-nat-4.0.10.tgz", - "integrity": "sha512-pEVLzDI7hY37vxjQyPvY6naWavUB5icTTLUtu/mHLvlb79jYX/NspIhUlbPcYFGH5dTD4NBaqHn6k3otOHssiw==", + "node_modules/@libp2p/tls/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@achingbrain/nat-port-mapper": "^4.0.4", - "@chainsafe/is-ip": "^2.1.0", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "main-event": "^1.0.1", - "p-defer": "^4.0.1", - "race-signal": "^2.0.0" + "uint8arrays": "^6.0.0" } }, - "node_modules/@libp2p/upnp-nat/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/tls/node_modules/uint8arrays": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "multiformats": "^14.0.0" } }, - "node_modules/@libp2p/upnp-nat/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "node_modules/@libp2p/upnp-nat": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@libp2p/upnp-nat/-/upnp-nat-4.0.23.tgz", + "integrity": "sha512-r82ADwCQODOulfHiuCzRGrCcopA294L6TwkBLtbysntdkSlKPniwf/YGVUuRLisAqdniqubW9xxHebjXebVG8Q==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "@achingbrain/nat-port-mapper": "^4.0.4", + "@chainsafe/is-ip": "^2.1.0", + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", + "main-event": "^1.0.1", + "p-defer": "^4.0.1", + "race-signal": "^2.0.0" } }, "node_modules/@libp2p/utils": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-7.0.10.tgz", - "integrity": "sha512-+mzD+7yLMoZ8+34y/iS9d1CnwHjJJ/qEsao9FckHf9T9tnVXEyLLu9TpzBCcGRm4fUK/QCSHK2AcZH50kkAFkw==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-7.2.4.tgz", + "integrity": "sha512-rp5mlFJqV1cc+Kfuxt61RXbWaHaku/HmfhiEHIvFaaP3do1QUSlG+Tjbufwb5r7JzotYnmL4egNDTlNnpjZsBA==", "license": "Apache-2.0 OR MIT", "dependencies": { "@chainsafe/is-ip": "^2.1.0", "@chainsafe/netmask": "^2.0.0", - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/logger": "^6.2.2", - "@multiformats/multiaddr": "^13.0.1", + "@libp2p/interface": "^3.2.5", + "@libp2p/logger": "^6.2.10", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", "@sindresorhus/fnv1a": "^3.1.0", "any-signal": "^4.1.1", - "cborg": "^4.2.14", + "cborg": "^5.1.0", "delay": "^7.0.0", "is-loopback-addr": "^2.0.2", - "it-length-prefixed": "^10.0.1", + "it-length-prefixed": "^11.0.1", "it-pipe": "^3.0.1", "it-pushable": "^3.2.3", "it-stream-types": "^2.0.2", @@ -4827,22 +4331,11 @@ "netmask": "^2.0.2", "p-defer": "^4.0.1", "p-event": "^7.0.0", + "progress-events": "^1.1.0", "race-signal": "^2.0.0", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/utils/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1" } }, "node_modules/@libp2p/utils/node_modules/delay": { @@ -4861,59 +4354,88 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@libp2p/utils/node_modules/it-length-prefixed": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-11.0.1.tgz", + "integrity": "sha512-0Cy4RHFiL2CH060Lkigq0N37VaPg7oSylG6YjXErq+ccJFYcNEWNzxNjbqceio/sY1C+q84vZXOCE6/C0flYfQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-reader": "^7.0.0", + "it-stream-types": "^2.0.1", + "uint8-varint": "^3.0.0", + "uint8arraylist": "^3.0.1", + "uint8arrays": "^6.1.0" + } + }, + "node_modules/@libp2p/utils/node_modules/it-reader": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-7.0.0.tgz", + "integrity": "sha512-bTWQPHH1if8N1K9XeidDjhTDm51ALbOksMa9uCZVVsQkoIPXP0XVKM88/Ynqr7HS18La/P1Kvu7C73j4rRoKWQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-stream-types": "^2.0.1", + "uint8arraylist": "^3.0.1" + } + }, + "node_modules/@libp2p/utils/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" + } + }, "node_modules/@libp2p/utils/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@libp2p/websockets": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@libp2p/websockets/-/websockets-10.1.3.tgz", - "integrity": "sha512-TzH7ja1Ay7zIXif5eYSRUAupqtRotUyNegumRPFV+DjiqOYK2DiZd8Z6QTG1iVUsUXMXrWihbFkR96zyQ9eajw==", + "version": "10.1.16", + "resolved": "https://registry.npmjs.org/@libp2p/websockets/-/websockets-10.1.16.tgz", + "integrity": "sha512-4eH5zwOUWkUU+qyuat8Wep7A1oq/eqVkL/pUN+4HOGS7gw6kk7RkBgYs+zlTWMNpJ5Xfo9p5h+Au5zUkNsVirw==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", + "@libp2p/interface": "^3.2.5", + "@libp2p/utils": "^7.2.4", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", "@multiformats/multiaddr-to-uri": "^12.0.0", "main-event": "^1.0.1", "p-event": "^7.0.0", "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0", + "uint8arraylist": "^3.0.2", + "uint8arrays": "^6.1.1", "ws": "^8.18.3" } }, - "node_modules/@libp2p/websockets/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "node_modules/@libp2p/websockets/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8arrays": "^6.0.0" } }, "node_modules/@libp2p/websockets/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@multiformats/dns": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.13.tgz", - "integrity": "sha512-yr4bxtA3MbvJ+2461kYIYMsiiZj/FIqKI64hE4SdvWJUdWF9EtZLar38juf20Sf5tguXKFUruluswAO6JsjS2w==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.15.tgz", + "integrity": "sha512-W0zAMABtAn+3chgFcPGvllKND7M6GblMAAFcJQTy+iMmGiyFErZYPzAh2b50Y3SFf340iFV7+ckVgZkGfUyxzA==", "license": "Apache-2.0 OR MIT", "dependencies": { "@dnsquery/dns-packet": "^6.1.1", @@ -4921,16 +4443,16 @@ "hashlru": "^2.3.0", "p-queue": "^9.0.0", "progress-events": "^1.0.0", - "uint8arrays": "^5.0.2" + "uint8arrays": "^6.1.1" } }, "node_modules/@multiformats/dns/node_modules/p-queue": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", - "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.1.tgz", + "integrity": "sha512-POWdiIPmsUPGwb4FeQ4OBg46aqmcInSWe45CKDsGHiOBiVQM9chqfQTuqhuTzcg2Vz9faTI65at0KkVyVEiCHw==", "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.1", + "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" }, "engines": { @@ -4941,59 +4463,35 @@ } }, "node_modules/@multiformats/dns/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@multiformats/multiaddr": { - "version": "12.5.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz", - "integrity": "sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.3.tgz", + "integrity": "sha512-mEqqJ4r3a/uuFMTpRkU316wGNIDQNhuVWpm+ebKTQeYsfv9jXbPONWM6VVnj3KGUrwfsX7GZOyp4TFqEA2SPCw==", "license": "Apache-2.0 OR MIT", "dependencies": { "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@multiformats/dns": "^1.0.3", - "abort-error": "^1.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "multiformats": "^14.0.0", + "uint8-varint": "^3.0.0", + "uint8arrays": "^6.1.1" } }, "node_modules/@multiformats/multiaddr-matcher": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-matcher/-/multiaddr-matcher-3.0.1.tgz", - "integrity": "sha512-jvjwzCPysVTQ53F4KqwmcqZw73BqHMk0UUZrMP9P4OtJ/YHrfs122ikTqhVA2upe0P/Qz9l8HVlhEifVYB2q9A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-matcher/-/multiaddr-matcher-3.0.2.tgz", + "integrity": "sha512-iphGQJliZxe2yKu57bdRDgeS+3znc5uXtMybDO1Wau3rIjas4zjrjlyxmFz3wqyUL9f3VDQwas/ZqA7N4QeSfw==", "license": "Apache-2.0 OR MIT", "dependencies": { "@multiformats/multiaddr": "^13.0.0" } }, - "node_modules/@multiformats/multiaddr-matcher/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/multiaddr-matcher/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, "node_modules/@multiformats/multiaddr-to-uri": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-12.0.0.tgz", @@ -5003,34 +4501,13 @@ "@multiformats/multiaddr": "^13.0.0" } }, - "node_modules/@multiformats/multiaddr-to-uri/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/multiaddr-to-uri/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, "node_modules/@multiformats/multiaddr/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/@multiformats/uri-to-multiaddr": { @@ -5043,31 +4520,10 @@ "is-ip": "^5.0.0" } }, - "node_modules/@multiformats/uri-to-multiaddr/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/uri-to-multiaddr/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, "node_modules/@noble/ciphers": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.1.1.tgz", - "integrity": "sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.2.0.tgz", + "integrity": "sha512-Z6pjIZ/8IJcCGzb2S/0Px5J81yij85xASuk1teLNeg75bfT07MV3a/O2Mtn1I2se43k3lkVEcFaR10N4cgQcZA==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -5077,12 +4533,12 @@ } }, "node_modules/@noble/curves": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", - "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.2.0.tgz", + "integrity": "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ==", "license": "MIT", "dependencies": { - "@noble/hashes": "2.0.1" + "@noble/hashes": "2.2.0" }, "engines": { "node": ">= 20.19.0" @@ -5092,9 +4548,9 @@ } }, "node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -5141,70 +4597,10 @@ "node": ">= 8" } }, - "node_modules/@nodeutils/defaults-deep": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@nodeutils/defaults-deep/-/defaults-deep-1.1.0.tgz", - "integrity": "sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg==", - "dev": true, - "license": "ISC", - "dependencies": { - "lodash": "^4.15.0" - } - }, - "node_modules/@npmcli/agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", - "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", - "license": "ISC", - "optional": true, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^11.2.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@npmcli/fs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", - "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", - "license": "ISC", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", - "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", - "license": "ISC", - "optional": true, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@oceanprotocol/contracts": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@oceanprotocol/contracts/-/contracts-2.7.0.tgz", - "integrity": "sha512-6rXT/agjty4VyT0j/Do13Rf8dH0eweL57e7rFSv4KmANFx3wdTcQoInHZsoRpwXZf1MmMgHVWL4/ZvqHtRqMRA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@oceanprotocol/contracts/-/contracts-2.9.0.tgz", + "integrity": "sha512-B3dQNxIYD7bASNE066vfZu6Ik5uHZ/1c+QEcUvAsfoNvUUJ5+uQfIvhwrpdMCza1GtE11EW2glDPZvbr2LwFsg==", "license": "Apache-2.0" }, "node_modules/@oceanprotocol/ddo-js": { @@ -5250,9 +4646,9 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", - "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -5331,16 +4727,17 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", - "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.11.tgz", + "integrity": "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^11.0.2", + "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", - "fast-content-type-parse": "^3.0.0", + "content-type": "^2.0.0", + "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, "engines": { @@ -5360,6 +4757,20 @@ "node": ">= 20" } }, + "node_modules/@octokit/request/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/@octokit/rest": { "version": "22.0.1", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz", @@ -5387,18 +4798,18 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", "license": "Apache-2.0", "engines": { "node": ">=8.0.0" } }, "node_modules/@opentelemetry/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.0.tgz", - "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.9.0.tgz", + "integrity": "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -5411,137 +4822,137 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", - "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", + "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", "license": "Apache-2.0", "engines": { "node": ">=14" } }, "node_modules/@peculiar/asn1-cms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", - "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz", + "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-x509-attr": "^2.8.0", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-csr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", - "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz", + "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", - "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz", + "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", - "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz", + "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", "license": "MIT", "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", + "@peculiar/asn1-cms": "^2.8.0", + "@peculiar/asn1-pkcs8": "^2.8.0", + "@peculiar/asn1-rsa": "^2.8.0", + "@peculiar/asn1-schema": "^2.8.0", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", - "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz", + "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", - "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz", + "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", "license": "MIT", "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pfx": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", + "@peculiar/asn1-cms": "^2.8.0", + "@peculiar/asn1-pfx": "^2.8.0", + "@peculiar/asn1-pkcs8": "^2.8.0", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-x509-attr": "^2.8.0", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", - "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz", + "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", + "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", "license": "MIT", "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-x509": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", - "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz", + "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", - "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.8.0.tgz", + "integrity": "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, @@ -5557,26 +4968,35 @@ "node": ">=8.0.0" } }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, "node_modules/@peculiar/webcrypto": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", - "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-schema": "^2.7.0", "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2", - "webcrypto-core": "^1.8.0" + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" }, "engines": { - "node": ">=10.12.0" + "node": ">=14.18.0" } }, "node_modules/@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-2.0.0.tgz", + "integrity": "sha512-r10lkuy6BNfRmyYdRAfgu6dq0HOmyIV2OLhXWE3gDEPBdX1b8miztJVyX/UxWhLwemNyDP3CLZHpDxDwSY0xaA==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -5587,7 +5007,6 @@ "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.0", "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", "tslib": "^2.8.1", "tsyringe": "^4.10.0" }, @@ -5621,13 +5040,13 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/pkgr" @@ -5646,25 +5065,24 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", "license": "BSD-3-Clause", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@protobufjs/aspromise": "^1.1.1" } }, "node_modules/@protobufjs/float": { @@ -5673,12 +5091,6 @@ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause" }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", @@ -5692,24 +5104,24 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", "license": "BSD-3-Clause" }, "node_modules/@rdfjs/data-model": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.1.1.tgz", - "integrity": "sha512-6mcOI4DjIPS6MOZw23H8oAdujHCk5gippVNQ7mKwliYTvTNh+uqRM91B9OLqhoAoNcQ3t49Dx2ooIMRG9/6ooA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.1.2.tgz", + "integrity": "sha512-yoSVlyCltqbaCTse3uSdf5Vo3q4UskcTm+3klaUQTwOq7Z5aCZLtLPZatXTPzr+S0WEcjTZvD++A+r3QmgamsA==", "license": "MIT", "bin": { "rdfjs-data-model-test": "bin/test.js" } }, "node_modules/@rdfjs/dataset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@rdfjs/dataset/-/dataset-2.0.2.tgz", - "integrity": "sha512-6YJx+5n5Uxzq9dd9I0GGcIo6eopZOPfcsAfxSGX5d+YBzDgVa1cbtEBFnaPyPKiQsOm4+Cr3nwypjpg02YKPlA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@rdfjs/dataset/-/dataset-2.0.3.tgz", + "integrity": "sha512-Ur6M0nDFXMJWNYe1IBDBaQV/nIwRbe3+I58syOHnzZNbe7ZHumUOS/0XQ1+9WYF31tmQU7w741MRn6W3J+OTeg==", "license": "MIT", "bin": { "rdfjs-dataset-test": "bin/test.js" @@ -5757,804 +5169,145 @@ "node_modules/@rdfjs/types": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-2.0.1.tgz", - "integrity": "sha512-uyAzpugX7KekAXAHq26m3JlUIZJOC0uSBhpnefGV5i15bevDyyejoB7I+9MKeUrzXD8OOUI3+4FeV1wwQr5ihA==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/fnv1a": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/fnv1a/-/fnv1a-3.1.0.tgz", - "integrity": "sha512-KV321z5m/0nuAg83W1dPLy85HpHDk7Sdi4fJbwvacWsEhAh+rZUW4ZfGcXmUIvjZg4ss2bcwNlRhJ7GBEUG08w==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/commons/node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", - "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "type-detect": "^4.1.0" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", - "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", - "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", - "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", - "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", - "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.23.11", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.11.tgz", - "integrity": "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", - "@smithy/uuid": "^1.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", - "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz", - "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.13.1", - "@smithy/util-hex-encoding": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz", - "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz", - "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz", - "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz", - "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.15", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", - "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.13.tgz", - "integrity": "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/chunked-blob-reader": "^5.2.2", - "@smithy/chunked-blob-reader-native": "^4.2.3", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", - "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.12.tgz", - "integrity": "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", - "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", - "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.12.tgz", - "integrity": "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", - "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.25", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz", - "integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.23.11", - "@smithy/middleware-serde": "^4.2.14", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-middleware": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.4.42", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz", - "integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/service-error-classification": "^4.2.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.12", - "@smithy/uuid": "^1.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz", - "integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.23.11", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", - "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", - "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.4.16", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.16.tgz", - "integrity": "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", - "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.3.12", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", - "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", - "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-uri-escape": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", - "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", - "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", - "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.3.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", - "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-uri-escape": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.5.tgz", - "integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.23.11", - "@smithy/middleware-endpoint": "^4.4.25", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-stream": "^4.5.19", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", - "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", - "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", - "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", - "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", - "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", - "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", - "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", - "license": "Apache-2.0", + "integrity": "sha512-uyAzpugX7KekAXAHq26m3JlUIZJOC0uSBhpnefGV5i15bevDyyejoB7I+9MKeUrzXD8OOUI3+4FeV1wwQr5ihA==", + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@types/node": "*" } }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.41", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz", - "integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/fnv1a": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/fnv1a/-/fnv1a-3.1.0.tgz", + "integrity": "sha512-KV321z5m/0nuAg83W1dPLy85HpHDk7Sdi4fJbwvacWsEhAh+rZUW4ZfGcXmUIvjZg4ss2bcwNlRhJ7GBEUG08w==", + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.44", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz", - "integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==", - "license": "Apache-2.0", + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@smithy/config-resolver": "^4.4.11", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "type-detect": "4.0.8" } }, - "node_modules/@smithy/util-endpoints": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", - "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, + "node_modules/@sinonjs/commons/node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=4" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", - "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", - "license": "Apache-2.0", + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@sinonjs/commons": "^3.0.1" } }, - "node_modules/@smithy/util-middleware": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", - "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", - "license": "Apache-2.0", + "node_modules/@sinonjs/samsam": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", + "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@sinonjs/commons": "^3.0.1", + "type-detect": "^4.1.0" } }, - "node_modules/@smithy/util-retry": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", - "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", + "node_modules/@smithy/core": { + "version": "3.29.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.29.2.tgz", + "integrity": "sha512-DXUk6yU0C1Q1tYvJh1VCtl8QOBcSoZpKwjTPkxT6A4MUQYHvgeKGByL8mrEdxnvhdf9nq5GyzmRb5n/vPgu3Lw==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-stream": { - "version": "4.5.19", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", - "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.7.tgz", + "integrity": "sha512-UEMLOoA0Fl4uYBxh6l0uN0H6EJe/A89OGeDNTteQeXpJ20BcpfIr4wlCY9pel1jEAUHAxaYwuqrYlrKdXE1GKQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.4.16", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", - "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", + "node_modules/@smithy/fetch-http-handler": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.4.tgz", + "integrity": "sha512-psnst7NZWdAEvJvyW8YZEE7xNVMyLrQFfHtyrVFrxNyy+dKWkQ+rqC6oI5ZhxThpUy9RSfEshgm34zqbOxzsRw==", "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", - "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", + "node_modules/@smithy/node-http-handler": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.4.tgz", + "integrity": "sha512-BNTop/fSOptmoVk8g+efwHCofFh37g70OWGAFES1TeAAJja1K5aAI8rTE26ETSc5k8IQuWY2kAIoPla01NgYrA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-waiter": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.13.tgz", - "integrity": "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ==", + "node_modules/@smithy/signature-v4": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.3.tgz", + "integrity": "sha512-8qVKKzqh7naF27ePmx0SkUfnGP/wBI9dyaeAmhHvopnbIlItUAmB/e6PkPCU3rRb2v9BY8D4EZXSoydSibatvw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/core": "^3.29.2", + "@smithy/types": "^4.16.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/uuid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", - "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "node_modules/@smithy/types": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.16.0.tgz", + "integrity": "sha512-aVUabzlBBmY0PfvVgLKQSOGFIL5/7R54JE3uD9a5Ay/jSED61SkuAcCYENNXJzYUvJ1NPrWO0P+rAXHCkbBUKw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -6574,25 +5327,25 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", - "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" } }, "node_modules/@tpluscode/rdf-ns-builders": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tpluscode/rdf-ns-builders/-/rdf-ns-builders-4.3.0.tgz", - "integrity": "sha512-x3uh9mYwAU+PrALaDKhVjml1TCCWWduo6J8rybd9SMEEAoooXq1MYb13MRputjRT/kYaFyCND7LMobzhxZ/+bg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@tpluscode/rdf-ns-builders/-/rdf-ns-builders-5.0.0.tgz", + "integrity": "sha512-rtMFbArdief+s0z2A3TOb/gNe5O5xn9LDiEpilCf6lGYCUIfyqoOvZY80fS/eILwcF2Mj6cUQN1WBQ+1neJmaw==", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^2", - "@rdfjs/namespace": "^2", - "@rdfjs/types": "*", - "@types/rdfjs__namespace": "^2.0.2", - "@zazuko/prefixes": "^2.0.1" + "@rdfjs/data-model": "^2.1.0", + "@rdfjs/namespace": "^2.0.1", + "@rdfjs/types": "^2", + "@types/rdfjs__namespace": "^2.0.10", + "@zazuko/prefixes": "^2.3.0" } }, "node_modules/@types/bn.js": { @@ -6700,9 +5453,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "version": "4.19.9", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz", + "integrity": "sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==", "dev": true, "license": "MIT", "dependencies": { @@ -6755,9 +5508,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", "dev": true, "license": "MIT" }, @@ -6793,12 +5546,12 @@ } }, "node_modules/@types/node": { - "version": "25.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", - "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", + "version": "25.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.5.tgz", + "integrity": "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==", "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/node-cron": { @@ -6825,9 +5578,9 @@ } }, "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", "dev": true, "license": "MIT" }, @@ -6910,6 +5663,7 @@ "version": "15.0.1", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-15.0.1.tgz", "integrity": "sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==", + "dev": true, "license": "MIT" }, "node_modules/@types/ssh2": { @@ -7154,9 +5908,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", "dev": true, "license": "ISC" }, @@ -7198,9 +5952,9 @@ } }, "node_modules/abort-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz", - "integrity": "sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.2.tgz", + "integrity": "sha512-lVgvB2NyPLqbXXhVmXcYFTC1x5K7CiVdPgdY7LGgFQWC8506oN01sPN3i9cl9ynuwF4iJ0TS9exnR7cZ9FuX4w==", "license": "Apache-2.0 OR MIT" }, "node_modules/abstract-level": { @@ -7273,10 +6027,32 @@ "node": ">= 16" } }, + "node_modules/acme-client/node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "bin": { @@ -7303,13 +6079,15 @@ "license": "MIT" }, "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", - "optional": true, + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">= 14" + "node": ">= 6.0.0" } }, "node_modules/aggregate-error": { @@ -7327,9 +6105,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -7407,14 +6185,20 @@ } }, "node_modules/apache-arrow/node_modules/@types/node": { - "version": "24.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.10.tgz", - "integrity": "sha512-+0/4J266CBGPUq/ELg7QUHhN25WYjE0wYTPSQJn1xeu8DOlIOPxXxrNGiLmfAWl7HMMgWFWXpt9IDjMWrF5Iow==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, + "node_modules/apache-arrow/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, "node_modules/append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", @@ -7443,9 +6227,9 @@ "license": "Python-2.0" }, "node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.3.tgz", + "integrity": "sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==", "license": "MIT", "engines": { "node": ">=12.17" @@ -7637,13 +6421,13 @@ } }, "node_modules/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", + "pvutils": "^1.1.5", "tslib": "^2.8.1" }, "engines": { @@ -7706,24 +6490,23 @@ "license": "MIT" }, "node_modules/auto-changelog": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.5.0.tgz", - "integrity": "sha512-UTnLjT7I9U2U/xkCUH5buDlp8C7g0SGChfib+iDrJkamcj5kaMqNKHNfbKJw1kthJUq8sUo3i3q2S6FzO/l/wA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.6.0.tgz", + "integrity": "sha512-jJgUkuWXQ7fPLPXOMQk/XSSmy7KvzpzhjJa6w660dq1KTEez/GW2CPckBra3jMMMMpcwxp84bOslo29qRCewzA==", "dev": true, "license": "MIT", "dependencies": { "commander": "^7.2.0", - "handlebars": "^4.7.7", + "handlebars": "^4.7.9", "import-cwd": "^3.0.0", - "node-fetch": "^2.6.1", - "parse-github-url": "^1.0.3", - "semver": "^7.3.5" + "parse-github-url": "^1.0.4", + "semver": "^7.8.1" }, "bin": { "auto-changelog": "src/index.js" }, "engines": { - "node": ">=8.3" + "node": ">= 10" } }, "node_modules/available-typed-arrays": { @@ -7742,25 +6525,17 @@ } }, "node_modules/axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, - "node_modules/axios/node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -7807,13 +6582,16 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.42", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", + "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/basic-ftp": { @@ -7867,30 +6645,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -7912,15 +6666,15 @@ "license": "MIT" }, "node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -7931,7 +6685,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.14.0", + "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -7963,9 +6717,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", "dev": true, "license": "MIT", "dependencies": { @@ -8022,9 +6776,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", + "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==", "dev": true, "funding": [ { @@ -8042,11 +6796,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001800", + "electron-to-chromium": "^1.5.387", + "node-releases": "^2.0.50", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -8144,192 +6898,73 @@ "node_modules/c12": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz", - "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^17.2.3", - "exsolve": "^1.0.8", - "giget": "^2.0.0", - "jiti": "^2.6.1", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^2.0.0", - "pkg-types": "^2.3.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "*" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/c12/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/c12/node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/c12/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/cacache": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", - "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", - "license": "ISC", - "optional": true, - "dependencies": { - "@npmcli/fs": "^5.0.0", - "fs-minipass": "^3.0.0", - "glob": "^13.0.0", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/cacache/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "optional": true, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "license": "BlueOak-1.0.0", - "optional": true, + "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==", + "dev": true, + "license": "MIT", "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" + "chokidar": "^5.0.0", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^17.2.3", + "exsolve": "^1.0.8", + "giget": "^2.0.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.0.0", + "pkg-types": "^2.3.0", + "rc9": "^2.1.2" }, - "engines": { - "node": "18 || 20 || >=22" + "peerDependencies": { + "magicast": "*" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": "20 || >=22" + "peerDependenciesMeta": { + "magicast": { + "optional": true + } } }, - "node_modules/cacache/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "optional": true, + "node_modules/c12/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.5" + "readdirp": "^5.0.0" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">= 20.19.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/cacache/node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", - "license": "MIT", - "optional": true, + "node_modules/c12/node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://dotenvx.com" } }, - "node_modules/cacache/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", - "optional": true, - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, + "node_modules/c12/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">= 20.19.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/caching-transform": { @@ -8349,14 +6984,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -8416,9 +7051,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001767", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz", - "integrity": "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==", + "version": "1.0.30001803", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", + "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==", "dev": true, "funding": [ { @@ -8443,9 +7078,9 @@ "license": "Apache-2.0" }, "node_modules/cborg": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz", - "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.7.tgz", + "integrity": "sha512-rGg2MG9zZEUKtKqjkBppIWUecTXf9N1vs1Qru43vJWoDaODhCrtmzdehCaA/aq/c1cPI5A0kPrJ5Tf+jIfhV4w==", "license": "Apache-2.0", "bin": { "cborg": "lib/bin.js" @@ -8502,9 +7137,9 @@ } }, "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", "dev": true, "license": "MIT" }, @@ -8537,6 +7172,15 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/ci-info": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", @@ -8805,15 +7449,15 @@ } }, "node_modules/command-line-args": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz", - "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.2.tgz", + "integrity": "sha512-AIjYVxrV9X752LmPDLbVYv8aMCuHPSLZJXEo2qo/xJfv+NYhaZ4sMSF01rM+gHPaMgvPM0l5D/F+Qx+i2WfSmQ==", "license": "MIT", "dependencies": { - "array-back": "^6.2.2", + "array-back": "^6.2.3", "find-replace": "^5.0.2", "lodash.camelcase": "^4.3.0", - "typical": "^7.2.0" + "typical": "^7.3.0" }, "engines": { "node": ">=12.20" @@ -8828,15 +7472,15 @@ } }, "node_modules/command-line-usage": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", - "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.4.tgz", + "integrity": "sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==", "license": "MIT", "dependencies": { "array-back": "^6.2.2", "chalk-template": "^0.4.0", - "table-layout": "^4.1.0", - "typical": "^7.1.1" + "table-layout": "^4.1.1", + "typical": "^7.3.0" }, "engines": { "node": ">=12.20.0" @@ -8911,9 +7555,9 @@ } }, "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "dev": true, "license": "MIT" }, @@ -9024,9 +7668,9 @@ } }, "node_modules/cpu-features/node_modules/nan": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", - "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.28.0.tgz", + "integrity": "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==", "license": "MIT", "optional": true }, @@ -9085,13 +7729,12 @@ } }, "node_modules/data-uri-to-buffer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-7.0.0.tgz", - "integrity": "sha512-CuRUx0TXGSbbWdEci3VK/XOZGP3n0P4pIKpsqpVtBqaIIuj3GKK8H45oAqA4Rg8FHipc+CzRdUzmD4YQXxv66Q==", - "dev": true, + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 12" } }, "node_modules/data-view-buffer": { @@ -9149,36 +7792,38 @@ } }, "node_modules/datastore-core": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-11.0.2.tgz", - "integrity": "sha512-0pN4hMcaCWcnUBo5OL/8j14Lt1l/p1v2VvzryRYeJAKRLqnFrzy2FhAQ7y0yTA63ki760ImQHfm2XlZrfIdFpQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-12.0.1.tgz", + "integrity": "sha512-pfgIE5LG0Z5oyc6TxiLaF/0j4Gh1Yrs2+Ck/qssf9Oxw4s4YKC3zpqifuzThnKakAFWONr/vRv+66Koc0yJvyA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/logger": "^6.0.0", - "interface-datastore": "^9.0.0", - "interface-store": "^7.0.0", - "it-drain": "^3.0.9", - "it-filter": "^3.1.3", - "it-map": "^3.1.3", - "it-merge": "^3.0.11", + "@libp2p/logger": "^6.2.4", + "abort-error": "^1.0.2", + "interface-datastore": "^10.0.0", + "interface-store": "^8.0.0", + "it-drain": "^3.0.10", + "it-filter": "^3.1.4", + "it-map": "^3.1.4", + "it-merge": "^3.0.12", "it-pipe": "^3.0.1", - "it-sort": "^3.0.8", - "it-take": "^3.0.8" + "it-sort": "^3.0.9", + "it-take": "^3.0.9" } }, "node_modules/datastore-level": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/datastore-level/-/datastore-level-12.0.2.tgz", - "integrity": "sha512-BMXRvFhDfx7CxlUj7XBAtPt6V2D9CWnKwRGTvZ3KQ4BBTJoXL66UDTxi52rzYLKfd2QppwaO2S+ZhLWhF5PbQQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/datastore-level/-/datastore-level-13.0.1.tgz", + "integrity": "sha512-QDXcCj3Hc4zorCMTqCWtHl0KcfFkygGX3gVxAcFKNbA3kPGXeImOgFbJT+lLavg0C2C4gkgSZ/QlvoCD2mrObQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "datastore-core": "^11.0.0", - "interface-datastore": "^9.0.0", - "interface-store": "^7.0.0", - "it-filter": "^3.1.3", - "it-map": "^3.1.3", - "it-sort": "^3.0.8", - "it-take": "^3.0.8", + "abort-error": "^1.0.2", + "datastore-core": "^12.0.0", + "interface-datastore": "^10.0.0", + "interface-store": "^8.0.0", + "it-filter": "^3.1.4", + "it-map": "^3.1.4", + "it-sort": "^3.0.9", + "it-take": "^3.0.9", "level": "^10.0.0", "race-signal": "^2.0.0" } @@ -9218,9 +7863,9 @@ } }, "node_modules/debug-logfmt": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/debug-logfmt/-/debug-logfmt-1.4.7.tgz", - "integrity": "sha512-NzGmPp2Fru8KerWcg4zfiPCC1rspLUPqfH5Duz/ZF49CqO97odSx7eFjBNiOQzNQYfvpEEPrxNjyA436lITQkQ==", + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/debug-logfmt/-/debug-logfmt-1.4.13.tgz", + "integrity": "sha512-LF2JDEigILRayrszaLwXq1UX8sC2hbDRfbV29kfq5r6u6haBAxKWAECb2e7fWmivKe+AoC4u5/Z/gxQOwVEyMA==", "license": "MIT", "dependencies": { "@kikobeats/time-span": "~1.0.5", @@ -9229,6 +7874,9 @@ }, "engines": { "node": ">= 8" + }, + "peerDependencies": { + "debug": "*" } }, "node_modules/decamelize": { @@ -9380,9 +8028,9 @@ } }, "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "dev": true, "license": "MIT" }, @@ -9496,9 +8144,9 @@ } }, "node_modules/docker-modem": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", - "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.7.tgz", + "integrity": "sha512-XJgGhoR/CLpqshm4d3L7rzH6t8NgDFUIIpztYlLHIApeJjMZKYJMz2zxPsYxnejq5h3ELYSw/RBsi3t5h7gNTA==", "license": "Apache-2.0", "dependencies": { "debug": "^4.1.1", @@ -9525,15 +8173,15 @@ } }, "node_modules/dockerode": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.9.tgz", - "integrity": "sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.12.tgz", + "integrity": "sha512-/bCZd6KlGcjZO8Buqmi/vXuqEGVEZ0PNjx/biBNqJD3MhK9DmdiAuKxqfNhflgDESDIiBz3qF+0e55+CpnrUcw==", "license": "Apache-2.0", "dependencies": { "@balena/dockerignore": "^1.0.2", "@grpc/grpc-js": "^1.11.1", "@grpc/proto-loader": "^0.7.13", - "docker-modem": "^5.0.6", + "docker-modem": "^5.0.7", "protobufjs": "^7.3.2", "tar-fs": "^2.1.4", "uuid": "^10.0.0" @@ -9542,19 +8190,6 @@ "node": ">= 8.0" } }, - "node_modules/dockerode/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -9639,9 +8274,9 @@ } }, "node_modules/eciesjs": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.17.tgz", - "integrity": "sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w==", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.18.tgz", + "integrity": "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==", "license": "MIT", "dependencies": { "@ecies/ciphers": "^0.2.5", @@ -9656,13 +8291,13 @@ } }, "node_modules/eciesjs/node_modules/@ecies/ciphers": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.5.tgz", - "integrity": "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.6.tgz", + "integrity": "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==", "license": "MIT", "engines": { "bun": ">=1", - "deno": ">=2", + "deno": ">=2.7.10", "node": ">=16" }, "peerDependencies": { @@ -9715,9 +8350,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.389", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", + "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", "dev": true, "license": "ISC" }, @@ -9784,9 +8419,9 @@ "license": "MIT" }, "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -9852,6 +8487,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -9871,16 +8525,16 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz", + "integrity": "sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", @@ -9892,16 +8546,16 @@ "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", - "safe-array-concat": "^1.1.3" + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -9939,15 +8593,18 @@ } }, "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -9970,9 +8627,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9983,32 +8640,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/escalade": { @@ -10242,15 +8899,15 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -10264,9 +8921,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -10372,9 +9029,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -10406,9 +9063,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -10445,9 +9102,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -10456,9 +9113,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -10468,6 +9125,28 @@ "node": "*" } }, + "node_modules/eslint-plugin-n/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -10490,9 +9169,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -10547,9 +9226,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -10559,15 +9238,37 @@ "node": "*" } }, + "node_modules/eslint-plugin-node/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", - "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz", + "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.1", - "synckit": "^0.11.12" + "synckit": "^0.11.13" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -10640,9 +9341,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -10664,9 +9365,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -10676,24 +9377,6 @@ "node": "*" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-security": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", @@ -10764,9 +9447,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -10775,9 +9458,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -11005,15 +9688,15 @@ } }, "node_modules/ethereumjs-util/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", "license": "MIT" }, "node_modules/ethers": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", - "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.17.0.tgz", + "integrity": "sha512-BpyrpIPJ3ydEVow8zGaz1DuPS7YU8DcWxuBnY9a0UA/lvAPwrMr+EPXsfrul628SRaekPNeIM4UFh/91GWZang==", "funding": [ { "type": "individual", @@ -11026,13 +9709,13 @@ ], "license": "MIT", "dependencies": { - "@adraffy/ens-normalize": "1.10.1", + "@adraffy/ens-normalize": "1.11.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", "tslib": "2.7.0", - "ws": "8.17.1" + "ws": "8.21.0" }, "engines": { "node": ">=14.0.0" @@ -11083,27 +9766,6 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, - "node_modules/ethers/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -11155,14 +9817,14 @@ "optional": true }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", + "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", @@ -11181,7 +9843,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -11218,34 +9880,17 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", + "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", + "dev": true, "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -11324,49 +9969,15 @@ } }, "node_modules/fast-wrap-ansi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.0.tgz", - "integrity": "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", "dev": true, "license": "MIT", "dependencies": { "fast-string-width": "^3.0.2" } }, - "node_modules/fast-xml-builder": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.3.tgz", - "integrity": "sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.1.3" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", - "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "fast-xml-builder": "^1.0.0", - "strnum": "^2.1.2" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -11564,9 +10175,9 @@ "license": "Apache-2.0" }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -11577,9 +10188,9 @@ "license": "MIT" }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -11629,16 +10240,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -11711,19 +10322,6 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -11768,18 +10366,21 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -11828,9 +10429,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { @@ -11921,19 +10522,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", - "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/get-uri": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-7.0.0.tgz", @@ -11949,6 +10537,16 @@ "node": ">= 14" } }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-7.0.0.tgz", + "integrity": "sha512-CuRUx0TXGSbbWdEci3VK/XOZGP3n0P4pIKpsqpVtBqaIIuj3GKK8H45oAqA4Rg8FHipc+CzRdUzmD4YQXxv66Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/giget": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", @@ -12030,13 +10628,13 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -12126,9 +10724,9 @@ "license": "MIT" }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12239,6 +10837,12 @@ "node": ">= 0.8" } }, + "node_modules/hash-base/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/hash-base/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -12302,19 +10906,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasha/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/hasha/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -12332,9 +10923,9 @@ "license": "MIT" }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -12380,13 +10971,6 @@ "dev": true, "license": "MIT" }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause", - "optional": true - }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -12408,31 +10992,40 @@ } }, "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-8.0.0.tgz", + "integrity": "sha512-7pose0uGgrCJeH2Qh4JcNhWZp3u/oNrWjNYDK4ydOLxOpTw8V8ogHFAmkz0VWq96JBFj4umVJpvmQi287rSYLg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "agent-base": "^7.1.0", + "agent-base": "8.0.0", "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-8.0.0.tgz", + "integrity": "sha512-QT8i0hCz6C/KQ+KTAbSNwCHDGdmUJl2tp2ZpNlGSWCfhUNVbYG2WLE3MdZGBAgXPV4GAvjGMxo+C1hroyxmZEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", - "optional": true, "dependencies": { - "agent-base": "^7.1.2", + "agent-base": "6", "debug": "4" }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, "node_modules/humanhash": { @@ -12448,31 +11041,25 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "bin/uuid" } }, "node_modules/hyperdiff": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/hyperdiff/-/hyperdiff-2.0.23.tgz", - "integrity": "sha512-C6MU5mCx0wHqcOG5tB0hH1XMEYj00/TlhTYROigua6bY3+qhDuNIxBfJAtuMTKygjX0Q/eexyLH8HcYo9qXF8g==", + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/hyperdiff/-/hyperdiff-2.0.25.tgz", + "integrity": "sha512-inah02XAc4UeKO2bu22vtb/AkCMsjgtykPE1eidmg2gCF7G8+ERixJxExuEnTG2g1GVBI/bcSLt7+mINremnBA==", "license": "MIT", "dependencies": { "debug-logfmt": "~1.4.0", - "lodash": "~4.17.21" + "lodash": "~4.18.1" }, "engines": { "node": ">= 8" } }, - "node_modules/hyperdiff/node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -12613,29 +11200,33 @@ "license": "ISC" }, "node_modules/interface-datastore": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-9.0.2.tgz", - "integrity": "sha512-jebn+GV/5LTDDoyicNIB4D9O0QszpPqT09Z/MpEWvf3RekjVKpXJCDguM5Au2fwIFxFDAQMZe5bSla0jMamCNg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-10.0.1.tgz", + "integrity": "sha512-DYMj/Og5Cz1Qwkx6/x5KRvR8SYEX7rVAv3KKCm2NzTwWSfpNAC4PahjcYbHyoZBP6zPWrhQv5n5wE+vaDdgSAg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "interface-store": "^7.0.0", - "uint8arrays": "^5.1.0" + "abort-error": "^1.0.2", + "interface-store": "^8.0.0", + "uint8arrays": "^6.1.1" } }, "node_modules/interface-datastore/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/interface-store": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-7.0.1.tgz", - "integrity": "sha512-OPRRUO3Cs6Jr/t98BrJLQp1jUTPgrRH0PqFfuNoPAqd+J7ABN1tjFVjQdaOBiybYJTS/AyBSZnZVWLPvp3dW3w==", - "license": "Apache-2.0 OR MIT" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-8.0.0.tgz", + "integrity": "sha512-e2+s3EEROzM+Wlas4hU3zveTUscvVMf1BOvdsJfpzFm19SoEXLVadpACjWOnM491HqGpvtfFnevyiaN8W+I6Eg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "abort-error": "^1.0.2" + } }, "node_modules/internal-slot": { "version": "1.1.0", @@ -12653,10 +11244,10 @@ } }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "devOptional": true, + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 12" @@ -12675,9 +11266,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", "license": "MIT", "engines": { "node": ">= 10" @@ -12790,13 +11381,13 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -12856,6 +11447,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-electron": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", @@ -13024,9 +11631,9 @@ } }, "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", "license": "MIT", "engines": { "node": ">=16" @@ -13151,6 +11758,18 @@ "protocols": "^2.0.1" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", @@ -13294,9 +11913,9 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, "node_modules/isexe": { @@ -13385,6 +12004,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", "bin": { @@ -13452,45 +12072,45 @@ } }, "node_modules/it-all": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.9.tgz", - "integrity": "sha512-fz1oJJ36ciGnu2LntAlE6SA97bFZpW7Rnt0uEc1yazzR2nKokZLr8lIRtgnpex4NsmaBcvHF+Z9krljWFy/mmg==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.11.tgz", + "integrity": "sha512-Gvqj6MO4GMLnFdtE68HZRpGBskNC+9+GQ+JevTGNYLyhjUuPhjDLU3jN1LpBemXJDW1bRSkczqA/qGyKlPKrcQ==", "license": "Apache-2.0 OR MIT" }, "node_modules/it-drain": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.10.tgz", - "integrity": "sha512-0w/bXzudlyKIyD1+rl0xUKTI7k4cshcS43LTlBiGFxI8K1eyLydNPxGcsVLsFVtKh1/ieS8AnVWt6KwmozxyEA==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.12.tgz", + "integrity": "sha512-RaFA9X1PF2Pf1Jlqhgf5PlXLgf6CaZt7tSzhia+EkEVcAJRKa0Uhr8UnjVv0GmOA3Air9jDJfIX2KIvz5hZ1Ag==", "license": "Apache-2.0 OR MIT" }, "node_modules/it-filter": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.4.tgz", - "integrity": "sha512-80kWEKgiFEa4fEYD3mwf2uygo1dTQ5Y5midKtL89iXyjinruA/sNXl6iFkTcdNedydjvIsFhWLiqRPQP4fAwWQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.6.tgz", + "integrity": "sha512-yXiGPAvJn/exXjVFSCMQc3+J/7RLpOMwKoY2DH1yMhF4lYkdRoAdOwU0vnDACAlRAexf7AZvESZIc9mzhEoi/A==", "license": "Apache-2.0 OR MIT", "dependencies": { "it-peekable": "^3.0.0" } }, "node_modules/it-foreach": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-2.1.5.tgz", - "integrity": "sha512-9tIp+NFVODmGV/49JUKVxW3+8RrPkYrmUaXUM4W6lMC5POM/1gegckNjBmDe5xgBa7+RE9HKBmRTAdY5V+bWSQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-2.1.7.tgz", + "integrity": "sha512-HoZgIF7DGU1X/8svRuJ7aPl6sge8W6MQxmMomkeAABNXJXoiXEU0xnvulzncRdd013Kh9SubXWhx6YjYw6lu5A==", "license": "Apache-2.0 OR MIT", "dependencies": { "it-peekable": "^3.0.0" } }, "node_modules/it-length": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-length/-/it-length-3.0.9.tgz", - "integrity": "sha512-cPhRPzyulYqyL7x4sX4MOjG/xu3vvEIFAhJ1aCrtrnbfxloCOtejOONib5oC3Bz8tLL6b6ke6+YHu4Bm6HCG7A==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/it-length/-/it-length-3.0.11.tgz", + "integrity": "sha512-j0uukHdr3zoLm4dcozDoyv5khQrOI8dfXMSSEqaxorfOtleh1KwRVbdnTmzj6HVkHgTM1jcx+bhAcnTkbpHl+g==", "license": "Apache-2.0 OR MIT" }, "node_modules/it-length-prefixed": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-10.0.1.tgz", - "integrity": "sha512-BhyluvGps26u9a7eQIpOI1YN7mFgi8lFwmiPi07whewbBARKAG9LE09Odc8s1Wtbt2MB6rNUrl7j9vvfXTJwdQ==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-10.0.2.tgz", + "integrity": "sha512-RrNBs4d7baK8AKGHleC55l/JtvzxDw6DPXs3CvFgQwdwFzLBFDvlpKgDDNDFwXJjPSy1nEX1A44nL110+EKc3g==", "license": "Apache-2.0 OR MIT", "dependencies": { "it-reader": "^6.0.1", @@ -13498,52 +12118,64 @@ "uint8-varint": "^2.0.1", "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + } + }, + "node_modules/it-length-prefixed/node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-length-prefixed/node_modules/uint8-varint": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.5.tgz", + "integrity": "sha512-jeFLbL/x30wBRnWjKE1qVBXeumG46r7XmYkpis955lTQ+blccGKFrOsSMHlxePwYB1pI7L8YPHz1t4jLxEs3nA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" } }, "node_modules/it-length-prefixed/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.1.tgz", + "integrity": "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "multiformats": "^13.0.0" } }, "node_modules/it-map": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.4.tgz", - "integrity": "sha512-QB9PYQdE9fUfpVFYfSxBIyvKynUCgblb143c+ktTK6ZuKSKkp7iH58uYFzagqcJ5HcqIfn1xbfaralHWam+3fg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.6.tgz", + "integrity": "sha512-wCix0FXImtIPIxhCnbz35RqWs00e/CReSZX9nZq1j46JcAzBBp57ob9/2l1WnDYEaUURIR8xCyg2NsWbOwBJFQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "it-peekable": "^3.0.0" } }, "node_modules/it-merge": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.12.tgz", - "integrity": "sha512-nnnFSUxKlkZVZD7c0jYw6rDxCcAQYcMsFj27thf7KkDhpj0EA0g9KHPxbFzHuDoc6US2EPS/MtplkNj8sbCx4Q==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.14.tgz", + "integrity": "sha512-D3t1Go2G2SQMkTujaA6EVojJPJKA9pFksxlSPDRBfrHKhWl6O40vEP7Itr5eCAjyCQH5p9+BFFVIy9bhLM4ZuQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "it-queueless-pushable": "^2.0.0" } }, "node_modules/it-parallel": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.13.tgz", - "integrity": "sha512-85PPJ/O8q97Vj9wmDTSBBXEkattwfQGruXitIzrh0RLPso6RHfiVqkuTqBNufYYtB1x6PSkh0cwvjmMIkFEPHA==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.16.tgz", + "integrity": "sha512-qr3nTgj4fraSfr6Ix9JkHsy/Yb/4vmS3QIAu3fsX52r2SOTLbohXoixKp6AIhTJcorpKwjP0VFcpHr5V54jivA==", "license": "Apache-2.0 OR MIT", "dependencies": { "p-defer": "^4.0.1" } }, "node_modules/it-peekable": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.8.tgz", - "integrity": "sha512-7IDBQKSp/dtBxXV3Fj0v3qM1jftJ9y9XrWLRIuU1X6RdKqWiN60syNwP0fiDxZD97b8SYM58dD3uklIk1TTQAw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.10.tgz", + "integrity": "sha512-2E6+p1pelZOhzp69aaiiBuEybWzAl10uYbIdCR3Pxy8bFNnS/kgpbLtGbNbIZ6RVdU7yHHkmATYwjy52GfFEKA==", "license": "Apache-2.0 OR MIT" }, "node_modules/it-pipe": { @@ -13562,42 +12194,42 @@ } }, "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.4.tgz", + "integrity": "sha512-WSD7Ss4oCRfDZJT4ldLWr0Bom/muY90xxoJ5PQnU3uSKf0kxCOeehqZtiJX1ARqn+ymXGh1bxpDW9bDNHp2ivQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "p-defer": "^4.0.0" } }, "node_modules/it-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/it-queue/-/it-queue-1.1.1.tgz", - "integrity": "sha512-yeYCV22WF1QDyb3ylw+g3TGEdkmnoHUH2mc12QoGOQuxW4XP1V7Zd3BfsEF1iq2IFBwIK7wCPUcRLTAQVeZ3SQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/it-queue/-/it-queue-1.1.4.tgz", + "integrity": "sha512-cGH0+YfMPmwQ+lV+MhJcOXqOgE04h0zQCXvDUmvGGTyW0VqxJZbi7V+PQFEuPVN/5dHQg5RY9aVjMCgmxXaE5Q==", "license": "Apache-2.0 OR MIT", "dependencies": { - "abort-error": "^1.0.1", + "abort-error": "^1.0.2", "it-pushable": "^3.2.3", - "main-event": "^1.0.0", - "race-event": "^1.3.0", + "main-event": "^1.0.1", + "race-event": "^1.6.1", "race-signal": "^2.0.0" } }, "node_modules/it-queueless-pushable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/it-queueless-pushable/-/it-queueless-pushable-2.0.3.tgz", - "integrity": "sha512-USa5EzTvmQswOcVE7+o6qsj2o2G+6KHCxSogPOs23sGYkDWFidhqVO7dAvv6ve/Z+Q+nvxpEa9rrRo6VEK7w4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/it-queueless-pushable/-/it-queueless-pushable-2.0.5.tgz", + "integrity": "sha512-BaKqGLL1AQMR1AEaxiM09vzJQVXHHhfhh9UV0qPqORw/8Rm8igDQqT1qHregfHIb1NIW9jxQ/aXBibHJyuivuQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "abort-error": "^1.0.1", + "abort-error": "^1.0.2", "p-defer": "^4.0.1", "race-signal": "^2.0.0" } }, "node_modules/it-reader": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.4.tgz", - "integrity": "sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.5.tgz", + "integrity": "sha512-xdSVkCsVyWmKaE7ZIlqb1QbzitY7Zty7//F2YeZ/9Py5i3RzQHVoPqlHELH+1EouumUdPyfuKoANJ7Q5w4IEBg==", "license": "Apache-2.0 OR MIT", "dependencies": { "it-stream-types": "^2.0.1", @@ -13609,30 +12241,30 @@ } }, "node_modules/it-sort": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-sort/-/it-sort-3.0.9.tgz", - "integrity": "sha512-jsM6alGaPiQbcAJdzMsuMh00uJcI+kD9TBoScB8TR75zUFOmHvhSsPi+Dmh2zfVkcoca+14EbfeIZZXTUGH63w==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/it-sort/-/it-sort-3.0.11.tgz", + "integrity": "sha512-eZ22LAoNLx4i4gVV44tJPoUYf/o+mHKa6+OigdVH/hmsdA2qoJN6MNPvKZyZKBf6+S/8PBE44zyvkzdYGkRhbA==", "license": "Apache-2.0 OR MIT", "dependencies": { "it-all": "^3.0.0" } }, "node_modules/it-stream-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", - "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.4.tgz", + "integrity": "sha512-tsX+klvMQ53J4Jm2B52vCIs7WD609ck+VS9X2TKMEv7VPY9VwaYKmSWyHek5QS0wHBtP0bWj9KMqCtAHgVKiXw==", "license": "Apache-2.0 OR MIT" }, "node_modules/it-take": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-take/-/it-take-3.0.9.tgz", - "integrity": "sha512-XMeUbnjOcgrhFXPUqa7H0VIjYSV/BvyxxjCp76QHVAFDJw2LmR1SHxUFiqyGeobgzJr7P2ZwSRRJQGn4D2BVlA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/it-take/-/it-take-3.0.11.tgz", + "integrity": "sha512-zvoeEjLViGFyhYT5KNCgmcIH90Si8lCve4aTMvgej/ZQRfB9YzrcJW3UHIJjbQ9TiAnsT4vsWDImEFQNk5xmnA==", "license": "Apache-2.0 OR MIT" }, "node_modules/it-to-browser-readablestream": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/it-to-browser-readablestream/-/it-to-browser-readablestream-2.0.12.tgz", - "integrity": "sha512-9pcVGxY8jrfMUgCqPrxjVN0bl6fQXCK1NEbUq5Bi+APlr3q0s2AsQINBPcWYgJbMnSHAfoRDthsi4GHqtkvHgw==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/it-to-browser-readablestream/-/it-to-browser-readablestream-2.0.14.tgz", + "integrity": "sha512-YyTLGvX5ufvukf05ZQCBEQO0ZyFmI9gxOEZ5yO1oQCnAL8Zlwmep7ty8RN2qg27oe1eu/qBQG5P79qS59Az8HA==", "license": "Apache-2.0 OR MIT", "dependencies": { "get-iterator": "^2.0.1" @@ -13673,9 +12305,9 @@ } }, "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, "license": "MIT", "bin": { @@ -13696,10 +12328,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -13750,6 +12392,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-with-bigint": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", + "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -13911,46 +12560,19 @@ "node-fetch": "^3.2.10" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" - }, - "peerDependencies": { - "ky": ">=0.31.4", - "web-streams-polyfill": ">=3.2.1" - }, - "peerDependenciesMeta": { - "web-streams-polyfill": { - "optional": true - } - } - }, - "node_modules/ky-universal/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/ky-universal/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" + }, + "peerDependencies": { + "ky": ">=0.31.4", + "web-streams-polyfill": ">=3.2.1" + }, + "peerDependenciesMeta": { + "web-streams-polyfill": { + "optional": true + } } }, "node_modules/level": { @@ -14032,59 +12654,47 @@ } }, "node_modules/libp2p": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-3.1.3.tgz", - "integrity": "sha512-Jgl6Km1PfFTKR7krDNDxuuxQ6ya3D6VHFOi/XYJA539F62PmbxOQLd+nqbqozwB9BgJVTxaXRVmGTKo7dyrdQw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-3.3.5.tgz", + "integrity": "sha512-4pton1K8G3CNoamj6Vj8THRbpy4KFDjoxNOcOUZk+V5Yim3krp2IYeiw4LA0PhwCKufKf9jKvnaADkYnlQEbRw==", "license": "Apache-2.0 OR MIT", "dependencies": { "@chainsafe/is-ip": "^2.1.0", "@chainsafe/netmask": "^2.0.0", - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/logger": "^6.2.2", - "@libp2p/multistream-select": "^7.0.10", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/peer-store": "^12.0.10", - "@libp2p/utils": "^7.0.10", + "@libp2p/crypto": "^5.1.21", + "@libp2p/interface": "^3.2.5", + "@libp2p/interface-internal": "^3.1.8", + "@libp2p/logger": "^6.2.10", + "@libp2p/multistream-select": "^7.0.23", + "@libp2p/peer-collections": "^7.0.23", + "@libp2p/peer-id": "^6.0.12", + "@libp2p/peer-store": "^12.0.23", + "@libp2p/utils": "^7.2.4", "@multiformats/dns": "^1.0.6", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", + "@multiformats/multiaddr": "^13.0.3", + "@multiformats/multiaddr-matcher": "^3.0.2", "any-signal": "^4.1.1", - "datastore-core": "^11.0.1", - "interface-datastore": "^9.0.1", + "datastore-core": "^12.0.1", + "interface-datastore": "^10.0.1", "it-merge": "^3.0.12", "it-parallel": "^3.0.13", "main-event": "^1.0.1", - "multiformats": "^13.4.0", + "multiformats": "^14.0.0", "p-defer": "^4.0.1", "p-event": "^7.0.0", - "p-retry": "^7.0.0", - "progress-events": "^1.0.1", + "p-retry": "^8.0.0", + "progress-events": "^1.1.0", "race-signal": "^2.0.0", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/libp2p/node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "uint8arrays": "^6.1.1" } }, "node_modules/libp2p/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/locate-path": { @@ -14289,9 +12899,9 @@ } }, "node_modules/macos-release": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.4.0.tgz", - "integrity": "sha512-wpGPwyg/xrSp4H4Db4xYSeAr6+cFQGHfspHzDUdYxswDnUW0L5Ov63UuJiSr8NMSpyaChO4u1n0MXUvVPtrN6A==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.5.1.tgz", + "integrity": "sha512-Lci/1in+elqZ589PXnfP/iwZXpwQifTM94WJRQwG2tZSdfY7NfB/aUaTARHrohWCgHlXoabeaeXRDOnF5X9JQw==", "dev": true, "license": "MIT", "engines": { @@ -14302,9 +12912,9 @@ } }, "node_modules/main-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/main-event/-/main-event-1.0.1.tgz", - "integrity": "sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/main-event/-/main-event-1.0.4.tgz", + "integrity": "sha512-sKazUjIy2Jalv5lkQ446iOcrx8Q7TkaCuk6xfnzg5uUqMusMLDMPmRDmSNE2kjSVpSTJo4j1bQZusS+Ib7Bvrg==", "license": "Apache-2.0 OR MIT" }, "node_modules/make-dir": { @@ -14323,40 +12933,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.5.tgz", - "integrity": "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==", - "license": "ISC", - "optional": true, - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/agent": "^4.0.0", - "@npmcli/redact": "^4.0.0", - "cacache": "^20.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^6.0.0", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/make-fetch-happen/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -14553,119 +13129,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", - "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^2.0.0", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - }, - "optionalDependencies": { - "iconv-lite": "^0.7.2" - } - }, - "node_modules/minipass-fetch/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", - "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", - "license": "BlueOak-1.0.0", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", - "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minizlib": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", @@ -14685,9 +13148,9 @@ "license": "MIT" }, "node_modules/mocha": { - "version": "11.7.5", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", - "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "version": "11.7.6", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.6.tgz", + "integrity": "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==", "dev": true, "license": "MIT", "dependencies": { @@ -14722,13 +13185,13 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -14802,9 +13265,9 @@ } }, "node_modules/multiformats": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", - "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.4.tgz", + "integrity": "sha512-+SXItmOUWzT0kjlIfkZ4NawJaC9jW/mPlyn902V9Qgpc7YDwdEiwqbiZxTyvC0XWh1jZguXca3A/WQ+UOPRLUA==", "license": "Apache-2.0 OR MIT" }, "node_modules/mute-stream": { @@ -14861,9 +13324,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.16.tgz", + "integrity": "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==", "funding": [ { "type": "github", @@ -14914,9 +13377,9 @@ "license": "MIT" }, "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -14952,23 +13415,32 @@ } }, "node_modules/nise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", - "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.5.tgz", + "integrity": "sha512-SnRDPDBjxZZoU2n0+gzzLtSvo1OZo7j6jnbXsoh3AFxEGhaFU7ZF0TmefuKERq79wxR2U+MPn7ArW+Tl+clC3A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^13.0.1", - "@sinonjs/text-encoding": "^0.7.3", + "@sinonjs/fake-timers": "^15.1.1", "just-extend": "^6.2.0", - "path-to-regexp": "^8.1.0" + "path-to-regexp": "^8.3.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" } }, "node_modules/nise/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "dev": true, "license": "MIT", "funding": { @@ -14977,9 +13449,9 @@ } }, "node_modules/node-abi": { - "version": "3.87.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", - "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "version": "3.94.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.94.0.tgz", + "integrity": "sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -15010,6 +13482,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -15035,25 +13508,41 @@ "node": ">=10.5.0" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", "dev": true, "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "encoding": "^0.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-fetch-native": { @@ -15064,30 +13553,30 @@ "license": "MIT" }, "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-gyp": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", - "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", "license": "MIT", "optional": true, "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^15.0.0", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", + "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { @@ -15148,11 +13637,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/nopt": { "version": "9.0.0", @@ -15171,9 +13663,9 @@ } }, "node_modules/null-prototype-object": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/null-prototype-object/-/null-prototype-object-1.2.5.tgz", - "integrity": "sha512-YAPMPwBVlXXmIx/eIHx/KwIL1Bsd8I+YHQdFpW0Ydvez6vu5Bx2CaP4GrEnH5c1huVWZD9MqEuFwAJoBMm5LJQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/null-prototype-object/-/null-prototype-object-1.2.7.tgz", + "integrity": "sha512-pSZWCUew0zed2gxCerA4zdXRGg8ezLiWwvE8RvncezTcROXL0uz3PjSZXl5NsI04Egz0Uu46o1wyX6qr3u/ZWA==", "license": "MIT", "engines": { "node": ">= 20" @@ -15222,9 +13714,9 @@ } }, "node_modules/nyc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -15301,9 +13793,9 @@ } }, "node_modules/nyc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -15434,15 +13926,15 @@ } }, "node_modules/nypm": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.4.tgz", - "integrity": "sha512-1TvCKjZyyklN+JJj2TS3P4uSQEInrM/HkkuSXsEzm1ApPgBffOn8gFguNnZf07r/1X6vlryfIqMUkJKQMzlZiw==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.8.tgz", + "integrity": "sha512-Q9K4Diu6l5u6xJQogeFSs/zKtyMSgFKFtRQV+tHP4kL7KPm2grpBU0dFIwFaXwNxN0MtfKWc43VpCugAa+LPsw==", "dev": true, "license": "MIT", "dependencies": { - "citty": "^0.2.0", + "citty": "^0.2.2", "pathe": "^2.0.3", - "tinyexec": "^1.0.2" + "tinyexec": "^1.2.4" }, "bin": { "nypm": "dist/cli.mjs" @@ -15452,9 +13944,9 @@ } }, "node_modules/nypm/node_modules/citty": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.0.tgz", - "integrity": "sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", "dev": true, "license": "MIT" }, @@ -15760,9 +14252,9 @@ } }, "node_modules/ora/node_modules/string-width": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", - "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { @@ -15928,15 +14420,15 @@ } }, "node_modules/p-retry": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", - "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-8.0.0.tgz", + "integrity": "sha512-kFVqH1HxOHp8LupNsOys7bSV09VYTRLxarH/mokO4Rqhk6wGi70E0jh4VzvVGXfEVNggHoHLAMWsQqHyU1Ey9A==", "license": "MIT", "dependencies": { - "is-network-error": "^1.1.0" + "is-network-error": "^1.3.0" }, "engines": { - "node": ">=20" + "node": ">=22" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15994,20 +14486,6 @@ "node": ">= 14" } }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-8.0.0.tgz", - "integrity": "sha512-7pose0uGgrCJeH2Qh4JcNhWZp3u/oNrWjNYDK4ydOLxOpTw8V8ogHFAmkz0VWq96JBFj4umVJpvmQi287rSYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-8.0.0.tgz", @@ -16022,21 +14500,6 @@ "node": ">= 14" } }, - "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-9.0.0.tgz", - "integrity": "sha512-fFlbMlfsXhK02ZB8aZY7Hwxh/IHBV9b1Oq9bvBk6tkFWXvdAxUgA0wbw/NYR5liU3Y5+KI6U4FH3kYJt9QYv0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/pac-resolver": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-8.0.0.tgz", @@ -16091,9 +14554,9 @@ } }, "node_modules/parse-github-url": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", - "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.4.tgz", + "integrity": "sha512-CEtCOt55fHmd6DpBc/N7H5NC4vJpcquhzzs9Iw2mRj8bVxo1O5TQI5MXKOMO7+yBOqD+5dKCCRK4Kj1KskZc6Q==", "dev": true, "license": "MIT", "bin": { @@ -16155,21 +14618,6 @@ "node": ">=8" } }, - "node_modules/path-expression-matcher": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -16222,9 +14670,9 @@ "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/path-type": { @@ -16255,9 +14703,9 @@ } }, "node_modules/pbkdf2": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", - "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.6.tgz", + "integrity": "sha512-BT6eelPB1EyGHo8pC0o9Bl6k6SYVhKO1jEbd3lcTrtr7XHdjP8BW1YpfCV3G9Kwkxgattk+S5q2/RvuttCsS1g==", "license": "MIT", "dependencies": { "create-hash": "^1.2.0", @@ -16265,7 +14713,7 @@ "ripemd160": "^2.0.3", "safe-buffer": "^5.2.1", "sha.js": "^2.4.12", - "to-buffer": "^1.2.1" + "to-buffer": "^1.2.2" }, "engines": { "node": ">= 0.10" @@ -16286,9 +14734,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -16368,14 +14816,14 @@ } }, "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", + "confbox": "^0.2.4", + "exsolve": "^1.0.8", "pathe": "^2.0.3" } }, @@ -16405,6 +14853,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", @@ -16438,9 +14887,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", + "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", "dev": true, "license": "MIT", "bin": { @@ -16520,9 +14969,9 @@ } }, "node_modules/progress-events": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", - "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.1.0.tgz", + "integrity": "sha512-82DVc5tI36neVB3IjdXR11ztwGuoBc98em9ijzubeZKxI47OlV2Znq6mlPqE5xPDzO2Uw98GHiQSjj2favBCRQ==", "license": "Apache-2.0 OR MIT" }, "node_modules/prop-types": { @@ -16538,24 +14987,23 @@ } }, "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz", + "integrity": "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", - "long": "^5.0.0" + "long": "^5.3.2" }, "engines": { "node": ">=12.0.0" @@ -16579,10 +15027,26 @@ "uint8arrays": "^5.0.1" } }, + "node_modules/protons-runtime/node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/protons-runtime/node_modules/uint8-varint": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.5.tgz", + "integrity": "sha512-jeFLbL/x30wBRnWjKE1qVBXeumG46r7XmYkpis955lTQ+blccGKFrOsSMHlxePwYB1pI7L8YPHz1t4jLxEs3nA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" + } + }, "node_modules/protons-runtime/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.1.tgz", + "integrity": "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "multiformats": "^13.0.0" @@ -16640,20 +15104,6 @@ "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-8.0.0.tgz", - "integrity": "sha512-7pose0uGgrCJeH2Qh4JcNhWZp3u/oNrWjNYDK4ydOLxOpTw8V8ogHFAmkz0VWq96JBFj4umVJpvmQi287rSYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/proxy-agent/node_modules/https-proxy-agent": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-8.0.0.tgz", @@ -16678,32 +15128,26 @@ "node": ">=12" } }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-9.0.0.tgz", - "integrity": "sha512-fFlbMlfsXhK02ZB8aZY7Hwxh/IHBV9b1Oq9bvBk6tkFWXvdAxUgA0wbw/NYR5liU3Y5+KI6U4FH3kYJt9QYv0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-from-env": { + "node_modules/proxy-agent/node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true, "license": "MIT" }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -16739,12 +15183,13 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -17112,9 +15557,9 @@ } }, "node_modules/release-it": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-20.0.0.tgz", - "integrity": "sha512-KLCgEJH+t/MnJieOzjcroFcTSFY8dw44HT9joMm6+R5hPa+h2qPrDhHHZ5eN6m1yx8KK+q7KNdM7AfJYfAVFvQ==", + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-20.2.1.tgz", + "integrity": "sha512-xd0mqTGduwQlEzVBKOJcoVZxDrRLzjmFv3W8tWwkPIPDYtwYBWYjULiSk6VhfuGKocfz7GmptAqViKMQV4Zzbw==", "dev": true, "funding": [ { @@ -17128,13 +15573,13 @@ ], "license": "MIT", "dependencies": { - "@inquirer/prompts": "8.3.2", - "@nodeutils/defaults-deep": "1.1.0", + "@inquirer/prompts": "8.4.2", "@octokit/rest": "22.0.1", "@phun-ky/typeof": "2.0.3", "async-retry": "1.3.3", "c12": "3.3.3", "ci-info": "^4.4.0", + "defu": "^6.1.7", "eta": "4.5.1", "git-url-parse": "16.1.0", "issue-parser": "7.0.1", @@ -17147,7 +15592,7 @@ "proxy-agent": "7.0.0", "semver": "7.7.4", "tinyglobby": "0.2.15", - "undici": "7.24.5", + "undici": "7.28.0", "url-join": "5.0.0", "wildcard-match": "5.1.4", "yargs-parser": "22.0.0" @@ -17187,9 +15632,9 @@ } }, "node_modules/release-it/node_modules/undici": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", - "integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "dev": true, "license": "MIT", "engines": { @@ -17236,13 +15681,16 @@ "license": "ISC" }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.1", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -17266,16 +15714,6 @@ "node": ">=4" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -17338,9 +15776,9 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -17371,9 +15809,9 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -17409,9 +15847,9 @@ } }, "node_modules/rlp/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", "license": "MIT" }, "node_modules/run-applescript": { @@ -17462,15 +15900,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -17481,13 +15919,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -17525,13 +15956,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/safe-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", @@ -17576,19 +16000,22 @@ "license": "MIT" }, "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", - "license": "ISC" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/scrypt-js": { "version": "3.0.1", @@ -17634,9 +16061,9 @@ "license": "BSD-3-Clause" }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -17820,9 +16247,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", "dev": true, "license": "MIT", "engines": { @@ -17833,14 +16260,14 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -17852,13 +16279,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -17995,7 +16422,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -18003,13 +16430,13 @@ } }, "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "devOptional": true, + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "dev": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -18018,13 +16445,13 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-9.0.0.tgz", + "integrity": "sha512-fFlbMlfsXhK02ZB8aZY7Hwxh/IHBV9b1Oq9bvBk6tkFWXvdAxUgA0wbw/NYR5liU3Y5+KI6U4FH3kYJt9QYv0w==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "agent-base": "^7.1.2", + "agent-base": "8.0.0", "debug": "^4.3.4", "socks": "^2.8.3" }, @@ -18032,6 +16459,16 @@ "node": ">= 14" } }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-8.0.0.tgz", + "integrity": "sha512-QT8i0hCz6C/KQ+KTAbSNwCHDGdmUJl2tp2ZpNlGSWCfhUNVbYG2WLE3MdZGBAgXPV4GAvjGMxo+C1hroyxmZEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -18128,9 +16565,9 @@ } }, "node_modules/sqlite3/node_modules/node-addon-api": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", - "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", + "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", "license": "MIT", "engines": { "node": "^18 || ^20 || >= 21" @@ -18154,25 +16591,12 @@ } }, "node_modules/ssh2/node_modules/nan": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", - "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.28.0.tgz", + "integrity": "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==", "license": "MIT", "optional": true }, - "node_modules/ssri": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", - "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -18315,13 +16739,13 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -18370,19 +16794,20 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -18392,16 +16817,16 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -18477,18 +16902,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, "node_modules/super-regex": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", @@ -18532,13 +16945,13 @@ } }, "node_modules/synckit": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.9" + "@pkgr/core": "^0.3.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -18561,9 +16974,9 @@ } }, "node_modules/tar": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", - "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "version": "7.5.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.19.tgz", + "integrity": "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -18577,9 +16990,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz", + "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", "license": "MIT", "dependencies": { "chownr": "^1.1.1", @@ -18624,15 +17037,6 @@ "node": ">= 6" } }, - "node_modules/tar/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", @@ -18658,9 +17062,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -18691,9 +17095,9 @@ } }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -18738,9 +17142,9 @@ } }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "dev": true, "license": "MIT", "engines": { @@ -18783,9 +17187,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "devOptional": true, "license": "MIT", "engines": { @@ -18809,12 +17213,6 @@ "node": ">= 0.4" } }, - "node_modules/to-buffer/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -18837,13 +17235,6 @@ "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -18928,14 +17319,13 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.0.tgz", + "integrity": "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" + "esbuild": "~0.28.0" }, "bin": { "tsx": "dist/cli.mjs" @@ -19089,18 +17479,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -19157,37 +17547,52 @@ } }, "node_modules/uint8-varint": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", - "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-3.0.0.tgz", + "integrity": "sha512-S4DdpXBaLwKcFo7f0bWzWfHjbZ/i3QhM842qn+ZvHjxqFCfUcEB9SQNcmI69S+zMlcmIcKxsk9Iyw77S2Kxv6Q==", "license": "Apache-2.0 OR MIT", "dependencies": { - "uint8arraylist": "^2.0.0", - "uint8arrays": "^5.0.0" + "uint8arraylist": "^3.0.1", + "uint8arrays": "^6.1.0" + } + }, + "node_modules/uint8-varint/node_modules/uint8arraylist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-3.0.2.tgz", + "integrity": "sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^6.0.0" } }, "node_modules/uint8-varint/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz", + "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "multiformats": "^13.0.0" + "multiformats": "^14.0.0" } }, "node_modules/uint8arraylist": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", - "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.9.tgz", + "integrity": "sha512-KxWjyEFzchzik3aoQlK66oaoxIReoMo5bQRm1fcjBUZvE8xv/tyR3CTKhjh6K/faV8VaF6hd5pjr45CzbwuwkA==", "license": "Apache-2.0 OR MIT", "dependencies": { "uint8arrays": "^5.0.1" } }, + "node_modules/uint8arraylist/node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/uint8arraylist/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.1.tgz", + "integrity": "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "multiformats": "^13.0.0" @@ -19232,20 +17637,29 @@ } }, "node_modules/undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", + "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", "license": "MIT", "engines": { "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "license": "MIT" }, + "node_modules/unique-names-generator": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", + "integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/universal-user-agent": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", @@ -19351,6 +17765,20 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -19361,22 +17789,22 @@ } }, "node_modules/weald": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/weald/-/weald-1.1.1.tgz", - "integrity": "sha512-PaEQShzMCz8J/AD2N3dJMc1hTZWkJeLKS2NMeiVkV5KDHwgZe7qXLEzyodsT/SODxWDdXJJqocuwf3kHzcXhSQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/weald/-/weald-1.1.3.tgz", + "integrity": "sha512-vMWtNbYuPb58NeG2+0sKA0Een4VMDwzf+3oHqh68buWRSOMUBlUeRb11LhV28czV+DUpJHRykifijZDuS9bInA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "ms": "^3.0.0-canary.1", + "ms": "^4.0.0-nightly.202508271359", "supports-color": "^10.0.0" } }, "node_modules/weald/node_modules/ms": { - "version": "3.0.0-canary.202508261828", - "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.202508261828.tgz", - "integrity": "sha512-NotsCoUCIUkojWCzQff4ttdCfIPoA1UGZsyQbi7KmqkNRfKCrvga8JJi2PknHymHOuor0cJSn/ylj52Cbt2IrQ==", + "version": "4.0.0-nightly.202508271359", + "resolved": "https://registry.npmjs.org/ms/-/ms-4.0.0-nightly.202508271359.tgz", + "integrity": "sha512-WC/Eo7NzFrOV/RRrTaI0fxKVbNCzEy76j2VqNV8SxDf9D69gSE2Lh0QwYvDlhiYmheBYExAvEAxVf5NoN0cj2A==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/weald/node_modules/supports-color": { @@ -19401,34 +17829,16 @@ } }, "node_modules/webcrypto-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", - "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.3.13", + "@peculiar/asn1-schema": "^2.7.0", "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.5", - "tslib": "^2.7.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" } }, "node_modules/wherearewe": { @@ -19508,13 +17918,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", @@ -19542,13 +17945,13 @@ "license": "ISC" }, "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -19666,18 +18069,6 @@ "node": ">= 6" } }, - "node_modules/winston/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/winston/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -19811,13 +18202,13 @@ } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -19853,9 +18244,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -19928,9 +18319,9 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", diff --git a/package.json b/package.json index abcb4ef6a..e47d63b1f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocean-node", - "version": "3.2.1", + "version": "3.2.2", "description": "Ocean Node is used to run all core services in the Ocean stack", "author": "Ocean Protocol Foundation", "license": "Apache-2.0", @@ -60,7 +60,7 @@ "@libp2p/crypto": "^5.1.13", "@libp2p/dcutr": "^3.0.9", "@libp2p/identify": "^4.0.9", - "@libp2p/kad-dht": "^16.1.2", + "@libp2p/kad-dht": "16.3.4", "@libp2p/keychain": "^6.0.9", "@libp2p/mdns": "^12.0.10", "@libp2p/peer-id": "^6.0.4", @@ -72,21 +72,21 @@ "@libp2p/tls": "^3.0.10", "@libp2p/upnp-nat": "^4.0.9", "@libp2p/websockets": "^10.1.2", - "@multiformats/multiaddr": "^12.2.3", - "@oceanprotocol/contracts": "^2.7.0", + "@multiformats/multiaddr": "^13.0.3", + "@oceanprotocol/contracts": "^2.9.0", "@oceanprotocol/ddo-js": "^0.4.0", "axios": "^1.15.0", "base58-js": "^2.0.0", "basic-ftp": "^5.3.1", "cors": "^2.8.5", - "datastore-level": "^12.0.2", + "datastore-level": "^13.0.1", "delay": "^5.0.0", "dockerode": "^4.0.5", "dotenv": "^16.3.1", "eciesjs": "^0.4.5", "eth-crypto": "^2.6.0", "ethers": "^6.16.0", - "express": "^4.21.1", + "express": "^4.22.2", "humanhash": "^1.0.4", "hyperdiff": "^2.0.16", "ipaddr.js": "^2.3.0", @@ -98,8 +98,9 @@ "node-cron": "^3.0.3", "sqlite3": "^6.0.1", "stream-concat": "^1.0.0", - "tar": "^7.5.11", + "tar": "^7.5.16", "uint8arrays": "^4.0.6", + "unique-names-generator": "^4.7.1", "url-join": "^5.0.0", "winston": "^3.11.0", "winston-daily-rotate-file": "^4.7.1", @@ -134,7 +135,7 @@ "prettier": "^3.7.4", "release-it": "^20.0.0", "sinon": "^19.0.2", - "tsx": "^4.19.3", + "tsx": "^4.22.4", "typescript": "^5.9.3" }, "overrides": { diff --git a/src/@types/C2D/C2D.ts b/src/@types/C2D/C2D.ts index fb764c6c6..cb8eb6adb 100644 --- a/src/@types/C2D/C2D.ts +++ b/src/@types/C2D/C2D.ts @@ -173,11 +173,7 @@ export interface C2DDockerConfig { } export type ComputeResultType = - | 'imageLog' - | 'algorithmLog' - | 'output' - | 'configurationLog' - | 'publishLog' + 'imageLog' | 'algorithmLog' | 'output' | 'configurationLog' | 'publishLog' export interface ComputeResult { filename: string @@ -291,6 +287,7 @@ export interface DBComputeJob extends ComputeJob { algoDuration: number // duration of the job in seconds encryptedDockerRegistryAuth?: string output?: string // this is always an ECIES encrypted string, that decodes to ComputeOutput interface + outputBucketId?: string jobIdHash: string buildStartTimestamp?: string buildStopTimestamp?: string diff --git a/src/@types/Escrow.ts b/src/@types/Escrow.ts index 7f9f25575..20690f042 100644 --- a/src/@types/Escrow.ts +++ b/src/@types/Escrow.ts @@ -14,3 +14,22 @@ export interface EscrowLock { expiry: BigInt token: string } + +export interface EscrowEvent { + id: string + eventType: string + chainId: number + contract: string + block: number + txHash: string + payer?: string + payee?: string + token?: string + jobId?: string + amount?: string + expiry?: string + proof?: string + maxLockedAmount?: string + maxLockSeconds?: string + maxLockCounts?: string +} diff --git a/src/@types/PersistentStorage.ts b/src/@types/PersistentStorage.ts index 67b0448a2..f6b177acf 100644 --- a/src/@types/PersistentStorage.ts +++ b/src/@types/PersistentStorage.ts @@ -1,5 +1,5 @@ import type { AccessList } from './AccessList' -import type { BaseFileObject } from './fileObject.js' +export type { PersistentStorageObject } from './fileObject.js' export type PersistentStorageType = 'localfs' | 's3' export interface PersistentStorageLocalFSOptions { @@ -33,9 +33,3 @@ export interface DockerMountObject { Target: string ReadOnly: boolean } - -export interface PersistentStorageObject extends BaseFileObject { - type: 'nodePersistentStorage' - bucketId: string - fileName: string -} diff --git a/src/@types/commands.ts b/src/@types/commands.ts index cbeb6977f..b18676e3b 100644 --- a/src/@types/commands.ts +++ b/src/@types/commands.ts @@ -75,6 +75,8 @@ export interface FileInfoCommand extends Command { fileIndex?: number file?: StorageObject checksum?: boolean + // required only for nodePersistentStorage files, to gate on the bucket ACL + consumerAddress?: string } // group these 2 export interface DDOCommand extends Command { @@ -106,6 +108,18 @@ export interface QueryCommand extends Command { maxResultsPerPage?: number pageNumber?: number } + +export interface GetEscrowEventsCommand extends Command { + chainId?: number + eventType?: string + payer?: string + payee?: string + token?: string + jobId?: string + txId?: string + offset?: number + size?: number +} export interface ReindexCommand extends Command { txId: string chainId: number @@ -157,6 +171,10 @@ export interface GetFeesCommand extends Command { } // admin commands export interface AdminStopNodeCommand extends SignedCommand {} + +export interface AdminStopJobCommand extends SignedCommand { + jobId: string // composite format: "-" +} export interface AdminReindexTxCommand extends SignedCommand { chainId: number txId: string @@ -243,6 +261,7 @@ export interface FreeComputeStartCommand extends Command { algorithm: ComputeAlgorithm datasets?: ComputeAsset[] output?: string // this is always an ECIES encrypted string, that decodes to ComputeOutput interface + outputBucketId?: string resources?: ComputeResourceRequest[] maxJobDuration?: number policyServer?: any // object to pass to policy server @@ -332,6 +351,15 @@ export interface PersistentStorageCreateBucketCommand extends Command { signature: string nonce: string accessLists: AccessList[] + label?: string +} + +export interface PersistentStorageUpdateBucketCommand extends Command { + consumerAddress: string + signature: string + nonce: string + bucketId: string + label?: string } export interface PersistentStorageGetBucketsCommand extends Command { diff --git a/src/@types/fileObject.ts b/src/@types/fileObject.ts index 23803bc1f..b0a4b755d 100644 --- a/src/@types/fileObject.ts +++ b/src/@types/fileObject.ts @@ -49,12 +49,19 @@ export interface FtpFileObject extends BaseFileObject { url: string } +export interface PersistentStorageObject extends BaseFileObject { + type: 'nodePersistentStorage' + bucketId: string + fileName: string +} + export type StorageObject = | UrlFileObject | IpfsFileObject | ArweaveFileObject | S3FileObject | FtpFileObject + | PersistentStorageObject export interface StorageReadable { stream: Readable @@ -68,7 +75,18 @@ export enum FileObjectType { IPFS = 'ipfs', ARWEAVE = 'arweave', S3 = 's3', - FTP = 'ftp' + FTP = 'ftp', + NODE_PERSISTENT_STORAGE = 'nodePersistentStorage' +} + +// Case-insensitive match for the persistent-storage type. getStorageClass routes on +// `type?.toLowerCase()`, so all guard checks must normalize too or a casing variant +// (e.g. "NodePersistentStorage") slips past the guard and is still routed as PS. +export function isPersistentStorageType(type: unknown): boolean { + return ( + typeof type === 'string' && + type.toLowerCase() === FileObjectType.NODE_PERSISTENT_STORAGE.toLowerCase() + ) } export interface FileInfoRequest { diff --git a/src/components/Indexer/processor.ts b/src/components/Indexer/processor.ts index 98f9d2723..171d6750a 100644 --- a/src/components/Indexer/processor.ts +++ b/src/components/Indexer/processor.ts @@ -20,6 +20,7 @@ import { NewAccessListEventProcessor, AddressAddedEventProcessor, AddressRemovedEventProcessor, + EscrowEventProcessor, ProcessorConstructor } from './processors/index.js' import { findEventByKey } from './utils.js' @@ -42,7 +43,13 @@ const EVENT_PROCESSOR_MAP: Record = { [EVENTS.EXCHANGE_RATE_CHANGED]: ExchangeRateChangedEventProcessor, [EVENTS.NEW_ACCESS_LIST]: NewAccessListEventProcessor, [EVENTS.ADDRESS_ADDED]: AddressAddedEventProcessor, - [EVENTS.ADDRESS_REMOVED]: AddressRemovedEventProcessor + [EVENTS.ADDRESS_REMOVED]: AddressRemovedEventProcessor, + [EVENTS.ESCROW_AUTH]: EscrowEventProcessor, + [EVENTS.ESCROW_LOCK]: EscrowEventProcessor, + [EVENTS.ESCROW_CLAIMED]: EscrowEventProcessor, + [EVENTS.ESCROW_CANCELED]: EscrowEventProcessor, + [EVENTS.ESCROW_DEPOSIT]: EscrowEventProcessor, + [EVENTS.ESCROW_WITHDRAW]: EscrowEventProcessor } const processorInstances = new Map() diff --git a/src/components/Indexer/processors/EscrowEventProcessor.ts b/src/components/Indexer/processors/EscrowEventProcessor.ts new file mode 100644 index 000000000..45108583b --- /dev/null +++ b/src/components/Indexer/processors/EscrowEventProcessor.ts @@ -0,0 +1,113 @@ +import { ethers, Signer, FallbackProvider, Interface } from 'ethers' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import { getContractAddress } from '../utils.js' +import { EVENTS } from '../../../utils/constants.js' +import { EscrowEvent } from '../../../@types/Escrow.js' +import { OceanNodeConfig } from '../../../@types/OceanNode.js' +import EscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json' with { type: 'json' } + +const escrowInterface = new Interface(EscrowJson.abi) + +const addr = (v: any): string => v?.toString().toLowerCase() +const num = (v: any): string => v?.toString() + +export class EscrowEventProcessor extends BaseEventProcessor { + private readonly escrowAddress: string + + constructor(chainId: number, config: OceanNodeConfig) { + super(chainId, config) + this.escrowAddress = getContractAddress(chainId, 'Escrow') + } + + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider, + eventName?: string + ): Promise { + try { + if ( + !this.escrowAddress || + event.address.toLowerCase() !== this.escrowAddress.toLowerCase() + ) { + return null + } + + const decoded = escrowInterface.parseLog({ + topics: Array.from(event.topics), + data: event.data + }) + if (!decoded) return null + + const { args } = decoded + if (!eventName) return null + const record: EscrowEvent = { + id: `${event.transactionHash}-${event.index}`, + eventType: eventName, + chainId, + contract: event.address.toLowerCase(), + block: event.blockNumber, + txHash: event.transactionHash + } + + switch (eventName) { + case EVENTS.ESCROW_AUTH: + record.payer = addr(args.payer) + record.payee = addr(args.payee) + record.maxLockedAmount = num(args.maxLockedAmount) + record.maxLockSeconds = num(args.maxLockSeconds) + record.maxLockCounts = num(args.maxLockCounts) + break + case EVENTS.ESCROW_LOCK: + record.payer = addr(args.payer) + record.payee = addr(args.payee) + record.jobId = num(args.jobId) + record.amount = num(args.amount) + record.expiry = num(args.expiry) + record.token = addr(args.token) + break + case EVENTS.ESCROW_CLAIMED: + record.payee = addr(args.payee) + record.jobId = num(args.jobId) + record.token = addr(args.token) + record.payer = addr(args.payer) + record.amount = num(args.amount) + record.proof = args.proof?.toString() + break + case EVENTS.ESCROW_CANCELED: + record.payee = addr(args.payee) + record.jobId = num(args.jobId) + record.token = addr(args.token) + record.payer = addr(args.payer) + record.amount = num(args.amount) + break + case EVENTS.ESCROW_DEPOSIT: + case EVENTS.ESCROW_WITHDRAW: + record.payer = addr(args.payer) + record.token = addr(args.token) + record.amount = num(args.amount) + break + default: + return null + } + + const { escrow } = await this.getDatabase() + if (!escrow) return null + const result = await escrow.create(record) + INDEXER_LOGGER.logMessage( + `[Escrow] ${eventName} indexed for tx ${event.transactionHash} on chain ${chainId}` + ) + return result + } catch (err) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Error processing Escrow ${eventName} event: ${err.message}`, + true + ) + return null + } + } +} diff --git a/src/components/Indexer/processors/index.ts b/src/components/Indexer/processors/index.ts index 418adeedb..c538c26b0 100644 --- a/src/components/Indexer/processors/index.ts +++ b/src/components/Indexer/processors/index.ts @@ -15,6 +15,7 @@ export * from './OrderStartedEventProcessor.js' export * from './NewAccessListEventProcessor.js' export * from './AddressAddedEventProcessor.js' export * from './AddressRemovedEventProcessor.js' +export * from './EscrowEventProcessor.js' export * from './BaseProcessor.js' export type ProcessorConstructor = new ( diff --git a/src/components/P2P/index.ts b/src/components/P2P/index.ts index 018c80c82..1ff3d555f 100644 --- a/src/components/P2P/index.ts +++ b/src/components/P2P/index.ts @@ -73,6 +73,13 @@ let index = 0 /** Optional request payload sent as LP frames after the command JSON; ends with an empty LP frame. */ export type P2PRequestBodyStream = AsyncIterable | Readable +type P2PSendResponse = { + status: any + stream: AsyncIterable +} + +type ContentRoutingCID = Parameters[0] + function toUint8ArrayChunk(chunk: unknown): Uint8Array { if (chunk instanceof Uint8Array) return chunk if (Buffer.isBuffer(chunk)) return new Uint8Array(chunk) @@ -278,7 +285,12 @@ export class OceanP2P extends EventEmitter { const maddr = multiaddr(addr) const protos = maddr.getComponents() - const addressString = maddr.nodeAddress().address + const addressString = protos.find((entry) => + ['ip4', 'ip6', 'dns', 'dns4', 'dns6', 'dnsaddr'].includes(entry.name) + )?.value + if (addressString == null) { + return false + } if ( protos.some( (entry) => @@ -768,7 +780,7 @@ export class OceanP2P extends EventEmitter { message: string, options: { signal: AbortSignal }, requestBody?: P2PRequestBodyStream - ) { + ): Promise { let outbound = message if (requestBody) { const cmd = JSON.parse(message) as Record @@ -787,7 +799,7 @@ export class OceanP2P extends EventEmitter { try { while (true) { const chunk = await lp.read() - yield chunk.subarray ? chunk.subarray() : chunk + yield chunk.subarray() } } catch {} } @@ -1011,11 +1023,14 @@ export class OceanP2P extends EventEmitter { const cid = await cidFromRawString(input) const peersFound = [] try { - const f = this._libp2p.contentRouting.findProviders(cid, { - queryFuncTimeout: timeout || 20000 // 20 seconds - // on timeout the query ends with an abort signal => CodeError: Query aborted - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any) + const f = this._libp2p.contentRouting.findProviders( + cid as unknown as ContentRoutingCID, + { + queryFuncTimeout: timeout || 20000 // 20 seconds + // on timeout the query ends with an abort signal => CodeError: Query aborted + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any + ) for await (const value of f) { peersFound.push(value) diff --git a/src/components/c2d/compute_engine_base.ts b/src/components/c2d/compute_engine_base.ts index 1fb7bea4e..361599798 100644 --- a/src/components/c2d/compute_engine_base.ts +++ b/src/components/c2d/compute_engine_base.ts @@ -99,7 +99,8 @@ export abstract class C2DEngine { metadata?: DBComputeJobMetadata, additionalViewers?: string[], queueMaxWaitTime?: number, - encryptedDockerRegistryAuth?: string + encryptedDockerRegistryAuth?: string, + outputBucketId?: string ): Promise public abstract stopComputeJob( diff --git a/src/components/c2d/compute_engine_docker.ts b/src/components/c2d/compute_engine_docker.ts index bde2b8fcc..1cba837e6 100755 --- a/src/components/c2d/compute_engine_docker.ts +++ b/src/components/c2d/compute_engine_docker.ts @@ -59,7 +59,11 @@ import { ValidateParams } from '../httpRoutes/validateCommands.js' import { Service } from '@oceanprotocol/ddo-js' import { getOceanTokenAddressForChain } from '../../utils/address.js' import { dockerRegistryAuth, OceanNodeConfig } from '../../@types/OceanNode.js' -import { EncryptMethod } from '../../@types/fileObject.js' +import { + BaseFileObject, + EncryptMethod, + isPersistentStorageType +} from '../../@types/fileObject.js' import { getAddress, ZeroAddress } from 'ethers' import { AccessList } from '../../@types/AccessList.js' @@ -1207,7 +1211,8 @@ export class C2DEngineDocker extends C2DEngine { metadata?: DBComputeJobMetadata, additionalViewers?: string[], queueMaxWaitTime?: number, - encryptedDockerRegistryAuth?: string + encryptedDockerRegistryAuth?: string, + outputBucketId?: string ): Promise { if (!this.docker) return [] // TO DO - iterate over resources and get default runtime @@ -1304,6 +1309,7 @@ export class C2DEngineDocker extends C2DEngine { queueMaxWaitTime: queueMaxWaitTime || 0, encryptedDockerRegistryAuth, // we store the encrypted docker registry auth in the job output, + outputBucketId, buildStartTimestamp: '0', buildStopTimestamp: '0' } @@ -1427,7 +1433,7 @@ export class C2DEngineDocker extends C2DEngine { try { // check if we have an output request. const jobDb = await this.db.getJob(jobId) - if (jobDb.length < 1 || !jobDb[0].output) { + if (jobDb.length < 1 || (!jobDb[0].output && !jobDb[0].outputBucketId)) { const outputStat = statSync( this.getStoragePath() + '/' + jobId + '/data/outputs/outputs.tar' ) @@ -1731,7 +1737,6 @@ export class C2DEngineDocker extends C2DEngine { - delete the container - delete the volume */ - if ( job.status === C2DStatusNumber.BuildImage || job.status === C2DStatusNumber.PullImage @@ -1961,20 +1966,21 @@ export class C2DEngineDocker extends C2DEngine { // persistent Storage: bind-mount bucket files into the job container (localfs backend) for (const i in job.assets) { const asset = job.assets[i] - if (!asset.fileObject || asset.fileObject.type !== 'nodePersistentStorage') { + // resolve the effective file object (plaintext, encrypted, or via documentId/serviceId) + const resolved = await resolveComputeFileObject(asset) + if (!resolved || !isPersistentStorageType(resolved.type)) { + // non persistent-storage assets are downloaded later, during uploadData continue } - const fo = asset.fileObject as { bucketId?: string; fileName?: string } + // keep `resolved` local — do NOT persist the decrypted bucketId/fileName back + // onto the job record. uploadData independently re-detects encrypted and + // DDO-derived persistent-storage assets and skips them. + const fo = resolved as unknown as { bucketId?: string; fileName?: string } if (!fo.bucketId || !fo.fileName) { CORE_LOGGER.error( `Job ${job.jobId} asset ${i}: nodePersistentStorage requires bucketId and fileName` ) - job.status = C2DStatusNumber.DataProvisioningFailed - job.statusText = C2DStatusText.DataProvisioningFailed - job.isRunning = false - job.dateFinished = String(Date.now() / 1000) - await this.db.updateJob(job) - await this.cleanupJob(job) + await this.failJobDataProvisioning(job) return } const ps = OceanNode.getInstance().getPersistentStorage() @@ -1982,12 +1988,7 @@ export class C2DEngineDocker extends C2DEngine { CORE_LOGGER.error( `Job ${job.jobId} asset ${i}: persistent storage is not configured on this node` ) - job.status = C2DStatusNumber.DataProvisioningFailed - job.statusText = C2DStatusText.DataProvisioningFailed - job.isRunning = false - job.dateFinished = String(Date.now() / 1000) - await this.db.updateJob(job) - await this.cleanupJob(job) + await this.failJobDataProvisioning(job) return } try { @@ -2006,12 +2007,31 @@ export class C2DEngineDocker extends C2DEngine { CORE_LOGGER.error( `Job ${job.jobId} asset ${i}: failed to resolve persistent storage bind: ${errMsg}` ) - job.status = C2DStatusNumber.DataProvisioningFailed - job.statusText = C2DStatusText.DataProvisioningFailed - job.isRunning = false - job.dateFinished = String(Date.now() / 1000) - await this.db.updateJob(job) - await this.cleanupJob(job) + await this.failJobDataProvisioning(job) + return + } + } + if (job.outputBucketId) { + try { + const ps = OceanNode.getInstance().getPersistentStorage() + if (!ps) { + throw new Error('Persistent storage is not configured on this node') + } + const outputMount = await ps.getDockerOutputMountObject( + job.outputBucketId, + job.owner + ) + CORE_LOGGER.debug( + `Mounting output bucket ${job.outputBucketId} to folder ${outputMount.Target}` + ) + hostConfig.Mounts.push(outputMount) + mountVols[outputMount.Target] = {} + } catch (e) { + const errMsg = e instanceof Error ? e.message : String(e) + CORE_LOGGER.error( + `Job ${job.jobId}: failed to mount output bucket ${job.outputBucketId}: ${errMsg}` + ) + await this.failJobDataProvisioning(job) return } } @@ -2191,8 +2211,11 @@ export class C2DEngineDocker extends C2DEngine { try { if (container) { - // if we have an output request, stream to remote storage; otherwise write to local file - if (job.output) { + if (job.outputBucketId) { + CORE_LOGGER.info( + `Job ${job.jobId}: results stored in bucket ${job.outputBucketId}` + ) + } else if (job.output) { const decryptedOutput = await this.keyManager.decrypt( Uint8Array.from(Buffer.from(job.output, 'hex')), EncryptMethod.ECIES @@ -2252,6 +2275,15 @@ export class C2DEngineDocker extends C2DEngine { } } + private async failJobDataProvisioning(job: DBComputeJob): Promise { + job.status = C2DStatusNumber.DataProvisioningFailed + job.statusText = C2DStatusText.DataProvisioningFailed + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + await this.db.updateJob(job) + await this.cleanupJob(job) + } + // eslint-disable-next-line require-await private parseCpusetString(cpuset: string): number[] { const cores: number[] = [] @@ -2598,6 +2630,7 @@ export class C2DEngineDocker extends C2DEngine { `Using docker registry auth for ${registry} to pull image ${job.containerImage}` ) } + pullOptions.abortSignal = controller.signal const pullStream = await this.docker.pull(job.containerImage, pullOptions) await new Promise((resolve, reject) => { @@ -2849,108 +2882,37 @@ export class C2DEngineDocker extends C2DEngine { appendFileSync(configLogPath, `Writing raw algo code to ${fullAlgoPath}\n`) writeFileSync(fullAlgoPath, job.algorithm.meta.rawcode) } else { - // do we have a files object? - if (job.algorithm.fileObject) { - // is it unencrypted? - if (job.algorithm.fileObject.type) { - // we can get the storage directly - try { - storage = Storage.getStorageClass(job.algorithm.fileObject, config) - } catch (e) { - CORE_LOGGER.error(`Unable to get storage class for algorithm: ${e.message}`) - appendFileSync( - configLogPath, - `Unable to get storage class for algorithm: ${e.message}\n` - ) - return { - status: C2DStatusNumber.AlgorithmProvisioningFailed, - statusText: C2DStatusText.AlgorithmProvisioningFailed - } - } - } else { - // ok, maybe we have this encrypted instead - CORE_LOGGER.info( - 'algorithm file object seems to be encrypted, checking it...' - ) - // 1. Decrypt the files object - try { - const decryptedFileObject = await decryptFilesObject( - job.algorithm.fileObject - ) - storage = Storage.getStorageClass(decryptedFileObject, config) - } catch (e) { - CORE_LOGGER.error(`Unable to decrypt algorithm files object: ${e.message}`) - appendFileSync( - configLogPath, - `Unable to decrypt algorithm files object: ${e.message}\n` - ) - return { - status: C2DStatusNumber.AlgorithmProvisioningFailed, - statusText: C2DStatusText.AlgorithmProvisioningFailed - } - } - } - } else { - // no files object, try to get information from documentId and serviceId + // resolve the effective algorithm file object (plaintext, encrypted, or via + // documentId/serviceId). All types — including nodePersistentStorage — are + // streamed uniformly through the Storage class (job.owner enforces the bucket + // ACL for persistent storage). + const resolved = await resolveComputeFileObject(job.algorithm) + if (!resolved) { CORE_LOGGER.info( - 'algorithm file object seems to be missing, checking "serviceId" and "documentId"...' + 'Could not extract any files object from the compute algorithm, skipping...' ) - const { serviceId, documentId } = job.algorithm appendFileSync( configLogPath, - `Using ${documentId} and serviceId ${serviceId} to get algorithm files.\n` + 'Could not extract any files object from the compute algorithm, skipping...\n' ) - // we can get it from this info - if (serviceId && documentId) { - const algoDdo = await new FindDdoHandler( - OceanNode.getInstance() - ).findAndFormatDdo(documentId) - // 1. Get the service - const service: Service = AssetUtils.getServiceById(algoDdo, serviceId) - if (!service) { - CORE_LOGGER.error( - `Could not find service with ID ${serviceId} in DDO ${documentId}` - ) - appendFileSync( - configLogPath, - `Could not find service with ID ${serviceId} in DDO ${documentId}\n` - ) - return { - status: C2DStatusNumber.AlgorithmProvisioningFailed, - statusText: C2DStatusText.AlgorithmProvisioningFailed - } - } - try { - // 2. Decrypt the files object - const decryptedFileObject = await decryptFilesObject(service.files) - storage = Storage.getStorageClass(decryptedFileObject, config) - } catch (e) { - CORE_LOGGER.error(`Unable to decrypt algorithm files object: ${e.message}`) - appendFileSync( - configLogPath, - `Unable to decrypt algorithm files object: ${e.message}\n` - ) - return { - status: C2DStatusNumber.AlgorithmProvisioningFailed, - statusText: C2DStatusText.AlgorithmProvisioningFailed - } + } else { + try { + storage = Storage.getStorageClass(resolved, config, job.owner) + } catch (e) { + CORE_LOGGER.error(`Unable to get storage class for algorithm: ${e.message}`) + appendFileSync( + configLogPath, + `Unable to get storage class for algorithm: ${e.message}\n` + ) + return { + status: C2DStatusNumber.AlgorithmProvisioningFailed, + statusText: C2DStatusText.AlgorithmProvisioningFailed } } - } - - if (storage) { await pipeline( (await storage.getReadableStream()).stream, createWriteStream(fullAlgoPath) ) - } else { - CORE_LOGGER.info( - 'Could not extract any files object from the compute algorithm, skipping...' - ) - appendFileSync( - configLogPath, - 'Could not extract any files object from the compute algorithm, skipping...\n' - ) } } } catch (e) { @@ -2977,8 +2939,8 @@ export class C2DEngineDocker extends C2DEngine { if (asset.fileObject) { try { if (asset.fileObject.type) { - if (asset.fileObject.type === 'nodePersistentStorage') { - // local storage is handled later, when we start the container and create the binds + if (isPersistentStorageType(asset.fileObject.type)) { + // persistent storage is handled during ConfiguringVolumes via bind mounts continue } storage = Storage.getStorageClass(asset.fileObject, config) @@ -2986,6 +2948,11 @@ export class C2DEngineDocker extends C2DEngine { CORE_LOGGER.info('asset file object seems to be encrypted, checking it...') // get the encrypted bytes let filesObject: any = await decryptFilesObject(asset.fileObject) + // persistent storage assets are bind-mounted during ConfiguringVolumes; + // skip download here even if the resolved object wasn't written back + if (isPersistentStorageType(filesObject?.type)) { + continue + } filesObject = await this.addUserDataToFilesObject(filesObject, asset.userdata) storage = Storage.getStorageClass(filesObject, config) } @@ -3022,6 +2989,10 @@ export class C2DEngineDocker extends C2DEngine { const service: Service = AssetUtils.getServiceById(ddo, serviceId) // 3. Decrypt the url let decryptedFileObject = await decryptFilesObject(service.files) + // persistent storage assets are bind-mounted during ConfiguringVolumes + if (isPersistentStorageType(decryptedFileObject?.type)) { + continue + } decryptedFileObject = await this.addUserDataToFilesObject( decryptedFileObject, asset.userdata @@ -3419,6 +3390,52 @@ export class C2DEngineDocker extends C2DEngine { // this uses the docker engine, but exposes only one env, the free one +/** + * Resolves the effective (decrypted) file object for a compute asset or algorithm. + * Handles the three ways a file object can arrive: + * 1. plaintext file object (already has a `type`) + * 2. encrypted file object (no `type`) -> decrypt it + * 3. no file object, only `documentId` + `serviceId` -> resolve the DDO and decrypt `service.files` + * Returns null if nothing could be resolved. Shared by the Docker provisioning path + * and the compute pre-checks (initialize/start) so persistent-storage ACL validation + * sees the same resolved object. + */ +export async function resolveComputeFileObject( + item: ComputeAsset | ComputeAlgorithm +): Promise { + try { + if (item.fileObject) { + // plaintext: type is directly available + if ((item.fileObject as BaseFileObject).type) { + return item.fileObject as BaseFileObject + } + // encrypted: decrypt to reveal the type + return await decryptFilesObject(item.fileObject) + } + // no file object: try documentId + serviceId + const { documentId, serviceId } = item + if (documentId && serviceId) { + const ddo = await new FindDdoHandler(OceanNode.getInstance()).findAndFormatDdo( + documentId + ) + if (!ddo) { + return null + } + const service: Service = AssetUtils.getServiceById(ddo, serviceId) + if (!service) { + return null + } + return await decryptFilesObject(service.files) + } + return null + } catch (e) { + CORE_LOGGER.error( + `Unable to resolve compute file object: ${e instanceof Error ? e.message : String(e)}` + ) + return null + } +} + export function getAlgorithmImage(algorithm: ComputeAlgorithm, jobId: string): string { if (!algorithm.meta || !algorithm.meta.container) { return null diff --git a/src/components/c2d/index.ts b/src/components/c2d/index.ts index 192f5a60f..8abbbbd72 100644 --- a/src/components/c2d/index.ts +++ b/src/components/c2d/index.ts @@ -44,7 +44,8 @@ export function omitDBComputeFieldsFromComputeJob(dbCompute: DBComputeJob): Comp 'isStarted', 'containerImage', 'encryptedDockerRegistryAuth', - 'output' + 'output', + 'outputBucketId' ]) as ComputeJob return job } diff --git a/src/components/core/admin/stopJob.ts b/src/components/core/admin/stopJob.ts new file mode 100644 index 000000000..1d64e3707 --- /dev/null +++ b/src/components/core/admin/stopJob.ts @@ -0,0 +1,80 @@ +import { Readable } from 'stream' +import { AdminCommandHandler } from './adminHandler.js' +import { AdminStopJobCommand } from '../../../@types/commands.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' +import { + ValidateParams, + validateCommandParameters, + buildInvalidRequestMessage, + buildInvalidParametersResponse +} from '../../httpRoutes/validateCommands.js' +import { CORE_LOGGER } from '../../../utils/logging/common.js' + +export class StopJobHandler extends AdminCommandHandler { + async validate(command: AdminStopJobCommand): Promise { + const validation = validateCommandParameters(command, ['jobId']) + if (!validation.valid) { + return buildInvalidRequestMessage(validation.reason) + } + return await super.validate(command) + } + + async handle(task: AdminStopJobCommand): Promise { + const validation = await this.validate(task) + if (!validation.valid) { + return buildInvalidParametersResponse(validation) + } + + try { + const index = task.jobId.indexOf('-') + if (index === -1) { + return { + stream: null, + status: { + httpStatus: 400, + error: 'Invalid jobId format: expected "-"' + } + } + } + const hash = task.jobId.slice(0, index) + const jobId = task.jobId.slice(index + 1) + + const engines = this.getOceanNode().getC2DEngines() + if (!engines) { + return { + stream: null, + status: { httpStatus: 500, error: 'No C2D engines configured on this node' } + } + } + + let engine + try { + engine = await engines.getC2DByHash(hash) + if (!engine) { + throw new Error('C2D engine not found for hash: ' + hash) + } + } catch (e) { + return { + stream: null, + status: { httpStatus: 400, error: 'Invalid C2D Environment' } + } + } + + // Empty owner bypasses the DB owner filter — admin can stop any job regardless of owner + const response = await engine.stopComputeJob(jobId, '') + CORE_LOGGER.logMessage(`Admin stopJob response: ${JSON.stringify(response)}`, true) + + return { + stream: Readable.from(JSON.stringify(response)), + status: { httpStatus: 200 } + } + } catch (error: any) { + const errorMessage = error instanceof Error ? error.message : String(error) + CORE_LOGGER.error(errorMessage) + return { + stream: null, + status: { httpStatus: 500, error: errorMessage } + } + } + } +} diff --git a/src/components/core/compute/initialize.ts b/src/components/core/compute/initialize.ts index 2d31192d8..026a806bf 100644 --- a/src/components/core/compute/initialize.ts +++ b/src/components/core/compute/initialize.ts @@ -28,7 +28,10 @@ import { sanitizeServiceFiles } from '../../../utils/util.js' import { FindDdoHandler } from '../handler/ddoHandler.js' import { isOrderingAllowedForAsset } from '../handler/downloadHandler.js' import { getNonceAsNumber } from '../utils/nonceHandler.js' -import { getAlgorithmImage } from '../../c2d/compute_engine_docker.js' +import { + getAlgorithmImage, + resolveComputeFileObject +} from '../../c2d/compute_engine_docker.js' import { Credentials, DDOManager } from '@oceanprotocol/ddo-js' import { checkCredentials } from '../../../utils/credentials.js' @@ -39,10 +42,7 @@ import { validateAlgoForDataset, validateOutput } from './utils.js' -import { - ensureConsumerAllowedForPersistentStorageLocalfsFileObject, - rejectPersistentStorageFileObjectOnAlgorithm -} from '../../persistentStorage/PersistentStorageFactory.js' +import { ensureConsumerAllowedForPersistentStorageLocalfsFileObject } from '../../persistentStorage/PersistentStorageFactory.js' export class ComputeInitializeHandler extends CommandHandler { validate(command: ComputeInitializeCommand): ValidateParams { @@ -107,7 +107,8 @@ export class ComputeInitializeHandler extends CommandHandler { task.algorithm.documentId, task.algorithm.serviceId, node, - config + config, + task.consumerAddress ) const isRawCodeAlgorithm = task.algorithm.meta?.rawcode @@ -224,17 +225,15 @@ export class ComputeInitializeHandler extends CommandHandler { if (isValidOutput.status.httpStatus !== 200) { return isValidOutput } - const algoPersistentStorageBan = rejectPersistentStorageFileObjectOnAlgorithm( - task.algorithm.fileObject - ) - if (algoPersistentStorageBan) { - return algoPersistentStorageBan - } - for (const dataset of task.datasets) { + for (const elem of [task.algorithm, ...task.datasets]) { + // resolve encrypted / documentId+serviceId references so persistent-storage ACL + // is validated here too (not only plaintext file objects) + const resolvedFileObject = + (await resolveComputeFileObject(elem)) ?? elem.fileObject const psAccess = await ensureConsumerAllowedForPersistentStorageLocalfsFileObject( node, task.consumerAddress, - dataset.fileObject + resolvedFileObject ) if (psAccess) { return psAccess diff --git a/src/components/core/compute/startCompute.ts b/src/components/core/compute/startCompute.ts index 2499ce22b..70ecb3ca9 100644 --- a/src/components/core/compute/startCompute.ts +++ b/src/components/core/compute/startCompute.ts @@ -11,7 +11,8 @@ import { generateUniqueID, getAlgoChecksums, validateAlgoForDataset, - validateOutput + validateOutput, + validateOutputBucket } from './utils.js' import { ValidateParams, @@ -44,10 +45,8 @@ import { getNonceAsNumber } from '../utils/nonceHandler.js' import { PolicyServer } from '../../policyServer/index.js' import { checkCredentials } from '../../../utils/credentials.js' import { checkAddressOnAccessList } from '../../../utils/accessList.js' -import { - ensureConsumerAllowedForPersistentStorageLocalfsFileObject, - rejectPersistentStorageFileObjectOnAlgorithm -} from '../../persistentStorage/PersistentStorageFactory.js' +import { ensureConsumerAllowedForPersistentStorageLocalfsFileObject } from '../../persistentStorage/PersistentStorageFactory.js' +import { resolveComputeFileObject } from '../../c2d/compute_engine_docker.js' export class CommonComputeHandler extends CommandHandler { validate(command: PaidComputeStartCommand): ValidateParams { @@ -209,11 +208,30 @@ export class PaidComputeStartHandler extends CommonComputeHandler { } } + const policyServer = new PolicyServer() + for (const elem of [task.algorithm, ...task.datasets]) { + // resolve encrypted / documentId+serviceId references so persistent-storage ACL + // is validated here too (not only plaintext file objects) + const resolvedFileObject = + (await resolveComputeFileObject(elem)) ?? elem.fileObject + const psAccess = await ensureConsumerAllowedForPersistentStorageLocalfsFileObject( + node, + task.consumerAddress, + resolvedFileObject + ) + if (psAccess) { + return psAccess + } + } + + // ACL preflight is confirmed above before attempting checksum retrieval, + // so unauthorized consumers get an explicit ACL denial instead of a generic 500. const algoChecksums = await getAlgoChecksums( task.algorithm.documentId, task.algorithm.serviceId, node, - config + config, + task.consumerAddress ) const isRawCodeAlgorithm = task.algorithm.meta?.rawcode @@ -231,23 +249,6 @@ export class PaidComputeStartHandler extends CommonComputeHandler { } } } - const policyServer = new PolicyServer() - const algoPersistentStorageBan = rejectPersistentStorageFileObjectOnAlgorithm( - task.algorithm.fileObject - ) - if (algoPersistentStorageBan) { - return algoPersistentStorageBan - } - for (const dataset of task.datasets) { - const psAccess = await ensureConsumerAllowedForPersistentStorageLocalfsFileObject( - node, - task.consumerAddress, - dataset.fileObject - ) - if (psAccess) { - return psAccess - } - } // check algo and datasets (orders, credentials, etc.) for (const elem of [...[task.algorithm], ...task.datasets]) { const result: any = { validOrder: false } @@ -466,11 +467,9 @@ export class PaidComputeStartHandler extends CommonComputeHandler { stream: null, status: { httpStatus: 400, - error: `Algorithm ${task.algorithm.documentId} with serviceId ${ - task.algorithm.serviceId - } not allowed to run on the dataset: ${ddoInstance.getDid()} with serviceId: ${ - task.datasets[safeIndex].serviceId - }` + error: `Algorithm ${ + task.algorithm.documentId + } not allowed to run on the dataset: ${ddoInstance.getDid()}` } } } @@ -609,6 +608,15 @@ export class PaidComputeStartHandler extends CommonComputeHandler { } } } + const isValidOutputBucket = await validateOutputBucket( + node, + task.outputBucketId, + task.output, + task.consumerAddress + ) + if (isValidOutputBucket.status.httpStatus !== 200) { + return isValidOutputBucket + } const isValidOutput = await validateOutput(node, task.output, node.getConfig()) if (isValidOutput.status.httpStatus !== 200) { return isValidOutput @@ -634,7 +642,8 @@ export class PaidComputeStartHandler extends CommonComputeHandler { task.metadata, task.additionalViewers, task.queueMaxWaitTime, - task.encryptedDockerRegistryAuth + task.encryptedDockerRegistryAuth, + task.outputBucketId ) CORE_LOGGER.logMessage( 'ComputeStartCommand Response: ' + JSON.stringify(response, null, 2), @@ -764,29 +773,36 @@ export class FreeComputeStartHandler extends CommonComputeHandler { } } const node = this.getOceanNode() + const isValidOutputBucket = await validateOutputBucket( + node, + task.outputBucketId, + task.output, + task.consumerAddress + ) + if (isValidOutputBucket.status.httpStatus !== 200) { + return isValidOutputBucket + } const isValidOutput = await validateOutput(node, task.output, node.getConfig()) if (isValidOutput.status.httpStatus !== 200) { return isValidOutput } const policyServer = new PolicyServer() - const algoPersistentStorageBanFree = rejectPersistentStorageFileObjectOnAlgorithm( - task.algorithm.fileObject - ) - if (algoPersistentStorageBanFree) { - return algoPersistentStorageBanFree - } - for (const dataset of task.datasets) { + for (const elem of [task.algorithm, ...task.datasets]) { + // resolve encrypted / documentId+serviceId references so persistent-storage ACL + // is validated here too (not only plaintext file objects) + const resolvedFileObject = + (await resolveComputeFileObject(elem)) ?? elem.fileObject const psAccess = await ensureConsumerAllowedForPersistentStorageLocalfsFileObject( thisNode, task.consumerAddress, - dataset.fileObject + resolvedFileObject ) if (psAccess) { return psAccess } } for (const elem of [...[task.algorithm], ...task.datasets]) { - if (!('documentId' in elem)) { + if (!('documentId' in elem) || !elem.documentId) { continue } const ddo = await new FindDdoHandler(this.getOceanNode()).findAndFormatDdo( @@ -1018,7 +1034,8 @@ export class FreeComputeStartHandler extends CommonComputeHandler { task.metadata, task.additionalViewers, task.queueMaxWaitTime, - task.encryptedDockerRegistryAuth + task.encryptedDockerRegistryAuth, + task.outputBucketId ) CORE_LOGGER.logMessage( diff --git a/src/components/core/compute/utils.ts b/src/components/core/compute/utils.ts index b4f99a5e3..26830e31c 100644 --- a/src/components/core/compute/utils.ts +++ b/src/components/core/compute/utils.ts @@ -1,7 +1,11 @@ import { OceanNode } from '../../../OceanNode.js' import { AlgoChecksums, ComputeOutput } from '../../../@types/C2D/C2D.js' import { OceanNodeConfig } from '../../../@types/OceanNode.js' -import { StorageObject, EncryptMethod } from '../../../@types/fileObject.js' +import { + StorageObject, + EncryptMethod, + isPersistentStorageType +} from '../../../@types/fileObject.js' import { getFile } from '../../../utils/file.js' import { Storage } from '../../storage/index.js' @@ -23,16 +27,21 @@ export function generateUniqueID(jobStructure: any): string { } export async function getAlgoChecksums( - algoDID: string, - algoServiceId: string, + algoDID: string | undefined, + algoServiceId: string | undefined, oceanNode: OceanNode, - config: OceanNodeConfig + config: OceanNodeConfig, + consumerAddress?: string ): Promise { const checksums: AlgoChecksums = { files: '', container: '', serviceId: algoServiceId } + // Raw-code algorithms have no DDO to resolve - skip the lookup (no error logs, no DB hit) + if (!algoDID) { + return checksums + } try { const algoDDO = await new FindDdoHandler(oceanNode).findAndFormatDdo(algoDID) if (!algoDDO) { @@ -41,7 +50,18 @@ export async function getAlgoChecksums( } const fileArray = await getFile(algoDDO, algoServiceId, oceanNode) for (const file of fileArray) { - const storage = Storage.getStorageClass(file as StorageObject, config) + // persistent storage checksums require a consumerAddress (ACL); guard so a + // missing consumer errors instead of silently producing an empty checksum + if (isPersistentStorageType((file as any)?.type) && !consumerAddress) { + throw new Error( + 'Unable to compute checksum for persistent storage algorithm file: missing consumerAddress' + ) + } + const storage = Storage.getStorageClass( + file as StorageObject, + config, + consumerAddress + ) const fileInfo = await storage.fetchSpecificFileMetadata( file as StorageObject, true // force checksum @@ -249,3 +269,54 @@ export async function validateOutput( } } } + +export async function validateOutputBucket( + node: OceanNode, + outputBucketId: string, + output: string, + consumerAddress: string +): Promise { + const success: P2PCommandResponse = { + status: { + httpStatus: 200, + error: null, + headers: null + }, + stream: null + } + const failure = (httpStatus: number, error: string): P2PCommandResponse => ({ + status: { + httpStatus, + error, + headers: null + }, + stream: null + }) + + if (!outputBucketId) { + return success + } + if (output) { + return failure(400, 'output and outputBucketId are mutually exclusive') + } + const persistentStorage = node.getPersistentStorage() + if (!persistentStorage) { + return failure(400, 'Persistent storage is not enabled on this node') + } + try { + persistentStorage.validateBucket(outputBucketId) + } catch (e) { + const message = e instanceof Error ? e.message : String(e) + return failure(400, message) + } + try { + await persistentStorage.assertConsumerAllowedForBucket( + consumerAddress, + outputBucketId + ) + } catch (e) { + const message = e instanceof Error ? e.message : String(e) + return failure(403, message) + } + return success +} diff --git a/src/components/core/handler/coreHandlersRegistry.ts b/src/components/core/handler/coreHandlersRegistry.ts index e492a01a6..ce3ea0da8 100644 --- a/src/components/core/handler/coreHandlersRegistry.ts +++ b/src/components/core/handler/coreHandlersRegistry.ts @@ -53,9 +53,12 @@ import { PersistentStorageGetBucketsHandler, PersistentStorageGetFileObjectHandler, PersistentStorageListFilesHandler, + PersistentStorageUpdateBucketHandler, PersistentStorageUploadFileHandler } from './persistentStorage.js' import { GetAccessListHandler, SearchAccessListHandler } from './accessListHandler.js' +import { EscrowEventsHandler } from './escrowHandler.js' +import { StopJobHandler } from '../admin/stopJob.js' export type HandlerRegistry = { handlerName: string // name of the handler @@ -145,6 +148,7 @@ export class CoreHandlersRegistry { ) this.registerCoreHandler(PROTOCOL_COMMANDS.STOP_NODE, new StopNodeHandler(node)) this.registerCoreHandler(PROTOCOL_COMMANDS.REINDEX_TX, new ReindexTxHandler(node)) + this.registerCoreHandler(PROTOCOL_COMMANDS.STOP_JOB, new StopJobHandler(node)) this.registerCoreHandler( PROTOCOL_COMMANDS.REINDEX_CHAIN, new ReindexChainHandler(node) @@ -180,6 +184,10 @@ export class CoreHandlersRegistry { PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, new PersistentStorageCreateBucketHandler(node) ) + this.registerCoreHandler( + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET, + new PersistentStorageUpdateBucketHandler(node) + ) this.registerCoreHandler( PROTOCOL_COMMANDS.PERSISTENT_STORAGE_GET_BUCKETS, new PersistentStorageGetBucketsHandler(node) @@ -208,6 +216,10 @@ export class CoreHandlersRegistry { PROTOCOL_COMMANDS.SEARCH_ACCESS_LIST, new SearchAccessListHandler(node) ) + this.registerCoreHandler( + PROTOCOL_COMMANDS.GET_ESCROW_EVENTS, + new EscrowEventsHandler(node) + ) } public static getInstance( diff --git a/src/components/core/handler/ddoHandler.ts b/src/components/core/handler/ddoHandler.ts index b33e5fedc..aa4f7f752 100644 --- a/src/components/core/handler/ddoHandler.ts +++ b/src/components/core/handler/ddoHandler.ts @@ -12,7 +12,12 @@ import { } from '../utils/findDdoHandler.js' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' -import { sleep, readStream, streamToUint8Array } from '../../../utils/util.js' +import { + sleep, + readStream, + streamToUint8Array, + fetchEventFromTransaction +} from '../../../utils/util.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { ethers, isAddress } from 'ethers' import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } @@ -50,6 +55,26 @@ const MAX_RESPONSE_WAIT_TIME_SECONDS = 60 // wait time for reading the next getDDO command const MAX_WAIT_TIME_SECONDS_GET_DDO = 5 +// scans all receipt logs for a MetadataCreated/MetadataUpdated event emitted by the +// given data NFT. The metadata event is not necessarily the first log of the +// transaction (AA accounts, multisigs and relayers emit other events before it) +export function findMetadataEventInLogs( + logs: readonly { address: string; topics: readonly string[]; data: string }[], + dataNftAddress: string +): ethers.LogDescription | null { + const abiInterface = new ethers.Interface(ERC721Template.abi) + const nftLogs = logs.filter( + (log) => log.address.toLowerCase() === dataNftAddress.toLowerCase() + ) + for (const eventName of [EVENTS.METADATA_CREATED, EVENTS.METADATA_UPDATED]) { + const events = fetchEventFromTransaction({ logs: nftLogs }, eventName, abiInterface) + if (events && events.length > 0) { + return events[0] + } + } + return null +} + export class DecryptDdoHandler extends CommandHandler { validate(command: DecryptDDOCommand): ValidateParams { const validation = validateCommandParameters(command, [ @@ -218,20 +243,14 @@ export class DecryptDdoHandler extends CommandHandler { if (transactionId) { try { const receipt = await provider.getTransactionReceipt(transactionId) - if (!receipt.logs.length) { + if (!receipt || !receipt.logs.length) { throw new Error('receipt logs 0') } - const abiInterface = new ethers.Interface(ERC721Template.abi) - const eventObject = { - topics: receipt.logs[0].topics as string[], - data: receipt.logs[0].data - } - const eventData = abiInterface.parseLog(eventObject) - if ( - eventData.name !== EVENTS.METADATA_CREATED && - eventData.name !== EVENTS.METADATA_UPDATED - ) { - throw new Error(`event name ${eventData.name}`) + const eventData = findMetadataEventInLogs(receipt.logs, dataNftAddress) + if (!eventData) { + throw new Error( + `transaction ${transactionId} does not contain a MetadataCreated or MetadataUpdated event emitted by ${dataNftAddress}` + ) } flags = parseInt(eventData.args[3], 16) encryptedDocument = ethers.getBytes(eventData.args[4]) diff --git a/src/components/core/handler/downloadHandler.ts b/src/components/core/handler/downloadHandler.ts index 35f9e93da..4c97b6b1b 100644 --- a/src/components/core/handler/downloadHandler.ts +++ b/src/components/core/handler/downloadHandler.ts @@ -19,7 +19,7 @@ import { checkCredentials } from '../../../utils/credentials.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { OceanNode } from '../../../OceanNode.js' import { DownloadCommand, DownloadURLCommand } from '../../../@types/commands.js' -import { EncryptMethod } from '../../../@types/fileObject.js' +import { EncryptMethod, isPersistentStorageType } from '../../../@types/fileObject.js' import { validateCommandParameters, @@ -62,6 +62,17 @@ export async function handleDownloadUrlCommand( CORE_LOGGER.logMessage('DownloadCommand requires file encryption? ' + encryptFile, true) const config = node.getConfig() try { + // Persistent-storage files are only available within compute jobs, never via download. + if (isPersistentStorageType((task.fileObject as { type?: string })?.type)) { + return { + stream: null, + status: { + httpStatus: 403, + error: + 'Persistent storage files cannot be downloaded; they are only available within compute jobs' + } + } + } // Determine the type of storage and get a readable stream const storage = Storage.getStorageClass(task.fileObject, config) @@ -395,7 +406,7 @@ export class DownloadHandler extends CommandHandler { } } } - const environments = await c2dEngines.fetchEnvironments(ddo.chainId) + const environments = await c2dEngines.fetchEnvironments(ddoChainId) for (const env of environments) computeAddrs.push(env.consumerAddress?.toLowerCase()) diff --git a/src/components/core/handler/escrowHandler.ts b/src/components/core/handler/escrowHandler.ts new file mode 100644 index 000000000..eb500aa92 --- /dev/null +++ b/src/components/core/handler/escrowHandler.ts @@ -0,0 +1,65 @@ +import { CommandHandler } from './handler.js' +import { GetEscrowEventsCommand } from '../../../@types/commands.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' +import { Readable } from 'stream' +import { + ValidateParams, + validateCommandParameters +} from '../../httpRoutes/validateCommands.js' +import { CORE_LOGGER } from '../../../utils/logging/common.js' +import { ESCROW_EVENTS } from '../../../utils/constants.js' + +export class EscrowEventsHandler extends CommandHandler { + validate(command: GetEscrowEventsCommand): ValidateParams { + if (command.eventType && !ESCROW_EVENTS.includes(command.eventType)) { + return { + valid: false, + status: 400, + reason: `eventType must be one of: ${ESCROW_EVENTS.join(', ')}` + } + } + return validateCommandParameters(command, []) + } + + async handle(task: GetEscrowEventsCommand): Promise { + const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) { + return validationResponse + } + try { + const database = await this.getOceanNode().getDatabase() + if (!database || !database.escrow) { + CORE_LOGGER.error('Escrow database is not available') + return { + stream: null, + status: { httpStatus: 503, error: 'Escrow database is not available' } + } + } + + const filters: Record = { + chainId: task.chainId, + eventType: task.eventType, + payer: typeof task.payer === 'string' ? task.payer.toLowerCase() : undefined, + payee: typeof task.payee === 'string' ? task.payee.toLowerCase() : undefined, + token: typeof task.token === 'string' ? task.token.toLowerCase() : undefined, + jobId: task.jobId, + txHash: task.txId + } + + let result = await database.escrow.search(filters, task.offset, task.size) + if (!result) { + result = [] + } + return { + stream: Readable.from(JSON.stringify(result)), + status: { httpStatus: 200 } + } + } catch (error) { + CORE_LOGGER.error(`Error in EscrowEventsHandler: ${error.message}`) + return { + stream: null, + status: { httpStatus: 500, error: 'Unknown error: ' + error.message } + } + } + } +} diff --git a/src/components/core/handler/fileInfoHandler.ts b/src/components/core/handler/fileInfoHandler.ts index 14649c5b8..70b64604a 100644 --- a/src/components/core/handler/fileInfoHandler.ts +++ b/src/components/core/handler/fileInfoHandler.ts @@ -1,6 +1,10 @@ import { Readable } from 'stream' import { P2PCommandResponse } from '../../../@types/index.js' -import { FileObjectType, StorageObject } from '../../../@types/fileObject.js' +import { + FileObjectType, + StorageObject, + isPersistentStorageType +} from '../../../@types/fileObject.js' import { OceanNodeConfig } from '../../../@types/OceanNode.js' import { FileInfoCommand } from '../../../@types/commands.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' @@ -16,7 +20,8 @@ import { getFile } from '../../../utils/file.js' async function formatMetadata( file: StorageObject, - config: OceanNodeConfig + config: OceanNodeConfig, + consumerAddress?: string ): Promise<{ valid: boolean contentLength: string @@ -25,7 +30,19 @@ async function formatMetadata( name: string type: string }> { - const storage = Storage.getStorageClass(file, config) + // Persistent-storage files are ACL-gated: only resolve real metadata when a + // consumerAddress is supplied (the backend then enforces the bucket ACL). Without it, + // return a generic entry + if (isPersistentStorageType((file as { type?: string })?.type) && !consumerAddress) { + return { + valid: false, + contentLength: '', + contentType: 'application/octet-stream', + name: '', + type: FileObjectType.NODE_PERSISTENT_STORAGE + } + } + const storage = Storage.getStorageClass(file, config, consumerAddress) const fileInfo = await storage.fetchSpecificFileMetadata(file, false) CORE_LOGGER.logMessage( `Metadata for file: ${fileInfo.contentLength} ${fileInfo.contentType}` @@ -63,6 +80,18 @@ export class FileInfoHandler extends CommandHandler { 'Invalid Request: type must be one of ' + Object.values(FileObjectType).join(', ') ) } + // persistent storage files are ACL-gated: a consumerAddress is required so the bucket + // ACL can be enforced. Check both the top-level command type AND the embedded file type + // (normalized for casing), since handle() routes getStorageClass on file.type. + if ( + (isPersistentStorageType(command.type) || + isPersistentStorageType(command.file?.type)) && + !command.consumerAddress + ) { + return buildInvalidRequestMessage( + 'Invalid Request: consumerAddress is required for nodePersistentStorage files' + ) + } return validation } @@ -78,7 +107,7 @@ export class FileInfoHandler extends CommandHandler { let fileInfo = [] if (task.file && task.type) { - const storage = Storage.getStorageClass(task.file, config) + const storage = Storage.getStorageClass(task.file, config, task.consumerAddress) fileInfo = await storage.getFileInfo({ type: task.type, @@ -87,11 +116,15 @@ export class FileInfoHandler extends CommandHandler { } else if (task.did && task.serviceId) { const fileArray = await getFile(task.did, task.serviceId, oceanNode) if (task.fileIndex) { - const fileMetadata = await formatMetadata(fileArray[task.fileIndex], config) + const fileMetadata = await formatMetadata( + fileArray[task.fileIndex], + config, + task.consumerAddress + ) fileInfo.push(fileMetadata) } else { for (const file of fileArray) { - const fileMetadata = await formatMetadata(file, config) + const fileMetadata = await formatMetadata(file, config, task.consumerAddress) fileInfo.push(fileMetadata) } } diff --git a/src/components/core/handler/persistentStorage.ts b/src/components/core/handler/persistentStorage.ts index a3ff9ae8a..02b89fe0a 100644 --- a/src/components/core/handler/persistentStorage.ts +++ b/src/components/core/handler/persistentStorage.ts @@ -5,6 +5,7 @@ import type { PersistentStorageGetBucketsCommand, PersistentStorageGetFileObjectCommand, PersistentStorageListFilesCommand, + PersistentStorageUpdateBucketCommand, PersistentStorageUploadFileCommand } from '../../../@types/commands.js' import { @@ -23,6 +24,21 @@ import { } from '../../httpRoutes/validateCommands.js' import { CommandHandler } from './handler.js' +const MAX_BUCKET_LABEL_LENGTH = 256 + +function validateOptionalLabel(label: unknown): ValidateParams | null { + if (label === undefined || label === null) return null + if (typeof label !== 'string') { + return buildInvalidRequestMessage('Invalid parameter: "label" must be a string') + } + if (label.length > MAX_BUCKET_LABEL_LENGTH) { + return buildInvalidRequestMessage( + `Invalid parameter: "label" must be at most ${MAX_BUCKET_LABEL_LENGTH} characters` + ) + } + return null +} + function requirePersistentStorage(handler: CommandHandler): PersistentStorageFactory { const node = handler.getOceanNode() as any if (!node.getPersistentStorage) { @@ -44,6 +60,8 @@ export class PersistentStorageCreateBucketHandler extends CommandHandler { 'Invalid parameter: "accessLists" must be an array of objects' ) } + const labelError = validateOptionalLabel(command.label) + if (labelError) return labelError return { valid: true } } @@ -97,7 +115,11 @@ export class PersistentStorageCreateBucketHandler extends CommandHandler { } } - const result = await storage.createNewBucket(task.accessLists, ownerNormalized) + const result = await storage.createNewBucket( + task.accessLists, + ownerNormalized, + task.label + ) return { stream: Readable.from(JSON.stringify(result)), status: { httpStatus: 200, error: null } @@ -110,6 +132,59 @@ export class PersistentStorageCreateBucketHandler extends CommandHandler { } } +export class PersistentStorageUpdateBucketHandler extends CommandHandler { + validate(command: PersistentStorageUpdateBucketCommand): ValidateParams { + const base = validateCommandParameters(command, ['bucketId']) + if (!base.valid) return base + if (!command.bucketId || typeof command.bucketId !== 'string') { + return buildInvalidRequestMessage('Invalid parameter: "bucketId" must be a string') + } + const labelError = validateOptionalLabel(command.label) + if (labelError) return labelError + return { valid: true } + } + + async handle(task: PersistentStorageUpdateBucketCommand): Promise { + const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) return validationResponse + + const isAuthRequestValid = await this.validateTokenOrSignature( + task.authorization, + task.consumerAddress, + task.nonce, + task.signature, + task.command + ) + if (isAuthRequestValid.status.httpStatus !== 200) return isAuthRequestValid + + try { + const storage = requirePersistentStorage(this) + const ownerNormalized = task.consumerAddress + ? getAddress(task.consumerAddress) + : getAddress(await this.getAddressFromToken(task.authorization)) + const label = await storage.updateBucketLabel( + task.bucketId, + task.label, + ownerNormalized + ) + return { + stream: Readable.from(JSON.stringify({ bucketId: task.bucketId, label })), + status: { httpStatus: 200, error: null } + } + } catch (e) { + if (e instanceof PersistentStorageAccessDeniedError) { + return { stream: null, status: { httpStatus: 403, error: e.message } } + } + const message = e instanceof Error ? e.message : String(e) + if (message.toLowerCase().includes('not found')) { + return { stream: null, status: { httpStatus: 404, error: message } } + } + CORE_LOGGER.error(`PersistentStorageUpdateBucketHandler error: ${message}`) + return { stream: null, status: { httpStatus: 500, error: message } } + } + } +} + export class PersistentStorageGetBucketsHandler extends CommandHandler { validate(command: PersistentStorageGetBucketsCommand): ValidateParams { const base = validateCommandParameters(command, ['owner']) diff --git a/src/components/database/BaseDatabase.ts b/src/components/database/BaseDatabase.ts index 1214e9488..f64043401 100644 --- a/src/components/database/BaseDatabase.ts +++ b/src/components/database/BaseDatabase.ts @@ -1,6 +1,7 @@ import { Schema } from '.' import { OceanNodeDBConfig } from '../../@types' import { AccessListUser } from '../../@types/AccessList.js' +import { EscrowEvent } from '../../@types/Escrow.js' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../utils/logging/Logger.js' import { DATABASE_LOGGER } from '../../utils/logging/common.js' import { ElasticsearchSchema } from './ElasticSchemas.js' @@ -152,6 +153,28 @@ export abstract class AbstractOrderDatabase { abstract delete(orderId: string): Promise } +export abstract class AbstractEscrowDatabase { + protected config: OceanNodeDBConfig + protected schema: Schema + + constructor(config: OceanNodeDBConfig, schema: Schema) { + this.config = config + this.schema = schema + } + + abstract create(event: EscrowEvent): Promise + + abstract retrieve(id: string): Promise | null> + + abstract search( + filters: Record, + offset?: number, + size?: number + ): Promise[] | null> + + abstract delete(id: string): Promise +} + export abstract class AbstractDdoDatabase { protected config: OceanNodeDBConfig protected schemas: Schema[] diff --git a/src/components/database/DatabaseFactory.ts b/src/components/database/DatabaseFactory.ts index cb6dbcb2c..baa5a2379 100644 --- a/src/components/database/DatabaseFactory.ts +++ b/src/components/database/DatabaseFactory.ts @@ -3,6 +3,7 @@ import { AbstractAccessListDatabase, AbstractDdoDatabase, AbstractDdoStateDatabase, + AbstractEscrowDatabase, AbstractIndexerDatabase, AbstractLogDatabase, AbstractOrderDatabase @@ -11,6 +12,7 @@ import { ElasticsearchAccessListDatabase, ElasticsearchDdoDatabase, ElasticsearchDdoStateDatabase, + ElasticsearchEscrowDatabase, ElasticsearchIndexerDatabase, ElasticsearchLogDatabase, ElasticsearchOrderDatabase @@ -20,6 +22,7 @@ import { TypesenseAccessListDatabase, TypesenseDdoDatabase, TypesenseDdoStateDatabase, + TypesenseEscrowDatabase, TypesenseIndexerDatabase, TypesenseLogDatabase, TypesenseOrderDatabase @@ -50,7 +53,9 @@ export class DatabaseFactory { ddoStateQuery: () => new ElasticSearchDdoStateQuery(), metadataQuery: () => new ElasticSearchMetadataQuery(), accessList: (config: OceanNodeDBConfig) => - new ElasticsearchAccessListDatabase(config) + new ElasticsearchAccessListDatabase(config), + escrow: (config: OceanNodeDBConfig) => + new ElasticsearchEscrowDatabase(config, elasticSchemas.escrowSchema) }, typesense: { ddo: (config: OceanNodeDBConfig) => @@ -66,7 +71,9 @@ export class DatabaseFactory { ddoStateQuery: () => new TypesenseDdoStateQuery(), metadataQuery: () => new TypesenseMetadataQuery(), accessList: (config: OceanNodeDBConfig) => - new TypesenseAccessListDatabase(config, typesenseSchemas.accessListSchema) + new TypesenseAccessListDatabase(config, typesenseSchemas.accessListSchema), + escrow: (config: OceanNodeDBConfig) => + new TypesenseEscrowDatabase(config, typesenseSchemas.escrowSchema) } } @@ -142,4 +149,10 @@ export class DatabaseFactory { ): Promise { return this.createDatabase('accessList', config) } + + static createEscrowDatabase( + config: OceanNodeDBConfig + ): Promise { + return this.createDatabase('escrow', config) + } } diff --git a/src/components/database/ElasticSchemas.ts b/src/components/database/ElasticSchemas.ts index 9e2064fb4..b2b09965a 100644 --- a/src/components/database/ElasticSchemas.ts +++ b/src/components/database/ElasticSchemas.ts @@ -22,6 +22,7 @@ export type ElasticsearchSchemas = { orderSchema: ElasticsearchSchema ddoStateSchema: ElasticsearchSchema accessListSchema: ElasticsearchSchema + escrowSchema: ElasticsearchSchema } // "op_ddo_short" is a node-side index for deprecated DDOs (state !== 0). @@ -143,5 +144,30 @@ export const elasticSchemas: ElasticsearchSchemas = { } } } + }, + escrowSchema: { + index: 'escrow', + body: { + mappings: { + properties: { + id: { type: 'keyword' }, + eventType: { type: 'keyword' }, + chainId: { type: 'long' }, + contract: { type: 'keyword' }, + block: { type: 'long' }, + txHash: { type: 'keyword' }, + payer: { type: 'keyword' }, + payee: { type: 'keyword' }, + token: { type: 'keyword' }, + jobId: { type: 'keyword' }, + amount: { type: 'text' }, + expiry: { type: 'text' }, + proof: { type: 'text' }, + maxLockedAmount: { type: 'text' }, + maxLockSeconds: { type: 'text' }, + maxLockCounts: { type: 'text' } + } + } + } } } diff --git a/src/components/database/ElasticSearchDatabase.ts b/src/components/database/ElasticSearchDatabase.ts index 09e47ca03..b78fa589e 100644 --- a/src/components/database/ElasticSearchDatabase.ts +++ b/src/components/database/ElasticSearchDatabase.ts @@ -3,11 +3,13 @@ import { AbstractAccessListDatabase, AbstractDdoDatabase, AbstractDdoStateDatabase, + AbstractEscrowDatabase, AbstractIndexerDatabase, AbstractLogDatabase, AbstractOrderDatabase } from './BaseDatabase.js' import { AccessListUser } from '../../@types/AccessList.js' +import { EscrowEvent } from '../../@types/Escrow.js' import { createElasticsearchClientWithRetry } from './ElasticsearchConfigHelper.js' import { OceanNodeDBConfig } from '../../@types' import { ElasticsearchSchema } from './ElasticSchemas.js' @@ -477,6 +479,108 @@ export class ElasticsearchOrderDatabase extends AbstractOrderDatabase { } } +export class ElasticsearchEscrowDatabase extends AbstractEscrowDatabase { + private provider: Client + + constructor(config: OceanNodeDBConfig, schema: ElasticsearchSchema) { + super(config, schema) + + return (async (): Promise => { + this.provider = await createElasticsearchClientWithRetry(config) + await this.initializeIndex() + return this + })() as unknown as ElasticsearchEscrowDatabase + } + + getSchema(): ElasticsearchSchema { + return this.schema as ElasticsearchSchema + } + + private async initializeIndex() { + try { + const { index } = this.getSchema() + const exists = await this.provider.indices.exists({ index }) + if (!exists) { + await this.provider.indices.create({ + index, + body: this.getSchema().body as any + }) + } + } catch (e) { + DATABASE_LOGGER.error(`Failed to create escrow index: ${e.message}`) + } + } + + async create(event: EscrowEvent) { + try { + await this.provider.index({ + index: this.getSchema().index, + id: event.id, + body: event + }) + return event + } catch (error) { + const errorMsg = `Error when creating escrow event ${event.id}: ` + error.message + DATABASE_LOGGER.logMessageWithEmoji(errorMsg, true, LOG_LEVELS_STR.LEVEL_ERROR) + return null + } + } + + async retrieve(id: string) { + try { + const result = await this.provider.get({ + index: this.getSchema().index, + id + }) + return normalizeDocumentId(result._source, result._id) + } catch (error) { + const errorMsg = `Error when retrieving escrow event ${id}: ` + error.message + DATABASE_LOGGER.logMessageWithEmoji(errorMsg, true, LOG_LEVELS_STR.LEVEL_ERROR) + return null + } + } + + async search(filters: Record, offset?: number, size?: number) { + try { + // clamp the page size so a single request can't return an unbounded set + const limit = Math.min(size && size > 0 ? size : 100, 250) + const from = offset && offset > 0 ? offset : 0 + + const terms = Object.entries(filters || {}) + .filter(([, value]) => value !== undefined && value !== null && value !== '') + .map(([field, value]) => ({ term: { [field]: value } })) + const query = terms.length ? { bool: { must: terms } } : { match_all: {} } + + const searchParams = { + index: this.getSchema().index, + body: { query, from, size: limit } + } + const result = await this.provider.search(searchParams) + return result.hits.hits.map((hit: any) => normalizeDocumentId(hit._source, hit._id)) + } catch (error) { + const errorMsg = + `Error when searching escrow events by ${JSON.stringify(filters)}: ` + + error.message + DATABASE_LOGGER.logMessageWithEmoji(errorMsg, true, LOG_LEVELS_STR.LEVEL_ERROR) + return null + } + } + + async delete(id: string) { + try { + await this.provider.delete({ + index: this.getSchema().index, + id + }) + return { id } + } catch (error) { + const errorMsg = `Error when deleting escrow event ${id}: ` + error.message + DATABASE_LOGGER.logMessageWithEmoji(errorMsg, true, LOG_LEVELS_STR.LEVEL_ERROR) + return null + } + } +} + export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { private client: Client @@ -532,6 +636,33 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { return schema } + private async deleteDDOFromOtherSchemas( + id: string, + currentSchema: ElasticsearchSchema + ): Promise { + for (const schema of this.getSchemas()) { + if (schema.index === currentSchema.index) { + continue + } + + try { + await this.client.delete({ + index: schema.index, + id + }) + } catch (error) { + if (error.statusCode !== 404) { + DATABASE_LOGGER.logMessageWithEmoji( + `Error when deleting stale DDO entry ${id} from schema ${schema.index}: ${error.message}`, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + } + } + } + } + async search(query: Record): Promise { const results = [] const maxPerPage = query.size || 100 @@ -693,13 +824,12 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { if (ddo?.indexedMetadata?.nft) delete ddo.nft const validation = await validateDDO(ddo) if (validation === true) { - const response: any = await this.client.update({ + const response: any = await this.client.index({ index: schema.index, id: ddo.id, - body: { - doc: ddo - } + body: ddo }) + await this.deleteDDOFromOtherSchemas(ddo.id, schema) // make sure we do not have different responses 4 between DBs // do the same thing on other methods if (response._id === ddo.id) { diff --git a/src/components/database/TypesenseDatabase.ts b/src/components/database/TypesenseDatabase.ts index b11054252..fe0cc4a57 100644 --- a/src/components/database/TypesenseDatabase.ts +++ b/src/components/database/TypesenseDatabase.ts @@ -10,11 +10,13 @@ import { AbstractAccessListDatabase, AbstractDdoDatabase, AbstractDdoStateDatabase, + AbstractEscrowDatabase, AbstractIndexerDatabase, AbstractLogDatabase, AbstractOrderDatabase } from './BaseDatabase.js' import { AccessListUser } from '../../@types/AccessList.js' +import { EscrowEvent } from '../../@types/Escrow.js' import { validateDDO } from '../../utils/asset.js' import { DDOManager } from '@oceanprotocol/ddo-js' @@ -210,6 +212,133 @@ export class TypesenseOrderDatabase extends AbstractOrderDatabase { } } +export class TypesenseEscrowDatabase extends AbstractEscrowDatabase { + private provider: Typesense + + constructor(config: OceanNodeDBConfig, schema: TypesenseSchema) { + super(config, schema) + return (async (): Promise => { + this.provider = new Typesense({ + ...convertTypesenseConfig(this.config.url), + logger: DATABASE_LOGGER + }) + try { + await this.provider.collections(this.getSchema().name).retrieve() + } catch (error) { + if (error instanceof TypesenseError && error.httpStatus === 404) { + await this.provider.collections().create(this.getSchema()) + } + } + return this + })() as unknown as TypesenseEscrowDatabase + } + + getSchema(): TypesenseSchema { + return this.schema as TypesenseSchema + } + + async create(event: EscrowEvent) { + try { + return await this.provider + .collections(this.getSchema().name) + .documents() + .create({ ...event }) + } catch (error) { + if (error instanceof TypesenseError && error.httpStatus === 409) { + return { ...event } + } + const errorMsg = `Error when creating escrow event ${event.id}: ` + error.message + DATABASE_LOGGER.logMessageWithEmoji( + errorMsg, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + return null + } + } + + async retrieve(id: string) { + try { + return await this.provider + .collections(this.getSchema().name) + .documents() + .retrieve(id) + } catch (error) { + const errorMsg = `Error when retrieving escrow event ${id}: ` + error.message + DATABASE_LOGGER.logMessageWithEmoji( + errorMsg, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + return null + } + } + + async search(filters: Record, offset?: number, size?: number) { + try { + const filterBy = Object.entries(filters || {}) + .filter(([, value]) => value !== undefined && value !== null && value !== '') + // Backtick string values so spaces/special chars can't break the syntax; + // strip backticks from the value so it can't escape the quoted literal. + .map(([field, value]) => + typeof value === 'string' + ? `${field}:=\`${value.replace(/`/g, '')}\`` + : `${field}:=${value}` + ) + .join(' && ') + + // clamp the page size so a single request can't return an unbounded set + const limit = Math.min(size && size > 0 ? size : 100, TYPESENSE_HITS_CAP) + const from = offset && offset > 0 ? offset : 0 + + const searchParams: TypesenseSearchParams = { + q: '*', + query_by: 'eventType', + offset: from, + limit + } + if (filterBy) { + searchParams.filter_by = filterBy + } + + const result = await this.provider + .collections(this.getSchema().name) + .documents() + .search(searchParams) + + return result.hits.map((hit) => hit.document) + } catch (error) { + const errorMsg = + `Error when searching escrow events by ${JSON.stringify(filters)}: ` + + error.message + DATABASE_LOGGER.logMessageWithEmoji( + errorMsg, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + return null + } + } + + async delete(id: string) { + try { + return await this.provider.collections(this.getSchema().name).documents().delete(id) + } catch (error) { + const errorMsg = `Error when deleting escrow event ${id}: ` + error.message + DATABASE_LOGGER.logMessageWithEmoji( + errorMsg, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + return null + } + } +} + export class TypesenseDdoStateDatabase extends AbstractDdoStateDatabase { private provider: Typesense @@ -392,6 +521,31 @@ export class TypesenseDdoDatabase extends AbstractDdoDatabase { return schema } + private async deleteDDOFromOtherSchemas( + did: string, + currentSchema: TypesenseSchema + ): Promise { + for (const schema of this.getSchemas()) { + if (schema.name === currentSchema.name) { + continue + } + + try { + await this.provider.collections(schema.name).documents().delete(did) + } catch (error) { + if (!(error instanceof TypesenseError && error.httpStatus === 404)) { + DATABASE_LOGGER.logMessageWithEmoji( + `Error when deleting stale DDO entry ${did} from schema ${schema.name}: ` + + error.message, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + } + } + } + } + async search( query: Record, maxResultsPerPage?: number, @@ -514,10 +668,12 @@ export class TypesenseDdoDatabase extends AbstractDdoDatabase { if (ddo?.indexedMetadata?.nft) delete ddo.nft const validation = await validateDDO(ddo) if (validation === true) { - return await this.provider + const response = await this.provider .collections(schema.name) .documents() - .update(ddo.id, ddo) + .upsert(ddo) + await this.deleteDDOFromOtherSchemas(ddo.id, schema) + return response } else { throw new Error( `Validation of DDO with schema version ${ddo.version} failed with errors` diff --git a/src/components/database/TypesenseSchemas.ts b/src/components/database/TypesenseSchemas.ts index f928922c1..292aef8f8 100644 --- a/src/components/database/TypesenseSchemas.ts +++ b/src/components/database/TypesenseSchemas.ts @@ -54,6 +54,7 @@ export type TypesenseSchemas = { orderSchema: TypesenseSchema ddoStateSchema: TypesenseSchema accessListSchema: TypesenseSchema + escrowSchema: TypesenseSchema } const ddoSchemas = readJsonSchemas() export const typesenseSchemas: TypesenseSchemas = { @@ -143,5 +144,29 @@ export const typesenseSchemas: TypesenseSchemas = { { name: 'deploymentBlock', type: 'int64', optional: true }, { name: 'deploymentTxId', type: 'string', optional: true } ] + }, + escrowSchema: { + name: 'escrow', + enable_nested_fields: true, + fields: [ + { name: 'eventType', type: 'string', facet: true }, + { name: 'chainId', type: 'int64', facet: true }, + { name: 'contract', type: 'string' }, + { name: 'block', type: 'int64' }, + { name: 'txHash', type: 'string' }, + { name: 'payer', type: 'string', optional: true }, + { name: 'payee', type: 'string', optional: true }, + { name: 'token', type: 'string', optional: true }, + { name: 'jobId', type: 'string', optional: true }, + // uint256 values kept as raw strings to avoid precision loss + { name: 'amount', type: 'string', optional: true }, + { name: 'expiry', type: 'string', optional: true }, + // proof (Claimed event bytes) is stored but never filtered; skip indexing + // it so a large hex value can't hit Typesense's indexed-field length limit. + { name: 'proof', type: 'string', optional: true, index: false }, + { name: 'maxLockedAmount', type: 'string', optional: true }, + { name: 'maxLockSeconds', type: 'string', optional: true }, + { name: 'maxLockCounts', type: 'string', optional: true } + ] } } diff --git a/src/components/database/index.ts b/src/components/database/index.ts index 3c42f468d..b01a85c4d 100644 --- a/src/components/database/index.ts +++ b/src/components/database/index.ts @@ -9,6 +9,7 @@ import { AbstractAccessListDatabase, AbstractDdoDatabase, AbstractDdoStateDatabase, + AbstractEscrowDatabase, AbstractIndexerDatabase, AbstractLogDatabase, AbstractOrderDatabase @@ -31,6 +32,7 @@ export class Database { order: AbstractOrderDatabase ddoState: AbstractDdoStateDatabase accessList: AbstractAccessListDatabase + escrow: AbstractEscrowDatabase sqliteConfig: SQLLiteConfigDatabase c2d: C2DDatabase authToken: AuthTokenDatabase @@ -110,6 +112,13 @@ export class Database { DATABASE_LOGGER.error(`AccessList database initialization failed: ${error}`) return null } + + try { + db.escrow = await DatabaseFactory.createEscrowDatabase(config) + } catch (error) { + DATABASE_LOGGER.error(`Escrow database initialization failed: ${error}`) + return null + } } else { DATABASE_LOGGER.info( 'Invalid DB URL. Only Nonce, C2D, Auth Token and Config Databases are initialized.' diff --git a/src/components/database/sqliteCompute.ts b/src/components/database/sqliteCompute.ts index 1c2462d5f..5a1006636 100644 --- a/src/components/database/sqliteCompute.ts +++ b/src/components/database/sqliteCompute.ts @@ -48,6 +48,7 @@ function getInternalStructure(job: DBComputeJob): any { algoDuration: job.algoDuration, queueMaxWaitTime: job.queueMaxWaitTime, output: job.output, + outputBucketId: job.outputBucketId, jobIdHash: job.jobIdHash, buildStartTimestamp: job.buildStartTimestamp, buildStopTimestamp: job.buildStopTimestamp diff --git a/src/components/database/typesense.ts b/src/components/database/typesense.ts index 02856400a..aa157a81c 100644 --- a/src/components/database/typesense.ts +++ b/src/components/database/typesense.ts @@ -58,6 +58,14 @@ class TypesenseDocuments { return this.api.post(this.apiPath, document) } + // eslint-disable-next-line require-await + async upsert(document: TypesenseDocumentSchema) { + if (!document) throw new Error('No document provided') + return this.api.post(this.apiPath, document, { + action: 'upsert' + }) + } + // eslint-disable-next-line require-await async retrieve(documentId: string) { const path = `${this.apiPath}/${documentId}` diff --git a/src/components/database/typesenseApi.ts b/src/components/database/typesenseApi.ts index 11e62f5f4..60550382e 100644 --- a/src/components/database/typesenseApi.ts +++ b/src/components/database/typesenseApi.ts @@ -109,11 +109,11 @@ export class TypesenseApi { transformResponse: [ (data, headers) => { let transformedData = data + const contentType = headers?.['content-type'] if ( - headers !== undefined && typeof data === 'string' && - headers['content-type'] && - headers['content-type'].startsWith('application/json') + typeof contentType === 'string' && + contentType.startsWith('application/json') ) { transformedData = JSON.parse(data) } diff --git a/src/components/httpRoutes/compute.ts b/src/components/httpRoutes/compute.ts index 3411253d0..1885678df 100644 --- a/src/components/httpRoutes/compute.ts +++ b/src/components/httpRoutes/compute.ts @@ -89,6 +89,9 @@ computeRoutes.post(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { if (req.body.output) { startComputeTask.output = req.body.output } + if (req.body.outputBucketId) { + startComputeTask.outputBucketId = req.body.outputBucketId + } const response = await new PaidComputeStartHandler(req.oceanNode).handle( startComputeTask @@ -138,6 +141,9 @@ computeRoutes.post(`${SERVICES_API_BASE_PATH}/freeCompute`, async (req, res) => if (req.body.output) { startComputeTask.output = req.body.output } + if (req.body.outputBucketId) { + startComputeTask.outputBucketId = req.body.outputBucketId + } const response = await new FreeComputeStartHandler(req.oceanNode).handle( startComputeTask diff --git a/src/components/httpRoutes/escrow.ts b/src/components/httpRoutes/escrow.ts new file mode 100644 index 000000000..f22288b77 --- /dev/null +++ b/src/components/httpRoutes/escrow.ts @@ -0,0 +1,45 @@ +import express, { Request, Response } from 'express' +import { Readable } from 'stream' +import { EscrowEventsHandler } from '../core/handler/escrowHandler.js' +import { PROTOCOL_COMMANDS } from '../../utils/constants.js' +import { streamToString } from '../../utils/util.js' +import { GetEscrowEventsCommand } from '../../@types/commands.js' + +export const escrowRoutes = express.Router() + +escrowRoutes.get( + '/api/services/escrow/events', + async (req: Request, res: Response): Promise => { + const { chainId } = req.query + let parsedChainId: number | undefined + if (chainId !== undefined) { + parsedChainId = Number(chainId) + if (Number.isNaN(parsedChainId)) { + res.status(400).send('chainId must be a number') + return + } + } + + const command: GetEscrowEventsCommand = { + command: PROTOCOL_COMMANDS.GET_ESCROW_EVENTS, + chainId: parsedChainId, + eventType: req.query.eventType ? String(req.query.eventType) : undefined, + payer: req.query.payer ? String(req.query.payer) : undefined, + payee: req.query.payee ? String(req.query.payee) : undefined, + token: req.query.token ? String(req.query.token) : undefined, + jobId: req.query.jobId ? String(req.query.jobId) : undefined, + txId: req.query.txId ? String(req.query.txId) : undefined, + offset: req.query.offset ? Number(req.query.offset) : undefined, + size: req.query.size ? Number(req.query.size) : undefined, + caller: req.caller + } + + const result = await new EscrowEventsHandler(req.oceanNode).handle(command) + if (result.stream) { + const data = JSON.parse(await streamToString(result.stream as Readable)) + res.json(data) + } else { + res.status(result.status.httpStatus).send(result.status.error) + } + } +) diff --git a/src/components/httpRoutes/fileInfo.ts b/src/components/httpRoutes/fileInfo.ts index 85925b352..6f9ae7f5a 100644 --- a/src/components/httpRoutes/fileInfo.ts +++ b/src/components/httpRoutes/fileInfo.ts @@ -33,6 +33,9 @@ fileInfoRoute.post( res.status(400).send('Invalid request parameters') return } + // optional; required only for nodePersistentStorage files (gates on the bucket ACL) + const consumerAddress = (req.body as { consumerAddress?: string })?.consumerAddress + // Retrieve the file info let fileObject: StorageObject let fileInfoTask: FileInfoCommand @@ -42,6 +45,7 @@ fileInfoRoute.post( command: PROTOCOL_COMMANDS.FILE_INFO, did: fileInfoReq.did, serviceId: fileInfoReq.serviceId, + consumerAddress, caller: req.caller } } else { @@ -51,6 +55,7 @@ fileInfoRoute.post( command: PROTOCOL_COMMANDS.FILE_INFO, file: fileObject, type: fileObject.type as FileObjectType, + consumerAddress, caller: req.caller } } diff --git a/src/components/httpRoutes/index.ts b/src/components/httpRoutes/index.ts index 0706f3cba..75e06cc02 100644 --- a/src/components/httpRoutes/index.ts +++ b/src/components/httpRoutes/index.ts @@ -16,6 +16,7 @@ import { authRoutes } from './auth.js' import { adminConfigRoutes } from './adminConfig.js' import { persistentStorageRoutes } from './persistentStorage.js' import { accessListRoutes } from './accessList.js' +import { escrowRoutes } from './escrow.js' export * from './getOceanPeers.js' export * from './auth.js' @@ -67,6 +68,9 @@ httpRoutes.use(adminConfigRoutes) httpRoutes.use(persistentStorageRoutes) // access list routes httpRoutes.use(accessListRoutes) +// escrow events routes +// /api/services/escrow/events +httpRoutes.use(escrowRoutes) export function getAllServiceEndpoints() { httpRoutes.stack.forEach(addMapping.bind(null, [])) diff --git a/src/components/persistentStorage/PersistentStorageFactory.ts b/src/components/persistentStorage/PersistentStorageFactory.ts index d0ee58d5c..c00baf151 100644 --- a/src/components/persistentStorage/PersistentStorageFactory.ts +++ b/src/components/persistentStorage/PersistentStorageFactory.ts @@ -1,4 +1,5 @@ import { P2PCommandResponse } from '../../@types/index.js' +import { isPersistentStorageType } from '../../@types/fileObject.js' import type { AccessList } from '../../@types/AccessList.js' import type { DockerMountObject, @@ -41,6 +42,7 @@ export type BucketRow = { owner: string accessListJson: string createdAt: number + label: string | null } export interface PersistentStorageFileInfo { @@ -54,6 +56,7 @@ export type CreateBucketResult = { bucketId: string owner: string accessList: AccessList[] + label?: string | null } /** Bucket metadata from registry (list APIs and internal filtering). */ @@ -62,6 +65,7 @@ export type PersistentStorageBucketRecord = { owner: string createdAt: number accessLists: AccessList[] + label?: string | null } export abstract class PersistentStorageFactory { @@ -82,7 +86,8 @@ export abstract class PersistentStorageFactory { bucketId TEXT PRIMARY KEY, owner TEXT NOT NULL, accessListJson TEXT NOT NULL, - createdAt INTEGER NOT NULL + createdAt INTEGER NOT NULL, + label TEXT ); ` this.dbReadyPromise = new Promise((resolve, reject) => { @@ -91,8 +96,20 @@ export abstract class PersistentStorageFactory { reject(err) return } - this.dbReady = true - resolve() + // Migration: add the label column if it doesn't exist + this.db.run( + `ALTER TABLE persistent_storage_buckets ADD COLUMN label TEXT`, + (alterErr) => { + // Ignore "duplicate column name" (expected once the column exists); + // surface any other failure instead of starting with a broken schema. + if (alterErr && !/duplicate column name/i.test(alterErr.message)) { + reject(alterErr) + return + } + this.dbReady = true + resolve() + } + ) }) }) } @@ -123,7 +140,8 @@ export abstract class PersistentStorageFactory { public abstract createNewBucket( accessList: AccessList[], - owner: string + owner: string, + label?: string ): Promise public abstract listFiles( @@ -161,9 +179,45 @@ export abstract class PersistentStorageFactory { public abstract getDockerMountObject( bucketId: string, fileName: string, - consumerAddress?: string + consumerAddress: string + ): Promise + + public abstract getDockerOutputMountObject( + bucketId: string, + consumerAddress: string ): Promise + /** + * Returns a sha256 checksum of a bucket file's contents. + * Used to compute algorithm file checksums for compute jobs that reference + * persistent storage. + */ + public abstract getFileChecksum( + bucketId: string, + fileName: string, + consumerAddress?: string + ): Promise + + /** + * Stat-like metadata for a bucket file. ACL is enforced only when + * `consumerAddress` is provided (mirrors `getDockerMountObject`). + */ + public abstract getFileInfo( + bucketId: string, + fileName: string, + consumerAddress?: string + ): Promise<{ size: number; lastModified: number }> + + /** + * Returns a readable stream of a bucket file's contents. ACL is enforced only + * when `consumerAddress` is provided. Backs the NodePersistentStorage class. + */ + public abstract getReadableStream( + bucketId: string, + fileName: string, + consumerAddress?: string + ): Promise + // common functions async getBucketAccessList(bucketId: string): Promise { try { @@ -197,7 +251,8 @@ export abstract class PersistentStorageFactory { bucketId: row.bucketId, owner: row.owner, createdAt: row.createdAt, - accessLists: parseBucketAccessListsJson(row.accessListJson) + accessLists: parseBucketAccessListsJson(row.accessListJson), + label: row.label ?? null })) } @@ -210,17 +265,19 @@ export abstract class PersistentStorageFactory { bucketId: string, owner: string, accessListJson: string, - createdAt: number + createdAt: number, + label: string | null ): Promise { + // ON CONFLICT does not touch label, so a re-create never clobbers a rename. const sql = ` - INSERT INTO persistent_storage_buckets (bucketId, owner, accessListJson, createdAt) - VALUES (?, ?, ?, ?) + INSERT INTO persistent_storage_buckets (bucketId, owner, accessListJson, createdAt, label) + VALUES (?, ?, ?, ?, ?) ON CONFLICT(bucketId) DO UPDATE SET accessListJson=excluded.accessListJson; ` return this.ensureDbReady().then( () => new Promise((resolve, reject) => { - this.db.run(sql, [bucketId, owner, accessListJson, createdAt], (err) => { + this.db.run(sql, [bucketId, owner, accessListJson, createdAt, label], (err) => { if (err) reject(err) else resolve() }) @@ -229,7 +286,7 @@ export abstract class PersistentStorageFactory { } dbGetBucket(bucketId: string): Promise { - const sql = `SELECT bucketId, owner, accessListJson, createdAt FROM persistent_storage_buckets WHERE bucketId = ?` + const sql = `SELECT bucketId, owner, accessListJson, createdAt, label FROM persistent_storage_buckets WHERE bucketId = ?` return this.ensureDbReady().then( () => new Promise((resolve, reject) => { @@ -242,7 +299,7 @@ export abstract class PersistentStorageFactory { } dbListBucketsByOwner(owner: string): Promise { - const sql = `SELECT bucketId, owner, accessListJson, createdAt FROM persistent_storage_buckets WHERE owner = ? ORDER BY createdAt ASC` + const sql = `SELECT bucketId, owner, accessListJson, createdAt, label FROM persistent_storage_buckets WHERE owner = ? ORDER BY createdAt ASC` return this.ensureDbReady().then( () => new Promise((resolve, reject) => { @@ -267,6 +324,23 @@ export abstract class PersistentStorageFactory { ) } + dbUpdateBucketLabel( + bucketId: string, + owner: string, + label: string | null + ): Promise { + const sql = `UPDATE persistent_storage_buckets SET label = ? WHERE bucketId = ? AND owner = ?` + return this.ensureDbReady().then( + () => + new Promise((resolve, reject) => { + this.db.run(sql, [label, bucketId, owner], function (this: RunResult, err) { + if (err) reject(err) + else resolve(this.changes === 1) + }) + }) + ) + } + isAllowed(consumerAddress: string, accessLists: AccessList[]): Promise { return checkAddressOnAccessList(consumerAddress, accessLists, this.node) } @@ -288,34 +362,39 @@ export abstract class PersistentStorageFactory { throw new PersistentStorageAccessDeniedError() } } -} -/** - * Algorithms must not reference node persistent storage; only datasets may use - * `nodePersistentStorage` / `localfs` file objects. - */ -export function rejectPersistentStorageFileObjectOnAlgorithm( - fileObject: unknown -): P2PCommandResponse | null { - if (fileObject === null || fileObject === undefined || typeof fileObject !== 'object') { - return null - } - const fo = fileObject as { type?: string } - if (fo.type === 'nodePersistentStorage' || fo.type === 'localfs') { - return { - stream: null, - status: { - httpStatus: 400, - error: - 'Algorithms cannot use node persistent storage file objects; only datasets may reference persistent storage.' - } + public async updateBucketLabel( + bucketId: string, + label: string | null | undefined, + owner: string + ): Promise { + this.validateBucket(bucketId) + const bucket = await this.getBucket(bucketId) + if (!bucket) { + throw new Error(`Bucket not found: ${bucketId}`) + } + if (normalizeWeb3Address(owner) !== normalizeWeb3Address(bucket.owner)) { + throw new PersistentStorageAccessDeniedError() + } + // Omitted label leaves the name unchanged (PATCH semantics); null/'' clears it. + if (label === undefined) { + return bucket.label ?? null } + const normalized = label && label.trim() ? label.trim() : null + const updated = await this.dbUpdateBucketLabel( + bucketId, + normalizeWeb3Address(bucket.owner), + normalized + ) + if (!updated) { + throw new Error(`Bucket not found: ${bucketId}`) + } + return normalized } - return null } /** - * When a compute dataset uses a node persistent-storage file (localfs backend), + * When a compute dataset or algorithm uses a node persistent-storage file (localfs backend), * ensure the consumer is on the bucket ACL before proceeding. */ export async function ensureConsumerAllowedForPersistentStorageLocalfsFileObject( @@ -327,7 +406,7 @@ export async function ensureConsumerAllowedForPersistentStorageLocalfsFileObject return null } const fo = fileObject as { type?: string; bucketId?: unknown } - if (fo.type !== 'nodePersistentStorage') { + if (!isPersistentStorageType(fo.type)) { return null } if (typeof fo.bucketId !== 'string' || fo.bucketId.length === 0) { diff --git a/src/components/persistentStorage/PersistentStorageLocalFS.ts b/src/components/persistentStorage/PersistentStorageLocalFS.ts index 4c1dec0bc..92ac36698 100644 --- a/src/components/persistentStorage/PersistentStorageLocalFS.ts +++ b/src/components/persistentStorage/PersistentStorageLocalFS.ts @@ -2,7 +2,8 @@ import fs from 'fs' import fsp from 'fs/promises' import path from 'path' import { pipeline } from 'stream/promises' -import { randomUUID } from 'crypto' +import { createHash, randomUUID } from 'crypto' +import { uniqueNamesGenerator, adjectives, animals } from 'unique-names-generator' import type { AccessList } from '../../@types/AccessList.js' import type { @@ -29,7 +30,9 @@ export class PersistentStorageLocalFS extends PersistentStorageFactory { const options = node.getConfig().persistentStorage .options as PersistentStorageLocalFSOptions - this.baseFolder = options.folder + // Resolve to an absolute path so all derived paths (incl. Docker bind-mount Source, + // which must be absolute) are absolute even when a relative folder is configured. + this.baseFolder = path.resolve(options.folder) // Ensure base folder exists and is a directory (sync to avoid startup races). try { @@ -94,10 +97,15 @@ export class PersistentStorageLocalFS extends PersistentStorageFactory { async createNewBucket( accessList: AccessList[], - owner: string + owner: string, + label?: string ): Promise { const bucketId = randomUUID() const createdAt = Math.floor(Date.now() / 1000) + const finalLabel = + label && label.trim() + ? label.trim() + : uniqueNamesGenerator({ dictionaries: [adjectives, animals], separator: '-' }) const path = this.bucketPath(bucketId) CORE_LOGGER.debug(`Creating ${path} folder for new bucket`) await fsp.mkdir(path) @@ -105,10 +113,11 @@ export class PersistentStorageLocalFS extends PersistentStorageFactory { bucketId, owner, JSON.stringify(accessList ?? []), - createdAt + createdAt, + finalLabel ) - return { bucketId, owner, accessList } + return { bucketId, owner, accessList, label: finalLabel } } async listFiles( @@ -199,12 +208,15 @@ export class PersistentStorageLocalFS extends PersistentStorageFactory { async getDockerMountObject( bucketId: string, fileName: string, - consumerAddress?: string + consumerAddress: string ): Promise { await this.ensureBucketExists(bucketId) - if (consumerAddress) { - await this.assertConsumerAllowedForBucket(consumerAddress, bucketId) + if (!consumerAddress) { + throw new Error( + 'Access denied: consumerAddress is required to access persistent storage' + ) } + await this.assertConsumerAllowedForBucket(consumerAddress, bucketId) await this.ensureFileExists(bucketId, fileName) const source = path.join(this.bucketPath(bucketId), fileName) @@ -217,5 +229,76 @@ export class PersistentStorageLocalFS extends PersistentStorageFactory { ReadOnly: true } } + + async getDockerOutputMountObject( + bucketId: string, + consumerAddress: string + ): Promise { + await this.ensureBucketExists(bucketId) + await this.assertConsumerAllowedForBucket(consumerAddress, bucketId) + + const source = path.resolve(this.bucketPath(bucketId)) + await fsp.chmod(source, 0o777) + + return { + Type: 'bind', + Source: source, + Target: '/data/outputs', + ReadOnly: false + } + } + + async getFileChecksum( + bucketId: string, + fileName: string, + consumerAddress?: string + ): Promise { + await this.ensureBucketExists(bucketId) + // file checksum can be obtained without consumerAddress, but if provided, it will be validated for access. + if (consumerAddress) { + await this.assertConsumerAllowedForBucket(consumerAddress, bucketId) + } + await this.ensureFileExists(bucketId, fileName) + + const targetPath = path.join(this.bucketPath(bucketId), fileName) + const hash = createHash('sha256') + await pipeline(fs.createReadStream(targetPath), hash) + return hash.digest('hex') + } + + async getFileInfo( + bucketId: string, + fileName: string, + consumerAddress?: string + ): Promise<{ size: number; lastModified: number }> { + await this.ensureBucketExists(bucketId) + // fileInfo can be obtained without consumerAddress, but if provided, it will be validated for access. + if (consumerAddress) { + await this.assertConsumerAllowedForBucket(consumerAddress, bucketId) + } + await this.ensureFileExists(bucketId, fileName) + + const targetPath = path.join(this.bucketPath(bucketId), fileName) + const st = await fsp.stat(targetPath) + return { size: st.size, lastModified: Math.floor(st.mtimeMs) } + } + + async getReadableStream( + bucketId: string, + fileName: string, + consumerAddress?: string + ): Promise { + await this.ensureBucketExists(bucketId) + if (!consumerAddress) { + throw new Error( + 'Access denied: consumerAddress is required to access persistent storage' + ) + } + await this.assertConsumerAllowedForBucket(consumerAddress, bucketId) + await this.ensureFileExists(bucketId, fileName) + + const targetPath = path.join(this.bucketPath(bucketId), fileName) + return fs.createReadStream(targetPath) + } } /* eslint-enable security/detect-non-literal-fs-filename */ diff --git a/src/components/persistentStorage/PersistentStorageS3.ts b/src/components/persistentStorage/PersistentStorageS3.ts index bd4cac5ee..f5c9912b0 100644 --- a/src/components/persistentStorage/PersistentStorageS3.ts +++ b/src/components/persistentStorage/PersistentStorageS3.ts @@ -34,7 +34,8 @@ export class PersistentStorageS3 extends PersistentStorageFactory { // eslint-disable-next-line require-await async createNewBucket( accessList: AccessList[], - _owner: string + _owner: string, + _label?: string ): Promise { throw new Error('PersistentStorageS3 is not implemented yet') } @@ -79,8 +80,43 @@ export class PersistentStorageS3 extends PersistentStorageFactory { async getDockerMountObject( _bucketId: string, _fileName: string, - _consumerAddress?: string + _consumerAddress: string ): Promise { throw new Error('PersistentStorageS3 is not implemented yet') } + + // eslint-disable-next-line require-await + async getDockerOutputMountObject( + _bucketId: string, + _consumerAddress: string + ): Promise { + throw new Error('PersistentStorageS3 is not implemented yet') + } + + // eslint-disable-next-line require-await + async getFileChecksum( + _bucketId: string, + _fileName: string, + _consumerAddress?: string + ): Promise { + throw new Error('PersistentStorageS3 is not implemented yet') + } + + // eslint-disable-next-line require-await + async getFileInfo( + _bucketId: string, + _fileName: string, + _consumerAddress?: string + ): Promise<{ size: number; lastModified: number }> { + throw new Error('PersistentStorageS3 is not implemented yet') + } + + // eslint-disable-next-line require-await + async getReadableStream( + _bucketId: string, + _fileName: string, + _consumerAddress?: string + ): Promise { + throw new Error('PersistentStorageS3 is not implemented yet') + } } diff --git a/src/components/storage/NodePersistentStorage.ts b/src/components/storage/NodePersistentStorage.ts new file mode 100644 index 000000000..d59c3dae5 --- /dev/null +++ b/src/components/storage/NodePersistentStorage.ts @@ -0,0 +1,92 @@ +import { Readable } from 'stream' +import { + FileInfoResponse, + PersistentStorageObject, + StorageReadable +} from '../../@types/fileObject.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { OceanNode } from '../../OceanNode.js' +import { PersistentStorageFactory } from '../persistentStorage/PersistentStorageFactory.js' +import { Storage } from './Storage.js' + +/** + * Storage class for node persistent-storage (localfs bucket) file objects. + * Unlike the other backends, persistent storage lives on the node itself, so this + * class reaches it through the OceanNode singleton. ACL is enforced by the backend + * whenever a consumerAddress is available (captured at construction time, since the + * Storage interface does not pass it to the read methods). + */ +export class NodePersistentStorage extends Storage { + private consumerAddress?: string + + public constructor( + file: PersistentStorageObject, + config: OceanNodeConfig, + consumerAddress?: string + ) { + super(file, config, false) + this.consumerAddress = consumerAddress + const [isValid, message] = this.validate() + if (isValid === false) { + throw new Error(`Error validating the persistent storage file: ${message}`) + } + } + + private backend(): PersistentStorageFactory { + if (!this.config.persistentStorage?.enabled) { + throw new Error('Persistent storage is not enabled on this node') + } + const ps = OceanNode.getInstance().getPersistentStorage() + if (!ps) { + throw new Error('Persistent storage is not available on this node') + } + return ps + } + + validate(): [boolean, string] { + const file = this.getFile() as PersistentStorageObject + if (!file?.bucketId) { + return [false, 'Missing bucketId'] + } + if (!file?.fileName) { + return [false, 'Missing fileName'] + } + if (!this.config.persistentStorage?.enabled) { + return [false, 'Persistent storage is not enabled on this node'] + } + // Stay backend-agnostic: a non-localfs backend will throw at read time. + return [true, ''] + } + + override async getReadableStream(): Promise { + const { bucketId, fileName } = this.getFile() as PersistentStorageObject + const stream = await this.backend().getReadableStream( + bucketId, + fileName, + this.consumerAddress + ) + return { stream: stream as Readable, httpStatus: 200, headers: {} } + } + + async fetchSpecificFileMetadata( + fileObject: PersistentStorageObject, + forceChecksum: boolean + ): Promise { + const { bucketId, fileName } = fileObject + const ps = this.backend() + const { size } = await ps.getFileInfo(bucketId, fileName, this.consumerAddress) + // getFileChecksum always enforces ACL and requires a consumerAddress; skip when absent. + let checksum: string | undefined + if (forceChecksum && this.consumerAddress) { + checksum = await ps.getFileChecksum(bucketId, fileName, this.consumerAddress) + } + return { + valid: true, + contentLength: String(size), + contentType: 'application/octet-stream', + checksum, + name: fileName, + type: 'nodePersistentStorage' + } + } +} diff --git a/src/components/storage/Storage.ts b/src/components/storage/Storage.ts index 9d74dd44b..ad04f2d56 100644 --- a/src/components/storage/Storage.ts +++ b/src/components/storage/Storage.ts @@ -11,8 +11,13 @@ import { OceanNodeConfig } from '../../@types/OceanNode.js' import { CORE_LOGGER } from '../../utils/logging/common.js' export abstract class Storage { - // eslint-disable-next-line no-use-before-define -- static factory return type references this class - static getStorageClass: (file: any, config: OceanNodeConfig) => Storage + /* eslint-disable no-use-before-define -- static factory return type references this class */ + static getStorageClass: ( + file: any, + config: OceanNodeConfig, + consumerAddress?: string + ) => Storage + /* eslint-enable no-use-before-define */ private file: StorageObject config: OceanNodeConfig diff --git a/src/components/storage/getStorageClass.ts b/src/components/storage/getStorageClass.ts index fbad7f507..c348b7711 100644 --- a/src/components/storage/getStorageClass.ts +++ b/src/components/storage/getStorageClass.ts @@ -7,6 +7,7 @@ import { FTPStorage } from './FTPStorage.js' import { IpfsStorage } from './IpfsStorage.js' import { S3Storage } from './S3Storage.js' import { UrlStorage } from './UrlStorage.js' +import { NodePersistentStorage } from './NodePersistentStorage.js' export type StorageClass = | UrlStorage @@ -14,8 +15,13 @@ export type StorageClass = | ArweaveStorage | S3Storage | FTPStorage + | NodePersistentStorage -export function getStorageClass(file: any, config: OceanNodeConfig): StorageClass { +export function getStorageClass( + file: any, + config: OceanNodeConfig, + consumerAddress?: string +): StorageClass { if (!file) { throw new Error('Empty file object') } @@ -34,6 +40,8 @@ export function getStorageClass(file: any, config: OceanNodeConfig): StorageClas return new S3Storage(file, config) case FileObjectType.FTP: return new FTPStorage(file, config) + case FileObjectType.NODE_PERSISTENT_STORAGE.toLowerCase(): + return new NodePersistentStorage(file, config, consumerAddress) default: throw new Error(`Invalid storage type: ${type}`) } diff --git a/src/components/storage/index.ts b/src/components/storage/index.ts index 62a1f310d..9b649b415 100644 --- a/src/components/storage/index.ts +++ b/src/components/storage/index.ts @@ -5,7 +5,16 @@ import { FTPStorage } from './FTPStorage.js' import { IpfsStorage } from './IpfsStorage.js' import { S3Storage } from './S3Storage.js' import { UrlStorage } from './UrlStorage.js' +import { NodePersistentStorage } from './NodePersistentStorage.js' Storage.getStorageClass = getStorageClass -export { Storage, UrlStorage, ArweaveStorage, IpfsStorage, S3Storage, FTPStorage } +export { + Storage, + UrlStorage, + ArweaveStorage, + IpfsStorage, + S3Storage, + FTPStorage, + NodePersistentStorage +} diff --git a/src/test/integration/algorithmsAccess.test.ts b/src/test/integration/algorithmsAccess.test.ts index fc6dca45b..cae2eccca 100644 --- a/src/test/integration/algorithmsAccess.test.ts +++ b/src/test/integration/algorithmsAccess.test.ts @@ -45,10 +45,11 @@ import { homedir } from 'os' import { DEVELOPMENT_CHAIN_ID, getOceanArtifactsAdresses } from '../../utils/address.js' import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } import OceanToken from '@oceanprotocol/contracts/artifacts/contracts/utils/OceanToken.sol/OceanToken.json' with { type: 'json' } -import EscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json' with { type: 'json' } +import EnterpriseEscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/EnterpriseEscrow.sol/EnterpriseEscrow.json' with { type: 'json' } import { createHash } from 'crypto' import { getAlgoChecksums } from '../../components/core/compute/utils.js' import { createHashForSignature, safeSign } from '../utils/signature.js' +import { ensureEnterpriseFeeTokenAllowed } from '../utils/contracts.js' describe('********** Trusted algorithms Flow', () => { let previousConfiguration: OverrideEnvConfig[] @@ -124,14 +125,19 @@ describe('********** Trusted algorithms Flow', () => { provider = new JsonRpcProvider('http://127.0.0.1:8545') publisherAccount = (await provider.getSigner(0)) as Signer consumerAccount = (await provider.getSigner(1)) as Signer + await ensureEnterpriseFeeTokenAllowed( + provider, + artifactsAddresses.development.EnterpriseFeeCollector, + paymentToken + ) paymentTokenContract = new ethers.Contract( paymentToken, OceanToken.abi, publisherAccount ) escrowContract = new ethers.Contract( - artifactsAddresses.development.Escrow, - EscrowJson.abi, + artifactsAddresses.development.EnterpriseEscrow, + EnterpriseEscrowJson.abi, publisherAccount ) }) @@ -389,7 +395,7 @@ describe('********** Trusted algorithms Flow', () => { const consumerAddress = await consumerAccount.getAddress() escrowContract = new ethers.Contract( initializeResponse.payment.escrowAddress, - EscrowJson.abi, + EnterpriseEscrowJson.abi, publisherAccount ) diff --git a/src/test/integration/compute.test.ts b/src/test/integration/compute.test.ts index 79af02220..931a7b8df 100644 --- a/src/test/integration/compute.test.ts +++ b/src/test/integration/compute.test.ts @@ -69,7 +69,7 @@ import { DEVELOPMENT_CHAIN_ID, getOceanArtifactsAdresses } from '../../utils/add import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' with { type: 'json' } import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } import OceanToken from '@oceanprotocol/contracts/artifacts/contracts/utils/OceanToken.sol/OceanToken.json' with { type: 'json' } -import EscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json' with { type: 'json' } +import EnterpriseEscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/EnterpriseEscrow.sol/EnterpriseEscrow.json' with { type: 'json' } import { createHash, randomBytes } from 'crypto' import { EncryptMethod } from '../../@types/fileObject.js' import { @@ -90,7 +90,10 @@ import { PersistentStorageCreateBucketHandler, PersistentStorageUploadFileHandler } from '../../components/core/handler/persistentStorage.js' -import { deployAndGetAccessListConfig } from '../utils/contracts.js' +import { + deployAndGetAccessListConfig, + ensureEnterpriseFeeTokenAllowed +} from '../utils/contracts.js' import * as tar from 'tar' /** @@ -169,27 +172,10 @@ describe('********** Compute', () => { let algoDDO: any let datasetDDO: any let artifactsAddresses: any - let testAddressFile: string let initializeResponse: ProviderComputeInitializeResults before(async () => { - const defaultTestAddressFile = `${homedir}/.ocean/ocean-contracts/artifacts/address.json` - // eslint-disable-next-line security/detect-non-literal-fs-filename - if (existsSync(defaultTestAddressFile)) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - artifactsAddresses = JSON.parse(await fsp.readFile(defaultTestAddressFile, 'utf8')) - } else { - artifactsAddresses = getOceanArtifactsAdresses() - } - if (artifactsAddresses?.development?.EnterpriseEscrow) { - delete artifactsAddresses.development.EnterpriseEscrow - testAddressFile = path.join( - tmpdir(), - `ocean-node-test-addresses-${Date.now()}.json` - ) - // eslint-disable-next-line security/detect-non-literal-fs-filename - await fsp.writeFile(testAddressFile, JSON.stringify(artifactsAddresses)) - } + artifactsAddresses = getOceanArtifactsAdresses() paymentToken = artifactsAddresses.development.Ocean previousConfiguration = await setupEnvironment( TEST_ENV_CONFIG_FILE, @@ -207,7 +193,7 @@ describe('********** Compute', () => { JSON.stringify([DEVELOPMENT_CHAIN_ID]), '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), - testAddressFile || defaultTestAddressFile, + `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, '[{"socketPath":"/var/run/docker.sock","environments":[{"storageExpiry":604800,"maxJobDuration":3600,"minJobDuration":60,"resources":[{"id":"cpu","total":4,"max":4,"min":1,"type":"cpu"},{"id":"ram","total":10,"max":10,"min":1,"type":"ram"},{"id":"disk","total":10,"max":10,"min":0,"type":"disk"}],"fees":{"' + DEVELOPMENT_CHAIN_ID + '":[{"feeToken":"' + @@ -234,6 +220,11 @@ describe('********** Compute', () => { consumerAccount = (await provider.getSigner(1)) as Signer additionalViewerAccount = (await provider.getSigner(2)) as Signer nonAllowedAccount = (await provider.getSigner(3)) as Signer + await ensureEnterpriseFeeTokenAllowed( + provider, + artifactsAddresses.development.EnterpriseFeeCollector, + paymentToken + ) publisherAddress = await publisherAccount.getAddress() algoDDO = { ...publishAlgoDDO } @@ -248,18 +239,19 @@ describe('********** Compute', () => { OceanToken.abi, publisherAccount ) + console.log( + 'initializeResponse.payment.escrowAddress:', + artifactsAddresses.development.EnterpriseEscrow + ) escrowContract = new ethers.Contract( - artifactsAddresses.development.Escrow, - EscrowJson.abi, + artifactsAddresses.development.EnterpriseEscrow, + EnterpriseEscrowJson.abi, publisherAccount ) }) after(async () => { await oceanNode.tearDownAll() await tearDownEnvironment(previousConfiguration) - if (testAddressFile) { - await fsp.rm(testAddressFile, { force: true }) - } }) it('Sets up compute envs', () => { assert(oceanNode, 'Failed to instantiate OceanNode') @@ -482,11 +474,9 @@ describe('********** Compute', () => { assert(resultParsed.providerFee.validUntil, 'algorithm validUntil does not exist') assert(result.datasets[0].validOrder === false, 'incorrect validOrder') // expect false because tx id was not provided and no start order was called before assert(result.payment, ' Payment structure does not exists') - const expectedEscrowAddress = - oceanNode.escrow.getEscrowContractAddressForChain(DEVELOPMENT_CHAIN_ID) - assert(expectedEscrowAddress, 'Expected escrow address does not exist') + console.log('artifactsAddresses.development', artifactsAddresses.development) assert( - result.payment.escrowAddress.toLowerCase() === expectedEscrowAddress.toLowerCase(), + result.payment.escrowAddress === artifactsAddresses.development.EnterpriseEscrow, 'Incorrect escrow address' ) assert(result.payment.payee === firstEnv.consumerAddress, 'Incorrect payee address') @@ -711,29 +701,25 @@ describe('********** Compute', () => { }) it('should start a compute job with output to URL storage at 172.15.0.7', async () => { // deposit funds and create auth in escrow - escrowContract = new ethers.Contract( - initializeResponse.payment.escrowAddress, - EscrowJson.abi, - publisherAccount - ) - let balance = await paymentTokenContract.balanceOf(await consumerAccount.getAddress()) + const consumerAddress = await consumerAccount.getAddress() + let balance = await paymentTokenContract.balanceOf(consumerAddress) if (BigInt(balance.toString()) === BigInt(0)) { const mintAmount = ethers.parseUnits('1000', 18) - const mintTx = await paymentTokenContract.mint( - await consumerAccount.getAddress(), - mintAmount - ) + const mintTx = await paymentTokenContract.mint(consumerAddress, mintAmount) await mintTx.wait() - balance = await paymentTokenContract.balanceOf(await consumerAccount.getAddress()) + balance = await paymentTokenContract.balanceOf(consumerAddress) } - await paymentTokenContract + const approveTx = await paymentTokenContract .connect(consumerAccount) .approve(initializeResponse.payment.escrowAddress, balance) - await escrowContract + await approveTx.wait() + + const depositTx = await escrowContract .connect(consumerAccount) .deposit(initializeResponse.payment.token, balance) + await depositTx.wait() - await escrowContract + const authorizeTx = await escrowContract .connect(consumerAccount) .authorize( initializeResponse.payment.token, @@ -742,10 +728,11 @@ describe('********** Compute', () => { initializeResponse.payment.minLockSeconds, 10 ) + await authorizeTx.wait() const fundsBefore = await oceanNode.escrow.getUserAvailableFunds( DEVELOPMENT_CHAIN_ID, - await consumerAccount.getAddress(), + consumerAddress, paymentToken ) assert(BigInt(fundsBefore.toString()) > BigInt(0), 'Should have funds in escrow') @@ -850,7 +837,7 @@ describe('********** Compute', () => { await consumerAccount.getAddress(), firstEnv.consumerAddress ) - for (const lock of locks) { + for (const lock of locks ?? []) { try { await escrowContract .connect(consumerAccount) @@ -908,11 +895,6 @@ describe('********** Compute', () => { it('should start a compute job with maxed resources', async function () { this.timeout(130_000) // waitForAllJobsToFinish can take up to 120s await waitForAllJobsToFinish(oceanNode) - escrowContract = new ethers.Contract( - initializeResponse.payment.escrowAddress, - EscrowJson.abi, - publisherAccount - ) let balance = await paymentTokenContract.balanceOf(await consumerAccount.getAddress()) if (BigInt(balance.toString()) === BigInt(0)) { console.log('Minting') @@ -964,14 +946,12 @@ describe('********** Compute', () => { ) assert(BigInt(fundsBefore.toString()) > BigInt(0), 'Should have funds in escrow') - const locksBefore = ( - await oceanNode.escrow.getLocks( - DEVELOPMENT_CHAIN_ID, - paymentToken, - await consumerAccount.getAddress(), - firstEnv.consumerAddress - ) - ).length + const locksBefore = await oceanNode.escrow.getLocks( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) const nonce = Date.now().toString() const messageHashBytes = createHashForSignature( @@ -1041,7 +1021,9 @@ describe('********** Compute', () => { await consumerAccount.getAddress(), firstEnv.consumerAddress ) - assert(locksAfter.length > locksBefore, 'We should have locks') + if (locksBefore && locksAfter) { + assert(locksAfter.length > locksBefore.length, 'We should have locks') + } const authAfter = await oceanNode.escrow.getAuthorizations( DEVELOPMENT_CHAIN_ID, @@ -2270,6 +2252,23 @@ describe('********** Compute', () => { const jobReachedSuccessfulTerminalStatus = (status: number) => status === C2DStatusNumber.JobFinished || status === C2DStatusNumber.JobSettle + const getJobConfigurationLog = async (fullJobId: string): Promise => { + if (!psDockerEngine) return 'configuration log unavailable: no Docker engine' + const innerJobId = fullJobId.slice(fullJobId.indexOf('-') + 1) + const configurationLog = path.join( + (psDockerEngine as any).getStoragePath(), + innerJobId, + 'data/logs/configuration.log' + ) + try { + return await fsp.readFile(configurationLog, 'utf8') + } catch (error) { + return `configuration log unavailable at ${configurationLog}: ${ + error instanceof Error ? error.message : String(error) + }` + } + } + const waitForComputeJobFinished = async ( node: OceanNode, fullJobId: string, @@ -2294,8 +2293,10 @@ describe('********** Compute', () => { return j } if (j.dateFinished && !jobReachedSuccessfulTerminalStatus(j.status)) { + const configurationLog = await getJobConfigurationLog(fullJobId) assert.fail( - `Job ended with status ${j.status} (${j.statusText}) instead of JobFinished or JobSettle` + `Job ended with status ${j.status} (${j.statusText}) instead of JobFinished or JobSettle.\n` + + `Configuration log:\n${configurationLog}` ) } await sleep(3000) @@ -2305,6 +2306,139 @@ describe('********** Compute', () => { ) } + // create a bucket owned by `account` and upload `content` under `fileName` + const createBucketAndUpload = async ( + account: any, + fileName: string, + content: string | Buffer + ): Promise => { + const consumerAddress = await account.getAddress() + let nonce = Date.now().toString() + let signature = await safeSign( + account, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + ) + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + authorization: undefined + } as any) + assert.equal(createRes.status.httpStatus, 200) + const bucketId = (await streamToObject(createRes.stream as Readable)) + .bucketId as string + + nonce = Date.now().toString() + signature = await safeSign( + account, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE + ) + ) + const uploadRes = await new PersistentStorageUploadFileHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE, + consumerAddress, + signature, + nonce, + bucketId, + fileName, + stream: Readable.from(Buffer.isBuffer(content) ? content : Buffer.from(content)) + } as any) + assert.equal(uploadRes.status.httpStatus, 200) + return bucketId + } + + // ECIES-encrypted file object (hex) wrapping a nodePersistentStorage reference, + // mirroring how an encrypted DDO service.files would look + const encryptPSFileObject = async ( + bucketId: string, + fileName: string + ): Promise => { + const data = Uint8Array.from( + Buffer.from( + JSON.stringify({ + files: [{ type: 'nodePersistentStorage', bucketId, fileName }] + }) + ) + ) + const encrypted = await oceanNode.getKeyManager().encrypt(data, EncryptMethod.ECIES) + return Buffer.from(encrypted).toString('hex') + } + + const buildFreeStart = async ( + account: any, + datasets: any[], + algorithm: any + ): Promise => { + const consumerAddress = await account.getAddress() + const nonce = Date.now().toString() + const signature = await safeSign( + account, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.FREE_COMPUTE_START + ) + ) + return { + command: PROTOCOL_COMMANDS.FREE_COMPUTE_START, + consumerAddress, + signature, + nonce, + environment: firstEnv.id, + queueMaxWaitTime: 0, + datasets, + algorithm, + output: null + } + } + + // run a free compute job to completion and return the extracted contents of a + // single output file written by the algorithm into /data/outputs + const runFreeJobAndReadOutput = async ( + account: any, + datasets: any[], + algorithm: any, + outputFileName: string + ): Promise => { + const startTask = await buildFreeStart(account, datasets, algorithm) + const startRes = await new FreeComputeStartHandler(oceanNode).handle(startTask) + assert.equal(startRes.status.httpStatus, 200, String(startRes.status.error)) + const started = await streamToObject(startRes.stream as Readable) + const fullJobId = started[0].jobId as string + const innerJobId = fullJobId.slice(fullJobId.indexOf('-') + 1) + await sleep(2000) // give the job a moment to start and create its output directory + await waitForComputeJobFinished(oceanNode, fullJobId, 180_000) + + const base = (psDockerEngine as any).getStoragePath() as string + const outputsTarPath = path.join(base, innerJobId, 'data/outputs/outputs.tar') + /* eslint-disable security/detect-non-literal-fs-filename -- job paths from C2D engine */ + assert(existsSync(outputsTarPath), `expected outputs archive at ${outputsTarPath}`) + const extractDir = await fsp.mkdtemp(path.join(tmpdir(), 'ocean-ps-out-')) + try { + await tar.x({ file: outputsTarPath, cwd: extractDir }, [ + `outputs/${outputFileName}` + ]) + const extracted = path.join(extractDir, `outputs/${outputFileName}`) + assert( + existsSync(extracted), + `expected outputs/${outputFileName} inside outputs.tar` + ) + return await fsp.readFile(extracted, 'utf8') + } finally { + await fsp.rm(extractDir, { recursive: true, force: true }) + } + /* eslint-enable security/detect-non-literal-fs-filename */ + } + before(async function () { try { const d = new Dockerode() @@ -2635,6 +2769,374 @@ describe('********** Compute', () => { 'expected access-denied style message' ) }) + + it('reads a persistent storage dataset provided as an ENCRYPTED file object', async function () { + const fileName = 'enc-ps-data.txt' + const secret = 'ENCRYPTED_PS_DATASET_OK\n' + const bucketId = await createBucketAndUpload(consumerAccount, fileName, secret) + const encryptedFileObject = await encryptPSFileObject(bucketId, fileName) + + const rawcode = [ + "const fs = require('fs');", + `const p = '/data/persistentStorage/${bucketId}/${fileName}';`, + "fs.mkdirSync('/data/outputs', { recursive: true });", + "fs.writeFileSync('/data/outputs/enc-result.txt', fs.readFileSync(p, 'utf8'), 'utf8');" + ].join('\n') + const algoMeta = publishedAlgoDataset.ddo.metadata.algorithm + + const written = await runFreeJobAndReadOutput( + consumerAccount, + [{ fileObject: encryptedFileObject as any }], + { meta: { ...algoMeta, rawcode } }, + 'enc-result.txt' + ) + assert.equal(written, secret) + }) + + it('runs an ALGORITHM stored in persistent storage (no longer banned)', async function () { + const algoFileName = 'algo.js' + const inputFileName = 'algo-input.txt' + const algoCode = [ + "const fs = require('fs');", + "fs.mkdirSync('/data/outputs', { recursive: true });", + "fs.writeFileSync('/data/outputs/algo-result.txt', 'PS_ALGORITHM_OK\\n', 'utf8');" + ].join('\n') + const bucketId = await createBucketAndUpload( + consumerAccount, + algoFileName, + algoCode + ) + // upload an input file into the same bucket so the job has a dataset + await (async () => { + const consumerAddress = await consumerAccount.getAddress() + const nonce = Date.now().toString() + const signature = await safeSign( + consumerAccount, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE + ) + ) + const uploadRes = await new PersistentStorageUploadFileHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE, + consumerAddress, + signature, + nonce, + bucketId, + fileName: inputFileName, + stream: Readable.from(Buffer.from('input\n')) + } as any) + assert.equal(uploadRes.status.httpStatus, 200) + })() + + const algoMeta = publishedAlgoDataset.ddo.metadata.algorithm + const written = await runFreeJobAndReadOutput( + consumerAccount, + [ + { + fileObject: { + type: 'nodePersistentStorage', + bucketId, + fileName: inputFileName + } as any + } + ], + { + meta: { ...algoMeta }, + fileObject: { + type: 'nodePersistentStorage', + bucketId, + fileName: algoFileName + } as any + }, + 'algo-result.txt' + ) + assert.equal(written, 'PS_ALGORITHM_OK\n') + }) + + it('handles a MIX of persistent-storage and non-persistent-storage datasets', async function () { + const fileName = 'mixed-ps.txt' + const secret = 'MIXED_PS_OK\n' + const bucketId = await createBucketAndUpload(consumerAccount, fileName, secret) + const encryptedFileObject = await encryptPSFileObject(bucketId, fileName) + + const rawcode = [ + "const fs = require('fs');", + `const ps = fs.readFileSync('/data/persistentStorage/${bucketId}/${fileName}', 'utf8');`, + "const inputs = fs.readdirSync('/data/inputs').filter(f => f !== 'algoCustomData.json');", + "fs.mkdirSync('/data/outputs', { recursive: true });", + "fs.writeFileSync('/data/outputs/mixed-result.txt', ps + '|inputs=' + inputs.length, 'utf8');" + ].join('\n') + const algoMeta = publishedAlgoDataset.ddo.metadata.algorithm + + const written = await runFreeJobAndReadOutput( + consumerAccount, + [ + { fileObject: encryptedFileObject as any }, + { + fileObject: { + type: 'url', + method: 'GET', + url: 'https://raw.githubusercontent.com/oceanprotocol/test-algorithm/master/javascript/algo.js' + } as any + } + ], + { meta: { ...algoMeta, rawcode } }, + 'mixed-result.txt' + ) + // the persistent-storage dataset is bind-mounted, the URL dataset is downloaded + // into /data/inputs alongside algoCustomData.json + assert(written.startsWith(secret + '|inputs='), `unexpected output: ${written}`) + const count = parseInt(written.split('|inputs=')[1], 10) + assert(count >= 1, `expected at least one downloaded non-PS input, got ${count}`) + }) + + it('denies a persistent-storage ALGORITHM when the consumer is not on the bucket ACL', async function () { + const algoFileName = 'private-algo.js' + const bucketId = await createBucketAndUpload( + consumerAccount, + algoFileName, + "console.log('noop');" + ) + + const intruder = nonAllowedAccount + const algoMeta = publishedAlgoDataset.ddo.metadata.algorithm + const startTask = await buildFreeStart( + intruder, + [ + { + fileObject: { + type: 'nodePersistentStorage', + bucketId, + fileName: algoFileName + } as any + } + ], + { + meta: { ...algoMeta }, + fileObject: { + type: 'nodePersistentStorage', + bucketId, + fileName: algoFileName + } as any + } + ) + const startRes = await new FreeComputeStartHandler(oceanNode).handle(startTask) + assert.equal(startRes.status.httpStatus, 403, String(startRes.status.error)) + assert.include((startRes.status.error || '').toLowerCase(), 'allow') + }) + + it('getAlgoChecksums computes a real content checksum for a PUBLISHED persistent-storage algorithm', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 6) + const algoFileName = 'published-algo.js' + const algoCode = "console.log('published ps algo');\n" + const bucketId = await createBucketAndUpload( + consumerAccount, + algoFileName, + algoCode + ) + const expected = createHash('sha256').update(Buffer.from(algoCode)).digest('hex') + + // publish an algorithm DDO whose (encrypted) service.files points to the bucket file + const psAlgoAsset = JSON.parse(JSON.stringify(algoAsset)) + psAlgoAsset.services[0].files.files = [ + { type: 'nodePersistentStorage', bucketId, fileName: algoFileName } + ] + const published = await publishAsset(psAlgoAsset, publisherAccount) + assert(published, 'failed to publish persistent-storage algorithm DDO') + + const { ddo, wasTimeout } = await waitToIndex( + oceanNode, + published.ddo.id, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT * 3, + true + ) + if (!ddo) { + expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) + return + } + + const config = await getConfiguration() + const consumerAddress = await consumerAccount.getAddress() + const checksums = await getAlgoChecksums( + ddo.id, + ddo.services[0].id, + oceanNode, + config, + consumerAddress + ) + expect(checksums.files).to.equal(expected) + expect(checksums.container).to.not.equal('') + }) + + describe('Compute output in bucket (outputBucketId)', function () { + let outputBucketId: string + const seedFileName = 'seed.txt' + const resultFileName = 'bucket-result.txt' + const seedContent = 'OUTPUT_BUCKET_SEED\n' + + const bucketResultPath = () => + path.join(psRoot, 'buckets', outputBucketId, resultFileName) + + const copyRawcode = (inputFileName: string, appendSuffix = '') => + [ + "const fs = require('fs');", + `const c = fs.readFileSync('/data/persistentStorage/${outputBucketId}/${inputFileName}', 'utf8');`, + `fs.writeFileSync('/data/outputs/${resultFileName}', c + '${appendSuffix}', 'utf8');` + ].join('\n') + + const startFreeJob = async ( + inputFileName: string, + rawcode: string, + opts: { account?: typeof consumerAccount; output?: string } = {} + ) => { + const account = opts.account ?? consumerAccount + const consumerAddress = await account.getAddress() + const nonce = Date.now().toString() + const signature = await safeSign( + account, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.FREE_COMPUTE_START + ) + ) + const startTask: FreeComputeStartCommand = { + command: PROTOCOL_COMMANDS.FREE_COMPUTE_START, + consumerAddress, + signature, + nonce, + environment: firstEnv.id, + queueMaxWaitTime: 0, + datasets: [ + { + fileObject: { + type: 'nodePersistentStorage', + bucketId: outputBucketId, + fileName: inputFileName + } as any + } + ], + algorithm: { + meta: { ...publishedAlgoDataset.ddo.metadata.algorithm, rawcode } + }, + output: opts.output ?? null, + outputBucketId + } + return new FreeComputeStartHandler(oceanNode).handle(startTask) + } + + const startFreeJobAndWait = async (inputFileName: string, rawcode: string) => { + const startRes = await startFreeJob(inputFileName, rawcode) + assert.equal(startRes.status.httpStatus, 200, String(startRes.status.error)) + const started = await streamToObject(startRes.stream as Readable) + const fullJobId = started[0].jobId as string + const job = await waitForComputeJobFinished(oceanNode, fullJobId, 180_000) + return { job, innerJobId: fullJobId.slice(fullJobId.indexOf('-') + 1) } + } + + before(async function () { + const consumerAddress = await consumerAccount.getAddress() + let nonce = Date.now().toString() + let signature = await safeSign( + consumerAccount, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + ) + const createRes = await new PersistentStorageCreateBucketHandler( + oceanNode + ).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + authorization: undefined + } as any) + assert.equal(createRes.status.httpStatus, 200) + outputBucketId = (await streamToObject(createRes.stream as Readable)).bucketId + + nonce = Date.now().toString() + signature = await safeSign( + consumerAccount, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE + ) + ) + const uploadRes = await new PersistentStorageUploadFileHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE, + consumerAddress, + signature, + nonce, + bucketId: outputBucketId, + fileName: seedFileName, + stream: Readable.from(Buffer.from(seedContent)) + } as any) + assert.equal(uploadRes.status.httpStatus, 200) + }) + + /* eslint-disable security/detect-non-literal-fs-filename -- test paths */ + it('stores job results directly in the bucket as individual files (no outputs.tar)', async function () { + this.timeout(300_000) + const { job, innerJobId } = await startFreeJobAndWait( + seedFileName, + copyRawcode(seedFileName) + ) + + assert.equal(await fsp.readFile(bucketResultPath(), 'utf8'), seedContent) + const files = await oceanNode + .getPersistentStorage() + .listFiles(outputBucketId, await consumerAccount.getAddress()) + assert( + files.some((f) => f.name === resultFileName), + 'result file should be listed in the bucket' + ) + + const base = (psDockerEngine as any).getStoragePath() as string + const outputsTarPath = path.join(base, innerJobId, 'data/outputs/outputs.tar') + assert(!existsSync(outputsTarPath), 'outputs.tar should not exist') + assert( + !(job.results || []).some((r: any) => r.type === 'output'), + 'no output entry expected in results' + ) + }) + + it('chains a bucket output file as input of a next job and overwrites on collision', async function () { + this.timeout(300_000) + await startFreeJobAndWait(resultFileName, copyRawcode(resultFileName, 'CHAINED')) + + assert.equal( + await fsp.readFile(bucketResultPath(), 'utf8'), + seedContent + 'CHAINED' + ) + const entries = await fsp.readdir(path.join(psRoot, 'buckets', outputBucketId)) + assert.deepEqual(entries.sort(), [resultFileName, seedFileName].sort()) + }) + /* eslint-enable security/detect-non-literal-fs-filename */ + + it('rejects a start request with both output and outputBucketId', async function () { + const res = await startFreeJob(seedFileName, "console.log('noop');", { + output: '0xdeadbeef' + }) + assert.equal(res.status.httpStatus, 400, String(res.status.error)) + assert.include(String(res.status.error), 'mutually exclusive') + }) + + it('denies compute start when consumer is not allowed on the output bucket', async function () { + const res = await startFreeJob(seedFileName, "console.log('noop');", { + account: nonAllowedAccount + }) + assert.equal(res.status.httpStatus, 403, String(res.status.error)) + assert.include((res.status.error || '').toLowerCase(), 'allow') + }) + }) }) }) @@ -3060,28 +3562,10 @@ describe('********** Compute Access Restrictions', () => { let escrowContract: any let paymentTokenContract: any let artifactsAddresses: any - let testAddressFile: string before(async function () { this.timeout(DEFAULT_TEST_TIMEOUT * 2) - const defaultTestAddressFile = `${homedir}/.ocean/ocean-contracts/artifacts/address.json` - // eslint-disable-next-line security/detect-non-literal-fs-filename - if (existsSync(defaultTestAddressFile)) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - const addressFileContent = await fsp.readFile(defaultTestAddressFile, 'utf8') - artifactsAddresses = JSON.parse(addressFileContent) - } else { - artifactsAddresses = getOceanArtifactsAdresses() - } - if (artifactsAddresses?.development?.EnterpriseEscrow) { - delete artifactsAddresses.development.EnterpriseEscrow - testAddressFile = path.join( - tmpdir(), - `ocean-node-test-addresses-${Date.now()}.json` - ) - // eslint-disable-next-line security/detect-non-literal-fs-filename - await fsp.writeFile(testAddressFile, JSON.stringify(artifactsAddresses)) - } + artifactsAddresses = getOceanArtifactsAdresses() paymentToken = artifactsAddresses.development.Ocean previousConfiguration = await setupEnvironment( TEST_ENV_CONFIG_FILE, @@ -3097,7 +3581,7 @@ describe('********** Compute Access Restrictions', () => { JSON.stringify(mockSupportedNetworks), JSON.stringify([DEVELOPMENT_CHAIN_ID]), '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', - testAddressFile || defaultTestAddressFile, + `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, '[{"socketPath":"/var/run/docker.sock","paymentClaimInterval":60,"environments":[{"storageExpiry":604800,"maxJobDuration":3600,"minJobDuration":60,"resources":[{"id":"cpu","total":4,"max":4,"min":1,"type":"cpu"},{"id":"ram","total":10,"max":10,"min":1,"type":"ram"},{"id":"disk","total":10,"max":10,"min":0,"type":"disk"}],"fees":{"' + DEVELOPMENT_CHAIN_ID + '":[{"feeToken":"' + @@ -3125,15 +3609,16 @@ describe('********** Compute Access Restrictions', () => { const provider = new JsonRpcProvider('http://127.0.0.1:8545') const publisherAccount = (await provider.getSigner(0)) as Signer consumerAccount = (await provider.getSigner(1)) as Signer + escrowContract = new ethers.Contract( + artifactsAddresses.development.EnterpriseEscrow, + EnterpriseEscrowJson.abi, + consumerAccount + ) paymentTokenContract = new ethers.Contract( paymentToken, OceanToken.abi, publisherAccount ) - const escrowAddress = - oceanNode.escrow.getEscrowContractAddressForChain(DEVELOPMENT_CHAIN_ID) - assert(escrowAddress, 'Expected escrow address does not exist') - escrowContract = new ethers.Contract(escrowAddress, EscrowJson.abi, consumerAccount) // Get the Docker engine const c2dEngines = oceanNode.getC2DEngines() @@ -3157,9 +3642,6 @@ describe('********** Compute Access Restrictions', () => { after(async () => { await oceanNode.tearDownAll() await tearDownEnvironment(previousConfiguration) - if (testAddressFile) { - await fsp.rm(testAddressFile, { force: true }) - } }) it('should transition job to JobSettle status when PublishingResults completes', async function () { @@ -3248,16 +3730,14 @@ describe('********** Compute Access Restrictions', () => { await consumerAccount.getAddress(), providerAddress ) - if (locks.length > 0) { - // Cancel all existing locks - for (const lock of locks) { - try { - await escrowContract - .connect(consumerAccount) - .cancelExpiredLock(lock.jobId, lock.token, lock.payer, providerAddress) - } catch (e) { - // Ignore errors - } + // Cancel all existing locks when the escrow query is available. + for (const lock of locks ?? []) { + try { + await escrowContract + .connect(consumerAccount) + .cancelExpiredLock(lock.jobId, lock.token, lock.payer, providerAddress) + } catch (e) { + // Ignore errors } } @@ -3300,7 +3780,7 @@ describe('********** Compute Access Restrictions', () => { const approveTx = await paymentTokenContract .connect(consumerAccount) - .approve(await escrowContract.getAddress(), balance) + .approve(artifactsAddresses.development.EnterpriseEscrow, balance) await approveTx.wait() const depositTx = await escrowContract diff --git a/src/test/integration/escrow.test.ts b/src/test/integration/escrow.test.ts new file mode 100644 index 000000000..d58698f9e --- /dev/null +++ b/src/test/integration/escrow.test.ts @@ -0,0 +1,273 @@ +import { assert, expect } from 'chai' +import { JsonRpcProvider, Signer, ethers, parseUnits } from 'ethers' +import { Readable } from 'stream' +import OceanToken from '@oceanprotocol/contracts/artifacts/contracts/utils/OceanToken.sol/OceanToken.json' with { type: 'json' } +import EscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json' with { type: 'json' } +import { Database } from '../../components/database/index.js' +import { OceanIndexer } from '../../components/Indexer/index.js' +import { OceanNode } from '../../OceanNode.js' +import { RPCS } from '../../@types/blockchain.js' +import { EscrowEventsHandler } from '../../components/core/handler/escrowHandler.js' +import { streamToString } from '../../utils/util.js' +import { + DEVELOPMENT_CHAIN_ID, + getOceanArtifactsAdresses, + getOceanArtifactsAdressesByChainId +} from '../../utils/address.js' +import { + ENVIRONMENT_VARIABLES, + EVENTS, + PROTOCOL_COMMANDS +} from '../../utils/constants.js' +import { + DEFAULT_TEST_TIMEOUT, + OverrideEnvConfig, + buildEnvOverrideConfig, + getMockSupportedNetworks, + setupEnvironment, + tearDownEnvironment +} from '../utils/utils.js' +import { waitForCondition } from './testUtils.js' +import { getConfiguration } from '../../utils/config.js' +import { homedir } from 'os' + +const legacyAuthInterface = new ethers.Interface([ + 'event Auth(address indexed payer,address indexed payee,uint256 maxLockedAmount,uint256 maxLockSeconds,uint256 maxLockCounts)' +]) + +describe('Indexer stores Escrow contract events', () => { + let database: Database + let oceanNode: OceanNode + let indexer: OceanIndexer + let provider: JsonRpcProvider + let publisherAccount: Signer // payee that creates/claims locks + let consumerAccount: Signer // payer that deposits/authorizes + let payerAddress: string + let payeeAddress: string + let paymentToken: string + let escrowAddress: string + let tokenContract: any + let escrowContract: any + + const chainId = DEVELOPMENT_CHAIN_ID + const depositAmount = parseUnits('100', 18) + const lockAmount = parseUnits('10', 18) + const jobId = BigInt(Date.now()) + const expiry = 7200 + + let depositTxHash: string + let lockTxHash: string + + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() + let previousConfiguration: OverrideEnvConfig[] + + // search() returns [] (truthy) when empty, which would make waitForCondition + // resolve on the first poll; return null until a matching row is indexed. + const waitForEscrowEvents = (filters: Record) => + waitForCondition( + async () => { + const found = await database.escrow.search(filters) + return found && found.length ? found : null + }, + DEFAULT_TEST_TIMEOUT * 3 - 5000 + ) + + before(async () => { + previousConfiguration = await setupEnvironment( + null, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.PRIVATE_KEY, + ENVIRONMENT_VARIABLES.ADDRESS_FILE + ], + [ + JSON.stringify(mockSupportedNetworks), + JSON.stringify([DEVELOPMENT_CHAIN_ID]), + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', + `${homedir}/.ocean/ocean-contracts/artifacts/address.json` + ] + ) + ) + + const config = await getConfiguration(true) + database = await Database.init(config.dbConfig) + + const oldIndexer = OceanNode.getInstance(config, database).getIndexer() + if (oldIndexer) { + await oldIndexer.stopAllChainIndexers() + } + oceanNode = OceanNode.getInstance( + config, + database, + null, + null, + null, + null, + null, + true + ) + + let artifactsAddresses = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) + if (!artifactsAddresses) { + artifactsAddresses = getOceanArtifactsAdresses().development + } + escrowAddress = artifactsAddresses?.Escrow + paymentToken = artifactsAddresses?.Ocean + + provider = new JsonRpcProvider('http://127.0.0.1:8545') + publisherAccount = (await provider.getSigner(0)) as Signer + consumerAccount = (await provider.getSigner(1)) as Signer + payerAddress = await consumerAccount.getAddress() + payeeAddress = await publisherAccount.getAddress() + + const headBlock = await provider.getBlockNumber() + await database.indexer.update(chainId, headBlock) + + indexer = new OceanIndexer(database, config, oceanNode.blockchainRegistry) + oceanNode.addIndexer(indexer) + + if (escrowAddress && paymentToken) { + tokenContract = new ethers.Contract(paymentToken, OceanToken.abi, publisherAccount) + escrowContract = new ethers.Contract(escrowAddress, EscrowJson.abi, consumerAccount) + } + }) + + after(async () => { + await oceanNode.tearDownAll() + await tearDownEnvironment(previousConfiguration) + }) + + it('escrow database is available', function () { + if (!escrowAddress || !paymentToken) { + // Escrow not deployed on this chain — nothing to index. + this.skip() + } + assert(database.escrow, 'escrow database should be initialized') + }) + + it('indexes a Deposit event', async function () { + if (!escrowAddress || !paymentToken) this.skip() + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + + let balance = await tokenContract.balanceOf(payerAddress) + if (BigInt(balance.toString()) < depositAmount) { + const mintTx = await tokenContract.mint(payerAddress, depositAmount) + await mintTx.wait() + balance = await tokenContract.balanceOf(payerAddress) + } + await ( + await tokenContract.connect(consumerAccount).approve(escrowAddress, depositAmount) + ).wait() + const tx = await escrowContract.deposit(paymentToken, depositAmount) + const receipt = await tx.wait() + depositTxHash = receipt.hash + + const events = await waitForEscrowEvents({ + txHash: depositTxHash, + eventType: EVENTS.ESCROW_DEPOSIT + }) + assert(events && events.length > 0, 'Deposit event should be indexed') + const event = events[0] + expect(event.eventType).to.equal(EVENTS.ESCROW_DEPOSIT) + expect(event.payer).to.equal(payerAddress.toLowerCase()) + expect(event.token).to.equal(paymentToken.toLowerCase()) + expect(event.amount).to.equal(depositAmount.toString()) + expect(event.chainId).to.equal(chainId) + }) + + it('authorizes escrow and emits an Auth event', async function () { + if (!escrowAddress || !paymentToken) this.skip() + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + + const tx = await escrowContract.authorize( + paymentToken, + payeeAddress, + depositAmount, + expiry, + 10 + ) + const receipt = await tx.wait() + + // Development deployments may still use the legacy Auth event, while the + // installed contracts ABI includes the token address in the newer event. + const authInterfaces = [escrowContract.interface, legacyAuthInterface] + let event = null + for (const log of receipt.logs) { + for (const authInterface of authInterfaces) { + try { + const parsed = authInterface.parseLog(log) + if (parsed?.name === EVENTS.ESCROW_AUTH) { + event = parsed + break + } + } catch (_error) { + // Try the other supported Auth event layout. + } + } + if (event) break + } + + assert(event, 'Auth event should be emitted') + expect(event.args.payer.toLowerCase()).to.equal(payerAddress.toLowerCase()) + expect(event.args.payee.toLowerCase()).to.equal(payeeAddress.toLowerCase()) + expect(event.args.maxLockedAmount.toString()).to.equal(depositAmount.toString()) + expect(event.args.maxLockCounts.toString()).to.equal('10') + }) + + it('indexes a Lock event', async function () { + if (!escrowAddress || !paymentToken) this.skip() + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + + const tx = await escrowContract + .connect(publisherAccount) + .createLock(jobId, paymentToken, payerAddress, lockAmount, expiry) + const receipt = await tx.wait() + lockTxHash = receipt.hash + + const events = await waitForEscrowEvents({ + txHash: lockTxHash, + eventType: EVENTS.ESCROW_LOCK + }) + assert(events && events.length > 0, 'Lock event should be indexed') + const event = events[0] + expect(event.payer).to.equal(payerAddress.toLowerCase()) + expect(event.payee).to.equal(payeeAddress.toLowerCase()) + expect(event.jobId).to.equal(jobId.toString()) + expect(event.amount).to.equal(lockAmount.toString()) + expect(event.token).to.equal(paymentToken.toLowerCase()) + }) + + it('returns indexed events through the EscrowEventsHandler (query command)', async function () { + if (!escrowAddress || !paymentToken) this.skip() + this.timeout(DEFAULT_TEST_TIMEOUT) + + const response = await new EscrowEventsHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.GET_ESCROW_EVENTS, + chainId, + eventType: EVENTS.ESCROW_DEPOSIT, + payer: payerAddress, + caller: '127.0.0.1' + }) + expect(response.status.httpStatus).to.equal(200) + assert(response.stream, 'handler should return a stream') + const result = JSON.parse(await streamToString(response.stream as Readable)) + assert(Array.isArray(result), 'result should be an array') + assert( + result.some((e: any) => e.txHash === depositTxHash), + 'query should return the indexed Deposit event' + ) + }) + + it('respects offset and size pagination', async function () { + if (!escrowAddress || !paymentToken) this.skip() + // Deposit and Lock are indexed for this chain by now. + const page = await database.escrow.search({ chainId }, 0, 2) + assert(page && page.length === 2, 'size should cap the page to 2 rows') + + const next = await database.escrow.search({ chainId }, 1, 1) + assert(next && next.length === 1, 'offset + size should return a single row') + expect(next[0].id).to.not.equal(page[0].id) // offset advanced past the first row + }) +}) diff --git a/src/test/integration/persistentStorage.test.ts b/src/test/integration/persistentStorage.test.ts index 7383d6d30..1b40d6fc8 100644 --- a/src/test/integration/persistentStorage.test.ts +++ b/src/test/integration/persistentStorage.test.ts @@ -2,6 +2,7 @@ import { expect } from 'chai' import fsp from 'fs/promises' import os from 'os' import path from 'path' +import { createHash, randomUUID } from 'crypto' import { Readable } from 'stream' import { getAddress, JsonRpcProvider, Signer } from 'ethers' @@ -12,6 +13,7 @@ import { PersistentStorageGetBucketsHandler, PersistentStorageGetFileObjectHandler, PersistentStorageListFilesHandler, + PersistentStorageUpdateBucketHandler, PersistentStorageUploadFileHandler } from '../../components/core/handler/persistentStorage.js' import { StatusHandler } from '../../components/core/handler/statusHandler.js' @@ -30,6 +32,10 @@ import { sleep } from '../utils/utils.js' import { createHashForSignature, safeSign } from '../utils/signature.js' +import { Storage, NodePersistentStorage } from '../../components/storage/index.js' +import { FileObjectType } from '../../@types/fileObject.js' +import { PersistentStorageLocalFS } from '../../components/persistentStorage/PersistentStorageLocalFS.js' +import { FileInfoHandler } from '../../components/core/handler/fileInfoHandler.js' import { BlockchainRegistry } from '../../components/BlockchainRegistry/index.js' import { Blockchain } from '../../utils/blockchain.js' @@ -134,6 +140,39 @@ describe('********** Persistent storage handlers (integration)', functio expect(nodeStatus.persistentStorage?.accessLists).to.be.an('array').with.lengthOf(1) }) + it('getDockerMountObject returns an absolute Source even when folder is relative', async () => { + // a relative folder must still produce an absolute bind-mount Source (Docker requires it) + const relativeFolder = '.tmp-ps-relative-mount-test' + const fakeNode = { + getConfig: () => ({ + persistentStorage: { + enabled: true, + type: 'localfs', + // accessLists: [], + options: { folder: relativeFolder } + } + }) + } as unknown as OceanNode + + const backend = new PersistentStorageLocalFS(fakeNode) + try { + const ownerAddress = await consumer.getAddress() + const { bucketId } = await backend.createNewBucket([], ownerAddress) + const fileName = 'rel.txt' + await backend.uploadFile( + bucketId, + fileName, + Readable.from(Buffer.from('x')), + ownerAddress + ) + + const mount = await backend.getDockerMountObject(bucketId, fileName, ownerAddress) + expect(path.isAbsolute(mount.Source)).to.equal(true) + } finally { + await fsp.rm(path.resolve(relativeFolder), { recursive: true, force: true }) + } + }) + it('create bucket → upload → list → delete (happy path)', async () => { const consumerAddress = await consumer.getAddress() let nonce = Date.now().toString() @@ -311,6 +350,250 @@ describe('********** Persistent storage handlers (integration)', functio expect(obj.fileName).to.equal(fileName) }) + it('getFileChecksum returns the sha256 of the file contents for an allowed consumer', async () => { + const consumerAddress = await consumer.getAddress() + + let nonce = Date.now().toString() + let signature = await safeSign( + consumer, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + ) + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + authorization: undefined + } as any) + expect(createRes.status.httpStatus).to.equal(200) + const bucketId = (await streamToObject(createRes.stream as Readable)) + .bucketId as string + + const fileName = 'checksum.bin' + const body = Buffer.from('persistent-storage-checksum-contents') + const expected = createHash('sha256').update(body).digest('hex') + + nonce = Date.now().toString() + signature = await safeSign( + consumer, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE + ) + ) + const uploadRes = await new PersistentStorageUploadFileHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE, + consumerAddress, + signature, + nonce, + bucketId, + fileName, + stream: Readable.from(body) + } as any) + expect(uploadRes.status.httpStatus).to.equal(200) + + const ps = oceanNode.getPersistentStorage() + const checksum = await ps.getFileChecksum(bucketId, fileName, consumerAddress) + expect(checksum).to.equal(expected) + + // a consumer not on the bucket ACL must be denied + const intruderAddress = await forbiddenConsumer.getAddress() + let denied = false + try { + await ps.getFileChecksum(bucketId, fileName, intruderAddress) + } catch (e) { + // only the expected access-denial counts; anything else fails the test + expect((e as Error).name).to.equal('PersistentStorageAccessDeniedError') + denied = true + } + expect(denied).to.equal(true) + }) + + it('getStorageClass returns a working NodePersistentStorage for nodePersistentStorage files', async () => { + const consumerAddress = await consumer.getAddress() + + let nonce = Date.now().toString() + let signature = await safeSign( + consumer, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + ) + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + authorization: undefined + } as any) + expect(createRes.status.httpStatus).to.equal(200) + const bucketId = (await streamToObject(createRes.stream as Readable)) + .bucketId as string + + const fileName = 'storage-class.txt' + const body = Buffer.from('node-persistent-storage-class-contents') + const expectedChecksum = createHash('sha256').update(body).digest('hex') + + nonce = Date.now().toString() + signature = await safeSign( + consumer, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE + ) + ) + const uploadRes = await new PersistentStorageUploadFileHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE, + consumerAddress, + signature, + nonce, + bucketId, + fileName, + stream: Readable.from(body) + } as any) + expect(uploadRes.status.httpStatus).to.equal(200) + + const fileObject = { + type: FileObjectType.NODE_PERSISTENT_STORAGE, + bucketId, + fileName + } + + // factory returns the right class + const storage = Storage.getStorageClass(fileObject, config, consumerAddress) + expect(storage).to.be.instanceOf(NodePersistentStorage) + + // metadata (with consumer -> checksum present) + const info = await storage.fetchSpecificFileMetadata(fileObject as any, true) + expect(info.valid).to.equal(true) + expect(info.contentLength).to.equal(String(body.length)) + expect(info.type).to.equal('nodePersistentStorage') + expect(info.checksum).to.equal(expectedChecksum) + + // readable stream returns the bytes + const { stream } = await storage.getReadableStream() + const chunks: Buffer[] = [] + for await (const chunk of stream as Readable) { + chunks.push(Buffer.from(chunk)) + } + expect(Buffer.concat(chunks).toString()).to.equal(body.toString()) + + // without a consumer, forceChecksum cannot run the ACL'd checksum -> undefined + const noConsumer = Storage.getStorageClass(fileObject, config) + const infoNoConsumer = await noConsumer.fetchSpecificFileMetadata( + fileObject as any, + true + ) + expect(infoNoConsumer.checksum).to.equal(undefined) + + // a consumer not on the bucket ACL is denied when reading + const intruderAddress = await forbiddenConsumer.getAddress() + const intruderStorage = Storage.getStorageClass(fileObject, config, intruderAddress) + let denied = false + try { + await intruderStorage.getReadableStream() + } catch (e) { + // only the expected access-denial counts; anything else fails the test + expect((e as Error).name).to.equal('PersistentStorageAccessDeniedError') + denied = true + } + expect(denied).to.equal(true) + }) + + it('fileInfo serves a persistentStorage file only with an allowed consumerAddress', async () => { + const consumerAddress = await consumer.getAddress() + + let nonce = Date.now().toString() + let signature = await safeSign( + consumer, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + ) + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + authorization: undefined + } as any) + expect(createRes.status.httpStatus).to.equal(200) + const bucketId = (await streamToObject(createRes.stream as Readable)) + .bucketId as string + + const fileName = 'fileinfo.txt' + const body = Buffer.from('node-persistent-storage-fileinfo') + + nonce = Date.now().toString() + signature = await safeSign( + consumer, + createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE + ) + ) + const uploadRes = await new PersistentStorageUploadFileHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE, + consumerAddress, + signature, + nonce, + bucketId, + fileName, + stream: Readable.from(body) + } as any) + expect(uploadRes.status.httpStatus).to.equal(200) + + const fileObject = { + type: FileObjectType.NODE_PERSISTENT_STORAGE, + bucketId, + fileName + } + + // allowed consumer -> metadata returned + const okRes = await new FileInfoHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.FILE_INFO, + file: fileObject as any, + type: FileObjectType.NODE_PERSISTENT_STORAGE, + consumerAddress + } as any) + expect(okRes.status.httpStatus).to.equal(200) + const info = await streamToObject(okRes.stream as Readable) + expect(info[0].contentLength).to.equal(String(body.length)) + expect(info[0].type).to.equal('nodePersistentStorage') + + // missing consumerAddress -> rejected at validation + const noConsumerRes = await new FileInfoHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.FILE_INFO, + file: fileObject as any, + type: FileObjectType.NODE_PERSISTENT_STORAGE + } as any) + expect(noConsumerRes.status.httpStatus).to.not.equal(200) + + // consumer not on the bucket ACL -> backend denies -> error, no metadata + const intruderAddress = await forbiddenConsumer.getAddress() + const deniedRes = await new FileInfoHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.FILE_INFO, + file: fileObject as any, + type: FileObjectType.NODE_PERSISTENT_STORAGE, + consumerAddress: intruderAddress + } as any) + expect(deniedRes.status.httpStatus).to.not.equal(200) + }) + it('should not create bucket when consumer is not on allow list', async () => { const forbiddenConsumerAddress = await forbiddenConsumer.getAddress() const nonce = Date.now().toString() @@ -648,6 +931,268 @@ describe('********** Persistent storage handlers (integration)', functio expect(validation.reason).to.contain('accessLists') }) + it('creates a bucket with a label and returns it from getBuckets', async () => { + const consumerAddress = await consumer.getAddress() + await sleep(1000) + let nonce = Date.now().toString() + let messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + let signature = await safeSign(consumer, messageHashBytes) + const label = 'my-dataset-bucket' + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + label, + authorization: undefined + } as any) + expect(createRes.status.httpStatus).to.equal(200) + const created = await streamToObject(createRes.stream as Readable) + expect(created.label).to.equal(label) + const bucketId = created.bucketId as string + + await sleep(1000) + nonce = Date.now().toString() + messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_GET_BUCKETS + ) + signature = await safeSign(consumer, messageHashBytes) + const listRes = await new PersistentStorageGetBucketsHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_GET_BUCKETS, + consumerAddress, + signature, + nonce, + owner: consumerAddress, + authorization: undefined + } as any) + expect(listRes.status.httpStatus).to.equal(200) + const buckets = await streamToObject(listRes.stream as Readable) + const found = buckets.find((b: { bucketId: string }) => b.bucketId === bucketId) + expect(found).to.be.an('object') + expect(found.label).to.equal(label) + }) + + it('assigns a friendly default name when no label is provided', async () => { + const consumerAddress = await consumer.getAddress() + await sleep(1000) + const nonce = Date.now().toString() + const messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + const signature = await safeSign(consumer, messageHashBytes) + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + authorization: undefined + } as any) + expect(createRes.status.httpStatus).to.equal(200) + const created = await streamToObject(createRes.stream as Readable) + expect(created.label).to.be.a('string') + expect(created.label.length).to.be.greaterThan(0) + }) + + it('owner can rename a bucket and getBuckets reflects the new name', async () => { + const consumerAddress = await consumer.getAddress() + await sleep(1000) + let nonce = Date.now().toString() + let messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + let signature = await safeSign(consumer, messageHashBytes) + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + label: 'before', + authorization: undefined + } as any) + expect(createRes.status.httpStatus).to.equal(200) + const created = await streamToObject(createRes.stream as Readable) + const bucketId = created.bucketId as string + + await sleep(1000) + nonce = Date.now().toString() + messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET + ) + signature = await safeSign(consumer, messageHashBytes) + const updateRes = await new PersistentStorageUpdateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET, + consumerAddress, + signature, + nonce, + bucketId, + label: 'after', + authorization: undefined + } as any) + expect(updateRes.status.httpStatus).to.equal(200) + const updated = await streamToObject(updateRes.stream as Readable) + expect(updated.label).to.equal('after') + + await sleep(1000) + nonce = Date.now().toString() + messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_GET_BUCKETS + ) + signature = await safeSign(consumer, messageHashBytes) + const listRes = await new PersistentStorageGetBucketsHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_GET_BUCKETS, + consumerAddress, + signature, + nonce, + owner: consumerAddress, + authorization: undefined + } as any) + const buckets = await streamToObject(listRes.stream as Readable) + const found = buckets.find((b: { bucketId: string }) => b.bucketId === bucketId) + expect(found.label).to.equal('after') + }) + + it('renaming with an empty label clears the name', async () => { + const consumerAddress = await consumer.getAddress() + await sleep(1000) + let nonce = Date.now().toString() + let messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + let signature = await safeSign(consumer, messageHashBytes) + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [], + label: 'temporary', + authorization: undefined + } as any) + const created = await streamToObject(createRes.stream as Readable) + const bucketId = created.bucketId as string + + await sleep(1000) + nonce = Date.now().toString() + messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET + ) + signature = await safeSign(consumer, messageHashBytes) + const updateRes = await new PersistentStorageUpdateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET, + consumerAddress, + signature, + nonce, + bucketId, + label: '', + authorization: undefined + } as any) + expect(updateRes.status.httpStatus).to.equal(200) + const updated = await streamToObject(updateRes.stream as Readable) + expect(updated.label).to.equal(null) + }) + + it('non-owner cannot rename a bucket (403)', async () => { + // consumer owns the bucket (with an ACL); a different wallet must not rename it, + // even if it were on the access list — rename is owner-only. + const consumerAddress = await consumer.getAddress() + await sleep(1000) + let nonce = Date.now().toString() + let messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET + ) + let signature = await safeSign(consumer, messageHashBytes) + const createRes = await new PersistentStorageCreateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + consumerAddress, + signature, + nonce, + accessLists: [bucketAllowList], + authorization: undefined + } as any) + const created = await streamToObject(createRes.stream as Readable) + const bucketId = created.bucketId as string + + const forbiddenConsumerAddress = await forbiddenConsumer.getAddress() + nonce = Date.now().toString() + messageHashBytes = createHashForSignature( + forbiddenConsumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET + ) + signature = await safeSign(forbiddenConsumer, messageHashBytes) + const updateRes = await new PersistentStorageUpdateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET, + consumerAddress: forbiddenConsumerAddress, + signature, + nonce, + bucketId, + label: 'hijacked', + authorization: undefined + } as any) + expect(updateRes.status.httpStatus).to.equal(403) + expect(updateRes.status.error).to.contain('not allowed') + }) + + it('rename returns 404 for an unknown bucket', async () => { + const consumerAddress = await consumer.getAddress() + await sleep(1000) + const nonce = Date.now().toString() + const messageHashBytes = createHashForSignature( + consumerAddress, + nonce, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET + ) + const signature = await safeSign(consumer, messageHashBytes) + const updateRes = await new PersistentStorageUpdateBucketHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET, + consumerAddress, + signature, + nonce, + bucketId: randomUUID(), + label: 'ghost', + authorization: undefined + } as any) + expect(updateRes.status.httpStatus).to.equal(404) + }) + + it('rename validate rejects an over-long label', async () => { + const validation = await new PersistentStorageUpdateBucketHandler(oceanNode).validate( + { + command: PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET, + consumerAddress: await consumer.getAddress(), + signature: 'x', + nonce: '1', + bucketId: randomUUID(), + label: 'a'.repeat(257) + } as any + ) + expect(validation.valid).to.equal(false) + expect(validation.reason).to.contain('label') + }) + it('returns error when persistent storage is disabled', async () => { const disabledConfig = { ...config, diff --git a/src/test/integration/stopJob.test.ts b/src/test/integration/stopJob.test.ts new file mode 100644 index 000000000..fe8dc7fec --- /dev/null +++ b/src/test/integration/stopJob.test.ts @@ -0,0 +1,163 @@ +import { expect } from 'chai' +import { Signer, JsonRpcProvider } from 'ethers' +import { Database } from '../../components/database/index.js' +import { OceanNode } from '../../OceanNode.js' +import { StopJobHandler } from '../../components/core/admin/stopJob.js' +import { ENVIRONMENT_VARIABLES, PROTOCOL_COMMANDS } from '../../utils/constants.js' +import { getConfiguration } from '../../utils/index.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { RPCS } from '../../@types/blockchain.js' +import { + DEFAULT_TEST_TIMEOUT, + OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig, + getMockSupportedNetworks, + setupEnvironment, + tearDownEnvironment +} from '../utils/utils.js' +import { createHashForSignature, safeSign } from '../utils/signature.js' + +describe('********** Admin StopJob Handler Integration Tests', () => { + let config: OceanNodeConfig + let database: Database + let adminAccount: Signer + let nonAdminAccount: Signer + let previousConfiguration: OverrideEnvConfig[] + let oceanNode: OceanNode + + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() + + before(async () => { + const provider = new JsonRpcProvider('http://127.0.0.1:8545') + adminAccount = (await provider.getSigner(0)) as Signer + nonAdminAccount = (await provider.getSigner(1)) as Signer + const adminAddress = await adminAccount.getAddress() + + previousConfiguration = await setupEnvironment( + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.ALLOWED_ADMINS + ], + [ + JSON.stringify(mockSupportedNetworks), + JSON.stringify([8996]), + JSON.stringify([adminAddress]) + ] + ) + ) + + config = await getConfiguration(true) + database = await Database.init(config.dbConfig) + oceanNode = OceanNode.getInstance( + config, + database, + null, + null, + null, + null, + null, + true + ) + }) + + after(async () => { + await oceanNode.tearDownAll() + await tearDownEnvironment(previousConfiguration) + }) + + const getAdminSignature = async (nonce: string, command: string): Promise => { + const messageHashBytes = createHashForSignature( + await adminAccount.getAddress(), + nonce, + command + ) + return safeSign(adminAccount, messageHashBytes) + } + + const getNonAdminSignature = async ( + nonce: string, + command: string + ): Promise => { + const messageHashBytes = createHashForSignature( + await nonAdminAccount.getAddress(), + nonce, + command + ) + return safeSign(nonAdminAccount, messageHashBytes) + } + + it('should reject request with missing jobId', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const nonce = Date.now().toString() + const signature = await getAdminSignature(nonce, PROTOCOL_COMMANDS.STOP_JOB) + + const response = await new StopJobHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.STOP_JOB, + nonce, + address: await adminAccount.getAddress(), + signature, + jobId: undefined as unknown as string + }) + + expect(response.status.httpStatus).to.equal(400) + }) + + it('should reject request signed by non-admin', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const nonce = Date.now().toString() + const signature = await getNonAdminSignature(nonce, PROTOCOL_COMMANDS.STOP_JOB) + + const response = await new StopJobHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.STOP_JOB, + nonce, + address: await nonAdminAccount.getAddress(), + signature, + jobId: 'abc123-some-job-id' + }) + + expect(response.status.httpStatus).to.not.equal(200) + }) + + it('should reject jobId with no dash separator', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const nonce = Date.now().toString() + const signature = await getAdminSignature(nonce, PROTOCOL_COMMANDS.STOP_JOB) + + const response = await new StopJobHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.STOP_JOB, + nonce, + address: await adminAccount.getAddress(), + signature, + jobId: 'invalidJobIdWithNoDash' + }) + + expect(response.status.httpStatus).to.equal(400) + expect(response.status.error).to.include('Invalid jobId format') + }) + + it('should return error when no C2D engines are configured', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const nonce = Date.now().toString() + const signature = await getAdminSignature(nonce, PROTOCOL_COMMANDS.STOP_JOB) + + // Valid composite jobId format, but no engines are configured in the test environment + const response = await new StopJobHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.STOP_JOB, + nonce, + address: await adminAccount.getAddress(), + signature, + jobId: 'abc123-some-job-id' + }) + + expect(response.status.httpStatus).to.equal(500) + expect(response.status.error).to.include('No C2D engines configured') + }) +}) diff --git a/src/test/unit/compute.test.ts b/src/test/unit/compute.test.ts index a2766c478..b65a2ac25 100644 --- a/src/test/unit/compute.test.ts +++ b/src/test/unit/compute.test.ts @@ -35,6 +35,10 @@ import { C2DEngine } from '../../components/c2d/index.js' import { checkManifestPlatform } from '../../components/c2d/compute_engine_docker.js' import { ValidateParams } from '../../components/httpRoutes/validateCommands.js' import { Readable } from 'stream' +import sinon from 'sinon' +import { getAlgoChecksums } from '../../components/core/compute/utils.js' +import { FindDdoHandler } from '../../components/core/handler/ddoHandler.js' +import { CORE_LOGGER } from '../../utils/logging/common.js' /* eslint-disable require-await */ class TestC2DEngine extends C2DEngine { @@ -514,3 +518,33 @@ describe('Compute Jobs Database', () => { await tearDownEnvironment(envOverrides) }) }) + +describe('getAlgoChecksums', () => { + let findDdoStub: sinon.SinonStub + let loggerErrorSpy: sinon.SinonSpy + + beforeEach(() => { + findDdoStub = sinon.stub(FindDdoHandler.prototype, 'findAndFormatDdo') + loggerErrorSpy = sinon.spy(CORE_LOGGER, 'error') + }) + + afterEach(() => { + findDdoStub.restore() + loggerErrorSpy.restore() + }) + + it('returns empty checksums without a DDO lookup for raw-code algorithms (no documentId)', async () => { + const checksums = await getAlgoChecksums( + undefined, + undefined, + null as any, + null as any + ) + + expect(checksums).to.deep.equal({ files: '', container: '', serviceId: undefined }) + // no DDO lookup must be attempted when there is no algorithm documentId + expect(findDdoStub.called).to.equal(false) + // and therefore no "Algorithm with id: undefined not found!" error is logged + expect(loggerErrorSpy.called).to.equal(false) + }) +}) diff --git a/src/test/unit/ddoEventLog.test.ts b/src/test/unit/ddoEventLog.test.ts new file mode 100644 index 000000000..1a2c3efb5 --- /dev/null +++ b/src/test/unit/ddoEventLog.test.ts @@ -0,0 +1,94 @@ +import { expect } from 'chai' +import { ethers } from 'ethers' +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import { findMetadataEventInLogs } from '../../components/core/handler/ddoHandler.js' +import { EVENTS } from '../../utils/constants.js' + +describe('findMetadataEventInLogs', () => { + const nftAddress = '0x0d4Aa8DfDdBE0c4B4d5DF981f5416fd6001CE1e8' + const otherNftAddress = '0x2473f4F7bf40ed0310eEf9f3b52A9c15dbC1DCbc' + const publisherAddress = '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260' + const abiInterface = new ethers.Interface(ERC721Template.abi) + + const flags = '0x02' + const encryptedData = '0x1234567890abcdef' + const metaDataHash = ethers.id('some metadata') + + function buildMetadataLog(eventName: string, emitter: string) { + const { topics, data } = abiInterface.encodeEventLog(eventName, [ + publisherAddress, + 0, + 'http://localhost:8000', + flags, + encryptedData, + metaDataHash, + 1735689600, + 100 + ]) + return { address: emitter, topics, data } + } + + // an unrelated event emitted before the metadata one (e.g. by an ERC-4337 + // entry point, a multisig wallet or an ERC20 token) + function buildForeignLog(emitter: string) { + return { + address: emitter, + topics: [ + ethers.id('Transfer(address,address,uint256)'), + ethers.zeroPadValue(publisherAddress, 32), + ethers.zeroPadValue(otherNftAddress, 32) + ], + data: ethers.zeroPadValue('0x01', 32) + } + } + + it('should find MetadataCreated when it is not the first log in the receipt', () => { + const logs = [ + buildForeignLog('0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789'), + buildForeignLog(otherNftAddress), + buildMetadataLog(EVENTS.METADATA_CREATED, nftAddress) + ] + const eventData = findMetadataEventInLogs(logs, nftAddress) + expect(eventData).to.not.equal(null) + expect(eventData.name).to.equal(EVENTS.METADATA_CREATED) + expect(parseInt(eventData.args[3], 16)).to.equal(2) + expect(eventData.args[4]).to.equal(encryptedData) + expect(eventData.args[5]).to.equal(metaDataHash) + }) + + it('should find MetadataUpdated as well', () => { + const logs = [ + buildForeignLog(otherNftAddress), + buildMetadataLog(EVENTS.METADATA_UPDATED, nftAddress) + ] + const eventData = findMetadataEventInLogs(logs, nftAddress) + expect(eventData).to.not.equal(null) + expect(eventData.name).to.equal(EVENTS.METADATA_UPDATED) + }) + + it('should match the data NFT address case-insensitively', () => { + const logs = [buildMetadataLog(EVENTS.METADATA_CREATED, nftAddress.toLowerCase())] + const eventData = findMetadataEventInLogs(logs, nftAddress) + expect(eventData).to.not.equal(null) + expect(eventData.name).to.equal(EVENTS.METADATA_CREATED) + }) + + it('should ignore metadata events emitted by other contracts', () => { + const logs = [ + buildMetadataLog(EVENTS.METADATA_CREATED, otherNftAddress), + buildMetadataLog(EVENTS.METADATA_UPDATED, nftAddress) + ] + const eventData = findMetadataEventInLogs(logs, nftAddress) + expect(eventData).to.not.equal(null) + expect(eventData.name).to.equal(EVENTS.METADATA_UPDATED) + }) + + it('should return null when the transaction has no metadata event', () => { + const logs = [buildForeignLog(nftAddress), buildForeignLog(otherNftAddress)] + expect(findMetadataEventInLogs(logs, nftAddress)).to.equal(null) + }) + + it('should return null for an empty logs array', () => { + expect(findMetadataEventInLogs([], nftAddress)).to.equal(null) + }) +}) diff --git a/src/test/unit/download.test.ts b/src/test/unit/download.test.ts index f31adfa00..59288fa0a 100644 --- a/src/test/unit/download.test.ts +++ b/src/test/unit/download.test.ts @@ -15,7 +15,10 @@ import { setupEnvironment, tearDownEnvironment } from '../utils/utils.js' -import { validateFilesStructure } from '../../components/core/handler/downloadHandler.js' +import { + handleDownloadUrlCommand, + validateFilesStructure +} from '../../components/core/handler/downloadHandler.js' import { AssetUtils, isConfidentialChainDDO } from '../../utils/asset.js' import { DEVELOPMENT_CHAIN_ID, KNOWN_CONFIDENTIAL_EVMS } from '../../utils/address.js' import { DDO } from '@oceanprotocol/ddo-js' @@ -212,6 +215,34 @@ describe('Should validate files structure for download', () => { assert(decryptedFileData.nftAddress?.toLowerCase() === otherNFTAddress?.toLowerCase()) }) + it('should deny downloading a persistentStorage file object (compute-only)', async () => { + const result = await handleDownloadUrlCommand(oceanNode, { + fileObject: { + type: 'nodePersistentStorage', + bucketId: 'some-bucket', + fileName: 'data.txt' + } as any, + command: PROTOCOL_COMMANDS.DOWNLOAD + } as any) + expect(result.stream).to.equal(null) + expect(result.status.httpStatus).to.equal(403) + expect((result.status.error || '').toLowerCase()).to.include('compute') + }) + + it('should deny downloading a mixed-case persistentStorage file object (compute-only)', async () => { + const result = await handleDownloadUrlCommand(oceanNode, { + fileObject: { + type: 'NodePersistentStorage', + bucketId: 'some-bucket', + fileName: 'data.txt' + } as any, + command: PROTOCOL_COMMANDS.DOWNLOAD + } as any) + expect(result.stream).to.equal(null) + expect(result.status.httpStatus).to.equal(403) + expect((result.status.error || '').toLowerCase()).to.include('compute') + }) + it('should check if DDO service files is missing or empty (exected for confidential EVM, dt4)', () => { const otherDDOConfidential = structuredClone(ddoObj) expect( diff --git a/src/test/utils/contracts.ts b/src/test/utils/contracts.ts index 4dc7bbfa9..d0a00c57d 100644 --- a/src/test/utils/contracts.ts +++ b/src/test/utils/contracts.ts @@ -7,6 +7,7 @@ import { } from '../../utils/address.js' import AccessListFactory from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json' with { type: 'json' } import AccessList from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessList.sol/AccessList.json' with { type: 'json' } +import EnterpriseFeeCollector from '@oceanprotocol/contracts/artifacts/contracts/communityFee/EnterpriseFeeCollector.sol/EnterpriseFeeCollector.json' with { type: 'json' } export const EXISTING_ACCESSLISTS: Map = new Map< string, @@ -28,6 +29,41 @@ export function getEventFromTx(txReceipt: { logs: any[] }, eventName: string) { return log.fragment?.name === eventName })[0] } + +export async function ensureEnterpriseFeeTokenAllowed( + provider: JsonRpcProvider, + enterpriseFeeCollectorAddress: string, + token: string +): Promise { + const readContract = new Contract( + enterpriseFeeCollectorAddress, + EnterpriseFeeCollector.abi, + provider + ) + if (await readContract.isTokenAllowed(token)) return + + const owner = await readContract.owner() + let ownerSigner: Signer | null = null + for (let index = 0; index < 10; index++) { + const signer = await provider.getSigner(index) + if ((await signer.getAddress()).toLowerCase() === owner.toLowerCase()) { + ownerSigner = signer + break + } + } + if (!ownerSigner) { + throw new Error( + `Enterprise fee token ${token} is not allowed and collector owner ${owner} is not an unlocked test account` + ) + } + + const minFee = 1n + const maxFee = ethers.parseUnits('1000', 18) + const feePercentage = ethers.parseUnits('0.001', 18) + const writeContract = readContract.connect(ownerSigner) as Contract + const tx = await writeContract.updateToken(token, minFee, maxFee, feePercentage, true) + await tx.wait() +} /** * Create new Access List Contract * @param {Signer} signer The signer of the transaction. diff --git a/src/utils/asset.ts b/src/utils/asset.ts index 7407e1594..84e606c44 100644 --- a/src/utils/asset.ts +++ b/src/utils/asset.ts @@ -58,7 +58,8 @@ export async function fetchFileMetadata( responseType: 'stream', timeout: 30000 }) - contentType = response.headers['content-type'] + const responseContentType = response.headers['content-type'] + contentType = typeof responseContentType === 'string' ? responseContentType : '' let totalSize = 0 for await (const chunk of response.data) { totalSize += chunk.length diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 257bc24dd..ee8407948 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -24,6 +24,7 @@ export const PROTOCOL_COMMANDS = { COMPUTE_GET_RESULT: 'getComputeResult', COMPUTE_INITIALIZE: 'initializeCompute', STOP_NODE: 'stopNode', + STOP_JOB: 'stopJob', REINDEX_TX: 'reindexTx', REINDEX_CHAIN: 'reindexChain', HANDLE_INDEXING_THREAD: 'handleIndexingThread', @@ -40,13 +41,15 @@ export const PROTOCOL_COMMANDS = { GET_LOGS: 'getLogs', JOBS: 'jobs', PERSISTENT_STORAGE_CREATE_BUCKET: 'persistentStorageCreateBucket', + PERSISTENT_STORAGE_UPDATE_BUCKET: 'persistentStorageUpdateBucket', PERSISTENT_STORAGE_GET_BUCKETS: 'persistentStorageGetBuckets', PERSISTENT_STORAGE_LIST_FILES: 'persistentStorageListFiles', PERSISTENT_STORAGE_UPLOAD_FILE: 'persistentStorageUploadFile', PERSISTENT_STORAGE_GET_FILE_OBJECT: 'persistentStorageGetFileObject', PERSISTENT_STORAGE_DELETE_FILE: 'persistentStorageDeleteFile', GET_ACCESS_LIST: 'getAccessList', - SEARCH_ACCESS_LIST: 'searchAccessList' + SEARCH_ACCESS_LIST: 'searchAccessList', + GET_ESCROW_EVENTS: 'getEscrowEvents' } // more visible, keep then close to make sure we always update both export const SUPPORTED_PROTOCOL_COMMANDS: string[] = [ @@ -72,6 +75,7 @@ export const SUPPORTED_PROTOCOL_COMMANDS: string[] = [ PROTOCOL_COMMANDS.COMPUTE_GET_STREAMABLE_LOGS, PROTOCOL_COMMANDS.COMPUTE_INITIALIZE, PROTOCOL_COMMANDS.STOP_NODE, + PROTOCOL_COMMANDS.STOP_JOB, PROTOCOL_COMMANDS.REINDEX_TX, PROTOCOL_COMMANDS.REINDEX_CHAIN, PROTOCOL_COMMANDS.HANDLE_INDEXING_THREAD, @@ -88,13 +92,15 @@ export const SUPPORTED_PROTOCOL_COMMANDS: string[] = [ PROTOCOL_COMMANDS.GET_LOGS, PROTOCOL_COMMANDS.JOBS, PROTOCOL_COMMANDS.PERSISTENT_STORAGE_CREATE_BUCKET, + PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPDATE_BUCKET, PROTOCOL_COMMANDS.PERSISTENT_STORAGE_GET_BUCKETS, PROTOCOL_COMMANDS.PERSISTENT_STORAGE_LIST_FILES, PROTOCOL_COMMANDS.PERSISTENT_STORAGE_UPLOAD_FILE, PROTOCOL_COMMANDS.PERSISTENT_STORAGE_GET_FILE_OBJECT, PROTOCOL_COMMANDS.PERSISTENT_STORAGE_DELETE_FILE, PROTOCOL_COMMANDS.GET_ACCESS_LIST, - PROTOCOL_COMMANDS.SEARCH_ACCESS_LIST + PROTOCOL_COMMANDS.SEARCH_ACCESS_LIST, + PROTOCOL_COMMANDS.GET_ESCROW_EVENTS ] export const MetadataStates = { @@ -122,9 +128,25 @@ export const EVENTS = { EXCHANGE_DEACTIVATED: 'ExchangeDeactivated', ADDRESS_ADDED: 'AddressAdded', ADDRESS_REMOVED: 'AddressRemoved', - NEW_ACCESS_LIST: 'NewAccessList' + NEW_ACCESS_LIST: 'NewAccessList', + // Escrow contract events. Values must equal the on-chain event name. + ESCROW_AUTH: 'Auth', + ESCROW_LOCK: 'Lock', + ESCROW_CLAIMED: 'Claimed', + ESCROW_CANCELED: 'Canceled', + ESCROW_DEPOSIT: 'Deposit', + ESCROW_WITHDRAW: 'Withdraw' } +export const ESCROW_EVENTS = [ + EVENTS.ESCROW_AUTH, + EVENTS.ESCROW_LOCK, + EVENTS.ESCROW_CLAIMED, + EVENTS.ESCROW_CANCELED, + EVENTS.ESCROW_DEPOSIT, + EVENTS.ESCROW_WITHDRAW +] + export const INDEXER_CRAWLING_EVENTS = { CRAWLING_STARTED: 'crawlingStarted', REINDEX_QUEUE_POP: 'popFromQueue', // this is for reindex tx, not chain @@ -204,6 +226,30 @@ export const EVENT_HASHES: Hashes = { '0xd65bc8e3024bbad886df74eea79b6e118b7fbcffe1f3f98054e5a6b98dc83891': { type: EVENTS.NEW_ACCESS_LIST, text: 'NewAccessList(address,address)' + }, + '0x118cb6c6a02e26bfdb39cab8d70573499942c4ee3f0d7616d3c4100fe9163d9d': { + type: EVENTS.ESCROW_AUTH, + text: 'Auth(address,address,uint256,uint256,uint256)' + }, + '0xb746b0421b0b98debe76bb312ec9fb701603af22ddb107f7e639b0187e4ff880': { + type: EVENTS.ESCROW_LOCK, + text: 'Lock(address,address,uint256,uint256,uint256,address)' + }, + '0x77aeb72af8b0efaf7fd8c746d2fb78653ae489dd88dea7a851cb354e4cdc4eed': { + type: EVENTS.ESCROW_CLAIMED, + text: 'Claimed(address,uint256,address,address,uint256,bytes)' + }, + '0x5bcb66e310a3be233290f5d61fba34fe58a0e8045b4678714af2c7986f3a5e50': { + type: EVENTS.ESCROW_CANCELED, + text: 'Canceled(address,uint256,address,address,uint256)' + }, + '0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62': { + type: EVENTS.ESCROW_DEPOSIT, + text: 'Deposit(address,address,uint256)' + }, + '0x9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb': { + type: EVENTS.ESCROW_WITHDRAW, + text: 'Withdraw(address,address,uint256)' } } diff --git a/src/utils/crypt.ts b/src/utils/crypt.ts index 7e9f3f37d..369fe488a 100644 --- a/src/utils/crypt.ts +++ b/src/utils/crypt.ts @@ -25,7 +25,7 @@ export async function encrypt( } else if (algorithm === EncryptMethod.ECIES) { const sk = new eciesjs.PrivateKey(privateKey.raw) // get public key from Elliptic curve - encryptedData = eciesjs.encrypt(sk.publicKey.toHex(), data) + encryptedData = Buffer.from(eciesjs.encrypt(sk.publicKey.toHex(), data)) } return encryptedData } @@ -53,7 +53,7 @@ export async function decrypt( decryptedData = Buffer.concat([decipher.update(data), decipher.final()]) } else if (algorithm === EncryptMethod.ECIES) { const sk = new eciesjs.PrivateKey(privateKey.raw) - decryptedData = eciesjs.decrypt(sk.secret, data) + decryptedData = Buffer.from(eciesjs.decrypt(sk.secret, data)) } return decryptedData }