diff --git a/.gitignore b/.gitignore index b77ad32..c5586bb 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,9 @@ dist target node_modules dist -*.txt \ No newline at end of file +*.txt + +.vscode +yellowstone-grpc + +.env \ No newline at end of file diff --git a/apps/yellowstone-fumarole-cli/Cargo.toml b/apps/yellowstone-fumarole-cli/Cargo.toml index 998376c..e48e392 100644 --- a/apps/yellowstone-fumarole-cli/Cargo.toml +++ b/apps/yellowstone-fumarole-cli/Cargo.toml @@ -40,4 +40,4 @@ yellowstone-grpc-proto = { workspace = true } workspace = true [target.'cfg(not(target_env = "msvc"))'.dependencies] -tikv-jemallocator = "0.6" \ No newline at end of file +tikv-jemallocator = "0.6" diff --git a/apps/yellowstone-fumarole-cli/config_example.toml b/apps/yellowstone-fumarole-cli/config_example.toml new file mode 100644 index 0000000..0b254f9 --- /dev/null +++ b/apps/yellowstone-fumarole-cli/config_example.toml @@ -0,0 +1,3 @@ +[fumarole] +endpoints = ["https://fumarole.endpoint.rpcpool.com"] +x-token = "00000000-0000-0000-0000-000000000000" \ No newline at end of file diff --git a/apps/yellowstone-fumarole-cli/src/bin/fume.rs b/apps/yellowstone-fumarole-cli/src/bin/fume.rs index 9961435..aacc521 100644 --- a/apps/yellowstone-fumarole-cli/src/bin/fume.rs +++ b/apps/yellowstone-fumarole-cli/src/bin/fume.rs @@ -1,10 +1,7 @@ -#[cfg(not(target_env = "msvc"))] -use tikv_jemallocator::Jemalloc; use { clap::Parser, - futures::{FutureExt, future::BoxFuture}, - solana_pubkey::{ParsePubkeyError, Pubkey}, - solana_signature::Signature, + futures::{future::BoxFuture, FutureExt}, + solana_pubkey::Pubkey, std::{ collections::{HashMap, HashSet}, env, diff --git a/examples/typescript/package.json b/examples/typescript/package.json index 016980b..c485755 100644 --- a/examples/typescript/package.json +++ b/examples/typescript/package.json @@ -8,6 +8,8 @@ "homepage": "https://triton.one", "dependencies": { "@triton-one/yellowstone-fumarole": "file:../../typescript-sdk", + "bs58": "^6.0.0", + "dotenv": "^17.2.1", "yargs": "^17.6.2" }, "scripts": { diff --git a/examples/typescript/pnpm-lock.yaml b/examples/typescript/pnpm-lock.yaml new file mode 100644 index 0000000..f495453 --- /dev/null +++ b/examples/typescript/pnpm-lock.yaml @@ -0,0 +1,382 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@triton-one/yellowstone-fumarole': + specifier: file:../../typescript-sdk + version: file:../../typescript-sdk + bs58: + specifier: ^6.0.0 + version: 6.0.0 + dotenv: + specifier: ^17.2.1 + version: 17.2.1 + yargs: + specifier: ^17.6.2 + version: 17.7.2 + devDependencies: + '@types/node': + specifier: ^22.13.5 + version: 22.17.1 + '@types/yargs': + specifier: ^17.0.33 + version: 17.0.33 + prettier: + specifier: ^2.8.3 + version: 2.8.8 + typescript: + specifier: ^4.9.5 + version: 4.9.5 + +packages: + + '@bufbuild/protobuf@2.6.3': + resolution: {integrity: sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==} + + '@datastructures-js/deque@1.0.5': + resolution: {integrity: sha512-ogeIkpcCGnM+LAZYZqXBXn6Nx0a/ikkKDFPoa1MzZWRFyEdfVUNwkHclET/T8jkyNM1dN6NmPDfenNKcKazjjg==} + + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@js-sdsl/ordered-set@4.4.2': + resolution: {integrity: sha512-ieYQ8WlBPKYzEo81H3q0DFbd8WtFRXXABb4+vRCF0AO3WWtJZFxYvRGdipUXGrd6tlSySmqhcPuO3J6SCodCxg==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@triton-one/yellowstone-fumarole@file:../../typescript-sdk': + resolution: {directory: ../../typescript-sdk, type: directory} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/node@22.17.1': + resolution: {integrity: sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + dotenv@17.2.1: + resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + engines: {node: '>=12.0.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + +snapshots: + + '@bufbuild/protobuf@2.6.3': {} + + '@datastructures-js/deque@1.0.5': {} + + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.3 + yargs: 17.7.2 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@js-sdsl/ordered-set@4.4.2': {} + + '@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': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@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': {} + + '@triton-one/yellowstone-fumarole@file:../../typescript-sdk': + dependencies: + '@bufbuild/protobuf': 2.6.3 + '@datastructures-js/deque': 1.0.5 + '@grpc/grpc-js': 1.13.4 + '@js-sdsl/ordered-set': 4.4.2 + '@types/js-yaml': 4.0.9 + bs58: 6.0.0 + js-yaml: 4.1.0 + rxjs: 7.8.2 + + '@types/js-yaml@4.0.9': {} + + '@types/node@22.17.1': + dependencies: + undici-types: 6.21.0 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + base-x@5.0.1: {} + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + dotenv@17.2.1: {} + + emoji-regex@8.0.0: {} + + escalade@3.2.0: {} + + get-caller-file@2.0.5: {} + + is-fullwidth-code-point@3.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + lodash.camelcase@4.3.0: {} + + long@5.3.2: {} + + prettier@2.8.8: {} + + protobufjs@7.5.3: + 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/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.17.1 + long: 5.3.2 + + require-directory@2.1.1: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + tslib@2.8.1: {} + + typescript@4.9.5: {} + + undici-types@6.21.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/examples/typescript/src/index.ts b/examples/typescript/src/index.ts deleted file mode 100644 index 47617c0..0000000 --- a/examples/typescript/src/index.ts +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Read the Fumarole documentation abd blog if you haven't already to understand what's happening in the following code - * https://docs.triton.one/project-yellowstone/fumarole - * https://blog.triton.one/introducing-yellowstone-fumarole - * - * Fumarole Example Client - * - * This example demonstrates how to use the Yellowstone Fumarole client to: - * - Connect to a Fumarole endpoint - * - Subscribe to account and transaction updates - * - Manage consumer groups - * - Handle streaming data - * - * Comment/Uncomment blocks of code to perform the operations you want to try out - */ -import Client, { - FumaroleSubscribeRequest, -} from "@triton-one/yellowstone-fumarole"; -import { - EventSubscriptionPolicy, - InitialOffsetPolicy, - FumaroleClient, -} from "@triton-one/yellowstone-fumarole/dist/types/grpc/fumarole"; -import { CommitmentLevel } from "@triton-one/yellowstone-fumarole/dist/types/grpc/geyser"; -import yargs from "yargs"; -async function main() { - const args = await parseCommandLineArguments(); - - const client = new Client(args.endpoint, args.xToken, { - "grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB - }); - - const consumerGroupLabel = "hello3"; - - // const consumerGroup = await client.createStaticConsumerGroup({ - // commitmentLevel: CommitmentLevel.CONFIRMED, - // consumerGroupLabel: consumerGroupLabel, - // eventSubscriptionPolicy: EventSubscriptionPolicy.BOTH, - // initialOffsetPolicy: InitialOffsetPolicy.LATEST, - // }); - // console.log( - // `Created Consumer Group with label ${consumerGroupLabel} and id ${consumerGroup.groupId}` - // ); - - // const consumerGroupInfo = await client.getConsumerGroupInfo({ - // consumerGroupLabel: consumerGroupLabel, - // }); - // console.log(`Consumer group ${consumerGroupLabel} info: `); - // console.log(consumerGroupInfo); - - // const slotLagInfo = await client.getSlotLagInfo({ - // consumerGroupLabel: consumerGroupLabel, - // }); - // console.log(`Slot Lag Info: ${slotLagInfo}`); - - const subscribeRequest: FumaroleSubscribeRequest = { - accounts: { - tokenKeg: { - account: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"], - filters: [], - owner: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"], - nonemptyTxnSignature: false, - }, - }, - consumerGroupLabel: consumerGroupLabel, - transactions: { - // tokenKeg: { - // accountExclude: [], - // accountInclude: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"], - // accountRequired: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"], - // }, - }, - }; - - await fumaroleSubscribe(client, subscribeRequest); - - const consumerGroupsList = await client.listConsumerGroups({}); - console.log(`Consumer groups`); - console.log(consumerGroupsList); - - // const oldestSlot = await client.getOldestSlot({commitmentLevel: CommitmentLevel.CONFIRMED}) - // console.log(`Oldest slot ${oldestSlot}`); - - const commitmentLevels = await client.listAvailableCommitmentLevels({}); - console.log(`Commitment Levels`); - console.log(commitmentLevels); - - const deleteConsumerGroupInfo = await client.deleteConsumerGroup({ - consumerGroupLabel: consumerGroupLabel, - }); - console.log(`Delete consumer group result`); - console.log(deleteConsumerGroupInfo); -} - -async function fumaroleSubscribe( - client: Client, - subscribeRequest: FumaroleSubscribeRequest -) { - // Subscribe for events - const stream = await client.subscribe(); - // const stream = await client.subscribe({ compression: "gzip" }); - - // Create `error` / `end` handler - const streamClosed = new Promise((resolve, reject) => { - stream.on("error", (error) => { - reject(error); - stream.end(); - }); - stream.on("end", () => { - resolve(); - }); - stream.on("close", () => { - resolve(); - }); - }); - - // Handle updates - stream.on("data", (data) => { - console.log(data); - }); - - // Send subscribe request - await new Promise((resolve, reject) => { - stream.write(subscribeRequest, (err) => { - if (err === null || err === undefined) { - resolve(); - } else { - reject(err); - } - }); - }).catch((reason) => { - console.error(reason); - throw reason; - }); - - await streamClosed; -} - -function parseCommandLineArguments() { - return yargs(process.argv.slice(3)) - .options({ - endpoint: { - alias: "e", - default: "http://localhost:10000", - describe: "fumarole gRPC endpoint", - type: "string", - }, - "x-token": { - describe: "token for auth, can be used only with ssl", - type: "string", - }, - commitment: { - describe: "commitment level", - choices: ["processed", "confirmed", "finalized"], - }, - }) - .demandCommand(1) - .help().argv; -} - -main(); diff --git a/examples/typescript/src/list-consumer-groups-with-group-info.ts b/examples/typescript/src/list-consumer-groups-with-group-info.ts new file mode 100644 index 0000000..9e2941f --- /dev/null +++ b/examples/typescript/src/list-consumer-groups-with-group-info.ts @@ -0,0 +1,96 @@ +import { FumaroleClient, FumaroleConfig } from "@triton-one/yellowstone-fumarole"; +import dotenv from "dotenv"; +dotenv.config() + +const FUMAROLE_ENDPOINT = process.env.FUMAROLE_ENDPOINT!; +const FUMAROLE_X_TOKEN = process.env.FUMAROLE_X_TOKEN!; + + +async function main() { + try { + // Configure the client + const config: FumaroleConfig = { + endpoint: FUMAROLE_ENDPOINT, + xToken: FUMAROLE_X_TOKEN, + maxDecodingMessageSizeBytes: 100 * 1024 * 1024, // 100MB max message size + xMetadata: {}, // Additional metadata if needed + }; + + // Connect to the Fumarole server + console.log("Connecting to Fumarole server..."); + const client = await FumaroleClient.connect(config); + console.log("Connected successfully"); + + // List all consumer groups + console.log("\nFetching consumer groups..."); + try { + console.log("Sending listConsumerGroups request to server..."); + process.on("unhandledRejection", (reason, promise) => { + console.error("Unhandled Rejection at:", promise, "reason:", reason); + }); + + const response = await client.listConsumerGroups().catch((error) => { + console.error("Caught error during listConsumerGroups:", error); + if (error.code) console.error("Error code:", error.code); + if (error.details) console.error("Error details:", error.details); + if (error.metadata) console.error("Error metadata:", error.metadata); + if (error.stack) console.error("Error stack:", error.stack); + throw error; + }); + + console.log("\n=== ListConsumerGroups Response ==="); + console.log(JSON.stringify(response, null, 2)); + console.log("=====================================\n"); + + if (!response.consumerGroups || response.consumerGroups.length === 0) { + console.log("No consumer groups found on server"); + } else { + console.log( + `Found ${response.consumerGroups.length} consumer groups. Fetching details...\n` + ); + for (const group of response.consumerGroups) { + console.log(`=== Consumer Group: ${group.consumerGroupName} ===`); + console.log("Basic info:", JSON.stringify(group, null, 2)); + + // Get detailed info for the group + try { + console.log( + `\nFetching detailed info for group: ${group.consumerGroupName}` + ); + const info = await client.getConsumerGroupInfo( + group.consumerGroupName + ); + if (info) { + console.log("\nDetailed Group Info:"); + console.log("Status: Active"); + console.log("Server Response:", JSON.stringify(info, null, 2)); + } else { + console.log("\nGroup Status: Not found or inactive"); + } + console.log("===============================\n"); + } catch (err) { + console.error( + `\nError fetching group info from server: ${ + err instanceof Error ? err.message : String(err) + }` + ); + } + } + } + } catch (error) { + console.error( + "Error:", + error instanceof Error ? error.message : String(error) + ); + process.exit(1); + } + } catch (error) { + console.error( + "Error:", + error instanceof Error ? error.message : String(error) + ); + process.exit(1); + } +} + +main().catch(console.error); diff --git a/examples/typescript/src/subscribe-token-transactions.ts b/examples/typescript/src/subscribe-token-transactions.ts new file mode 100644 index 0000000..a297428 --- /dev/null +++ b/examples/typescript/src/subscribe-token-transactions.ts @@ -0,0 +1,167 @@ +import dotenv from "dotenv"; + +import { + FumaroleClient, + SubscribeRequest, + DragonsmouthAdapterSession, + CommitmentLevel, + InitialOffsetPolicy, + SubscribeUpdate, +} from "@triton-one/yellowstone-fumarole"; + +dotenv.config(); + +// stringify bigint in json +function safeJsonStringify(obj: unknown): string { + return JSON.stringify( + obj, + (_, v) => { + if (typeof v === "bigint") return v.toString(); + if (v instanceof Error) return v.message; + return v; + }, + 2 + ); +} + +const FUMAROLE_ENDPOINT = process.env.FUMAROLE_ENDPOINT!; +const FUMAROLE_X_TOKEN = process.env.FUMAROLE_X_TOKEN!; +const TOKEN_ADDRESS = "Tokenkegqfezyinwajbnbgkpfxcwubvf9ss623vq5da"; + +let isShuttingDown = false; + +async function main() { + let groupName: string | undefined; + let client: FumaroleClient | undefined; + + try { + console.log(`Connecting to Fumarole server at ${FUMAROLE_ENDPOINT}...`); + const config = { + endpoint: FUMAROLE_ENDPOINT, + xToken: FUMAROLE_X_TOKEN, + maxDecodingMessageSizeBytes: 100 * 1024 * 1024, + xMetadata: {}, + }; + + console.log( + "Initializing Fumarole client with configuration:", + safeJsonStringify(Object.assign({}, config, { xToken: "***" })) + ); + + client = await FumaroleClient.connect(config); + + const request: SubscribeRequest = { + commitment: CommitmentLevel.CONFIRMED, + accounts: {}, + transactions: { + tokenFilter: { + accountInclude: [TOKEN_ADDRESS], + accountExclude: [], + accountRequired: [TOKEN_ADDRESS], + }, + }, + slots: { + slotFilter: { + filterByCommitment: true, + interslotUpdates: true, + }, + }, + transactionsStatus: {}, + blocks: {}, + blocksMeta: {}, + entry: {}, + ping: { id: Date.now() }, + accountsDataSlice: [], + fromSlot: undefined, + }; + + // delete them all because they pile up and hit limit while developing + await client.deleteAllConsumerGroups(); + + groupName = `token-monitor-${Math.random().toString(36).substring(7)}`; + console.log(`Creating consumer group: ${groupName}`); + + console.log("Creating consumer group with initialOffsetPolicy LATEST"); + try { + await client.createConsumerGroup({ + consumerGroupName: groupName, + initialOffsetPolicy: InitialOffsetPolicy.LATEST, + }); + } catch (err) { + console.error("Failed to create consumer group:", err); + throw err; + } + + const subscribeConfig = { + concurrentDownloadLimit: 200, + commitInterval: 2000, + maxFailedSlotDownloadAttempt: 100, + dataChannelCapacity: 20000, + slotMemoryRetention: 300, + gcInterval: 30000, + }; + + console.log("Subscribe request:", safeJsonStringify(request)); + console.log("Subscribe config:", safeJsonStringify(subscribeConfig)); + + // groupName = "helloworld-1" + + console.log(`Starting subscription for group ${groupName}...`); + + let subscription: DragonsmouthAdapterSession; + + subscription = await client.dragonsmouthSubscribeWithConfig( + groupName, + request, + subscribeConfig, + FUMAROLE_X_TOKEN + ); + + const { sink, source, fumaroleHandle } = subscription; + + // await fumaroleHandle; + + fumaroleHandle.catch((e) => { + console.log("caught in fumarole handle"); + console.log(e); + }); + + // Handle fumarole connection closure in background + fumaroleHandle.then((res) => { + console.error("Fumarole handle closed:", res); + }); + + // while (true) { + // const up = await source.get() + // console.log("THE UPDATE"); + // console.log(up); + // } + + + // Consume async queue + for await (const event of source) { + console.log(JSON.stringify(event, null, 2)); + } + + console.error("Source closed"); + } catch (error) { + console.log("CATCH 2"); + console.log(error); + } +} + +async function handleShutdown(signal: string) { + if (isShuttingDown) return; + isShuttingDown = true; + console.log(`\nReceived ${signal}. Cleaning up...`); + await new Promise((resolve) => setTimeout(resolve, 1000)); + process.exit(0); +} + +process.on("SIGINT", () => handleShutdown("SIGINT")); +process.on("SIGTERM", () => handleShutdown("SIGTERM")); +process.on("unhandledRejection", (reason, promise) => { + console.error("Unhandled Rejection at:", promise, "reason:", reason); +}); + +main().catch(console.error); diff --git a/typescript-sdk/.prettierrc.json b/typescript-sdk/.prettierrc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/typescript-sdk/.prettierrc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/typescript-sdk/Changelog.md b/typescript-sdk/Changelog.md deleted file mode 100644 index d235734..0000000 --- a/typescript-sdk/Changelog.md +++ /dev/null @@ -1,26 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -### Breaking Changes - -### Features - -### Fixes - -## [0.1.1] - -### Fixes - -### Features - -- Enable gRPC GZIP compression support which can either be `gzip` or `none` (default). - -## [0.1.0] - -Initial release \ No newline at end of file diff --git a/typescript-sdk/README.md b/typescript-sdk/README.md deleted file mode 100644 index fead172..0000000 --- a/typescript-sdk/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Yellowstone Fumarole SDK -SDK client for [Yellowstone Fumarole](https://github.com/rpcpool/yellowstone-fumarole) - -Checkout the [example](https://github.com/rpcpool/yellowstone-fumarole/tree/main/examples/typescript) to learn how to use it \ No newline at end of file diff --git a/typescript-sdk/add-js-extensions.mjs b/typescript-sdk/add-js-extensions.mjs index 176147d..e69de29 100644 --- a/typescript-sdk/add-js-extensions.mjs +++ b/typescript-sdk/add-js-extensions.mjs @@ -1,107 +0,0 @@ -import { fileURLToPath } from 'url'; -import { dirname } from 'path'; -import fs from 'fs'; -import path from 'path'; -import recast from 'recast'; -import babelParser from '@babel/parser'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -// List of external packages that require '.js' extensions -const packagesRequiringJsExtension = [ - 'protobufjs/minimal', - // Add other package paths as needed -]; - -function shouldAppendJsExtension(source) { - // Check if the path has an extension already - if (path.extname(source)) { - return false; - } - - // Check if the path is relative - if (source.startsWith('./') || source.startsWith('../')) { - return true; - } - - // Check if the path is in the whitelist of external packages - return packagesRequiringJsExtension.some(pkg => source === pkg || source.startsWith(`${pkg}/`)); -} - -function processFile(filePath) { - const code = fs.readFileSync(filePath, 'utf8'); - const ast = recast.parse(code, { - parser: { - parse: (source) => babelParser.parse(source, { - sourceType: 'module', - plugins: ['typescript'] - }) - } - }); - - let modified = false; - - recast.types.visit(ast, { - visitImportDeclaration(pathNode) { - const source = pathNode.node.source.value; - if (shouldAppendJsExtension(source)) { - pathNode.node.source.value = `${source}.js`; - modified = true; - } - return false; - }, - visitExportNamedDeclaration(pathNode) { - if (pathNode.node.source?.value) { - const source = pathNode.node.source.value; - if (shouldAppendJsExtension(source)) { - pathNode.node.source.value = `${source}.js`; - modified = true; - } - } - return false; - }, - visitExportAllDeclaration(pathNode) { - if (pathNode.node.source?.value) { - const source = pathNode.node.source.value; - if (shouldAppendJsExtension(source)) { - pathNode.node.source.value = `${source}.js`; - modified = true; - } - } - return false; - } - }); - - if (modified) { - const output = recast.print(ast).code; - fs.writeFileSync(filePath, output, 'utf8'); - console.log(`Updated import/export paths in: ${filePath}`); - } -} - -function traverseDir(dir) { - fs.readdirSync(dir).forEach((file) => { - const fullPath = path.join(dir, file); - const stat = fs.statSync(fullPath); - - if (stat.isDirectory()) { - traverseDir(fullPath); - } else if (stat.isFile() && path.extname(fullPath) === '.js') { - processFile(fullPath); - } - }); -} - -function main() { - const esmDir = path.resolve(__dirname, 'dist/esm'); - - if (!fs.existsSync(esmDir)) { - console.error(`Directory not found: ${esmDir}`); - process.exit(1); - } - - traverseDir(esmDir); -} - -main(); \ No newline at end of file diff --git a/typescript-sdk/jest.config.js b/typescript-sdk/jest.config.js new file mode 100644 index 0000000..b086764 --- /dev/null +++ b/typescript-sdk/jest.config.js @@ -0,0 +1,16 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: "ts-jest/presets/default-esm", + testEnvironment: "node", + testMatch: ["**/src/tests/**/*.test.ts"], + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { + useESM: true, // <-- important for ESM builds + tsconfig: "tsconfig.json", + }, + ], + }, +}; diff --git a/typescript-sdk/jest.config.mjs b/typescript-sdk/jest.config.mjs new file mode 100644 index 0000000..bcd1f22 --- /dev/null +++ b/typescript-sdk/jest.config.mjs @@ -0,0 +1,18 @@ +export default { + preset: "ts-jest/presets/default-esm", + testEnvironment: "node", + testMatch: ["**/src/tests/**/*.test.ts"], + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { + useESM: true, + tsconfig: "tsconfig.json", + }, + ], + }, + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, +}; diff --git a/typescript-sdk/package-lock.json b/typescript-sdk/package-lock.json deleted file mode 100644 index 61d0c83..0000000 --- a/typescript-sdk/package-lock.json +++ /dev/null @@ -1,942 +0,0 @@ -{ - "name": "@triton-one/yellowstone-fumarole", - "version": "3.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@triton-one/yellowstone-fumarole", - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.8.0" - }, - "devDependencies": { - "@babel/parser": "^7.26.3", - "@solana/rpc-api": "=2.0.0", - "prettier": "^2.8.3", - "recast": "^0.23.9", - "ts-proto": "^1.139.0", - "typescript": "=5.2.2" - }, - "engines": { - "node": ">=20.18.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.9" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.12.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.6.tgz", - "integrity": "sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "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==", - "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==", - "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==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "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", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "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==", - "license": "BSD-3-Clause" - }, - "node_modules/@solana/addresses": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.0.0.tgz", - "integrity": "sha512-8n3c/mUlH1/z+pM8e7OJ6uDSXw26Be0dgYiokiqblO66DGQ0d+7pqFUFZ5pEGjJ9PU2lDTSfY8rHf4cemOqwzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/assertions": "2.0.0", - "@solana/codecs-core": "2.0.0", - "@solana/codecs-strings": "2.0.0", - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/assertions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.0.0.tgz", - "integrity": "sha512-NyPPqZRNGXs/GAjfgsw7YS6vCTXWt4ibXveS+ciy5sdmp/0v3pA6DlzYjleF9Sljrew0IiON15rjaXamhDxYfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0.tgz", - "integrity": "sha512-qCG+3hDU5Pm8V6joJjR4j4Zv9md1z0RaecniNDIkEglnxmOUODnmPLWbtOjnDylfItyuZeDihK8hkewdj8cUtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-data-structures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0.tgz", - "integrity": "sha512-N98Y4jsrC/XeOgqrfsGqcOFIaOoMsKdAxOmy5oqVaEN67YoGSLNC9ROnqamOAOrsZdicTWx9/YLKFmQi9DPh1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0", - "@solana/codecs-numbers": "2.0.0", - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-numbers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0.tgz", - "integrity": "sha512-r66i7VzJO1MZkQWZIAI6jjJOFVpnq0+FIabo2Z2ZDtrArFus/SbSEv543yCLeD2tdR/G/p+1+P5On10qF50Y1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0", - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-strings": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0.tgz", - "integrity": "sha512-dNqeCypsvaHcjW86H0gYgAZGGkKVBeKVeh7WXlOZ9kno7PeQ2wNkpccyzDfuzaIsKv+HZUD3v/eo86GCvnKazQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0", - "@solana/codecs-numbers": "2.0.0", - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5" - } - }, - "node_modules/@solana/errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0.tgz", - "integrity": "sha512-IHlaPFSy4lvYco1oHJ3X8DbchWwAwJaL/4wZKnF1ugwZ0g0re8wbABrqNOe/jyZ84VU9Z14PYM8W9oDAebdJbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "commander": "^12.1.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/functional": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.0.0.tgz", - "integrity": "sha512-Sj+sLiUTimnMEyGnSLGt0lbih2xPDUhxhonnrIkPwA+hjQ3ULGHAxeevHU06nqiVEgENQYUJ5rCtHs4xhUFAkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/instructions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.0.0.tgz", - "integrity": "sha512-MiTEiNF7Pzp+Y+x4yadl2VUcNHboaW5WP52psBuhHns3GpbbruRv5efMpM9OEQNe1OsN+Eg39vjEidX55+P+DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.0.0.tgz", - "integrity": "sha512-SSLSX8BXRvfLKBqsmBghmlhMKpwHeWd5CHi5zXgTS1BRrtiU6lcrTVC9ie6B+WaNNq7oe3e6K5bdbhu3fFZ+0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/assertions": "2.0.0", - "@solana/codecs-core": "2.0.0", - "@solana/codecs-strings": "2.0.0", - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.0.0.tgz", - "integrity": "sha512-1FwitYxwADMF/6zKP2kNXg8ESxB6GhNBNW1c4f5dEmuXuBbeD/enLV3WMrpg8zJkIaaYarEFNbt7R7HyFzmURQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.0.0", - "@solana/codecs-core": "2.0.0", - "@solana/codecs-strings": "2.0.0", - "@solana/errors": "2.0.0", - "@solana/keys": "2.0.0", - "@solana/rpc-parsed-types": "2.0.0", - "@solana/rpc-spec": "2.0.0", - "@solana/rpc-transformers": "2.0.0", - "@solana/rpc-types": "2.0.0", - "@solana/transaction-messages": "2.0.0", - "@solana/transactions": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-parsed-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.0.0.tgz", - "integrity": "sha512-VCeY/oKVEtBnp8EDOc5LSSiOeIOLFIgLndcxqU0ij/cZaQ01DOoHbhluvhZtU80Z3dUeicec8TiMgkFzed+WhQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-spec": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.0.0.tgz", - "integrity": "sha512-1uIDzj7vocCUqfOifjv1zAuxQ53ugiup/42edVFoQLOnJresoEZLL6WjnsJq4oCTccEAvGhUBI1WWKeZTGNxFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/errors": "2.0.0", - "@solana/rpc-spec-types": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-spec-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.0.0.tgz", - "integrity": "sha512-G2lmhFhgtxMQd/D6B04BHGE7bm5dMZdIPQNOqVGhzNAVjrmyapD3JN2hKAbmaYPe97wLfZERw0Ux1u4Y6q7TqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-transformers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.0.0.tgz", - "integrity": "sha512-H6tN0qcqzUangowsLLQtYXKJsf1Roe3/qJ1Cy0gv9ojY9uEvNbJqpeEj+7blv0MUZfEe+rECAwBhxxRKPMhYGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/errors": "2.0.0", - "@solana/functional": "2.0.0", - "@solana/rpc-spec-types": "2.0.0", - "@solana/rpc-types": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.0.0.tgz", - "integrity": "sha512-o1ApB9PYR0A3XjVSOh//SOVWgjDcqMlR3UNmtqciuREIBmWqnvPirdOa5EJxD3iPhfA4gnNnhGzT+tMDeDW/Kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.0.0", - "@solana/codecs-core": "2.0.0", - "@solana/codecs-numbers": "2.0.0", - "@solana/codecs-strings": "2.0.0", - "@solana/errors": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/transaction-messages": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.0.0.tgz", - "integrity": "sha512-Uc6Fw1EJLBrmgS1lH2ZfLAAKFvprWPQQzOVwZS78Pv8Whsk7tweYTK6S0Upv0nHr50rGpnORJfmdBrXE6OfNGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.0.0", - "@solana/codecs-core": "2.0.0", - "@solana/codecs-data-structures": "2.0.0", - "@solana/codecs-numbers": "2.0.0", - "@solana/errors": "2.0.0", - "@solana/functional": "2.0.0", - "@solana/instructions": "2.0.0", - "@solana/rpc-types": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/transactions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.0.0.tgz", - "integrity": "sha512-VfdTE+59WKvuBG//6iE9RPjAB+ZT2kLgY2CDHabaz6RkH6OjOkMez9fWPVa3Xtcus+YQWN1SnQoryjF/xSx04w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.0.0", - "@solana/codecs-core": "2.0.0", - "@solana/codecs-data-structures": "2.0.0", - "@solana/codecs-numbers": "2.0.0", - "@solana/codecs-strings": "2.0.0", - "@solana/errors": "2.0.0", - "@solana/functional": "2.0.0", - "@solana/instructions": "2.0.0", - "@solana/keys": "2.0.0", - "@solana/rpc-types": "2.0.0", - "@solana/transaction-messages": "2.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@types/node": { - "version": "22.13.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", - "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/case-anything": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", - "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dprint-node": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", - "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^1.0.3" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "dev": true, - "license": "CC0-1.0", - "peer": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, - "node_modules/long": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", - "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", - "license": "Apache-2.0" - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "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/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/recast": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", - "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/ts-poet": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.11.0.tgz", - "integrity": "sha512-r5AGF8vvb+GjBsnqiTqbLhN1/U2FJt6BI+k0dfCrkKzWvUhNlwMmq9nDHuucHs45LomgHjZPvYj96dD3JawjJA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dprint-node": "^1.0.8" - } - }, - "node_modules/ts-proto": { - "version": "1.181.2", - "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.181.2.tgz", - "integrity": "sha512-knJ8dtjn2Pd0c5ZGZG8z9DMiD4PUY8iGI9T9tb8DvGdWRMkLpf0WcPO7G+7cmbZyxvNTAG6ci3fybEaFgMZIvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "case-anything": "^2.1.13", - "protobufjs": "^7.2.4", - "ts-poet": "^6.7.0", - "ts-proto-descriptors": "1.16.0" - }, - "bin": { - "protoc-gen-ts_proto": "protoc-gen-ts_proto" - } - }, - "node_modules/ts-proto-descriptors": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.16.0.tgz", - "integrity": "sha512-3yKuzMLpltdpcyQji1PJZRfoo4OJjNieKTYkQY8pF7xGKsYz/RHe3aEe4KiRxcinoBmnEhmuI+yJTxLb922ULA==", - "dev": true, - "license": "ISC", - "dependencies": { - "long": "^5.2.3", - "protobufjs": "^7.2.4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - } - } -} diff --git a/typescript-sdk/package.json b/typescript-sdk/package.json index 95864f6..6685484 100644 --- a/typescript-sdk/package.json +++ b/typescript-sdk/package.json @@ -9,9 +9,11 @@ "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", "scripts": { + "clean": "rm -rf dist", + "prebuild": "npm run clean", "build": "npm run grpc-generate && tsc --project tsconfig.esm.json && tsc --project tsconfig.cjs.json && node add-js-extensions.mjs", - "fmt": "prettier -w .", - "grpc-generate": "mkdir -p src/grpc && protoc -I../yellowstone-grpc/yellowstone-grpc-proto/proto -I../proto --plugin=node_modules/.bin/protoc-gen-ts_proto --ts_proto_opt=forceLong=string --ts_proto_opt=outputServices=grpc-js --experimental_allow_proto3_optional --ts_proto_out=src/grpc fumarole.proto --ts_proto_opt=esModuleInterop=true" + "grpc-generate": "mkdir -p src/grpc && protoc -I../yellowstone-grpc/yellowstone-grpc-proto/proto -I../proto --plugin=node_modules/.bin/protoc-gen-ts_proto --ts_proto_opt=forceLong=bigint --ts_proto_opt=outputServices=grpc-js --experimental_allow_proto3_optional --ts_proto_out=src/grpc fumarole.proto --ts_proto_opt=esModuleInterop=true", + "test": "NODE_OPTIONS=--experimental-vm-modules jest --config jest.config.mjs" }, "repository": { "type": "git", @@ -30,48 +32,23 @@ "fumarole" ], "homepage": "https://triton.one", - "dependencies": { - "@grpc/grpc-js": "^1.8.0" - }, "devDependencies": { - "@babel/parser": "^7.26.3", - "@solana/rpc-api": "=2.0.0", - "prettier": "^2.8.3", - "recast": "^0.23.9", - "ts-proto": "^1.139.0", - "typescript": "=5.2.2" - }, - "engines": { - "node": ">=20.18.0" + "@jest/globals": "^30.0.5", + "@types/jest": "^30.0.0", + "@types/node": "^22.17.1", + "jest": "^30.0.5", + "ts-jest": "^29.4.1", + "ts-proto": "^2.7.7", + "typescript": "^5.2.2" }, - "files": [ - "dist" - ], - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js" - }, - "./grpc/fumarole": { - "types": "./dist/types/grpc/fumarole.d.ts", - "import": "./dist/esm/grpc/fumarole.js", - "require": "./dist/cjs/grpc/fumarole.js" - }, - "./grpc/geyser": { - "types": "./dist/types/grpc/geyser.d.ts", - "import": "./dist/esm/grpc/geyser.js", - "require": "./dist/cjs/grpc/geyser.js" - }, - "./dist/types/grpc/fumarole": { - "types": "./dist/types/grpc/fumarole.d.ts", - "import": "./dist/esm/grpc/fumarole.js", - "require": "./dist/cjs/grpc/fumarole.js" - }, - "./dist/types/grpc/geyser": { - "types": "./dist/types/grpc/geyser.d.ts", - "import": "./dist/esm/grpc/geyser.js", - "require": "./dist/cjs/grpc/geyser.js" - } + "dependencies": { + "@bufbuild/protobuf": "^2.6.3", + "@datastructures-js/deque": "^1.0.5", + "@grpc/grpc-js": "^1.13.4", + "@js-sdsl/ordered-set": "^4.4.2", + "@types/js-yaml": "^4.0.9", + "bs58": "^6.0.0", + "js-yaml": "^4.1.0", + "rxjs": "^7.8.2" } } \ No newline at end of file diff --git a/typescript-sdk/pnpm-lock.yaml b/typescript-sdk/pnpm-lock.yaml new file mode 100644 index 0000000..1810f1d --- /dev/null +++ b/typescript-sdk/pnpm-lock.yaml @@ -0,0 +1,3137 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@bufbuild/protobuf': + specifier: ^2.6.3 + version: 2.6.3 + '@datastructures-js/deque': + specifier: ^1.0.5 + version: 1.0.5 + '@grpc/grpc-js': + specifier: ^1.13.4 + version: 1.13.4 + '@js-sdsl/ordered-set': + specifier: ^4.4.2 + version: 4.4.2 + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 + bs58: + specifier: ^6.0.0 + version: 6.0.0 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + rxjs: + specifier: ^7.8.2 + version: 7.8.2 + devDependencies: + '@jest/globals': + specifier: ^30.0.5 + version: 30.0.5 + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 + '@types/node': + specifier: ^22.17.1 + version: 22.17.1 + jest: + specifier: ^30.0.5 + version: 30.0.5(@types/node@22.17.1) + ts-jest: + specifier: ^29.4.1 + version: 29.4.1(@babel/core@7.28.3)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.3))(jest-util@30.0.5)(jest@30.0.5(@types/node@22.17.1))(typescript@5.9.2) + ts-proto: + specifier: ^2.7.7 + version: 2.7.7 + typescript: + specifier: ^5.2.2 + version: 5.9.2 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@bufbuild/protobuf@2.6.3': + resolution: {integrity: sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==} + + '@datastructures-js/deque@1.0.5': + resolution: {integrity: sha512-ogeIkpcCGnM+LAZYZqXBXn6Nx0a/ikkKDFPoa1MzZWRFyEdfVUNwkHclET/T8jkyNM1dN6NmPDfenNKcKazjjg==} + + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@30.0.5': + resolution: {integrity: sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.0.5': + resolution: {integrity: sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.0.5': + resolution: {integrity: sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.0.5': + resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.0.5': + resolution: {integrity: sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.0.5': + resolution: {integrity: sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.0.1': + resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.0.5': + resolution: {integrity: sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.0.5': + resolution: {integrity: sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.0.5': + resolution: {integrity: sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.0.5': + resolution: {integrity: sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.0.5': + resolution: {integrity: sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.0.5': + resolution: {integrity: sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@30.0.5': + resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@js-sdsl/ordered-set@4.4.2': + resolution: {integrity: sha512-ieYQ8WlBPKYzEo81H3q0DFbd8WtFRXXABb4+vRCF0AO3WWtJZFxYvRGdipUXGrd6tlSySmqhcPuO3J6SCodCxg==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@sinclair/typebox@0.34.39': + resolution: {integrity: sha512-keEoFsevmLwAedzacnTVmra66GViRH3fhWO1M+nZ8rUgpPJyN4mcvqlGr3QMrQXx4L8KNwW0q9/BeHSEoO4teg==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/node@22.17.1': + resolution: {integrity: sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + babel-jest@30.0.5: + resolution: {integrity: sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + + babel-plugin-istanbul@7.0.0: + resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + engines: {node: '>=12'} + + babel-plugin-jest-hoist@30.0.1: + resolution: {integrity: sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@30.0.1: + resolution: {integrity: sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.2: + resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001735: + resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} + + case-anything@2.1.13: + resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} + engines: {node: '>=12.13'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + dprint-node@1.0.8: + resolution: {integrity: sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.203: + resolution: {integrity: sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} + + expect@30.0.5: + resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-changed-files@30.0.5: + resolution: {integrity: sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.0.5: + resolution: {integrity: sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.0.5: + resolution: {integrity: sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.0.5: + resolution: {integrity: sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-diff@30.0.5: + resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.0.1: + resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.0.5: + resolution: {integrity: sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-node@30.0.5: + resolution: {integrity: sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-haste-map@30.0.5: + resolution: {integrity: sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-leak-detector@30.0.5: + resolution: {integrity: sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.0.5: + resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.0.5: + resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.0.5: + resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.0.5: + resolution: {integrity: sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.0.5: + resolution: {integrity: sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.0.5: + resolution: {integrity: sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.0.5: + resolution: {integrity: sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-snapshot@30.0.5: + resolution: {integrity: sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@30.0.5: + resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.0.5: + resolution: {integrity: sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.0.5: + resolution: {integrity: sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-worker@30.0.5: + resolution: {integrity: sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.0.5: + resolution: {integrity: sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + napi-postinstall@0.3.3: + resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pretty-format@30.0.5: + resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + engines: {node: '>=12.0.0'} + + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-jest@29.4.1: + resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + + ts-poet@6.12.0: + resolution: {integrity: sha512-xo+iRNMWqyvXpFTaOAvLPA5QAWO6TZrSUs5s4Odaya3epqofBu/fMLHEWl8jPmjhA0s9sgj9sNvF1BmaQlmQkA==} + + ts-proto-descriptors@2.0.0: + resolution: {integrity: sha512-wHcTH3xIv11jxgkX5OyCSFfw27agpInAd6yh89hKG6zqIXnjW9SYqSER2CVQxdPj4czeOhGagNvZBEbJPy7qkw==} + + ts-proto@2.7.7: + resolution: {integrity: sha512-/OfN9/Yriji2bbpOysZ/Jzc96isOKz+eBTJEcKaIZ0PR6x1TNgVm4Lz0zfbo+J0jwFO7fJjJyssefBPQ0o1V9A==} + hasBin: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + + '@babel/traverse@7.28.3': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@0.2.3': {} + + '@bufbuild/protobuf@2.6.3': {} + + '@datastructures-js/deque@1.0.5': {} + + '@emnapi/core@1.4.5': + dependencies: + '@emnapi/wasi-threads': 1.0.4 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.4': + dependencies: + tslib: 2.8.1 + optional: true + + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.3 + yargs: 17.7.2 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@30.0.5': + dependencies: + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + chalk: 4.1.2 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + slash: 3.0.0 + + '@jest/core@30.0.5': + dependencies: + '@jest/console': 30.0.5 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.3.0 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.0.5 + jest-config: 30.0.5(@types/node@22.17.1) + jest-haste-map: 30.0.5 + jest-message-util: 30.0.5 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.5 + jest-resolve-dependencies: 30.0.5 + jest-runner: 30.0.5 + jest-runtime: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 + jest-watcher: 30.0.5 + micromatch: 4.0.8 + pretty-format: 30.0.5 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/diff-sequences@30.0.1': {} + + '@jest/environment@30.0.5': + dependencies: + '@jest/fake-timers': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + jest-mock: 30.0.5 + + '@jest/expect-utils@30.0.5': + dependencies: + '@jest/get-type': 30.0.1 + + '@jest/expect@30.0.5': + dependencies: + expect: 30.0.5 + jest-snapshot: 30.0.5 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@30.0.5': + dependencies: + '@jest/types': 30.0.5 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 22.17.1 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 + + '@jest/get-type@30.0.1': {} + + '@jest/globals@30.0.5': + dependencies: + '@jest/environment': 30.0.5 + '@jest/expect': 30.0.5 + '@jest/types': 30.0.5 + jest-mock: 30.0.5 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 22.17.1 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.0.5': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@jridgewell/trace-mapping': 0.3.30 + '@types/node': 22.17.1 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit-x: 0.2.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + jest-worker: 30.0.5 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.39 + + '@jest/snapshot-utils@30.0.5': + dependencies: + '@jest/types': 30.0.5 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.0.5': + dependencies: + '@jest/console': 30.0.5 + '@jest/types': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@30.0.5': + dependencies: + '@jest/test-result': 30.0.5 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.5 + slash: 3.0.0 + + '@jest/transform@30.0.5': + dependencies: + '@babel/core': 7.28.3 + '@jest/types': 30.0.5 + '@jridgewell/trace-mapping': 0.3.30 + babel-plugin-istanbul: 7.0.0 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.5 + jest-regex-util: 30.0.1 + jest-util: 30.0.5 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@jest/types@30.0.5': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.17.1 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@js-sdsl/ordered-set@4.4.2': {} + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.9': {} + + '@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': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@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': {} + + '@sinclair/typebox@0.34.39': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@tybys/wasm-util@0.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.2 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.2 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@30.0.0': + dependencies: + expect: 30.0.5 + pretty-format: 30.0.5 + + '@types/js-yaml@4.0.9': {} + + '@types/node@22.17.1': + dependencies: + undici-types: 6.21.0 + + '@types/stack-utils@2.0.3': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + babel-jest@30.0.5(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@jest/transform': 30.0.5 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.0 + babel-preset-jest: 30.0.1(@babel/core@7.28.3) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@7.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@30.0.1: + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + '@types/babel__core': 7.20.5 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3) + + babel-preset-jest@30.0.1(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + babel-plugin-jest-hoist: 30.0.1 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3) + + balanced-match@1.0.2: {} + + base-x@5.0.1: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.2: + dependencies: + caniuse-lite: 1.0.30001735 + electron-to-chromium: 1.5.203 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.2) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001735: {} + + case-anything@2.1.13: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + ci-info@4.3.0: {} + + cjs-module-lexer@2.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + dedent@1.6.0: {} + + deepmerge@4.3.1: {} + + detect-libc@1.0.3: {} + + detect-newline@3.1.0: {} + + dprint-node@1.0.8: + dependencies: + detect-libc: 1.0.3 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.203: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + escalade@3.2.0: {} + + escape-string-regexp@2.0.0: {} + + esprima@4.0.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit-x@0.2.2: {} + + expect@30.0.5: + dependencies: + '@jest/expect-utils': 30.0.5 + '@jest/get-type': 30.0.1 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-package-type@0.1.0: {} + + get-stream@6.0.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + graceful-fs@4.2.11: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@4.0.0: {} + + html-escaper@2.0.2: {} + + human-signals@2.1.0: {} + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-arrayish@0.2.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-number@7.0.0: {} + + is-stream@2.0.1: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-changed-files@30.0.5: + dependencies: + execa: 5.1.1 + jest-util: 30.0.5 + p-limit: 3.1.0 + + jest-circus@30.0.5: + dependencies: + '@jest/environment': 30.0.5 + '@jest/expect': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.6.0 + is-generator-fn: 2.1.0 + jest-each: 30.0.5 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-runtime: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 + p-limit: 3.1.0 + pretty-format: 30.0.5 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.0.5(@types/node@22.17.1): + dependencies: + '@jest/core': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.0.5(@types/node@22.17.1) + jest-util: 30.0.5 + jest-validate: 30.0.5 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.0.5(@types/node@22.17.1): + dependencies: + '@babel/core': 7.28.3 + '@jest/get-type': 30.0.1 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.0.5 + '@jest/types': 30.0.5 + babel-jest: 30.0.5(@babel/core@7.28.3) + chalk: 4.1.2 + ci-info: 4.3.0 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.0.5 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.5 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.5 + jest-runner: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.0.5 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.17.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@30.0.5: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + pretty-format: 30.0.5 + + jest-docblock@30.0.1: + dependencies: + detect-newline: 3.1.0 + + jest-each@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + '@jest/types': 30.0.5 + chalk: 4.1.2 + jest-util: 30.0.5 + pretty-format: 30.0.5 + + jest-environment-node@30.0.5: + dependencies: + '@jest/environment': 30.0.5 + '@jest/fake-timers': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + jest-mock: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 + + jest-haste-map@30.0.5: + dependencies: + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.1 + jest-util: 30.0.5 + jest-worker: 30.0.5 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + pretty-format: 30.0.5 + + jest-matcher-utils@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + jest-diff: 30.0.5 + pretty-format: 30.0.5 + + jest-message-util@30.0.5: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.0.5 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.0.5 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@30.0.5: + dependencies: + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + jest-util: 30.0.5 + + jest-pnp-resolver@1.2.3(jest-resolve@30.0.5): + optionalDependencies: + jest-resolve: 30.0.5 + + jest-regex-util@30.0.1: {} + + jest-resolve-dependencies@30.0.5: + dependencies: + jest-regex-util: 30.0.1 + jest-snapshot: 30.0.5 + transitivePeerDependencies: + - supports-color + + jest-resolve@30.0.5: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.5 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.5) + jest-util: 30.0.5 + jest-validate: 30.0.5 + slash: 3.0.0 + unrs-resolver: 1.11.1 + + jest-runner@30.0.5: + dependencies: + '@jest/console': 30.0.5 + '@jest/environment': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.5 + jest-haste-map: 30.0.5 + jest-leak-detector: 30.0.5 + jest-message-util: 30.0.5 + jest-resolve: 30.0.5 + jest-runtime: 30.0.5 + jest-util: 30.0.5 + jest-watcher: 30.0.5 + jest-worker: 30.0.5 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@30.0.5: + dependencies: + '@jest/environment': 30.0.5 + '@jest/fake-timers': 30.0.5 + '@jest/globals': 30.0.5 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + chalk: 4.1.2 + cjs-module-lexer: 2.1.0 + collect-v8-coverage: 1.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.5 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@30.0.5: + dependencies: + '@babel/core': 7.28.3 + '@babel/generator': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/types': 7.28.2 + '@jest/expect-utils': 30.0.5 + '@jest/get-type': 30.0.1 + '@jest/snapshot-utils': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3) + chalk: 4.1.2 + expect: 30.0.5 + graceful-fs: 4.2.11 + jest-diff: 30.0.5 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + pretty-format: 30.0.5 + semver: 7.7.2 + synckit: 0.11.11 + transitivePeerDependencies: + - supports-color + + jest-util@30.0.5: + dependencies: + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + chalk: 4.1.2 + ci-info: 4.3.0 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + + jest-validate@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + '@jest/types': 30.0.5 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.0.5 + + jest-watcher@30.0.5: + dependencies: + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 22.17.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.0.5 + string-length: 4.0.2 + + jest-worker@30.0.5: + dependencies: + '@types/node': 22.17.1 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.0.5 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.0.5(@types/node@22.17.1): + dependencies: + '@jest/core': 30.0.5 + '@jest/types': 30.0.5 + import-local: 3.2.0 + jest-cli: 30.0.5(@types/node@22.17.1) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json5@2.2.3: {} + + leven@3.1.0: {} + + lines-and-columns@1.2.4: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.camelcase@4.3.0: {} + + lodash.memoize@4.1.2: {} + + long@5.3.2: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + merge-stream@2.0.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + ms@2.1.3: {} + + napi-postinstall@0.3.3: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-int64@0.4.0: {} + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pretty-format@30.0.5: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + protobufjs@7.5.3: + 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/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.17.1 + long: 5.3.2 + + pure-rand@7.0.1: {} + + react-is@18.3.1: {} + + require-directory@2.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + semver@6.3.1: {} + + semver@7.7.2: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-jest@29.4.1(@babel/core@7.28.3)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.3))(jest-util@30.0.5)(jest@30.0.5(@types/node@22.17.1))(typescript@5.9.2): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.8 + jest: 30.0.5(@types/node@22.17.1) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.2 + type-fest: 4.41.0 + typescript: 5.9.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.28.3 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + babel-jest: 30.0.5(@babel/core@7.28.3) + jest-util: 30.0.5 + + ts-poet@6.12.0: + dependencies: + dprint-node: 1.0.8 + + ts-proto-descriptors@2.0.0: + dependencies: + '@bufbuild/protobuf': 2.6.3 + + ts-proto@2.7.7: + dependencies: + '@bufbuild/protobuf': 2.6.3 + case-anything: 2.1.13 + ts-poet: 6.12.0 + ts-proto-descriptors: 2.0.0 + + tslib@2.8.1: {} + + type-detect@4.0.8: {} + + type-fest@0.21.3: {} + + type-fest@4.41.0: {} + + typescript@5.9.2: {} + + uglify-js@3.19.3: + optional: true + + undici-types@6.21.0: {} + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.3 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + update-browserslist-db@1.1.3(browserslist@4.25.2): + dependencies: + browserslist: 4.25.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} diff --git a/typescript-sdk/src/config/config.ts b/typescript-sdk/src/config/config.ts new file mode 100644 index 0000000..6effb81 --- /dev/null +++ b/typescript-sdk/src/config/config.ts @@ -0,0 +1,39 @@ +import * as yaml from "js-yaml"; + +export interface FumaroleConfigOptions { + endpoint: string; + xToken?: string; + maxDecodingMessageSizeBytes?: number; + xMetadata?: Record; +} + +export class FumaroleConfig { + readonly endpoint: string; + readonly xToken?: string; + readonly maxDecodingMessageSizeBytes: number; + readonly xMetadata: Record; + + static readonly DEFAULT_MAX_DECODING_MESSAGE_SIZE = 512_000_000; + + constructor(options: FumaroleConfigOptions) { + this.endpoint = options.endpoint; + this.xToken = options.xToken; + this.maxDecodingMessageSizeBytes = + options.maxDecodingMessageSizeBytes ?? + FumaroleConfig.DEFAULT_MAX_DECODING_MESSAGE_SIZE; + this.xMetadata = options.xMetadata ?? {}; + } + + static fromYaml(yamlContent: string): FumaroleConfig { + const data = yaml.load(yamlContent) as Record; + + return new FumaroleConfig({ + endpoint: data.endpoint, + xToken: data["x-token"] || data.x_token, + maxDecodingMessageSizeBytes: + data.max_decoding_message_size_bytes ?? + FumaroleConfig.DEFAULT_MAX_DECODING_MESSAGE_SIZE, + xMetadata: data["x-metadata"] ?? {}, + }); + } +} diff --git a/typescript-sdk/src/connectivity.ts b/typescript-sdk/src/connectivity.ts new file mode 100644 index 0000000..9cf72f3 --- /dev/null +++ b/typescript-sdk/src/connectivity.ts @@ -0,0 +1,286 @@ +import { + ChannelCredentials, + credentials, + Metadata, + Client, + ServiceError, +} from "@grpc/grpc-js"; +import { FumaroleClient } from "./grpc/fumarole"; + +export const X_TOKEN_HEADER = "x-token"; + +interface FumaroleConfig { + xToken?: string; + xMetadata?: Record; +} + +// Simple logger implementation +class Logger { + constructor(private prefix: string) {} + + debug(message: string) { + console.debug(`[${this.prefix}] ${message}`); + } +} + +export class FumaroleGrpcConnector { + private readonly logger: Logger; + private readonly config: FumaroleConfig; + private readonly endpoint: string; + + constructor(config: FumaroleConfig, endpoint: string) { + this.logger = new Logger("FumaroleGrpcConnector"); + this.config = config; + this.endpoint = endpoint; + } + + private createMetadata(): Metadata { + const metadata = new Metadata(); + if (this.config.xMetadata) { + Object.entries(this.config.xMetadata).forEach(([key, value]) => { + metadata.set(key, value); + }); + } + return metadata; + } + + async connect( + grpcOptions: { [key: string]: any }[] = [] + ): Promise { + this.logger.debug(`Connecting to endpoint: ${this.endpoint}`); + + const defaultOptions: { [key: string]: any } = { + "grpc.max_receive_message_length": 111111110, + "grpc.keepalive_time_ms": 10000, + "grpc.keepalive_timeout_ms": 5000, + "grpc.http2.min_time_between_pings_ms": 10000, + "grpc.keepalive_permit_without_calls": 1, + "grpc.initial_reconnect_backoff_ms": 1000, + "grpc.max_reconnect_backoff_ms": 10000, + "grpc.service_config": JSON.stringify({ + loadBalancingConfig: [{ round_robin: {} }], + methodConfig: [ + { + name: [{ service: "fumarole.Fumarole" }], + retryPolicy: { + maxAttempts: 5, + initialBackoff: "1s", + maxBackoff: "10s", + backoffMultiplier: 2, + retryableStatusCodes: ["UNAVAILABLE"], + }, + }, + ], + }), + }; + + const channelOptions: { [key: string]: any } = { + ...defaultOptions, + }; + + // Add additional options + grpcOptions.forEach((opt) => { + Object.entries(opt).forEach(([key, value]) => { + this.logger.debug(`Setting channel option: ${key} = ${value}`); + channelOptions[key] = value; + }); + }); + + let channelCredentials: ChannelCredentials; + + try { + const endpointURL = new URL(this.endpoint); + this.logger.debug( + `Parsed URL - protocol: ${endpointURL.protocol}, hostname: ${endpointURL.hostname}, port: ${endpointURL.port}` + ); + + let port = endpointURL.port; + if (port === "") { + switch (endpointURL.protocol) { + case "https:": + port = "443"; + break; + case "http:": + port = "80"; + break; + } + this.logger.debug(`No port specified, using default port: ${port}`); + } + + // Check if we need to use TLS. + if (endpointURL.protocol === "https:") { + this.logger.debug("HTTPS detected, setting up SSL credentials"); + const sslCreds = credentials.createSsl(); + this.logger.debug("SSL credentials created"); + + const callCreds = credentials.createFromMetadataGenerator( + (_params, callback) => { + const metadata = new Metadata(); + if (this.config.xToken !== undefined) { + this.logger.debug("Adding x-token to metadata"); + metadata.add(X_TOKEN_HEADER, this.config.xToken); + metadata.add("x-subscription-id", this.config.xToken); + } + return callback(null, metadata); + } + ); + this.logger.debug("Call credentials created"); + + channelCredentials = credentials.combineChannelCredentials( + sslCreds, + callCreds + ); + this.logger.debug("Using secure channel with x-token authentication"); + } else { + channelCredentials = credentials.createInsecure(); + this.logger.debug("Using insecure channel without authentication"); + } + + const finalEndpoint = `${endpointURL.hostname}:${port}`; + this.logger.debug(`Creating gRPC client with endpoint: ${finalEndpoint}`); + + const client = new FumaroleClient( + finalEndpoint, + channelCredentials, + channelOptions + ); + + this.logger.debug(`gRPC client created, waiting for ready state...`); + + // Wait for the client to be ready with a longer timeout + await new Promise((resolve, reject) => { + const deadline = new Date().getTime() + 30000; // 30 second timeout + client.waitForReady(deadline, (error) => { + if (error) { + this.logger.debug( + `Client failed to become ready: ${error.message}` + ); + const grpcError = error as ServiceError; + if (grpcError.code !== undefined) + this.logger.debug(`Error code: ${grpcError.code}`); + if (grpcError.details) + this.logger.debug(`Error details: ${grpcError.details}`); + if (grpcError.metadata) + this.logger.debug(`Error metadata: ${grpcError.metadata}`); + reject(error); + } else { + this.logger.debug(`Client is ready`); + resolve(undefined); + } + }); + }); + + this.logger.debug( + `gRPC client created successfully for ${finalEndpoint}` + ); + return client; + } catch (error) { + this.logger.debug( + `Error during connection setup: ${ + error instanceof Error ? error.message : String(error) + }` + ); + throw error; + } + } +} + +// Helper function to create a gRPC channel (for backward compatibility) +export function createGrpcChannel( + endpoint: string, + xToken?: string, + compression?: any, + ...grpcOptions: { [key: string]: any }[] +): Client { + console.debug(`Creating gRPC channel for endpoint: ${endpoint}`); + + const defaultOptions: { [key: string]: any } = { + "grpc.max_receive_message_length": 111111110, + "grpc.keepalive_time_ms": 10000, + "grpc.keepalive_timeout_ms": 5000, + "grpc.http2.min_time_between_pings_ms": 10000, + "grpc.keepalive_permit_without_calls": 1, + }; + + const channelOptions: { [key: string]: any } = { + ...defaultOptions, + }; + + // Add additional options + grpcOptions.forEach((opt) => { + Object.entries(opt).forEach(([key, value]) => { + console.debug(`Setting channel option: ${key} = ${value}`); + channelOptions[key] = value; + }); + }); + + try { + const endpointURL = new URL(endpoint); + console.debug( + `Parsed URL - protocol: ${endpointURL.protocol}, hostname: ${endpointURL.hostname}, port: ${endpointURL.port}` + ); + + let port = endpointURL.port; + if (port === "") { + switch (endpointURL.protocol) { + case "https:": + port = "443"; + break; + case "http:": + port = "80"; + break; + } + console.debug(`No port specified, using default port: ${port}`); + } + + let channelCredentials: ChannelCredentials; + + // Check if we need to use TLS. + if (endpointURL.protocol === "https:") { + console.debug("HTTPS detected, setting up SSL credentials"); + const sslCreds = credentials.createSsl(); + console.debug("SSL credentials created"); + + const callCreds = credentials.createFromMetadataGenerator( + (_params, callback) => { + const metadata = new Metadata(); + if (xToken !== undefined) { + console.debug("Adding x-token to metadata"); + metadata.add(X_TOKEN_HEADER, xToken); + metadata.add("x-subscription-id", xToken); + } + return callback(null, metadata); + } + ); + console.debug("Call credentials created"); + + channelCredentials = credentials.combineChannelCredentials( + sslCreds, + callCreds + ); + console.debug("Combined credentials created for secure channel"); + } else { + channelCredentials = credentials.createInsecure(); + console.debug("Using insecure channel without authentication"); + } + + const finalEndpoint = `${endpointURL.hostname}:${port}`; + console.debug(`Creating gRPC client with endpoint: ${finalEndpoint}`); + + const client = new Client( + finalEndpoint, + channelCredentials, + channelOptions + ); + + console.debug("gRPC client created successfully"); + return client; + } catch (error) { + console.debug( + `Error creating gRPC channel: ${ + error instanceof Error ? error.message : String(error) + }` + ); + throw error; + } +} diff --git a/typescript-sdk/src/grpc/fumarole.ts b/typescript-sdk/src/grpc/fumarole.ts index e5f9c33..f487fa3 100644 --- a/typescript-sdk/src/grpc/fumarole.ts +++ b/typescript-sdk/src/grpc/fumarole.ts @@ -1,82 +1,54 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v1.181.2 -// protoc v6.30.0 +// protoc-gen-ts_proto v2.7.7 +// protoc v3.12.4 // source: fumarole.proto /* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; import { type CallOptions, - ChannelCredentials, + type ChannelCredentials, Client, - ClientDuplexStream, + type ClientDuplexStream, type ClientOptions, + type ClientReadableStream, type ClientUnaryCall, - handleBidiStreamingCall, + type handleBidiStreamingCall, + type handleServerStreamingCall, type handleUnaryCall, makeGenericClientConstructor, - Metadata, + type Metadata, type ServiceError, type UntypedServiceImplementation, } from "@grpc/grpc-js"; -import Long from "long"; -import _m0 from "protobufjs/minimal"; import { CommitmentLevel, commitmentLevelFromJSON, commitmentLevelToJSON, SubscribeRequestFilterAccounts, + SubscribeRequestFilterBlocksMeta, + SubscribeRequestFilterEntry, SubscribeRequestFilterTransactions, SubscribeUpdate, } from "./geyser"; export const protobufPackage = "fumarole"; -export enum ConsumerGroupType { - STATIC = 0, - UNRECOGNIZED = -1, -} - -export function consumerGroupTypeFromJSON(object: any): ConsumerGroupType { - switch (object) { - case 0: - case "STATIC": - return ConsumerGroupType.STATIC; - case -1: - case "UNRECOGNIZED": - default: - return ConsumerGroupType.UNRECOGNIZED; - } -} - -export function consumerGroupTypeToJSON(object: ConsumerGroupType): string { - switch (object) { - case ConsumerGroupType.STATIC: - return "STATIC"; - case ConsumerGroupType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - export enum InitialOffsetPolicy { - EARLIEST = 0, - LATEST = 1, - SLOT = 2, + LATEST = 0, + FROM_SLOT = 1, UNRECOGNIZED = -1, } export function initialOffsetPolicyFromJSON(object: any): InitialOffsetPolicy { switch (object) { case 0: - case "EARLIEST": - return InitialOffsetPolicy.EARLIEST; - case 1: case "LATEST": return InitialOffsetPolicy.LATEST; - case 2: - case "SLOT": - return InitialOffsetPolicy.SLOT; + case 1: + case "FROM_SLOT": + return InitialOffsetPolicy.FROM_SLOT; case -1: case "UNRECOGNIZED": default: @@ -86,70 +58,53 @@ export function initialOffsetPolicyFromJSON(object: any): InitialOffsetPolicy { export function initialOffsetPolicyToJSON(object: InitialOffsetPolicy): string { switch (object) { - case InitialOffsetPolicy.EARLIEST: - return "EARLIEST"; case InitialOffsetPolicy.LATEST: return "LATEST"; - case InitialOffsetPolicy.SLOT: - return "SLOT"; + case InitialOffsetPolicy.FROM_SLOT: + return "FROM_SLOT"; case InitialOffsetPolicy.UNRECOGNIZED: default: return "UNRECOGNIZED"; } } -export enum EventSubscriptionPolicy { - ACCOUNT_UPDATE_ONLY = 0, - TRANSACTION_ONLY = 1, - BOTH = 2, - UNRECOGNIZED = -1, +export interface GetSlotRangeRequest { + blockchainId: Uint8Array; } -export function eventSubscriptionPolicyFromJSON(object: any): EventSubscriptionPolicy { - switch (object) { - case 0: - case "ACCOUNT_UPDATE_ONLY": - return EventSubscriptionPolicy.ACCOUNT_UPDATE_ONLY; - case 1: - case "TRANSACTION_ONLY": - return EventSubscriptionPolicy.TRANSACTION_ONLY; - case 2: - case "BOTH": - return EventSubscriptionPolicy.BOTH; - case -1: - case "UNRECOGNIZED": - default: - return EventSubscriptionPolicy.UNRECOGNIZED; - } +export interface GetSlotRangeResponse { + blockchainId: Uint8Array; + minSlot: bigint; + maxSlot: bigint; } -export function eventSubscriptionPolicyToJSON(object: EventSubscriptionPolicy): string { - switch (object) { - case EventSubscriptionPolicy.ACCOUNT_UPDATE_ONLY: - return "ACCOUNT_UPDATE_ONLY"; - case EventSubscriptionPolicy.TRANSACTION_ONLY: - return "TRANSACTION_ONLY"; - case EventSubscriptionPolicy.BOTH: - return "BOTH"; - case EventSubscriptionPolicy.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } +export interface GetChainTipRequest { + blockchainId: Uint8Array; +} + +export interface GetChainTipResponse { + blockchainId: Uint8Array; + shardToMaxOffsetMap: { [key: number]: bigint }; +} + +export interface GetChainTipResponse_ShardToMaxOffsetMapEntry { + key: number; + value: bigint; } -export interface ListAvailableCommitmentLevelsRequest { +export interface VersionRequest { } -export interface ListAvailableCommitmentLevelsResponse { - commitmentLevels: CommitmentLevel[]; +export interface VersionResponse { + version: string; } export interface GetConsumerGroupInfoRequest { - consumerGroupLabel: string; + consumerGroupName: string; } export interface DeleteConsumerGroupRequest { - consumerGroupLabel: string; + consumerGroupName: string; } export interface DeleteConsumerGroupResponse { @@ -165,369 +120,561 @@ export interface ListConsumerGroupsResponse { export interface ConsumerGroupInfo { id: string; - consumerGroupLabel: string; - consumerGroupType: ConsumerGroupType; - memberCount: number; - commitmentLevel: CommitmentLevel; - eventSubscriptionPolicy: EventSubscriptionPolicy; + consumerGroupName: string; isStale: boolean; + blockchainId: Uint8Array; } export interface GetSlotLagInfoRequest { - consumerGroupLabel: string; + consumerGroupName: string; } -export interface GetSlotLagInfoResponse { - maxSlotSeen: string; - globalMaxSlot: string; -} - -export interface SubscribeRequest { - consumerGroupLabel: string; - consumerId?: number | undefined; +export interface BlockFilters { accounts: { [key: string]: SubscribeRequestFilterAccounts }; transactions: { [key: string]: SubscribeRequestFilterTransactions }; + entries: { [key: string]: SubscribeRequestFilterEntry }; + blocksMeta: { [key: string]: SubscribeRequestFilterBlocksMeta }; } -export interface SubscribeRequest_AccountsEntry { +export interface BlockFilters_AccountsEntry { key: string; value: SubscribeRequestFilterAccounts | undefined; } -export interface SubscribeRequest_TransactionsEntry { +export interface BlockFilters_TransactionsEntry { key: string; value: SubscribeRequestFilterTransactions | undefined; } -export interface CreateStaticConsumerGroupResponse { - groupId: string; +export interface BlockFilters_EntriesEntry { + key: string; + value: SubscribeRequestFilterEntry | undefined; } -export interface CreateStaticConsumerGroupRequest { - consumerGroupLabel: string; - memberCount?: number | undefined; - initialOffsetPolicy: InitialOffsetPolicy; - commitmentLevel: CommitmentLevel; - eventSubscriptionPolicy: EventSubscriptionPolicy; - atSlot?: string | undefined; +export interface BlockFilters_BlocksMetaEntry { + key: string; + value: SubscribeRequestFilterBlocksMeta | undefined; +} + +export interface DownloadBlockShard { + blockchainId: Uint8Array; + blockUid: Uint8Array; + shardIdx: number; + blockFilters?: BlockFilters | undefined; +} + +export interface Ping { + pingId: number; +} + +export interface Pong { + pingId: number; } -export interface GetOldestSlotRequest { +export interface DataCommand { + downloadBlockShard?: DownloadBlockShard | undefined; + filterUpdate?: BlockFilters | undefined; +} + +export interface BlockShardDownloadFinish { +} + +export interface BlockNotFound { + blockchainId: Uint8Array; + blockUid: Uint8Array; + shardIdx: number; +} + +export interface DataError { + notFound?: BlockNotFound | undefined; +} + +export interface DataResponse { + update?: SubscribeUpdate | undefined; + blockShardDownloadFinish?: BlockShardDownloadFinish | undefined; +} + +export interface CommitOffset { + offset: bigint; + shardId: number; +} + +export interface PollBlockchainHistory { + shardId: number; + from?: bigint | undefined; + limit?: bigint | undefined; +} + +export interface BlockchainEvent { + offset: bigint; + blockchainId: Uint8Array; + blockUid: Uint8Array; + numShards: number; + slot: bigint; + parentSlot?: bigint | undefined; commitmentLevel: CommitmentLevel; + blockchainShardId: number; + deadError?: string | undefined; } -export interface GetOldestSlotResponse { - slot?: string | undefined; +export interface BlockchainHistory { + events: BlockchainEvent[]; } -function createBaseListAvailableCommitmentLevelsRequest(): ListAvailableCommitmentLevelsRequest { - return {}; +export interface JoinControlPlane { + consumerGroupName?: string | undefined; +} + +export interface ControlCommand { + initialJoin?: JoinControlPlane | undefined; + commitOffset?: CommitOffset | undefined; + pollHist?: PollBlockchainHistory | undefined; + ping?: Ping | undefined; +} + +export interface ControlResponse { + init?: InitialConsumerGroupState | undefined; + commitOffset?: CommitOffsetResult | undefined; + pollHist?: BlockchainHistory | undefined; + pong?: Pong | undefined; +} + +export interface CommitOffsetResult { + offset: bigint; + shardId: number; +} + +export interface InitialConsumerGroupState { + blockchainId: Uint8Array; + lastCommittedOffsets: { [key: number]: bigint }; +} + +export interface InitialConsumerGroupState_LastCommittedOffsetsEntry { + key: number; + value: bigint; +} + +export interface CreateConsumerGroupResponse { + consumerGroupId: string; +} + +export interface CreateConsumerGroupRequest { + consumerGroupName: string; + initialOffsetPolicy: InitialOffsetPolicy; + fromSlot?: bigint | undefined; +} + +function createBaseGetSlotRangeRequest(): GetSlotRangeRequest { + return { blockchainId: new Uint8Array(0) }; } -export const ListAvailableCommitmentLevelsRequest = { - encode(_: ListAvailableCommitmentLevelsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const GetSlotRangeRequest: MessageFns = { + encode(message: GetSlotRangeRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockchainId.length !== 0) { + writer.uint32(10).bytes(message.blockchainId); + } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): ListAvailableCommitmentLevelsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListAvailableCommitmentLevelsRequest(); + decode(input: BinaryReader | Uint8Array, length?: number): GetSlotRangeRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetSlotRangeRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.blockchainId = reader.bytes(); + continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(_: any): ListAvailableCommitmentLevelsRequest { - return {}; + fromJSON(object: any): GetSlotRangeRequest { + return { blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0) }; }, - toJSON(_: ListAvailableCommitmentLevelsRequest): unknown { + toJSON(message: GetSlotRangeRequest): unknown { const obj: any = {}; + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); + } return obj; }, - create, I>>( - base?: I, - ): ListAvailableCommitmentLevelsRequest { - return ListAvailableCommitmentLevelsRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): GetSlotRangeRequest { + return GetSlotRangeRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( - _: I, - ): ListAvailableCommitmentLevelsRequest { - const message = createBaseListAvailableCommitmentLevelsRequest(); + fromPartial, I>>(object: I): GetSlotRangeRequest { + const message = createBaseGetSlotRangeRequest(); + message.blockchainId = object.blockchainId ?? new Uint8Array(0); return message; }, }; -function createBaseListAvailableCommitmentLevelsResponse(): ListAvailableCommitmentLevelsResponse { - return { commitmentLevels: [] }; +function createBaseGetSlotRangeResponse(): GetSlotRangeResponse { + return { blockchainId: new Uint8Array(0), minSlot: 0n, maxSlot: 0n }; } -export const ListAvailableCommitmentLevelsResponse = { - encode(message: ListAvailableCommitmentLevelsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - writer.uint32(10).fork(); - for (const v of message.commitmentLevels) { - writer.int32(v); +export const GetSlotRangeResponse: MessageFns = { + encode(message: GetSlotRangeResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockchainId.length !== 0) { + writer.uint32(10).bytes(message.blockchainId); + } + if (message.minSlot !== 0n) { + if (BigInt.asIntN(64, message.minSlot) !== message.minSlot) { + throw new globalThis.Error("value provided for field message.minSlot of type int64 too large"); + } + writer.uint32(16).int64(message.minSlot); + } + if (message.maxSlot !== 0n) { + if (BigInt.asIntN(64, message.maxSlot) !== message.maxSlot) { + throw new globalThis.Error("value provided for field message.maxSlot of type int64 too large"); + } + writer.uint32(24).int64(message.maxSlot); } - writer.ldelim(); return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): ListAvailableCommitmentLevelsResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListAvailableCommitmentLevelsResponse(); + decode(input: BinaryReader | Uint8Array, length?: number): GetSlotRangeResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetSlotRangeResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (tag === 8) { - message.commitmentLevels.push(reader.int32() as any); - - continue; + case 1: { + if (tag !== 10) { + break; } - if (tag === 10) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.commitmentLevels.push(reader.int32() as any); - } + message.blockchainId = reader.bytes(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } - continue; + message.minSlot = reader.int64() as bigint; + continue; + } + case 3: { + if (tag !== 24) { + break; } - break; + message.maxSlot = reader.int64() as bigint; + continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): ListAvailableCommitmentLevelsResponse { + fromJSON(object: any): GetSlotRangeResponse { return { - commitmentLevels: globalThis.Array.isArray(object?.commitmentLevels) - ? object.commitmentLevels.map((e: any) => commitmentLevelFromJSON(e)) - : [], + blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0), + minSlot: isSet(object.minSlot) ? BigInt(object.minSlot) : 0n, + maxSlot: isSet(object.maxSlot) ? BigInt(object.maxSlot) : 0n, }; }, - toJSON(message: ListAvailableCommitmentLevelsResponse): unknown { + toJSON(message: GetSlotRangeResponse): unknown { const obj: any = {}; - if (message.commitmentLevels?.length) { - obj.commitmentLevels = message.commitmentLevels.map((e) => commitmentLevelToJSON(e)); + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); + } + if (message.minSlot !== 0n) { + obj.minSlot = message.minSlot.toString(); + } + if (message.maxSlot !== 0n) { + obj.maxSlot = message.maxSlot.toString(); } return obj; }, - create, I>>( - base?: I, - ): ListAvailableCommitmentLevelsResponse { - return ListAvailableCommitmentLevelsResponse.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): GetSlotRangeResponse { + return GetSlotRangeResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( - object: I, - ): ListAvailableCommitmentLevelsResponse { - const message = createBaseListAvailableCommitmentLevelsResponse(); - message.commitmentLevels = object.commitmentLevels?.map((e) => e) || []; + fromPartial, I>>(object: I): GetSlotRangeResponse { + const message = createBaseGetSlotRangeResponse(); + message.blockchainId = object.blockchainId ?? new Uint8Array(0); + message.minSlot = object.minSlot ?? 0n; + message.maxSlot = object.maxSlot ?? 0n; return message; }, }; -function createBaseGetConsumerGroupInfoRequest(): GetConsumerGroupInfoRequest { - return { consumerGroupLabel: "" }; +function createBaseGetChainTipRequest(): GetChainTipRequest { + return { blockchainId: new Uint8Array(0) }; } -export const GetConsumerGroupInfoRequest = { - encode(message: GetConsumerGroupInfoRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.consumerGroupLabel !== "") { - writer.uint32(10).string(message.consumerGroupLabel); +export const GetChainTipRequest: MessageFns = { + encode(message: GetChainTipRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockchainId.length !== 0) { + writer.uint32(10).bytes(message.blockchainId); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetConsumerGroupInfoRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetConsumerGroupInfoRequest(); + decode(input: BinaryReader | Uint8Array, length?: number): GetChainTipRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetChainTipRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } - message.consumerGroupLabel = reader.string(); + message.blockchainId = reader.bytes(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): GetConsumerGroupInfoRequest { - return { consumerGroupLabel: isSet(object.consumerGroupLabel) ? globalThis.String(object.consumerGroupLabel) : "" }; + fromJSON(object: any): GetChainTipRequest { + return { blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0) }; }, - toJSON(message: GetConsumerGroupInfoRequest): unknown { + toJSON(message: GetChainTipRequest): unknown { const obj: any = {}; - if (message.consumerGroupLabel !== "") { - obj.consumerGroupLabel = message.consumerGroupLabel; + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); } return obj; }, - create, I>>(base?: I): GetConsumerGroupInfoRequest { - return GetConsumerGroupInfoRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): GetChainTipRequest { + return GetChainTipRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): GetConsumerGroupInfoRequest { - const message = createBaseGetConsumerGroupInfoRequest(); - message.consumerGroupLabel = object.consumerGroupLabel ?? ""; + fromPartial, I>>(object: I): GetChainTipRequest { + const message = createBaseGetChainTipRequest(); + message.blockchainId = object.blockchainId ?? new Uint8Array(0); return message; }, }; -function createBaseDeleteConsumerGroupRequest(): DeleteConsumerGroupRequest { - return { consumerGroupLabel: "" }; +function createBaseGetChainTipResponse(): GetChainTipResponse { + return { blockchainId: new Uint8Array(0), shardToMaxOffsetMap: {} }; } -export const DeleteConsumerGroupRequest = { - encode(message: DeleteConsumerGroupRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.consumerGroupLabel !== "") { - writer.uint32(10).string(message.consumerGroupLabel); +export const GetChainTipResponse: MessageFns = { + encode(message: GetChainTipResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockchainId.length !== 0) { + writer.uint32(10).bytes(message.blockchainId); } + Object.entries(message.shardToMaxOffsetMap).forEach(([key, value]) => { + GetChainTipResponse_ShardToMaxOffsetMapEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).join(); + }); return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): DeleteConsumerGroupRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeleteConsumerGroupRequest(); + decode(input: BinaryReader | Uint8Array, length?: number): GetChainTipResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetChainTipResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } - message.consumerGroupLabel = reader.string(); + message.blockchainId = reader.bytes(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + const entry2 = GetChainTipResponse_ShardToMaxOffsetMapEntry.decode(reader, reader.uint32()); + if (entry2.value !== undefined) { + message.shardToMaxOffsetMap[entry2.key] = entry2.value; + } continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): DeleteConsumerGroupRequest { - return { consumerGroupLabel: isSet(object.consumerGroupLabel) ? globalThis.String(object.consumerGroupLabel) : "" }; + fromJSON(object: any): GetChainTipResponse { + return { + blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0), + shardToMaxOffsetMap: isObject(object.shardToMaxOffsetMap) + ? Object.entries(object.shardToMaxOffsetMap).reduce<{ [key: number]: bigint }>((acc, [key, value]) => { + acc[globalThis.Number(key)] = BigInt(value as string | number | bigint | boolean); + return acc; + }, {}) + : {}, + }; }, - toJSON(message: DeleteConsumerGroupRequest): unknown { + toJSON(message: GetChainTipResponse): unknown { const obj: any = {}; - if (message.consumerGroupLabel !== "") { - obj.consumerGroupLabel = message.consumerGroupLabel; + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); + } + if (message.shardToMaxOffsetMap) { + const entries = Object.entries(message.shardToMaxOffsetMap); + if (entries.length > 0) { + obj.shardToMaxOffsetMap = {}; + entries.forEach(([k, v]) => { + obj.shardToMaxOffsetMap[k] = v.toString(); + }); + } } return obj; }, - create, I>>(base?: I): DeleteConsumerGroupRequest { - return DeleteConsumerGroupRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): GetChainTipResponse { + return GetChainTipResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): DeleteConsumerGroupRequest { - const message = createBaseDeleteConsumerGroupRequest(); - message.consumerGroupLabel = object.consumerGroupLabel ?? ""; + fromPartial, I>>(object: I): GetChainTipResponse { + const message = createBaseGetChainTipResponse(); + message.blockchainId = object.blockchainId ?? new Uint8Array(0); + message.shardToMaxOffsetMap = Object.entries(object.shardToMaxOffsetMap ?? {}).reduce<{ [key: number]: bigint }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[globalThis.Number(key)] = BigInt(value as string | number | bigint | boolean); + } + return acc; + }, + {}, + ); return message; }, }; -function createBaseDeleteConsumerGroupResponse(): DeleteConsumerGroupResponse { - return { success: false }; +function createBaseGetChainTipResponse_ShardToMaxOffsetMapEntry(): GetChainTipResponse_ShardToMaxOffsetMapEntry { + return { key: 0, value: 0n }; } -export const DeleteConsumerGroupResponse = { - encode(message: DeleteConsumerGroupResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.success !== false) { - writer.uint32(8).bool(message.success); +export const GetChainTipResponse_ShardToMaxOffsetMapEntry: MessageFns = { + encode( + message: GetChainTipResponse_ShardToMaxOffsetMapEntry, + writer: BinaryWriter = new BinaryWriter(), + ): BinaryWriter { + if (message.key !== 0) { + writer.uint32(8).int32(message.key); + } + if (message.value !== 0n) { + if (BigInt.asIntN(64, message.value) !== message.value) { + throw new globalThis.Error("value provided for field message.value of type int64 too large"); + } + writer.uint32(16).int64(message.value); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): DeleteConsumerGroupResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeleteConsumerGroupResponse(); + decode(input: BinaryReader | Uint8Array, length?: number): GetChainTipResponse_ShardToMaxOffsetMapEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetChainTipResponse_ShardToMaxOffsetMapEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.success = reader.bool(); + message.key = reader.int32(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.value = reader.int64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): DeleteConsumerGroupResponse { - return { success: isSet(object.success) ? globalThis.Boolean(object.success) : false }; + fromJSON(object: any): GetChainTipResponse_ShardToMaxOffsetMapEntry { + return { + key: isSet(object.key) ? globalThis.Number(object.key) : 0, + value: isSet(object.value) ? BigInt(object.value) : 0n, + }; }, - toJSON(message: DeleteConsumerGroupResponse): unknown { + toJSON(message: GetChainTipResponse_ShardToMaxOffsetMapEntry): unknown { const obj: any = {}; - if (message.success !== false) { - obj.success = message.success; + if (message.key !== 0) { + obj.key = Math.round(message.key); + } + if (message.value !== 0n) { + obj.value = message.value.toString(); } return obj; }, - create, I>>(base?: I): DeleteConsumerGroupResponse { - return DeleteConsumerGroupResponse.fromPartial(base ?? ({} as any)); + create, I>>( + base?: I, + ): GetChainTipResponse_ShardToMaxOffsetMapEntry { + return GetChainTipResponse_ShardToMaxOffsetMapEntry.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): DeleteConsumerGroupResponse { - const message = createBaseDeleteConsumerGroupResponse(); - message.success = object.success ?? false; + fromPartial, I>>( + object: I, + ): GetChainTipResponse_ShardToMaxOffsetMapEntry { + const message = createBaseGetChainTipResponse_ShardToMaxOffsetMapEntry(); + message.key = object.key ?? 0; + message.value = object.value ?? 0n; return message; }, }; -function createBaseListConsumerGroupsRequest(): ListConsumerGroupsRequest { +function createBaseVersionRequest(): VersionRequest { return {}; } -export const ListConsumerGroupsRequest = { - encode(_: ListConsumerGroupsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const VersionRequest: MessageFns = { + encode(_: VersionRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): ListConsumerGroupsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListConsumerGroupsRequest(); + decode(input: BinaryReader | Uint8Array, length?: number): VersionRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVersionRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -535,1130 +682,2910 @@ export const ListConsumerGroupsRequest = { if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(_: any): ListConsumerGroupsRequest { + fromJSON(_: any): VersionRequest { return {}; }, - toJSON(_: ListConsumerGroupsRequest): unknown { + toJSON(_: VersionRequest): unknown { const obj: any = {}; return obj; }, - create, I>>(base?: I): ListConsumerGroupsRequest { - return ListConsumerGroupsRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): VersionRequest { + return VersionRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(_: I): ListConsumerGroupsRequest { - const message = createBaseListConsumerGroupsRequest(); + fromPartial, I>>(_: I): VersionRequest { + const message = createBaseVersionRequest(); return message; }, }; -function createBaseListConsumerGroupsResponse(): ListConsumerGroupsResponse { - return { consumerGroups: [] }; +function createBaseVersionResponse(): VersionResponse { + return { version: "" }; } -export const ListConsumerGroupsResponse = { - encode(message: ListConsumerGroupsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.consumerGroups) { - ConsumerGroupInfo.encode(v!, writer.uint32(10).fork()).ldelim(); +export const VersionResponse: MessageFns = { + encode(message: VersionResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.version !== "") { + writer.uint32(10).string(message.version); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): ListConsumerGroupsResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListConsumerGroupsResponse(); + decode(input: BinaryReader | Uint8Array, length?: number): VersionResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVersionResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } - message.consumerGroups.push(ConsumerGroupInfo.decode(reader, reader.uint32())); + message.version = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): ListConsumerGroupsResponse { - return { - consumerGroups: globalThis.Array.isArray(object?.consumerGroups) - ? object.consumerGroups.map((e: any) => ConsumerGroupInfo.fromJSON(e)) - : [], - }; + fromJSON(object: any): VersionResponse { + return { version: isSet(object.version) ? globalThis.String(object.version) : "" }; }, - toJSON(message: ListConsumerGroupsResponse): unknown { + toJSON(message: VersionResponse): unknown { const obj: any = {}; - if (message.consumerGroups?.length) { - obj.consumerGroups = message.consumerGroups.map((e) => ConsumerGroupInfo.toJSON(e)); + if (message.version !== "") { + obj.version = message.version; } return obj; }, - create, I>>(base?: I): ListConsumerGroupsResponse { - return ListConsumerGroupsResponse.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): VersionResponse { + return VersionResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): ListConsumerGroupsResponse { - const message = createBaseListConsumerGroupsResponse(); - message.consumerGroups = object.consumerGroups?.map((e) => ConsumerGroupInfo.fromPartial(e)) || []; + fromPartial, I>>(object: I): VersionResponse { + const message = createBaseVersionResponse(); + message.version = object.version ?? ""; return message; }, }; -function createBaseConsumerGroupInfo(): ConsumerGroupInfo { - return { - id: "", - consumerGroupLabel: "", - consumerGroupType: 0, - memberCount: 0, - commitmentLevel: 0, - eventSubscriptionPolicy: 0, - isStale: false, - }; +function createBaseGetConsumerGroupInfoRequest(): GetConsumerGroupInfoRequest { + return { consumerGroupName: "" }; } -export const ConsumerGroupInfo = { - encode(message: ConsumerGroupInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== "") { - writer.uint32(10).string(message.id); - } - if (message.consumerGroupLabel !== "") { - writer.uint32(18).string(message.consumerGroupLabel); - } - if (message.consumerGroupType !== 0) { - writer.uint32(24).int32(message.consumerGroupType); - } - if (message.memberCount !== 0) { - writer.uint32(32).uint32(message.memberCount); - } - if (message.commitmentLevel !== 0) { - writer.uint32(40).int32(message.commitmentLevel); - } - if (message.eventSubscriptionPolicy !== 0) { - writer.uint32(48).int32(message.eventSubscriptionPolicy); - } - if (message.isStale !== false) { - writer.uint32(56).bool(message.isStale); +export const GetConsumerGroupInfoRequest: MessageFns = { + encode(message: GetConsumerGroupInfoRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.consumerGroupName !== "") { + writer.uint32(10).string(message.consumerGroupName); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): ConsumerGroupInfo { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseConsumerGroupInfo(); + decode(input: BinaryReader | Uint8Array, length?: number): GetConsumerGroupInfoRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetConsumerGroupInfoRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } - message.id = reader.string(); + message.consumerGroupName = reader.string(); continue; - case 2: - if (tag !== 18) { - break; - } + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, - message.consumerGroupLabel = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } + fromJSON(object: any): GetConsumerGroupInfoRequest { + return { consumerGroupName: isSet(object.consumerGroupName) ? globalThis.String(object.consumerGroupName) : "" }; + }, - message.consumerGroupType = reader.int32() as any; - continue; - case 4: - if (tag !== 32) { - break; - } + toJSON(message: GetConsumerGroupInfoRequest): unknown { + const obj: any = {}; + if (message.consumerGroupName !== "") { + obj.consumerGroupName = message.consumerGroupName; + } + return obj; + }, - message.memberCount = reader.uint32(); - continue; - case 5: - if (tag !== 40) { + create, I>>(base?: I): GetConsumerGroupInfoRequest { + return GetConsumerGroupInfoRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GetConsumerGroupInfoRequest { + const message = createBaseGetConsumerGroupInfoRequest(); + message.consumerGroupName = object.consumerGroupName ?? ""; + return message; + }, +}; + +function createBaseDeleteConsumerGroupRequest(): DeleteConsumerGroupRequest { + return { consumerGroupName: "" }; +} + +export const DeleteConsumerGroupRequest: MessageFns = { + encode(message: DeleteConsumerGroupRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.consumerGroupName !== "") { + writer.uint32(10).string(message.consumerGroupName); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DeleteConsumerGroupRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDeleteConsumerGroupRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.consumerGroupName = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DeleteConsumerGroupRequest { + return { consumerGroupName: isSet(object.consumerGroupName) ? globalThis.String(object.consumerGroupName) : "" }; + }, + + toJSON(message: DeleteConsumerGroupRequest): unknown { + const obj: any = {}; + if (message.consumerGroupName !== "") { + obj.consumerGroupName = message.consumerGroupName; + } + return obj; + }, + + create, I>>(base?: I): DeleteConsumerGroupRequest { + return DeleteConsumerGroupRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DeleteConsumerGroupRequest { + const message = createBaseDeleteConsumerGroupRequest(); + message.consumerGroupName = object.consumerGroupName ?? ""; + return message; + }, +}; + +function createBaseDeleteConsumerGroupResponse(): DeleteConsumerGroupResponse { + return { success: false }; +} + +export const DeleteConsumerGroupResponse: MessageFns = { + encode(message: DeleteConsumerGroupResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.success !== false) { + writer.uint32(8).bool(message.success); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DeleteConsumerGroupResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDeleteConsumerGroupResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.success = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DeleteConsumerGroupResponse { + return { success: isSet(object.success) ? globalThis.Boolean(object.success) : false }; + }, + + toJSON(message: DeleteConsumerGroupResponse): unknown { + const obj: any = {}; + if (message.success !== false) { + obj.success = message.success; + } + return obj; + }, + + create, I>>(base?: I): DeleteConsumerGroupResponse { + return DeleteConsumerGroupResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DeleteConsumerGroupResponse { + const message = createBaseDeleteConsumerGroupResponse(); + message.success = object.success ?? false; + return message; + }, +}; + +function createBaseListConsumerGroupsRequest(): ListConsumerGroupsRequest { + return {}; +} + +export const ListConsumerGroupsRequest: MessageFns = { + encode(_: ListConsumerGroupsRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ListConsumerGroupsRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseListConsumerGroupsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(_: any): ListConsumerGroupsRequest { + return {}; + }, + + toJSON(_: ListConsumerGroupsRequest): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): ListConsumerGroupsRequest { + return ListConsumerGroupsRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): ListConsumerGroupsRequest { + const message = createBaseListConsumerGroupsRequest(); + return message; + }, +}; + +function createBaseListConsumerGroupsResponse(): ListConsumerGroupsResponse { + return { consumerGroups: [] }; +} + +export const ListConsumerGroupsResponse: MessageFns = { + encode(message: ListConsumerGroupsResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.consumerGroups) { + ConsumerGroupInfo.encode(v!, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ListConsumerGroupsResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseListConsumerGroupsResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.consumerGroups.push(ConsumerGroupInfo.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ListConsumerGroupsResponse { + return { + consumerGroups: globalThis.Array.isArray(object?.consumerGroups) + ? object.consumerGroups.map((e: any) => ConsumerGroupInfo.fromJSON(e)) + : [], + }; + }, + + toJSON(message: ListConsumerGroupsResponse): unknown { + const obj: any = {}; + if (message.consumerGroups?.length) { + obj.consumerGroups = message.consumerGroups.map((e) => ConsumerGroupInfo.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): ListConsumerGroupsResponse { + return ListConsumerGroupsResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ListConsumerGroupsResponse { + const message = createBaseListConsumerGroupsResponse(); + message.consumerGroups = object.consumerGroups?.map((e) => ConsumerGroupInfo.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseConsumerGroupInfo(): ConsumerGroupInfo { + return { id: "", consumerGroupName: "", isStale: false, blockchainId: new Uint8Array(0) }; +} + +export const ConsumerGroupInfo: MessageFns = { + encode(message: ConsumerGroupInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.id !== "") { + writer.uint32(10).string(message.id); + } + if (message.consumerGroupName !== "") { + writer.uint32(18).string(message.consumerGroupName); + } + if (message.isStale !== false) { + writer.uint32(24).bool(message.isStale); + } + if (message.blockchainId.length !== 0) { + writer.uint32(34).bytes(message.blockchainId); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ConsumerGroupInfo { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseConsumerGroupInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.consumerGroupName = reader.string(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.isStale = reader.bool(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.blockchainId = reader.bytes(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ConsumerGroupInfo { + return { + id: isSet(object.id) ? globalThis.String(object.id) : "", + consumerGroupName: isSet(object.consumerGroupName) ? globalThis.String(object.consumerGroupName) : "", + isStale: isSet(object.isStale) ? globalThis.Boolean(object.isStale) : false, + blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0), + }; + }, + + toJSON(message: ConsumerGroupInfo): unknown { + const obj: any = {}; + if (message.id !== "") { + obj.id = message.id; + } + if (message.consumerGroupName !== "") { + obj.consumerGroupName = message.consumerGroupName; + } + if (message.isStale !== false) { + obj.isStale = message.isStale; + } + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); + } + return obj; + }, + + create, I>>(base?: I): ConsumerGroupInfo { + return ConsumerGroupInfo.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ConsumerGroupInfo { + const message = createBaseConsumerGroupInfo(); + message.id = object.id ?? ""; + message.consumerGroupName = object.consumerGroupName ?? ""; + message.isStale = object.isStale ?? false; + message.blockchainId = object.blockchainId ?? new Uint8Array(0); + return message; + }, +}; + +function createBaseGetSlotLagInfoRequest(): GetSlotLagInfoRequest { + return { consumerGroupName: "" }; +} + +export const GetSlotLagInfoRequest: MessageFns = { + encode(message: GetSlotLagInfoRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.consumerGroupName !== "") { + writer.uint32(10).string(message.consumerGroupName); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GetSlotLagInfoRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetSlotLagInfoRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.consumerGroupName = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetSlotLagInfoRequest { + return { consumerGroupName: isSet(object.consumerGroupName) ? globalThis.String(object.consumerGroupName) : "" }; + }, + + toJSON(message: GetSlotLagInfoRequest): unknown { + const obj: any = {}; + if (message.consumerGroupName !== "") { + obj.consumerGroupName = message.consumerGroupName; + } + return obj; + }, + + create, I>>(base?: I): GetSlotLagInfoRequest { + return GetSlotLagInfoRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GetSlotLagInfoRequest { + const message = createBaseGetSlotLagInfoRequest(); + message.consumerGroupName = object.consumerGroupName ?? ""; + return message; + }, +}; + +function createBaseBlockFilters(): BlockFilters { + return { accounts: {}, transactions: {}, entries: {}, blocksMeta: {} }; +} + +export const BlockFilters: MessageFns = { + encode(message: BlockFilters, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + Object.entries(message.accounts).forEach(([key, value]) => { + BlockFilters_AccountsEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).join(); + }); + Object.entries(message.transactions).forEach(([key, value]) => { + BlockFilters_TransactionsEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).join(); + }); + Object.entries(message.entries).forEach(([key, value]) => { + BlockFilters_EntriesEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).join(); + }); + Object.entries(message.blocksMeta).forEach(([key, value]) => { + BlockFilters_BlocksMetaEntry.encode({ key: key as any, value }, writer.uint32(34).fork()).join(); + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): BlockFilters { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockFilters(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + const entry1 = BlockFilters_AccountsEntry.decode(reader, reader.uint32()); + if (entry1.value !== undefined) { + message.accounts[entry1.key] = entry1.value; + } + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + const entry2 = BlockFilters_TransactionsEntry.decode(reader, reader.uint32()); + if (entry2.value !== undefined) { + message.transactions[entry2.key] = entry2.value; + } + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + const entry3 = BlockFilters_EntriesEntry.decode(reader, reader.uint32()); + if (entry3.value !== undefined) { + message.entries[entry3.key] = entry3.value; + } + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + const entry4 = BlockFilters_BlocksMetaEntry.decode(reader, reader.uint32()); + if (entry4.value !== undefined) { + message.blocksMeta[entry4.key] = entry4.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): BlockFilters { + return { + accounts: isObject(object.accounts) + ? Object.entries(object.accounts).reduce<{ [key: string]: SubscribeRequestFilterAccounts }>( + (acc, [key, value]) => { + acc[key] = SubscribeRequestFilterAccounts.fromJSON(value); + return acc; + }, + {}, + ) + : {}, + transactions: isObject(object.transactions) + ? Object.entries(object.transactions).reduce<{ [key: string]: SubscribeRequestFilterTransactions }>( + (acc, [key, value]) => { + acc[key] = SubscribeRequestFilterTransactions.fromJSON(value); + return acc; + }, + {}, + ) + : {}, + entries: isObject(object.entries) + ? Object.entries(object.entries).reduce<{ [key: string]: SubscribeRequestFilterEntry }>((acc, [key, value]) => { + acc[key] = SubscribeRequestFilterEntry.fromJSON(value); + return acc; + }, {}) + : {}, + blocksMeta: isObject(object.blocksMeta) + ? Object.entries(object.blocksMeta).reduce<{ [key: string]: SubscribeRequestFilterBlocksMeta }>( + (acc, [key, value]) => { + acc[key] = SubscribeRequestFilterBlocksMeta.fromJSON(value); + return acc; + }, + {}, + ) + : {}, + }; + }, + + toJSON(message: BlockFilters): unknown { + const obj: any = {}; + if (message.accounts) { + const entries = Object.entries(message.accounts); + if (entries.length > 0) { + obj.accounts = {}; + entries.forEach(([k, v]) => { + obj.accounts[k] = SubscribeRequestFilterAccounts.toJSON(v); + }); + } + } + if (message.transactions) { + const entries = Object.entries(message.transactions); + if (entries.length > 0) { + obj.transactions = {}; + entries.forEach(([k, v]) => { + obj.transactions[k] = SubscribeRequestFilterTransactions.toJSON(v); + }); + } + } + if (message.entries) { + const entries = Object.entries(message.entries); + if (entries.length > 0) { + obj.entries = {}; + entries.forEach(([k, v]) => { + obj.entries[k] = SubscribeRequestFilterEntry.toJSON(v); + }); + } + } + if (message.blocksMeta) { + const entries = Object.entries(message.blocksMeta); + if (entries.length > 0) { + obj.blocksMeta = {}; + entries.forEach(([k, v]) => { + obj.blocksMeta[k] = SubscribeRequestFilterBlocksMeta.toJSON(v); + }); + } + } + return obj; + }, + + create, I>>(base?: I): BlockFilters { + return BlockFilters.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): BlockFilters { + const message = createBaseBlockFilters(); + message.accounts = Object.entries(object.accounts ?? {}).reduce<{ [key: string]: SubscribeRequestFilterAccounts }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = SubscribeRequestFilterAccounts.fromPartial(value); + } + return acc; + }, + {}, + ); + message.transactions = Object.entries(object.transactions ?? {}).reduce< + { [key: string]: SubscribeRequestFilterTransactions } + >((acc, [key, value]) => { + if (value !== undefined) { + acc[key] = SubscribeRequestFilterTransactions.fromPartial(value); + } + return acc; + }, {}); + message.entries = Object.entries(object.entries ?? {}).reduce<{ [key: string]: SubscribeRequestFilterEntry }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = SubscribeRequestFilterEntry.fromPartial(value); + } + return acc; + }, + {}, + ); + message.blocksMeta = Object.entries(object.blocksMeta ?? {}).reduce< + { [key: string]: SubscribeRequestFilterBlocksMeta } + >((acc, [key, value]) => { + if (value !== undefined) { + acc[key] = SubscribeRequestFilterBlocksMeta.fromPartial(value); + } + return acc; + }, {}); + return message; + }, +}; + +function createBaseBlockFilters_AccountsEntry(): BlockFilters_AccountsEntry { + return { key: "", value: undefined }; +} + +export const BlockFilters_AccountsEntry: MessageFns = { + encode(message: BlockFilters_AccountsEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + SubscribeRequestFilterAccounts.encode(message.value, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): BlockFilters_AccountsEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockFilters_AccountsEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = SubscribeRequestFilterAccounts.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): BlockFilters_AccountsEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? SubscribeRequestFilterAccounts.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: BlockFilters_AccountsEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = SubscribeRequestFilterAccounts.toJSON(message.value); + } + return obj; + }, + + create, I>>(base?: I): BlockFilters_AccountsEntry { + return BlockFilters_AccountsEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): BlockFilters_AccountsEntry { + const message = createBaseBlockFilters_AccountsEntry(); + message.key = object.key ?? ""; + message.value = (object.value !== undefined && object.value !== null) + ? SubscribeRequestFilterAccounts.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseBlockFilters_TransactionsEntry(): BlockFilters_TransactionsEntry { + return { key: "", value: undefined }; +} + +export const BlockFilters_TransactionsEntry: MessageFns = { + encode(message: BlockFilters_TransactionsEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + SubscribeRequestFilterTransactions.encode(message.value, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): BlockFilters_TransactionsEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockFilters_TransactionsEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = SubscribeRequestFilterTransactions.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): BlockFilters_TransactionsEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? SubscribeRequestFilterTransactions.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: BlockFilters_TransactionsEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = SubscribeRequestFilterTransactions.toJSON(message.value); + } + return obj; + }, + + create, I>>(base?: I): BlockFilters_TransactionsEntry { + return BlockFilters_TransactionsEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): BlockFilters_TransactionsEntry { + const message = createBaseBlockFilters_TransactionsEntry(); + message.key = object.key ?? ""; + message.value = (object.value !== undefined && object.value !== null) + ? SubscribeRequestFilterTransactions.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseBlockFilters_EntriesEntry(): BlockFilters_EntriesEntry { + return { key: "", value: undefined }; +} + +export const BlockFilters_EntriesEntry: MessageFns = { + encode(message: BlockFilters_EntriesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + SubscribeRequestFilterEntry.encode(message.value, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): BlockFilters_EntriesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockFilters_EntriesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = SubscribeRequestFilterEntry.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): BlockFilters_EntriesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? SubscribeRequestFilterEntry.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: BlockFilters_EntriesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = SubscribeRequestFilterEntry.toJSON(message.value); + } + return obj; + }, + + create, I>>(base?: I): BlockFilters_EntriesEntry { + return BlockFilters_EntriesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): BlockFilters_EntriesEntry { + const message = createBaseBlockFilters_EntriesEntry(); + message.key = object.key ?? ""; + message.value = (object.value !== undefined && object.value !== null) + ? SubscribeRequestFilterEntry.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseBlockFilters_BlocksMetaEntry(): BlockFilters_BlocksMetaEntry { + return { key: "", value: undefined }; +} + +export const BlockFilters_BlocksMetaEntry: MessageFns = { + encode(message: BlockFilters_BlocksMetaEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + SubscribeRequestFilterBlocksMeta.encode(message.value, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): BlockFilters_BlocksMetaEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockFilters_BlocksMetaEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = SubscribeRequestFilterBlocksMeta.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): BlockFilters_BlocksMetaEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? SubscribeRequestFilterBlocksMeta.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: BlockFilters_BlocksMetaEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = SubscribeRequestFilterBlocksMeta.toJSON(message.value); + } + return obj; + }, + + create, I>>(base?: I): BlockFilters_BlocksMetaEntry { + return BlockFilters_BlocksMetaEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): BlockFilters_BlocksMetaEntry { + const message = createBaseBlockFilters_BlocksMetaEntry(); + message.key = object.key ?? ""; + message.value = (object.value !== undefined && object.value !== null) + ? SubscribeRequestFilterBlocksMeta.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseDownloadBlockShard(): DownloadBlockShard { + return { blockchainId: new Uint8Array(0), blockUid: new Uint8Array(0), shardIdx: 0, blockFilters: undefined }; +} + +export const DownloadBlockShard: MessageFns = { + encode(message: DownloadBlockShard, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockchainId.length !== 0) { + writer.uint32(10).bytes(message.blockchainId); + } + if (message.blockUid.length !== 0) { + writer.uint32(18).bytes(message.blockUid); + } + if (message.shardIdx !== 0) { + writer.uint32(24).int32(message.shardIdx); + } + if (message.blockFilters !== undefined) { + BlockFilters.encode(message.blockFilters, writer.uint32(34).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DownloadBlockShard { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDownloadBlockShard(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.blockchainId = reader.bytes(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.blockUid = reader.bytes(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.shardIdx = reader.int32(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.blockFilters = BlockFilters.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DownloadBlockShard { + return { + blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0), + blockUid: isSet(object.blockUid) ? bytesFromBase64(object.blockUid) : new Uint8Array(0), + shardIdx: isSet(object.shardIdx) ? globalThis.Number(object.shardIdx) : 0, + blockFilters: isSet(object.blockFilters) ? BlockFilters.fromJSON(object.blockFilters) : undefined, + }; + }, + + toJSON(message: DownloadBlockShard): unknown { + const obj: any = {}; + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); + } + if (message.blockUid.length !== 0) { + obj.blockUid = base64FromBytes(message.blockUid); + } + if (message.shardIdx !== 0) { + obj.shardIdx = Math.round(message.shardIdx); + } + if (message.blockFilters !== undefined) { + obj.blockFilters = BlockFilters.toJSON(message.blockFilters); + } + return obj; + }, + + create, I>>(base?: I): DownloadBlockShard { + return DownloadBlockShard.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DownloadBlockShard { + const message = createBaseDownloadBlockShard(); + message.blockchainId = object.blockchainId ?? new Uint8Array(0); + message.blockUid = object.blockUid ?? new Uint8Array(0); + message.shardIdx = object.shardIdx ?? 0; + message.blockFilters = (object.blockFilters !== undefined && object.blockFilters !== null) + ? BlockFilters.fromPartial(object.blockFilters) + : undefined; + return message; + }, +}; + +function createBasePing(): Ping { + return { pingId: 0 }; +} + +export const Ping: MessageFns = { + encode(message: Ping, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.pingId !== 0) { + writer.uint32(8).uint32(message.pingId); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Ping { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePing(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.pingId = reader.uint32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Ping { + return { pingId: isSet(object.pingId) ? globalThis.Number(object.pingId) : 0 }; + }, + + toJSON(message: Ping): unknown { + const obj: any = {}; + if (message.pingId !== 0) { + obj.pingId = Math.round(message.pingId); + } + return obj; + }, + + create, I>>(base?: I): Ping { + return Ping.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Ping { + const message = createBasePing(); + message.pingId = object.pingId ?? 0; + return message; + }, +}; + +function createBasePong(): Pong { + return { pingId: 0 }; +} + +export const Pong: MessageFns = { + encode(message: Pong, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.pingId !== 0) { + writer.uint32(8).uint32(message.pingId); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Pong { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePong(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.pingId = reader.uint32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Pong { + return { pingId: isSet(object.pingId) ? globalThis.Number(object.pingId) : 0 }; + }, + + toJSON(message: Pong): unknown { + const obj: any = {}; + if (message.pingId !== 0) { + obj.pingId = Math.round(message.pingId); + } + return obj; + }, + + create, I>>(base?: I): Pong { + return Pong.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Pong { + const message = createBasePong(); + message.pingId = object.pingId ?? 0; + return message; + }, +}; + +function createBaseDataCommand(): DataCommand { + return { downloadBlockShard: undefined, filterUpdate: undefined }; +} + +export const DataCommand: MessageFns = { + encode(message: DataCommand, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.downloadBlockShard !== undefined) { + DownloadBlockShard.encode(message.downloadBlockShard, writer.uint32(10).fork()).join(); + } + if (message.filterUpdate !== undefined) { + BlockFilters.encode(message.filterUpdate, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DataCommand { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDataCommand(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.downloadBlockShard = DownloadBlockShard.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.filterUpdate = BlockFilters.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DataCommand { + return { + downloadBlockShard: isSet(object.downloadBlockShard) + ? DownloadBlockShard.fromJSON(object.downloadBlockShard) + : undefined, + filterUpdate: isSet(object.filterUpdate) ? BlockFilters.fromJSON(object.filterUpdate) : undefined, + }; + }, + + toJSON(message: DataCommand): unknown { + const obj: any = {}; + if (message.downloadBlockShard !== undefined) { + obj.downloadBlockShard = DownloadBlockShard.toJSON(message.downloadBlockShard); + } + if (message.filterUpdate !== undefined) { + obj.filterUpdate = BlockFilters.toJSON(message.filterUpdate); + } + return obj; + }, + + create, I>>(base?: I): DataCommand { + return DataCommand.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DataCommand { + const message = createBaseDataCommand(); + message.downloadBlockShard = (object.downloadBlockShard !== undefined && object.downloadBlockShard !== null) + ? DownloadBlockShard.fromPartial(object.downloadBlockShard) + : undefined; + message.filterUpdate = (object.filterUpdate !== undefined && object.filterUpdate !== null) + ? BlockFilters.fromPartial(object.filterUpdate) + : undefined; + return message; + }, +}; + +function createBaseBlockShardDownloadFinish(): BlockShardDownloadFinish { + return {}; +} + +export const BlockShardDownloadFinish: MessageFns = { + encode(_: BlockShardDownloadFinish, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): BlockShardDownloadFinish { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockShardDownloadFinish(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(_: any): BlockShardDownloadFinish { + return {}; + }, + + toJSON(_: BlockShardDownloadFinish): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): BlockShardDownloadFinish { + return BlockShardDownloadFinish.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): BlockShardDownloadFinish { + const message = createBaseBlockShardDownloadFinish(); + return message; + }, +}; + +function createBaseBlockNotFound(): BlockNotFound { + return { blockchainId: new Uint8Array(0), blockUid: new Uint8Array(0), shardIdx: 0 }; +} + +export const BlockNotFound: MessageFns = { + encode(message: BlockNotFound, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockchainId.length !== 0) { + writer.uint32(10).bytes(message.blockchainId); + } + if (message.blockUid.length !== 0) { + writer.uint32(18).bytes(message.blockUid); + } + if (message.shardIdx !== 0) { + writer.uint32(24).int32(message.shardIdx); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): BlockNotFound { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockNotFound(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.blockchainId = reader.bytes(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.blockUid = reader.bytes(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.shardIdx = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): BlockNotFound { + return { + blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0), + blockUid: isSet(object.blockUid) ? bytesFromBase64(object.blockUid) : new Uint8Array(0), + shardIdx: isSet(object.shardIdx) ? globalThis.Number(object.shardIdx) : 0, + }; + }, + + toJSON(message: BlockNotFound): unknown { + const obj: any = {}; + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); + } + if (message.blockUid.length !== 0) { + obj.blockUid = base64FromBytes(message.blockUid); + } + if (message.shardIdx !== 0) { + obj.shardIdx = Math.round(message.shardIdx); + } + return obj; + }, + + create, I>>(base?: I): BlockNotFound { + return BlockNotFound.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): BlockNotFound { + const message = createBaseBlockNotFound(); + message.blockchainId = object.blockchainId ?? new Uint8Array(0); + message.blockUid = object.blockUid ?? new Uint8Array(0); + message.shardIdx = object.shardIdx ?? 0; + return message; + }, +}; + +function createBaseDataError(): DataError { + return { notFound: undefined }; +} + +export const DataError: MessageFns = { + encode(message: DataError, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.notFound !== undefined) { + BlockNotFound.encode(message.notFound, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DataError { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDataError(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { break; } - message.commitmentLevel = reader.int32() as any; - continue; - case 6: - if (tag !== 48) { + message.notFound = BlockNotFound.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DataError { + return { notFound: isSet(object.notFound) ? BlockNotFound.fromJSON(object.notFound) : undefined }; + }, + + toJSON(message: DataError): unknown { + const obj: any = {}; + if (message.notFound !== undefined) { + obj.notFound = BlockNotFound.toJSON(message.notFound); + } + return obj; + }, + + create, I>>(base?: I): DataError { + return DataError.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DataError { + const message = createBaseDataError(); + message.notFound = (object.notFound !== undefined && object.notFound !== null) + ? BlockNotFound.fromPartial(object.notFound) + : undefined; + return message; + }, +}; + +function createBaseDataResponse(): DataResponse { + return { update: undefined, blockShardDownloadFinish: undefined }; +} + +export const DataResponse: MessageFns = { + encode(message: DataResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.update !== undefined) { + SubscribeUpdate.encode(message.update, writer.uint32(10).fork()).join(); + } + if (message.blockShardDownloadFinish !== undefined) { + BlockShardDownloadFinish.encode(message.blockShardDownloadFinish, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DataResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDataResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { break; } - message.eventSubscriptionPolicy = reader.int32() as any; + message.update = SubscribeUpdate.decode(reader, reader.uint32()); continue; - case 7: - if (tag !== 56) { + } + case 2: { + if (tag !== 18) { break; } - message.isStale = reader.bool(); + message.blockShardDownloadFinish = BlockShardDownloadFinish.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): ConsumerGroupInfo { + fromJSON(object: any): DataResponse { return { - id: isSet(object.id) ? globalThis.String(object.id) : "", - consumerGroupLabel: isSet(object.consumerGroupLabel) ? globalThis.String(object.consumerGroupLabel) : "", - consumerGroupType: isSet(object.consumerGroupType) ? consumerGroupTypeFromJSON(object.consumerGroupType) : 0, - memberCount: isSet(object.memberCount) ? globalThis.Number(object.memberCount) : 0, - commitmentLevel: isSet(object.commitmentLevel) ? commitmentLevelFromJSON(object.commitmentLevel) : 0, - eventSubscriptionPolicy: isSet(object.eventSubscriptionPolicy) - ? eventSubscriptionPolicyFromJSON(object.eventSubscriptionPolicy) - : 0, - isStale: isSet(object.isStale) ? globalThis.Boolean(object.isStale) : false, + update: isSet(object.update) ? SubscribeUpdate.fromJSON(object.update) : undefined, + blockShardDownloadFinish: isSet(object.blockShardDownloadFinish) + ? BlockShardDownloadFinish.fromJSON(object.blockShardDownloadFinish) + : undefined, }; }, - toJSON(message: ConsumerGroupInfo): unknown { + toJSON(message: DataResponse): unknown { const obj: any = {}; - if (message.id !== "") { - obj.id = message.id; - } - if (message.consumerGroupLabel !== "") { - obj.consumerGroupLabel = message.consumerGroupLabel; - } - if (message.consumerGroupType !== 0) { - obj.consumerGroupType = consumerGroupTypeToJSON(message.consumerGroupType); + if (message.update !== undefined) { + obj.update = SubscribeUpdate.toJSON(message.update); } - if (message.memberCount !== 0) { - obj.memberCount = Math.round(message.memberCount); - } - if (message.commitmentLevel !== 0) { - obj.commitmentLevel = commitmentLevelToJSON(message.commitmentLevel); - } - if (message.eventSubscriptionPolicy !== 0) { - obj.eventSubscriptionPolicy = eventSubscriptionPolicyToJSON(message.eventSubscriptionPolicy); - } - if (message.isStale !== false) { - obj.isStale = message.isStale; + if (message.blockShardDownloadFinish !== undefined) { + obj.blockShardDownloadFinish = BlockShardDownloadFinish.toJSON(message.blockShardDownloadFinish); } return obj; }, - create, I>>(base?: I): ConsumerGroupInfo { - return ConsumerGroupInfo.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): DataResponse { + return DataResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): ConsumerGroupInfo { - const message = createBaseConsumerGroupInfo(); - message.id = object.id ?? ""; - message.consumerGroupLabel = object.consumerGroupLabel ?? ""; - message.consumerGroupType = object.consumerGroupType ?? 0; - message.memberCount = object.memberCount ?? 0; - message.commitmentLevel = object.commitmentLevel ?? 0; - message.eventSubscriptionPolicy = object.eventSubscriptionPolicy ?? 0; - message.isStale = object.isStale ?? false; + fromPartial, I>>(object: I): DataResponse { + const message = createBaseDataResponse(); + message.update = (object.update !== undefined && object.update !== null) + ? SubscribeUpdate.fromPartial(object.update) + : undefined; + message.blockShardDownloadFinish = + (object.blockShardDownloadFinish !== undefined && object.blockShardDownloadFinish !== null) + ? BlockShardDownloadFinish.fromPartial(object.blockShardDownloadFinish) + : undefined; return message; }, }; -function createBaseGetSlotLagInfoRequest(): GetSlotLagInfoRequest { - return { consumerGroupLabel: "" }; +function createBaseCommitOffset(): CommitOffset { + return { offset: 0n, shardId: 0 }; } -export const GetSlotLagInfoRequest = { - encode(message: GetSlotLagInfoRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.consumerGroupLabel !== "") { - writer.uint32(10).string(message.consumerGroupLabel); +export const CommitOffset: MessageFns = { + encode(message: CommitOffset, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.offset !== 0n) { + if (BigInt.asIntN(64, message.offset) !== message.offset) { + throw new globalThis.Error("value provided for field message.offset of type int64 too large"); + } + writer.uint32(8).int64(message.offset); + } + if (message.shardId !== 0) { + writer.uint32(16).int32(message.shardId); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetSlotLagInfoRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetSlotLagInfoRequest(); + decode(input: BinaryReader | Uint8Array, length?: number): CommitOffset { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCommitOffset(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (tag !== 10) { + case 1: { + if (tag !== 8) { + break; + } + + message.offset = reader.int64() as bigint; + continue; + } + case 2: { + if (tag !== 16) { break; } - message.consumerGroupLabel = reader.string(); + message.shardId = reader.int32(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): GetSlotLagInfoRequest { - return { consumerGroupLabel: isSet(object.consumerGroupLabel) ? globalThis.String(object.consumerGroupLabel) : "" }; + fromJSON(object: any): CommitOffset { + return { + offset: isSet(object.offset) ? BigInt(object.offset) : 0n, + shardId: isSet(object.shardId) ? globalThis.Number(object.shardId) : 0, + }; }, - toJSON(message: GetSlotLagInfoRequest): unknown { + toJSON(message: CommitOffset): unknown { const obj: any = {}; - if (message.consumerGroupLabel !== "") { - obj.consumerGroupLabel = message.consumerGroupLabel; + if (message.offset !== 0n) { + obj.offset = message.offset.toString(); + } + if (message.shardId !== 0) { + obj.shardId = Math.round(message.shardId); } return obj; }, - create, I>>(base?: I): GetSlotLagInfoRequest { - return GetSlotLagInfoRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): CommitOffset { + return CommitOffset.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): GetSlotLagInfoRequest { - const message = createBaseGetSlotLagInfoRequest(); - message.consumerGroupLabel = object.consumerGroupLabel ?? ""; + fromPartial, I>>(object: I): CommitOffset { + const message = createBaseCommitOffset(); + message.offset = object.offset ?? 0n; + message.shardId = object.shardId ?? 0; return message; }, }; -function createBaseGetSlotLagInfoResponse(): GetSlotLagInfoResponse { - return { maxSlotSeen: "0", globalMaxSlot: "0" }; +function createBasePollBlockchainHistory(): PollBlockchainHistory { + return { shardId: 0, from: undefined, limit: undefined }; } -export const GetSlotLagInfoResponse = { - encode(message: GetSlotLagInfoResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.maxSlotSeen !== "0") { - writer.uint32(8).uint64(message.maxSlotSeen); +export const PollBlockchainHistory: MessageFns = { + encode(message: PollBlockchainHistory, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.shardId !== 0) { + writer.uint32(8).int32(message.shardId); + } + if (message.from !== undefined) { + if (BigInt.asIntN(64, message.from) !== message.from) { + throw new globalThis.Error("value provided for field message.from of type int64 too large"); + } + writer.uint32(16).int64(message.from); } - if (message.globalMaxSlot !== "0") { - writer.uint32(16).uint64(message.globalMaxSlot); + if (message.limit !== undefined) { + if (BigInt.asIntN(64, message.limit) !== message.limit) { + throw new globalThis.Error("value provided for field message.limit of type int64 too large"); + } + writer.uint32(24).int64(message.limit); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetSlotLagInfoResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetSlotLagInfoResponse(); + decode(input: BinaryReader | Uint8Array, length?: number): PollBlockchainHistory { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePollBlockchainHistory(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.maxSlotSeen = longToString(reader.uint64() as Long); + message.shardId = reader.int32(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.globalMaxSlot = longToString(reader.uint64() as Long); + message.from = reader.int64() as bigint; + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.limit = reader.int64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): GetSlotLagInfoResponse { + fromJSON(object: any): PollBlockchainHistory { return { - maxSlotSeen: isSet(object.maxSlotSeen) ? globalThis.String(object.maxSlotSeen) : "0", - globalMaxSlot: isSet(object.globalMaxSlot) ? globalThis.String(object.globalMaxSlot) : "0", + shardId: isSet(object.shardId) ? globalThis.Number(object.shardId) : 0, + from: isSet(object.from) ? BigInt(object.from) : undefined, + limit: isSet(object.limit) ? BigInt(object.limit) : undefined, }; }, - toJSON(message: GetSlotLagInfoResponse): unknown { + toJSON(message: PollBlockchainHistory): unknown { const obj: any = {}; - if (message.maxSlotSeen !== "0") { - obj.maxSlotSeen = message.maxSlotSeen; + if (message.shardId !== 0) { + obj.shardId = Math.round(message.shardId); } - if (message.globalMaxSlot !== "0") { - obj.globalMaxSlot = message.globalMaxSlot; + if (message.from !== undefined) { + obj.from = message.from.toString(); + } + if (message.limit !== undefined) { + obj.limit = message.limit.toString(); } return obj; }, - create, I>>(base?: I): GetSlotLagInfoResponse { - return GetSlotLagInfoResponse.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): PollBlockchainHistory { + return PollBlockchainHistory.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): GetSlotLagInfoResponse { - const message = createBaseGetSlotLagInfoResponse(); - message.maxSlotSeen = object.maxSlotSeen ?? "0"; - message.globalMaxSlot = object.globalMaxSlot ?? "0"; + fromPartial, I>>(object: I): PollBlockchainHistory { + const message = createBasePollBlockchainHistory(); + message.shardId = object.shardId ?? 0; + message.from = object.from ?? undefined; + message.limit = object.limit ?? undefined; return message; }, }; -function createBaseSubscribeRequest(): SubscribeRequest { - return { consumerGroupLabel: "", consumerId: undefined, accounts: {}, transactions: {} }; +function createBaseBlockchainEvent(): BlockchainEvent { + return { + offset: 0n, + blockchainId: new Uint8Array(0), + blockUid: new Uint8Array(0), + numShards: 0, + slot: 0n, + parentSlot: undefined, + commitmentLevel: 0, + blockchainShardId: 0, + deadError: undefined, + }; } -export const SubscribeRequest = { - encode(message: SubscribeRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.consumerGroupLabel !== "") { - writer.uint32(10).string(message.consumerGroupLabel); +export const BlockchainEvent: MessageFns = { + encode(message: BlockchainEvent, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.offset !== 0n) { + if (BigInt.asIntN(64, message.offset) !== message.offset) { + throw new globalThis.Error("value provided for field message.offset of type int64 too large"); + } + writer.uint32(8).int64(message.offset); } - if (message.consumerId !== undefined) { - writer.uint32(16).uint32(message.consumerId); + if (message.blockchainId.length !== 0) { + writer.uint32(18).bytes(message.blockchainId); + } + if (message.blockUid.length !== 0) { + writer.uint32(26).bytes(message.blockUid); + } + if (message.numShards !== 0) { + writer.uint32(32).uint32(message.numShards); + } + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } + writer.uint32(40).uint64(message.slot); + } + if (message.parentSlot !== undefined) { + if (BigInt.asUintN(64, message.parentSlot) !== message.parentSlot) { + throw new globalThis.Error("value provided for field message.parentSlot of type uint64 too large"); + } + writer.uint32(48).uint64(message.parentSlot); + } + if (message.commitmentLevel !== 0) { + writer.uint32(56).int32(message.commitmentLevel); + } + if (message.blockchainShardId !== 0) { + writer.uint32(64).int32(message.blockchainShardId); + } + if (message.deadError !== undefined) { + writer.uint32(74).string(message.deadError); } - Object.entries(message.accounts).forEach(([key, value]) => { - SubscribeRequest_AccountsEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).ldelim(); - }); - Object.entries(message.transactions).forEach(([key, value]) => { - SubscribeRequest_TransactionsEntry.encode({ key: key as any, value }, writer.uint32(34).fork()).ldelim(); - }); return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribeRequest(); + decode(input: BinaryReader | Uint8Array, length?: number): BlockchainEvent { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockchainEvent(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (tag !== 10) { + case 1: { + if (tag !== 8) { break; } - message.consumerGroupLabel = reader.string(); + message.offset = reader.int64() as bigint; continue; - case 2: - if (tag !== 16) { + } + case 2: { + if (tag !== 18) { break; } - message.consumerId = reader.uint32(); + message.blockchainId = reader.bytes(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } - const entry3 = SubscribeRequest_AccountsEntry.decode(reader, reader.uint32()); - if (entry3.value !== undefined) { - message.accounts[entry3.key] = entry3.value; + message.blockUid = reader.bytes(); + continue; + } + case 4: { + if (tag !== 32) { + break; } + + message.numShards = reader.uint32(); continue; - case 4: - if (tag !== 34) { + } + case 5: { + if (tag !== 40) { break; } - const entry4 = SubscribeRequest_TransactionsEntry.decode(reader, reader.uint32()); - if (entry4.value !== undefined) { - message.transactions[entry4.key] = entry4.value; + message.slot = reader.uint64() as bigint; + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.parentSlot = reader.uint64() as bigint; + continue; + } + case 7: { + if (tag !== 56) { + break; + } + + message.commitmentLevel = reader.int32() as any; + continue; + } + case 8: { + if (tag !== 64) { + break; + } + + message.blockchainShardId = reader.int32(); + continue; + } + case 9: { + if (tag !== 74) { + break; } + + message.deadError = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): SubscribeRequest { + fromJSON(object: any): BlockchainEvent { return { - consumerGroupLabel: isSet(object.consumerGroupLabel) ? globalThis.String(object.consumerGroupLabel) : "", - consumerId: isSet(object.consumerId) ? globalThis.Number(object.consumerId) : undefined, - accounts: isObject(object.accounts) - ? Object.entries(object.accounts).reduce<{ [key: string]: SubscribeRequestFilterAccounts }>( - (acc, [key, value]) => { - acc[key] = SubscribeRequestFilterAccounts.fromJSON(value); - return acc; - }, - {}, - ) - : {}, - transactions: isObject(object.transactions) - ? Object.entries(object.transactions).reduce<{ [key: string]: SubscribeRequestFilterTransactions }>( - (acc, [key, value]) => { - acc[key] = SubscribeRequestFilterTransactions.fromJSON(value); - return acc; - }, - {}, - ) - : {}, + offset: isSet(object.offset) ? BigInt(object.offset) : 0n, + blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0), + blockUid: isSet(object.blockUid) ? bytesFromBase64(object.blockUid) : new Uint8Array(0), + numShards: isSet(object.numShards) ? globalThis.Number(object.numShards) : 0, + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, + parentSlot: isSet(object.parentSlot) ? BigInt(object.parentSlot) : undefined, + commitmentLevel: isSet(object.commitmentLevel) ? commitmentLevelFromJSON(object.commitmentLevel) : 0, + blockchainShardId: isSet(object.blockchainShardId) ? globalThis.Number(object.blockchainShardId) : 0, + deadError: isSet(object.deadError) ? globalThis.String(object.deadError) : undefined, }; }, - toJSON(message: SubscribeRequest): unknown { + toJSON(message: BlockchainEvent): unknown { const obj: any = {}; - if (message.consumerGroupLabel !== "") { - obj.consumerGroupLabel = message.consumerGroupLabel; + if (message.offset !== 0n) { + obj.offset = message.offset.toString(); } - if (message.consumerId !== undefined) { - obj.consumerId = Math.round(message.consumerId); + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); } - if (message.accounts) { - const entries = Object.entries(message.accounts); - if (entries.length > 0) { - obj.accounts = {}; - entries.forEach(([k, v]) => { - obj.accounts[k] = SubscribeRequestFilterAccounts.toJSON(v); - }); - } + if (message.blockUid.length !== 0) { + obj.blockUid = base64FromBytes(message.blockUid); } - if (message.transactions) { - const entries = Object.entries(message.transactions); - if (entries.length > 0) { - obj.transactions = {}; - entries.forEach(([k, v]) => { - obj.transactions[k] = SubscribeRequestFilterTransactions.toJSON(v); - }); + if (message.numShards !== 0) { + obj.numShards = Math.round(message.numShards); + } + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); + } + if (message.parentSlot !== undefined) { + obj.parentSlot = message.parentSlot.toString(); + } + if (message.commitmentLevel !== 0) { + obj.commitmentLevel = commitmentLevelToJSON(message.commitmentLevel); + } + if (message.blockchainShardId !== 0) { + obj.blockchainShardId = Math.round(message.blockchainShardId); + } + if (message.deadError !== undefined) { + obj.deadError = message.deadError; + } + return obj; + }, + + create, I>>(base?: I): BlockchainEvent { + return BlockchainEvent.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): BlockchainEvent { + const message = createBaseBlockchainEvent(); + message.offset = object.offset ?? 0n; + message.blockchainId = object.blockchainId ?? new Uint8Array(0); + message.blockUid = object.blockUid ?? new Uint8Array(0); + message.numShards = object.numShards ?? 0; + message.slot = object.slot ?? 0n; + message.parentSlot = object.parentSlot ?? undefined; + message.commitmentLevel = object.commitmentLevel ?? 0; + message.blockchainShardId = object.blockchainShardId ?? 0; + message.deadError = object.deadError ?? undefined; + return message; + }, +}; + +function createBaseBlockchainHistory(): BlockchainHistory { + return { events: [] }; +} + +export const BlockchainHistory: MessageFns = { + encode(message: BlockchainHistory, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.events) { + BlockchainEvent.encode(v!, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): BlockchainHistory { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBlockchainHistory(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.events.push(BlockchainEvent.decode(reader, reader.uint32())); + continue; + } } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): BlockchainHistory { + return { + events: globalThis.Array.isArray(object?.events) + ? object.events.map((e: any) => BlockchainEvent.fromJSON(e)) + : [], + }; + }, + + toJSON(message: BlockchainHistory): unknown { + const obj: any = {}; + if (message.events?.length) { + obj.events = message.events.map((e) => BlockchainEvent.toJSON(e)); } return obj; }, - create, I>>(base?: I): SubscribeRequest { - return SubscribeRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): BlockchainHistory { + return BlockchainHistory.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): SubscribeRequest { - const message = createBaseSubscribeRequest(); - message.consumerGroupLabel = object.consumerGroupLabel ?? ""; - message.consumerId = object.consumerId ?? undefined; - message.accounts = Object.entries(object.accounts ?? {}).reduce<{ [key: string]: SubscribeRequestFilterAccounts }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = SubscribeRequestFilterAccounts.fromPartial(value); + fromPartial, I>>(object: I): BlockchainHistory { + const message = createBaseBlockchainHistory(); + message.events = object.events?.map((e) => BlockchainEvent.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseJoinControlPlane(): JoinControlPlane { + return { consumerGroupName: undefined }; +} + +export const JoinControlPlane: MessageFns = { + encode(message: JoinControlPlane, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.consumerGroupName !== undefined) { + writer.uint32(10).string(message.consumerGroupName); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): JoinControlPlane { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseJoinControlPlane(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.consumerGroupName = reader.string(); + continue; } - return acc; - }, - {}, - ); - message.transactions = Object.entries(object.transactions ?? {}).reduce< - { [key: string]: SubscribeRequestFilterTransactions } - >((acc, [key, value]) => { - if (value !== undefined) { - acc[key] = SubscribeRequestFilterTransactions.fromPartial(value); } - return acc; - }, {}); + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): JoinControlPlane { + return { + consumerGroupName: isSet(object.consumerGroupName) ? globalThis.String(object.consumerGroupName) : undefined, + }; + }, + + toJSON(message: JoinControlPlane): unknown { + const obj: any = {}; + if (message.consumerGroupName !== undefined) { + obj.consumerGroupName = message.consumerGroupName; + } + return obj; + }, + + create, I>>(base?: I): JoinControlPlane { + return JoinControlPlane.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): JoinControlPlane { + const message = createBaseJoinControlPlane(); + message.consumerGroupName = object.consumerGroupName ?? undefined; return message; }, }; -function createBaseSubscribeRequest_AccountsEntry(): SubscribeRequest_AccountsEntry { - return { key: "", value: undefined }; +function createBaseControlCommand(): ControlCommand { + return { initialJoin: undefined, commitOffset: undefined, pollHist: undefined, ping: undefined }; } -export const SubscribeRequest_AccountsEntry = { - encode(message: SubscribeRequest_AccountsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); +export const ControlCommand: MessageFns = { + encode(message: ControlCommand, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.initialJoin !== undefined) { + JoinControlPlane.encode(message.initialJoin, writer.uint32(10).fork()).join(); } - if (message.value !== undefined) { - SubscribeRequestFilterAccounts.encode(message.value, writer.uint32(18).fork()).ldelim(); + if (message.commitOffset !== undefined) { + CommitOffset.encode(message.commitOffset, writer.uint32(18).fork()).join(); + } + if (message.pollHist !== undefined) { + PollBlockchainHistory.encode(message.pollHist, writer.uint32(26).fork()).join(); + } + if (message.ping !== undefined) { + Ping.encode(message.ping, writer.uint32(34).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_AccountsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribeRequest_AccountsEntry(); + decode(input: BinaryReader | Uint8Array, length?: number): ControlCommand { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseControlCommand(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } - message.key = reader.string(); + message.initialJoin = JoinControlPlane.decode(reader, reader.uint32()); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } - message.value = SubscribeRequestFilterAccounts.decode(reader, reader.uint32()); + message.commitOffset = CommitOffset.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.pollHist = PollBlockchainHistory.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.ping = Ping.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): SubscribeRequest_AccountsEntry { + fromJSON(object: any): ControlCommand { return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? SubscribeRequestFilterAccounts.fromJSON(object.value) : undefined, + initialJoin: isSet(object.initialJoin) ? JoinControlPlane.fromJSON(object.initialJoin) : undefined, + commitOffset: isSet(object.commitOffset) ? CommitOffset.fromJSON(object.commitOffset) : undefined, + pollHist: isSet(object.pollHist) ? PollBlockchainHistory.fromJSON(object.pollHist) : undefined, + ping: isSet(object.ping) ? Ping.fromJSON(object.ping) : undefined, }; }, - toJSON(message: SubscribeRequest_AccountsEntry): unknown { + toJSON(message: ControlCommand): unknown { const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; + if (message.initialJoin !== undefined) { + obj.initialJoin = JoinControlPlane.toJSON(message.initialJoin); } - if (message.value !== undefined) { - obj.value = SubscribeRequestFilterAccounts.toJSON(message.value); + if (message.commitOffset !== undefined) { + obj.commitOffset = CommitOffset.toJSON(message.commitOffset); + } + if (message.pollHist !== undefined) { + obj.pollHist = PollBlockchainHistory.toJSON(message.pollHist); + } + if (message.ping !== undefined) { + obj.ping = Ping.toJSON(message.ping); } return obj; }, - create, I>>(base?: I): SubscribeRequest_AccountsEntry { - return SubscribeRequest_AccountsEntry.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): ControlCommand { + return ControlCommand.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( - object: I, - ): SubscribeRequest_AccountsEntry { - const message = createBaseSubscribeRequest_AccountsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? SubscribeRequestFilterAccounts.fromPartial(object.value) + fromPartial, I>>(object: I): ControlCommand { + const message = createBaseControlCommand(); + message.initialJoin = (object.initialJoin !== undefined && object.initialJoin !== null) + ? JoinControlPlane.fromPartial(object.initialJoin) + : undefined; + message.commitOffset = (object.commitOffset !== undefined && object.commitOffset !== null) + ? CommitOffset.fromPartial(object.commitOffset) : undefined; + message.pollHist = (object.pollHist !== undefined && object.pollHist !== null) + ? PollBlockchainHistory.fromPartial(object.pollHist) + : undefined; + message.ping = (object.ping !== undefined && object.ping !== null) ? Ping.fromPartial(object.ping) : undefined; return message; }, }; -function createBaseSubscribeRequest_TransactionsEntry(): SubscribeRequest_TransactionsEntry { - return { key: "", value: undefined }; +function createBaseControlResponse(): ControlResponse { + return { init: undefined, commitOffset: undefined, pollHist: undefined, pong: undefined }; } -export const SubscribeRequest_TransactionsEntry = { - encode(message: SubscribeRequest_TransactionsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); +export const ControlResponse: MessageFns = { + encode(message: ControlResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.init !== undefined) { + InitialConsumerGroupState.encode(message.init, writer.uint32(10).fork()).join(); } - if (message.value !== undefined) { - SubscribeRequestFilterTransactions.encode(message.value, writer.uint32(18).fork()).ldelim(); + if (message.commitOffset !== undefined) { + CommitOffsetResult.encode(message.commitOffset, writer.uint32(18).fork()).join(); + } + if (message.pollHist !== undefined) { + BlockchainHistory.encode(message.pollHist, writer.uint32(26).fork()).join(); + } + if (message.pong !== undefined) { + Pong.encode(message.pong, writer.uint32(34).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_TransactionsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribeRequest_TransactionsEntry(); + decode(input: BinaryReader | Uint8Array, length?: number): ControlResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseControlResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } - message.key = reader.string(); + message.init = InitialConsumerGroupState.decode(reader, reader.uint32()); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } - message.value = SubscribeRequestFilterTransactions.decode(reader, reader.uint32()); + message.commitOffset = CommitOffsetResult.decode(reader, reader.uint32()); continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.pollHist = BlockchainHistory.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.pong = Pong.decode(reader, reader.uint32()); + continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): SubscribeRequest_TransactionsEntry { + fromJSON(object: any): ControlResponse { return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? SubscribeRequestFilterTransactions.fromJSON(object.value) : undefined, + init: isSet(object.init) ? InitialConsumerGroupState.fromJSON(object.init) : undefined, + commitOffset: isSet(object.commitOffset) ? CommitOffsetResult.fromJSON(object.commitOffset) : undefined, + pollHist: isSet(object.pollHist) ? BlockchainHistory.fromJSON(object.pollHist) : undefined, + pong: isSet(object.pong) ? Pong.fromJSON(object.pong) : undefined, }; }, - toJSON(message: SubscribeRequest_TransactionsEntry): unknown { + toJSON(message: ControlResponse): unknown { const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; + if (message.init !== undefined) { + obj.init = InitialConsumerGroupState.toJSON(message.init); } - if (message.value !== undefined) { - obj.value = SubscribeRequestFilterTransactions.toJSON(message.value); + if (message.commitOffset !== undefined) { + obj.commitOffset = CommitOffsetResult.toJSON(message.commitOffset); + } + if (message.pollHist !== undefined) { + obj.pollHist = BlockchainHistory.toJSON(message.pollHist); + } + if (message.pong !== undefined) { + obj.pong = Pong.toJSON(message.pong); } return obj; }, - create, I>>( - base?: I, - ): SubscribeRequest_TransactionsEntry { - return SubscribeRequest_TransactionsEntry.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): ControlResponse { + return ControlResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( - object: I, - ): SubscribeRequest_TransactionsEntry { - const message = createBaseSubscribeRequest_TransactionsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? SubscribeRequestFilterTransactions.fromPartial(object.value) + fromPartial, I>>(object: I): ControlResponse { + const message = createBaseControlResponse(); + message.init = (object.init !== undefined && object.init !== null) + ? InitialConsumerGroupState.fromPartial(object.init) + : undefined; + message.commitOffset = (object.commitOffset !== undefined && object.commitOffset !== null) + ? CommitOffsetResult.fromPartial(object.commitOffset) + : undefined; + message.pollHist = (object.pollHist !== undefined && object.pollHist !== null) + ? BlockchainHistory.fromPartial(object.pollHist) : undefined; + message.pong = (object.pong !== undefined && object.pong !== null) ? Pong.fromPartial(object.pong) : undefined; return message; }, }; -function createBaseCreateStaticConsumerGroupResponse(): CreateStaticConsumerGroupResponse { - return { groupId: "" }; +function createBaseCommitOffsetResult(): CommitOffsetResult { + return { offset: 0n, shardId: 0 }; } -export const CreateStaticConsumerGroupResponse = { - encode(message: CreateStaticConsumerGroupResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.groupId !== "") { - writer.uint32(10).string(message.groupId); +export const CommitOffsetResult: MessageFns = { + encode(message: CommitOffsetResult, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.offset !== 0n) { + if (BigInt.asIntN(64, message.offset) !== message.offset) { + throw new globalThis.Error("value provided for field message.offset of type int64 too large"); + } + writer.uint32(8).int64(message.offset); + } + if (message.shardId !== 0) { + writer.uint32(16).int32(message.shardId); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): CreateStaticConsumerGroupResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCreateStaticConsumerGroupResponse(); + decode(input: BinaryReader | Uint8Array, length?: number): CommitOffsetResult { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCommitOffsetResult(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (tag !== 10) { + case 1: { + if (tag !== 8) { break; } - message.groupId = reader.string(); + message.offset = reader.int64() as bigint; continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.shardId = reader.int32(); + continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): CreateStaticConsumerGroupResponse { - return { groupId: isSet(object.groupId) ? globalThis.String(object.groupId) : "" }; + fromJSON(object: any): CommitOffsetResult { + return { + offset: isSet(object.offset) ? BigInt(object.offset) : 0n, + shardId: isSet(object.shardId) ? globalThis.Number(object.shardId) : 0, + }; }, - toJSON(message: CreateStaticConsumerGroupResponse): unknown { + toJSON(message: CommitOffsetResult): unknown { const obj: any = {}; - if (message.groupId !== "") { - obj.groupId = message.groupId; + if (message.offset !== 0n) { + obj.offset = message.offset.toString(); + } + if (message.shardId !== 0) { + obj.shardId = Math.round(message.shardId); } return obj; }, - create, I>>( - base?: I, - ): CreateStaticConsumerGroupResponse { - return CreateStaticConsumerGroupResponse.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): CommitOffsetResult { + return CommitOffsetResult.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( - object: I, - ): CreateStaticConsumerGroupResponse { - const message = createBaseCreateStaticConsumerGroupResponse(); - message.groupId = object.groupId ?? ""; + fromPartial, I>>(object: I): CommitOffsetResult { + const message = createBaseCommitOffsetResult(); + message.offset = object.offset ?? 0n; + message.shardId = object.shardId ?? 0; return message; }, }; -function createBaseCreateStaticConsumerGroupRequest(): CreateStaticConsumerGroupRequest { - return { - consumerGroupLabel: "", - memberCount: undefined, - initialOffsetPolicy: 0, - commitmentLevel: 0, - eventSubscriptionPolicy: 0, - atSlot: undefined, - }; +function createBaseInitialConsumerGroupState(): InitialConsumerGroupState { + return { blockchainId: new Uint8Array(0), lastCommittedOffsets: {} }; } -export const CreateStaticConsumerGroupRequest = { - encode(message: CreateStaticConsumerGroupRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.consumerGroupLabel !== "") { - writer.uint32(10).string(message.consumerGroupLabel); - } - if (message.memberCount !== undefined) { - writer.uint32(16).uint32(message.memberCount); - } - if (message.initialOffsetPolicy !== 0) { - writer.uint32(24).int32(message.initialOffsetPolicy); - } - if (message.commitmentLevel !== 0) { - writer.uint32(32).int32(message.commitmentLevel); - } - if (message.eventSubscriptionPolicy !== 0) { - writer.uint32(40).int32(message.eventSubscriptionPolicy); - } - if (message.atSlot !== undefined) { - writer.uint32(48).int64(message.atSlot); +export const InitialConsumerGroupState: MessageFns = { + encode(message: InitialConsumerGroupState, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockchainId.length !== 0) { + writer.uint32(10).bytes(message.blockchainId); } + Object.entries(message.lastCommittedOffsets).forEach(([key, value]) => { + InitialConsumerGroupState_LastCommittedOffsetsEntry.encode({ key: key as any, value }, writer.uint32(18).fork()) + .join(); + }); return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): CreateStaticConsumerGroupRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCreateStaticConsumerGroupRequest(); + decode(input: BinaryReader | Uint8Array, length?: number): InitialConsumerGroupState { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseInitialConsumerGroupState(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } - message.consumerGroupLabel = reader.string(); + message.blockchainId = reader.bytes(); continue; - case 2: - if (tag !== 16) { + } + case 2: { + if (tag !== 18) { break; } - message.memberCount = reader.uint32(); - continue; - case 3: - if (tag !== 24) { - break; + const entry2 = InitialConsumerGroupState_LastCommittedOffsetsEntry.decode(reader, reader.uint32()); + if (entry2.value !== undefined) { + message.lastCommittedOffsets[entry2.key] = entry2.value; } - - message.initialOffsetPolicy = reader.int32() as any; continue; - case 4: - if (tag !== 32) { - break; - } + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, - message.commitmentLevel = reader.int32() as any; - continue; - case 5: - if (tag !== 40) { + fromJSON(object: any): InitialConsumerGroupState { + return { + blockchainId: isSet(object.blockchainId) ? bytesFromBase64(object.blockchainId) : new Uint8Array(0), + lastCommittedOffsets: isObject(object.lastCommittedOffsets) + ? Object.entries(object.lastCommittedOffsets).reduce<{ [key: number]: bigint }>((acc, [key, value]) => { + acc[globalThis.Number(key)] = BigInt(value as string | number | bigint | boolean); + return acc; + }, {}) + : {}, + }; + }, + + toJSON(message: InitialConsumerGroupState): unknown { + const obj: any = {}; + if (message.blockchainId.length !== 0) { + obj.blockchainId = base64FromBytes(message.blockchainId); + } + if (message.lastCommittedOffsets) { + const entries = Object.entries(message.lastCommittedOffsets); + if (entries.length > 0) { + obj.lastCommittedOffsets = {}; + entries.forEach(([k, v]) => { + obj.lastCommittedOffsets[k] = v.toString(); + }); + } + } + return obj; + }, + + create, I>>(base?: I): InitialConsumerGroupState { + return InitialConsumerGroupState.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): InitialConsumerGroupState { + const message = createBaseInitialConsumerGroupState(); + message.blockchainId = object.blockchainId ?? new Uint8Array(0); + message.lastCommittedOffsets = Object.entries(object.lastCommittedOffsets ?? {}).reduce<{ [key: number]: bigint }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[globalThis.Number(key)] = BigInt(value as string | number | bigint | boolean); + } + return acc; + }, + {}, + ); + return message; + }, +}; + +function createBaseInitialConsumerGroupState_LastCommittedOffsetsEntry(): InitialConsumerGroupState_LastCommittedOffsetsEntry { + return { key: 0, value: 0n }; +} + +export const InitialConsumerGroupState_LastCommittedOffsetsEntry: MessageFns< + InitialConsumerGroupState_LastCommittedOffsetsEntry +> = { + encode( + message: InitialConsumerGroupState_LastCommittedOffsetsEntry, + writer: BinaryWriter = new BinaryWriter(), + ): BinaryWriter { + if (message.key !== 0) { + writer.uint32(8).int32(message.key); + } + if (message.value !== 0n) { + if (BigInt.asIntN(64, message.value) !== message.value) { + throw new globalThis.Error("value provided for field message.value of type int64 too large"); + } + writer.uint32(16).int64(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): InitialConsumerGroupState_LastCommittedOffsetsEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseInitialConsumerGroupState_LastCommittedOffsetsEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { break; } - message.eventSubscriptionPolicy = reader.int32() as any; + message.key = reader.int32(); continue; - case 6: - if (tag !== 48) { + } + case 2: { + if (tag !== 16) { break; } - message.atSlot = longToString(reader.int64() as Long); + message.value = reader.int64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): CreateStaticConsumerGroupRequest { + fromJSON(object: any): InitialConsumerGroupState_LastCommittedOffsetsEntry { return { - consumerGroupLabel: isSet(object.consumerGroupLabel) ? globalThis.String(object.consumerGroupLabel) : "", - memberCount: isSet(object.memberCount) ? globalThis.Number(object.memberCount) : undefined, - initialOffsetPolicy: isSet(object.initialOffsetPolicy) - ? initialOffsetPolicyFromJSON(object.initialOffsetPolicy) - : 0, - commitmentLevel: isSet(object.commitmentLevel) ? commitmentLevelFromJSON(object.commitmentLevel) : 0, - eventSubscriptionPolicy: isSet(object.eventSubscriptionPolicy) - ? eventSubscriptionPolicyFromJSON(object.eventSubscriptionPolicy) - : 0, - atSlot: isSet(object.atSlot) ? globalThis.String(object.atSlot) : undefined, + key: isSet(object.key) ? globalThis.Number(object.key) : 0, + value: isSet(object.value) ? BigInt(object.value) : 0n, }; }, - toJSON(message: CreateStaticConsumerGroupRequest): unknown { + toJSON(message: InitialConsumerGroupState_LastCommittedOffsetsEntry): unknown { const obj: any = {}; - if (message.consumerGroupLabel !== "") { - obj.consumerGroupLabel = message.consumerGroupLabel; - } - if (message.memberCount !== undefined) { - obj.memberCount = Math.round(message.memberCount); - } - if (message.initialOffsetPolicy !== 0) { - obj.initialOffsetPolicy = initialOffsetPolicyToJSON(message.initialOffsetPolicy); + if (message.key !== 0) { + obj.key = Math.round(message.key); } - if (message.commitmentLevel !== 0) { - obj.commitmentLevel = commitmentLevelToJSON(message.commitmentLevel); - } - if (message.eventSubscriptionPolicy !== 0) { - obj.eventSubscriptionPolicy = eventSubscriptionPolicyToJSON(message.eventSubscriptionPolicy); - } - if (message.atSlot !== undefined) { - obj.atSlot = message.atSlot; + if (message.value !== 0n) { + obj.value = message.value.toString(); } return obj; }, - create, I>>( + create, I>>( base?: I, - ): CreateStaticConsumerGroupRequest { - return CreateStaticConsumerGroupRequest.fromPartial(base ?? ({} as any)); + ): InitialConsumerGroupState_LastCommittedOffsetsEntry { + return InitialConsumerGroupState_LastCommittedOffsetsEntry.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( + fromPartial, I>>( object: I, - ): CreateStaticConsumerGroupRequest { - const message = createBaseCreateStaticConsumerGroupRequest(); - message.consumerGroupLabel = object.consumerGroupLabel ?? ""; - message.memberCount = object.memberCount ?? undefined; - message.initialOffsetPolicy = object.initialOffsetPolicy ?? 0; - message.commitmentLevel = object.commitmentLevel ?? 0; - message.eventSubscriptionPolicy = object.eventSubscriptionPolicy ?? 0; - message.atSlot = object.atSlot ?? undefined; + ): InitialConsumerGroupState_LastCommittedOffsetsEntry { + const message = createBaseInitialConsumerGroupState_LastCommittedOffsetsEntry(); + message.key = object.key ?? 0; + message.value = object.value ?? 0n; return message; }, }; -function createBaseGetOldestSlotRequest(): GetOldestSlotRequest { - return { commitmentLevel: 0 }; +function createBaseCreateConsumerGroupResponse(): CreateConsumerGroupResponse { + return { consumerGroupId: "" }; } -export const GetOldestSlotRequest = { - encode(message: GetOldestSlotRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.commitmentLevel !== 0) { - writer.uint32(8).int32(message.commitmentLevel); +export const CreateConsumerGroupResponse: MessageFns = { + encode(message: CreateConsumerGroupResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.consumerGroupId !== "") { + writer.uint32(10).string(message.consumerGroupId); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetOldestSlotRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetOldestSlotRequest(); + decode(input: BinaryReader | Uint8Array, length?: number): CreateConsumerGroupResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCreateConsumerGroupResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (tag !== 8) { + case 1: { + if (tag !== 10) { break; } - message.commitmentLevel = reader.int32() as any; + message.consumerGroupId = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): GetOldestSlotRequest { - return { commitmentLevel: isSet(object.commitmentLevel) ? commitmentLevelFromJSON(object.commitmentLevel) : 0 }; + fromJSON(object: any): CreateConsumerGroupResponse { + return { consumerGroupId: isSet(object.consumerGroupId) ? globalThis.String(object.consumerGroupId) : "" }; }, - toJSON(message: GetOldestSlotRequest): unknown { + toJSON(message: CreateConsumerGroupResponse): unknown { const obj: any = {}; - if (message.commitmentLevel !== 0) { - obj.commitmentLevel = commitmentLevelToJSON(message.commitmentLevel); + if (message.consumerGroupId !== "") { + obj.consumerGroupId = message.consumerGroupId; } return obj; }, - create, I>>(base?: I): GetOldestSlotRequest { - return GetOldestSlotRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): CreateConsumerGroupResponse { + return CreateConsumerGroupResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): GetOldestSlotRequest { - const message = createBaseGetOldestSlotRequest(); - message.commitmentLevel = object.commitmentLevel ?? 0; + fromPartial, I>>(object: I): CreateConsumerGroupResponse { + const message = createBaseCreateConsumerGroupResponse(); + message.consumerGroupId = object.consumerGroupId ?? ""; return message; }, }; -function createBaseGetOldestSlotResponse(): GetOldestSlotResponse { - return { slot: undefined }; +function createBaseCreateConsumerGroupRequest(): CreateConsumerGroupRequest { + return { consumerGroupName: "", initialOffsetPolicy: 0, fromSlot: undefined }; } -export const GetOldestSlotResponse = { - encode(message: GetOldestSlotResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== undefined) { - writer.uint32(8).uint64(message.slot); +export const CreateConsumerGroupRequest: MessageFns = { + encode(message: CreateConsumerGroupRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.consumerGroupName !== "") { + writer.uint32(10).string(message.consumerGroupName); + } + if (message.initialOffsetPolicy !== 0) { + writer.uint32(16).int32(message.initialOffsetPolicy); + } + if (message.fromSlot !== undefined) { + if (BigInt.asUintN(64, message.fromSlot) !== message.fromSlot) { + throw new globalThis.Error("value provided for field message.fromSlot of type uint64 too large"); + } + writer.uint32(24).uint64(message.fromSlot); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetOldestSlotResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetOldestSlotResponse(); + decode(input: BinaryReader | Uint8Array, length?: number): CreateConsumerGroupRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCreateConsumerGroupRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (tag !== 8) { + case 1: { + if (tag !== 10) { + break; + } + + message.consumerGroupName = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.initialOffsetPolicy = reader.int32() as any; + continue; + } + case 3: { + if (tag !== 24) { break; } - message.slot = longToString(reader.uint64() as Long); + message.fromSlot = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, - fromJSON(object: any): GetOldestSlotResponse { - return { slot: isSet(object.slot) ? globalThis.String(object.slot) : undefined }; + fromJSON(object: any): CreateConsumerGroupRequest { + return { + consumerGroupName: isSet(object.consumerGroupName) ? globalThis.String(object.consumerGroupName) : "", + initialOffsetPolicy: isSet(object.initialOffsetPolicy) + ? initialOffsetPolicyFromJSON(object.initialOffsetPolicy) + : 0, + fromSlot: isSet(object.fromSlot) ? BigInt(object.fromSlot) : undefined, + }; }, - toJSON(message: GetOldestSlotResponse): unknown { + toJSON(message: CreateConsumerGroupRequest): unknown { const obj: any = {}; - if (message.slot !== undefined) { - obj.slot = message.slot; + if (message.consumerGroupName !== "") { + obj.consumerGroupName = message.consumerGroupName; + } + if (message.initialOffsetPolicy !== 0) { + obj.initialOffsetPolicy = initialOffsetPolicyToJSON(message.initialOffsetPolicy); + } + if (message.fromSlot !== undefined) { + obj.fromSlot = message.fromSlot.toString(); } return obj; }, - create, I>>(base?: I): GetOldestSlotResponse { - return GetOldestSlotResponse.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): CreateConsumerGroupRequest { + return CreateConsumerGroupRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): GetOldestSlotResponse { - const message = createBaseGetOldestSlotResponse(); - message.slot = object.slot ?? undefined; + fromPartial, I>>(object: I): CreateConsumerGroupRequest { + const message = createBaseCreateConsumerGroupRequest(); + message.consumerGroupName = object.consumerGroupName ?? ""; + message.initialOffsetPolicy = object.initialOffsetPolicy ?? 0; + message.fromSlot = object.fromSlot ?? undefined; return message; }, }; export type FumaroleService = typeof FumaroleService; export const FumaroleService = { - listAvailableCommitmentLevels: { - path: "/fumarole.Fumarole/ListAvailableCommitmentLevels", - requestStream: false, - responseStream: false, - requestSerialize: (value: ListAvailableCommitmentLevelsRequest) => - Buffer.from(ListAvailableCommitmentLevelsRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => ListAvailableCommitmentLevelsRequest.decode(value), - responseSerialize: (value: ListAvailableCommitmentLevelsResponse) => - Buffer.from(ListAvailableCommitmentLevelsResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => ListAvailableCommitmentLevelsResponse.decode(value), - }, getConsumerGroupInfo: { path: "/fumarole.Fumarole/GetConsumerGroupInfo", requestStream: false, responseStream: false, - requestSerialize: (value: GetConsumerGroupInfoRequest) => + requestSerialize: (value: GetConsumerGroupInfoRequest): Buffer => Buffer.from(GetConsumerGroupInfoRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => GetConsumerGroupInfoRequest.decode(value), - responseSerialize: (value: ConsumerGroupInfo) => Buffer.from(ConsumerGroupInfo.encode(value).finish()), - responseDeserialize: (value: Buffer) => ConsumerGroupInfo.decode(value), + requestDeserialize: (value: Buffer): GetConsumerGroupInfoRequest => GetConsumerGroupInfoRequest.decode(value), + responseSerialize: (value: ConsumerGroupInfo): Buffer => Buffer.from(ConsumerGroupInfo.encode(value).finish()), + responseDeserialize: (value: Buffer): ConsumerGroupInfo => ConsumerGroupInfo.decode(value), }, listConsumerGroups: { path: "/fumarole.Fumarole/ListConsumerGroups", requestStream: false, responseStream: false, - requestSerialize: (value: ListConsumerGroupsRequest) => + requestSerialize: (value: ListConsumerGroupsRequest): Buffer => Buffer.from(ListConsumerGroupsRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => ListConsumerGroupsRequest.decode(value), - responseSerialize: (value: ListConsumerGroupsResponse) => + requestDeserialize: (value: Buffer): ListConsumerGroupsRequest => ListConsumerGroupsRequest.decode(value), + responseSerialize: (value: ListConsumerGroupsResponse): Buffer => Buffer.from(ListConsumerGroupsResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => ListConsumerGroupsResponse.decode(value), + responseDeserialize: (value: Buffer): ListConsumerGroupsResponse => ListConsumerGroupsResponse.decode(value), }, deleteConsumerGroup: { path: "/fumarole.Fumarole/DeleteConsumerGroup", requestStream: false, responseStream: false, - requestSerialize: (value: DeleteConsumerGroupRequest) => + requestSerialize: (value: DeleteConsumerGroupRequest): Buffer => Buffer.from(DeleteConsumerGroupRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => DeleteConsumerGroupRequest.decode(value), - responseSerialize: (value: DeleteConsumerGroupResponse) => + requestDeserialize: (value: Buffer): DeleteConsumerGroupRequest => DeleteConsumerGroupRequest.decode(value), + responseSerialize: (value: DeleteConsumerGroupResponse): Buffer => Buffer.from(DeleteConsumerGroupResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => DeleteConsumerGroupResponse.decode(value), + responseDeserialize: (value: Buffer): DeleteConsumerGroupResponse => DeleteConsumerGroupResponse.decode(value), + }, + createConsumerGroup: { + path: "/fumarole.Fumarole/CreateConsumerGroup", + requestStream: false, + responseStream: false, + requestSerialize: (value: CreateConsumerGroupRequest): Buffer => + Buffer.from(CreateConsumerGroupRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): CreateConsumerGroupRequest => CreateConsumerGroupRequest.decode(value), + responseSerialize: (value: CreateConsumerGroupResponse): Buffer => + Buffer.from(CreateConsumerGroupResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): CreateConsumerGroupResponse => CreateConsumerGroupResponse.decode(value), + }, + downloadBlock: { + path: "/fumarole.Fumarole/DownloadBlock", + requestStream: false, + responseStream: true, + requestSerialize: (value: DownloadBlockShard): Buffer => Buffer.from(DownloadBlockShard.encode(value).finish()), + requestDeserialize: (value: Buffer): DownloadBlockShard => DownloadBlockShard.decode(value), + responseSerialize: (value: DataResponse): Buffer => Buffer.from(DataResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): DataResponse => DataResponse.decode(value), + }, + /** Represents subscription to the data plane */ + subscribeData: { + path: "/fumarole.Fumarole/SubscribeData", + requestStream: true, + responseStream: true, + requestSerialize: (value: DataCommand): Buffer => Buffer.from(DataCommand.encode(value).finish()), + requestDeserialize: (value: Buffer): DataCommand => DataCommand.decode(value), + responseSerialize: (value: DataResponse): Buffer => Buffer.from(DataResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): DataResponse => DataResponse.decode(value), }, - createStaticConsumerGroup: { - path: "/fumarole.Fumarole/CreateStaticConsumerGroup", + getChainTip: { + path: "/fumarole.Fumarole/GetChainTip", requestStream: false, responseStream: false, - requestSerialize: (value: CreateStaticConsumerGroupRequest) => - Buffer.from(CreateStaticConsumerGroupRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => CreateStaticConsumerGroupRequest.decode(value), - responseSerialize: (value: CreateStaticConsumerGroupResponse) => - Buffer.from(CreateStaticConsumerGroupResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => CreateStaticConsumerGroupResponse.decode(value), + requestSerialize: (value: GetChainTipRequest): Buffer => Buffer.from(GetChainTipRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetChainTipRequest => GetChainTipRequest.decode(value), + responseSerialize: (value: GetChainTipResponse): Buffer => Buffer.from(GetChainTipResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): GetChainTipResponse => GetChainTipResponse.decode(value), }, + /** Represents subscription to the control plane */ subscribe: { path: "/fumarole.Fumarole/Subscribe", requestStream: true, responseStream: true, - requestSerialize: (value: SubscribeRequest) => Buffer.from(SubscribeRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => SubscribeRequest.decode(value), - responseSerialize: (value: SubscribeUpdate) => Buffer.from(SubscribeUpdate.encode(value).finish()), - responseDeserialize: (value: Buffer) => SubscribeUpdate.decode(value), + requestSerialize: (value: ControlCommand): Buffer => Buffer.from(ControlCommand.encode(value).finish()), + requestDeserialize: (value: Buffer): ControlCommand => ControlCommand.decode(value), + responseSerialize: (value: ControlResponse): Buffer => Buffer.from(ControlResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): ControlResponse => ControlResponse.decode(value), }, - getSlotLagInfo: { - path: "/fumarole.Fumarole/GetSlotLagInfo", + version: { + path: "/fumarole.Fumarole/Version", requestStream: false, responseStream: false, - requestSerialize: (value: GetSlotLagInfoRequest) => Buffer.from(GetSlotLagInfoRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => GetSlotLagInfoRequest.decode(value), - responseSerialize: (value: GetSlotLagInfoResponse) => Buffer.from(GetSlotLagInfoResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => GetSlotLagInfoResponse.decode(value), + requestSerialize: (value: VersionRequest): Buffer => Buffer.from(VersionRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): VersionRequest => VersionRequest.decode(value), + responseSerialize: (value: VersionResponse): Buffer => Buffer.from(VersionResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): VersionResponse => VersionResponse.decode(value), }, - getOldestSlot: { - path: "/fumarole.Fumarole/GetOldestSlot", + getSlotRange: { + path: "/fumarole.Fumarole/GetSlotRange", requestStream: false, responseStream: false, - requestSerialize: (value: GetOldestSlotRequest) => Buffer.from(GetOldestSlotRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => GetOldestSlotRequest.decode(value), - responseSerialize: (value: GetOldestSlotResponse) => Buffer.from(GetOldestSlotResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => GetOldestSlotResponse.decode(value), + requestSerialize: (value: GetSlotRangeRequest): Buffer => Buffer.from(GetSlotRangeRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetSlotRangeRequest => GetSlotRangeRequest.decode(value), + responseSerialize: (value: GetSlotRangeResponse): Buffer => + Buffer.from(GetSlotRangeResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): GetSlotRangeResponse => GetSlotRangeResponse.decode(value), }, } as const; export interface FumaroleServer extends UntypedServiceImplementation { - listAvailableCommitmentLevels: handleUnaryCall< - ListAvailableCommitmentLevelsRequest, - ListAvailableCommitmentLevelsResponse - >; getConsumerGroupInfo: handleUnaryCall; listConsumerGroups: handleUnaryCall; deleteConsumerGroup: handleUnaryCall; - createStaticConsumerGroup: handleUnaryCall; - subscribe: handleBidiStreamingCall; - getSlotLagInfo: handleUnaryCall; - getOldestSlot: handleUnaryCall; + createConsumerGroup: handleUnaryCall; + downloadBlock: handleServerStreamingCall; + /** Represents subscription to the data plane */ + subscribeData: handleBidiStreamingCall; + getChainTip: handleUnaryCall; + /** Represents subscription to the control plane */ + subscribe: handleBidiStreamingCall; + version: handleUnaryCall; + getSlotRange: handleUnaryCall; } export interface FumaroleClient extends Client { - listAvailableCommitmentLevels( - request: ListAvailableCommitmentLevelsRequest, - callback: (error: ServiceError | null, response: ListAvailableCommitmentLevelsResponse) => void, - ): ClientUnaryCall; - listAvailableCommitmentLevels( - request: ListAvailableCommitmentLevelsRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: ListAvailableCommitmentLevelsResponse) => void, - ): ClientUnaryCall; - listAvailableCommitmentLevels( - request: ListAvailableCommitmentLevelsRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: ListAvailableCommitmentLevelsResponse) => void, - ): ClientUnaryCall; getConsumerGroupInfo( request: GetConsumerGroupInfoRequest, callback: (error: ServiceError | null, response: ConsumerGroupInfo) => void, @@ -1704,53 +3631,79 @@ export interface FumaroleClient extends Client { options: Partial, callback: (error: ServiceError | null, response: DeleteConsumerGroupResponse) => void, ): ClientUnaryCall; - createStaticConsumerGroup( - request: CreateStaticConsumerGroupRequest, - callback: (error: ServiceError | null, response: CreateStaticConsumerGroupResponse) => void, + createConsumerGroup( + request: CreateConsumerGroupRequest, + callback: (error: ServiceError | null, response: CreateConsumerGroupResponse) => void, + ): ClientUnaryCall; + createConsumerGroup( + request: CreateConsumerGroupRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: CreateConsumerGroupResponse) => void, + ): ClientUnaryCall; + createConsumerGroup( + request: CreateConsumerGroupRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: CreateConsumerGroupResponse) => void, + ): ClientUnaryCall; + downloadBlock(request: DownloadBlockShard, options?: Partial): ClientReadableStream; + downloadBlock( + request: DownloadBlockShard, + metadata?: Metadata, + options?: Partial, + ): ClientReadableStream; + /** Represents subscription to the data plane */ + subscribeData(): ClientDuplexStream; + subscribeData(options: Partial): ClientDuplexStream; + subscribeData(metadata: Metadata, options?: Partial): ClientDuplexStream; + getChainTip( + request: GetChainTipRequest, + callback: (error: ServiceError | null, response: GetChainTipResponse) => void, ): ClientUnaryCall; - createStaticConsumerGroup( - request: CreateStaticConsumerGroupRequest, + getChainTip( + request: GetChainTipRequest, metadata: Metadata, - callback: (error: ServiceError | null, response: CreateStaticConsumerGroupResponse) => void, + callback: (error: ServiceError | null, response: GetChainTipResponse) => void, ): ClientUnaryCall; - createStaticConsumerGroup( - request: CreateStaticConsumerGroupRequest, + getChainTip( + request: GetChainTipRequest, metadata: Metadata, options: Partial, - callback: (error: ServiceError | null, response: CreateStaticConsumerGroupResponse) => void, + callback: (error: ServiceError | null, response: GetChainTipResponse) => void, ): ClientUnaryCall; - subscribe(): ClientDuplexStream; - subscribe(options: Partial): ClientDuplexStream; - subscribe(metadata: Metadata, options?: Partial): ClientDuplexStream; - getSlotLagInfo( - request: GetSlotLagInfoRequest, - callback: (error: ServiceError | null, response: GetSlotLagInfoResponse) => void, + /** Represents subscription to the control plane */ + subscribe(): ClientDuplexStream; + subscribe(options: Partial): ClientDuplexStream; + subscribe(metadata: Metadata, options?: Partial): ClientDuplexStream; + version( + request: VersionRequest, + callback: (error: ServiceError | null, response: VersionResponse) => void, ): ClientUnaryCall; - getSlotLagInfo( - request: GetSlotLagInfoRequest, + version( + request: VersionRequest, metadata: Metadata, - callback: (error: ServiceError | null, response: GetSlotLagInfoResponse) => void, + callback: (error: ServiceError | null, response: VersionResponse) => void, ): ClientUnaryCall; - getSlotLagInfo( - request: GetSlotLagInfoRequest, + version( + request: VersionRequest, metadata: Metadata, options: Partial, - callback: (error: ServiceError | null, response: GetSlotLagInfoResponse) => void, + callback: (error: ServiceError | null, response: VersionResponse) => void, ): ClientUnaryCall; - getOldestSlot( - request: GetOldestSlotRequest, - callback: (error: ServiceError | null, response: GetOldestSlotResponse) => void, + getSlotRange( + request: GetSlotRangeRequest, + callback: (error: ServiceError | null, response: GetSlotRangeResponse) => void, ): ClientUnaryCall; - getOldestSlot( - request: GetOldestSlotRequest, + getSlotRange( + request: GetSlotRangeRequest, metadata: Metadata, - callback: (error: ServiceError | null, response: GetOldestSlotResponse) => void, + callback: (error: ServiceError | null, response: GetSlotRangeResponse) => void, ): ClientUnaryCall; - getOldestSlot( - request: GetOldestSlotRequest, + getSlotRange( + request: GetSlotRangeRequest, metadata: Metadata, options: Partial, - callback: (error: ServiceError | null, response: GetOldestSlotResponse) => void, + callback: (error: ServiceError | null, response: GetSlotRangeResponse) => void, ): ClientUnaryCall; } @@ -1760,7 +3713,32 @@ export const FumaroleClient = makeGenericClientConstructor(FumaroleService, "fum serviceName: string; }; -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; +function bytesFromBase64(b64: string): Uint8Array { + if ((globalThis as any).Buffer) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); + } else { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if ((globalThis as any).Buffer) { + return globalThis.Buffer.from(arr).toString("base64"); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined; export type DeepPartial = T extends Builtin ? T : T extends globalThis.Array ? globalThis.Array> @@ -1772,15 +3750,6 @@ type KeysOfUnion = T extends T ? keyof T : never; export type Exact = P extends Builtin ? P : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; -function longToString(long: Long) { - return long.toString(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - function isObject(value: any): boolean { return typeof value === "object" && value !== null; } @@ -1788,3 +3757,12 @@ function isObject(value: any): boolean { function isSet(value: any): boolean { return value !== null && value !== undefined; } + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/typescript-sdk/src/grpc/geyser.ts b/typescript-sdk/src/grpc/geyser.ts index bdb1e14..35b5510 100644 --- a/typescript-sdk/src/grpc/geyser.ts +++ b/typescript-sdk/src/grpc/geyser.ts @@ -1,26 +1,25 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v1.181.2 -// protoc v6.30.0 +// protoc-gen-ts_proto v2.7.7 +// protoc v3.12.4 // source: geyser.proto /* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; import { type CallOptions, - ChannelCredentials, + type ChannelCredentials, Client, - ClientDuplexStream, + type ClientDuplexStream, type ClientOptions, type ClientUnaryCall, - handleBidiStreamingCall, + type handleBidiStreamingCall, type handleUnaryCall, makeGenericClientConstructor, - Metadata, + type Metadata, type ServiceError, type UntypedServiceImplementation, } from "@grpc/grpc-js"; -import Long from "long"; -import _m0 from "protobufjs/minimal"; import { Timestamp } from "./google/protobuf/timestamp"; import { BlockHeight, @@ -146,7 +145,7 @@ export interface SubscribeRequest { commitment?: CommitmentLevel | undefined; accountsDataSlice: SubscribeRequestAccountsDataSlice[]; ping?: SubscribeRequestPing | undefined; - fromSlot?: string | undefined; + fromSlot?: bigint | undefined; } export interface SubscribeRequest_AccountsEntry { @@ -193,23 +192,23 @@ export interface SubscribeRequestFilterAccounts { export interface SubscribeRequestFilterAccountsFilter { memcmp?: SubscribeRequestFilterAccountsFilterMemcmp | undefined; - datasize?: string | undefined; + datasize?: bigint | undefined; tokenAccountState?: boolean | undefined; lamports?: SubscribeRequestFilterAccountsFilterLamports | undefined; } export interface SubscribeRequestFilterAccountsFilterMemcmp { - offset: string; + offset: bigint; bytes?: Uint8Array | undefined; base58?: string | undefined; base64?: string | undefined; } export interface SubscribeRequestFilterAccountsFilterLamports { - eq?: string | undefined; - ne?: string | undefined; - lt?: string | undefined; - gt?: string | undefined; + eq?: bigint | undefined; + ne?: bigint | undefined; + lt?: bigint | undefined; + gt?: bigint | undefined; } export interface SubscribeRequestFilterSlots { @@ -240,8 +239,8 @@ export interface SubscribeRequestFilterEntry { } export interface SubscribeRequestAccountsDataSlice { - offset: string; - length: string; + offset: bigint; + length: bigint; } export interface SubscribeRequestPing { @@ -264,31 +263,31 @@ export interface SubscribeUpdate { export interface SubscribeUpdateAccount { account: SubscribeUpdateAccountInfo | undefined; - slot: string; + slot: bigint; isStartup: boolean; } export interface SubscribeUpdateAccountInfo { pubkey: Uint8Array; - lamports: string; + lamports: bigint; owner: Uint8Array; executable: boolean; - rentEpoch: string; + rentEpoch: bigint; data: Uint8Array; - writeVersion: string; + writeVersion: bigint; txnSignature?: Uint8Array | undefined; } export interface SubscribeUpdateSlot { - slot: string; - parent?: string | undefined; + slot: bigint; + parent?: bigint | undefined; status: SlotStatus; deadError?: string | undefined; } export interface SubscribeUpdateTransaction { transaction: SubscribeUpdateTransactionInfo | undefined; - slot: string; + slot: bigint; } export interface SubscribeUpdateTransactionInfo { @@ -296,53 +295,53 @@ export interface SubscribeUpdateTransactionInfo { isVote: boolean; transaction: Transaction | undefined; meta: TransactionStatusMeta | undefined; - index: string; + index: bigint; } export interface SubscribeUpdateTransactionStatus { - slot: string; + slot: bigint; signature: Uint8Array; isVote: boolean; - index: string; + index: bigint; err: TransactionError | undefined; } export interface SubscribeUpdateBlock { - slot: string; + slot: bigint; blockhash: string; rewards: Rewards | undefined; blockTime: UnixTimestamp | undefined; blockHeight: BlockHeight | undefined; - parentSlot: string; + parentSlot: bigint; parentBlockhash: string; - executedTransactionCount: string; + executedTransactionCount: bigint; transactions: SubscribeUpdateTransactionInfo[]; - updatedAccountCount: string; + updatedAccountCount: bigint; accounts: SubscribeUpdateAccountInfo[]; - entriesCount: string; + entriesCount: bigint; entries: SubscribeUpdateEntry[]; } export interface SubscribeUpdateBlockMeta { - slot: string; + slot: bigint; blockhash: string; rewards: Rewards | undefined; blockTime: UnixTimestamp | undefined; blockHeight: BlockHeight | undefined; - parentSlot: string; + parentSlot: bigint; parentBlockhash: string; - executedTransactionCount: string; - entriesCount: string; + executedTransactionCount: bigint; + entriesCount: bigint; } export interface SubscribeUpdateEntry { - slot: string; - index: string; - numHashes: string; + slot: bigint; + index: bigint; + numHashes: bigint; hash: Uint8Array; - executedTransactionCount: string; + executedTransactionCount: bigint; /** added in v1.18, for solana 1.17 value is always 0 */ - startingTransactionIndex: string; + startingTransactionIndex: bigint; } export interface SubscribeUpdatePing { @@ -352,6 +351,13 @@ export interface SubscribeUpdatePong { id: number; } +export interface SubscribeReplayInfoRequest { +} + +export interface SubscribeReplayInfoResponse { + firstAvailable?: bigint | undefined; +} + export interface PingRequest { count: number; } @@ -365,9 +371,9 @@ export interface GetLatestBlockhashRequest { } export interface GetLatestBlockhashResponse { - slot: string; + slot: bigint; blockhash: string; - lastValidBlockHeight: string; + lastValidBlockHeight: bigint; } export interface GetBlockHeightRequest { @@ -375,7 +381,7 @@ export interface GetBlockHeightRequest { } export interface GetBlockHeightResponse { - blockHeight: string; + blockHeight: bigint; } export interface GetSlotRequest { @@ -383,7 +389,7 @@ export interface GetSlotRequest { } export interface GetSlotResponse { - slot: string; + slot: bigint; } export interface GetVersionRequest { @@ -399,7 +405,7 @@ export interface IsBlockhashValidRequest { } export interface IsBlockhashValidResponse { - slot: string; + slot: bigint; valid: boolean; } @@ -419,52 +425,55 @@ function createBaseSubscribeRequest(): SubscribeRequest { }; } -export const SubscribeRequest = { - encode(message: SubscribeRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequest: MessageFns = { + encode(message: SubscribeRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { Object.entries(message.accounts).forEach(([key, value]) => { - SubscribeRequest_AccountsEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).ldelim(); + SubscribeRequest_AccountsEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).join(); }); Object.entries(message.slots).forEach(([key, value]) => { - SubscribeRequest_SlotsEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).ldelim(); + SubscribeRequest_SlotsEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).join(); }); Object.entries(message.transactions).forEach(([key, value]) => { - SubscribeRequest_TransactionsEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).ldelim(); + SubscribeRequest_TransactionsEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).join(); }); Object.entries(message.transactionsStatus).forEach(([key, value]) => { - SubscribeRequest_TransactionsStatusEntry.encode({ key: key as any, value }, writer.uint32(82).fork()).ldelim(); + SubscribeRequest_TransactionsStatusEntry.encode({ key: key as any, value }, writer.uint32(82).fork()).join(); }); Object.entries(message.blocks).forEach(([key, value]) => { - SubscribeRequest_BlocksEntry.encode({ key: key as any, value }, writer.uint32(34).fork()).ldelim(); + SubscribeRequest_BlocksEntry.encode({ key: key as any, value }, writer.uint32(34).fork()).join(); }); Object.entries(message.blocksMeta).forEach(([key, value]) => { - SubscribeRequest_BlocksMetaEntry.encode({ key: key as any, value }, writer.uint32(42).fork()).ldelim(); + SubscribeRequest_BlocksMetaEntry.encode({ key: key as any, value }, writer.uint32(42).fork()).join(); }); Object.entries(message.entry).forEach(([key, value]) => { - SubscribeRequest_EntryEntry.encode({ key: key as any, value }, writer.uint32(66).fork()).ldelim(); + SubscribeRequest_EntryEntry.encode({ key: key as any, value }, writer.uint32(66).fork()).join(); }); if (message.commitment !== undefined) { writer.uint32(48).int32(message.commitment); } for (const v of message.accountsDataSlice) { - SubscribeRequestAccountsDataSlice.encode(v!, writer.uint32(58).fork()).ldelim(); + SubscribeRequestAccountsDataSlice.encode(v!, writer.uint32(58).fork()).join(); } if (message.ping !== undefined) { - SubscribeRequestPing.encode(message.ping, writer.uint32(74).fork()).ldelim(); + SubscribeRequestPing.encode(message.ping, writer.uint32(74).fork()).join(); } if (message.fromSlot !== undefined) { + if (BigInt.asUintN(64, message.fromSlot) !== message.fromSlot) { + throw new globalThis.Error("value provided for field message.fromSlot of type uint64 too large"); + } writer.uint32(88).uint64(message.fromSlot); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } @@ -474,7 +483,8 @@ export const SubscribeRequest = { message.accounts[entry1.key] = entry1.value; } continue; - case 2: + } + case 2: { if (tag !== 18) { break; } @@ -484,7 +494,8 @@ export const SubscribeRequest = { message.slots[entry2.key] = entry2.value; } continue; - case 3: + } + case 3: { if (tag !== 26) { break; } @@ -494,7 +505,8 @@ export const SubscribeRequest = { message.transactions[entry3.key] = entry3.value; } continue; - case 10: + } + case 10: { if (tag !== 82) { break; } @@ -504,7 +516,8 @@ export const SubscribeRequest = { message.transactionsStatus[entry10.key] = entry10.value; } continue; - case 4: + } + case 4: { if (tag !== 34) { break; } @@ -514,7 +527,8 @@ export const SubscribeRequest = { message.blocks[entry4.key] = entry4.value; } continue; - case 5: + } + case 5: { if (tag !== 42) { break; } @@ -524,7 +538,8 @@ export const SubscribeRequest = { message.blocksMeta[entry5.key] = entry5.value; } continue; - case 8: + } + case 8: { if (tag !== 66) { break; } @@ -534,39 +549,44 @@ export const SubscribeRequest = { message.entry[entry8.key] = entry8.value; } continue; - case 6: + } + case 6: { if (tag !== 48) { break; } message.commitment = reader.int32() as any; continue; - case 7: + } + case 7: { if (tag !== 58) { break; } message.accountsDataSlice.push(SubscribeRequestAccountsDataSlice.decode(reader, reader.uint32())); continue; - case 9: + } + case 9: { if (tag !== 74) { break; } message.ping = SubscribeRequestPing.decode(reader, reader.uint32()); continue; - case 11: + } + case 11: { if (tag !== 88) { break; } - message.fromSlot = longToString(reader.uint64() as Long); + message.fromSlot = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -632,7 +652,7 @@ export const SubscribeRequest = { ? object.accountsDataSlice.map((e: any) => SubscribeRequestAccountsDataSlice.fromJSON(e)) : [], ping: isSet(object.ping) ? SubscribeRequestPing.fromJSON(object.ping) : undefined, - fromSlot: isSet(object.fromSlot) ? globalThis.String(object.fromSlot) : undefined, + fromSlot: isSet(object.fromSlot) ? BigInt(object.fromSlot) : undefined, }; }, @@ -711,7 +731,7 @@ export const SubscribeRequest = { obj.ping = SubscribeRequestPing.toJSON(message.ping); } if (message.fromSlot !== undefined) { - obj.fromSlot = message.fromSlot; + obj.fromSlot = message.fromSlot.toString(); } return obj; }, @@ -796,43 +816,45 @@ function createBaseSubscribeRequest_AccountsEntry(): SubscribeRequest_AccountsEn return { key: "", value: undefined }; } -export const SubscribeRequest_AccountsEntry = { - encode(message: SubscribeRequest_AccountsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequest_AccountsEntry: MessageFns = { + encode(message: SubscribeRequest_AccountsEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.key !== "") { writer.uint32(10).string(message.key); } if (message.value !== undefined) { - SubscribeRequestFilterAccounts.encode(message.value, writer.uint32(18).fork()).ldelim(); + SubscribeRequestFilterAccounts.encode(message.value, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_AccountsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequest_AccountsEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequest_AccountsEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.key = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.value = SubscribeRequestFilterAccounts.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -874,43 +896,45 @@ function createBaseSubscribeRequest_SlotsEntry(): SubscribeRequest_SlotsEntry { return { key: "", value: undefined }; } -export const SubscribeRequest_SlotsEntry = { - encode(message: SubscribeRequest_SlotsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequest_SlotsEntry: MessageFns = { + encode(message: SubscribeRequest_SlotsEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.key !== "") { writer.uint32(10).string(message.key); } if (message.value !== undefined) { - SubscribeRequestFilterSlots.encode(message.value, writer.uint32(18).fork()).ldelim(); + SubscribeRequestFilterSlots.encode(message.value, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_SlotsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequest_SlotsEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequest_SlotsEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.key = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.value = SubscribeRequestFilterSlots.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -950,43 +974,45 @@ function createBaseSubscribeRequest_TransactionsEntry(): SubscribeRequest_Transa return { key: "", value: undefined }; } -export const SubscribeRequest_TransactionsEntry = { - encode(message: SubscribeRequest_TransactionsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequest_TransactionsEntry: MessageFns = { + encode(message: SubscribeRequest_TransactionsEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.key !== "") { writer.uint32(10).string(message.key); } if (message.value !== undefined) { - SubscribeRequestFilterTransactions.encode(message.value, writer.uint32(18).fork()).ldelim(); + SubscribeRequestFilterTransactions.encode(message.value, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_TransactionsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequest_TransactionsEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequest_TransactionsEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.key = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.value = SubscribeRequestFilterTransactions.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1030,43 +1056,45 @@ function createBaseSubscribeRequest_TransactionsStatusEntry(): SubscribeRequest_ return { key: "", value: undefined }; } -export const SubscribeRequest_TransactionsStatusEntry = { - encode(message: SubscribeRequest_TransactionsStatusEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequest_TransactionsStatusEntry: MessageFns = { + encode(message: SubscribeRequest_TransactionsStatusEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.key !== "") { writer.uint32(10).string(message.key); } if (message.value !== undefined) { - SubscribeRequestFilterTransactions.encode(message.value, writer.uint32(18).fork()).ldelim(); + SubscribeRequestFilterTransactions.encode(message.value, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_TransactionsStatusEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequest_TransactionsStatusEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequest_TransactionsStatusEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.key = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.value = SubscribeRequestFilterTransactions.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1110,43 +1138,45 @@ function createBaseSubscribeRequest_BlocksEntry(): SubscribeRequest_BlocksEntry return { key: "", value: undefined }; } -export const SubscribeRequest_BlocksEntry = { - encode(message: SubscribeRequest_BlocksEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequest_BlocksEntry: MessageFns = { + encode(message: SubscribeRequest_BlocksEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.key !== "") { writer.uint32(10).string(message.key); } if (message.value !== undefined) { - SubscribeRequestFilterBlocks.encode(message.value, writer.uint32(18).fork()).ldelim(); + SubscribeRequestFilterBlocks.encode(message.value, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_BlocksEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequest_BlocksEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequest_BlocksEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.key = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.value = SubscribeRequestFilterBlocks.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1186,43 +1216,45 @@ function createBaseSubscribeRequest_BlocksMetaEntry(): SubscribeRequest_BlocksMe return { key: "", value: undefined }; } -export const SubscribeRequest_BlocksMetaEntry = { - encode(message: SubscribeRequest_BlocksMetaEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequest_BlocksMetaEntry: MessageFns = { + encode(message: SubscribeRequest_BlocksMetaEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.key !== "") { writer.uint32(10).string(message.key); } if (message.value !== undefined) { - SubscribeRequestFilterBlocksMeta.encode(message.value, writer.uint32(18).fork()).ldelim(); + SubscribeRequestFilterBlocksMeta.encode(message.value, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_BlocksMetaEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequest_BlocksMetaEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequest_BlocksMetaEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.key = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.value = SubscribeRequestFilterBlocksMeta.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1266,43 +1298,45 @@ function createBaseSubscribeRequest_EntryEntry(): SubscribeRequest_EntryEntry { return { key: "", value: undefined }; } -export const SubscribeRequest_EntryEntry = { - encode(message: SubscribeRequest_EntryEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequest_EntryEntry: MessageFns = { + encode(message: SubscribeRequest_EntryEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.key !== "") { writer.uint32(10).string(message.key); } if (message.value !== undefined) { - SubscribeRequestFilterEntry.encode(message.value, writer.uint32(18).fork()).ldelim(); + SubscribeRequestFilterEntry.encode(message.value, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest_EntryEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequest_EntryEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequest_EntryEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.key = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.value = SubscribeRequestFilterEntry.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1342,8 +1376,8 @@ function createBaseSubscribeRequestFilterAccounts(): SubscribeRequestFilterAccou return { account: [], owner: [], filters: [], nonemptyTxnSignature: undefined }; } -export const SubscribeRequestFilterAccounts = { - encode(message: SubscribeRequestFilterAccounts, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestFilterAccounts: MessageFns = { + encode(message: SubscribeRequestFilterAccounts, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { for (const v of message.account) { writer.uint32(18).string(v!); } @@ -1351,7 +1385,7 @@ export const SubscribeRequestFilterAccounts = { writer.uint32(26).string(v!); } for (const v of message.filters) { - SubscribeRequestFilterAccountsFilter.encode(v!, writer.uint32(34).fork()).ldelim(); + SubscribeRequestFilterAccountsFilter.encode(v!, writer.uint32(34).fork()).join(); } if (message.nonemptyTxnSignature !== undefined) { writer.uint32(40).bool(message.nonemptyTxnSignature); @@ -1359,46 +1393,50 @@ export const SubscribeRequestFilterAccounts = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterAccounts { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterAccounts { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterAccounts(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 2: + case 2: { if (tag !== 18) { break; } message.account.push(reader.string()); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.owner.push(reader.string()); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.filters.push(SubscribeRequestFilterAccountsFilter.decode(reader, reader.uint32())); continue; - case 5: + } + case 5: { if (tag !== 40) { break; } message.nonemptyTxnSignature = reader.bool(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1452,63 +1490,70 @@ function createBaseSubscribeRequestFilterAccountsFilter(): SubscribeRequestFilte return { memcmp: undefined, datasize: undefined, tokenAccountState: undefined, lamports: undefined }; } -export const SubscribeRequestFilterAccountsFilter = { - encode(message: SubscribeRequestFilterAccountsFilter, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestFilterAccountsFilter: MessageFns = { + encode(message: SubscribeRequestFilterAccountsFilter, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.memcmp !== undefined) { - SubscribeRequestFilterAccountsFilterMemcmp.encode(message.memcmp, writer.uint32(10).fork()).ldelim(); + SubscribeRequestFilterAccountsFilterMemcmp.encode(message.memcmp, writer.uint32(10).fork()).join(); } if (message.datasize !== undefined) { + if (BigInt.asUintN(64, message.datasize) !== message.datasize) { + throw new globalThis.Error("value provided for field message.datasize of type uint64 too large"); + } writer.uint32(16).uint64(message.datasize); } if (message.tokenAccountState !== undefined) { writer.uint32(24).bool(message.tokenAccountState); } if (message.lamports !== undefined) { - SubscribeRequestFilterAccountsFilterLamports.encode(message.lamports, writer.uint32(34).fork()).ldelim(); + SubscribeRequestFilterAccountsFilterLamports.encode(message.lamports, writer.uint32(34).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterAccountsFilter { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterAccountsFilter { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterAccountsFilter(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.memcmp = SubscribeRequestFilterAccountsFilterMemcmp.decode(reader, reader.uint32()); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.datasize = longToString(reader.uint64() as Long); + message.datasize = reader.uint64() as bigint; continue; - case 3: + } + case 3: { if (tag !== 24) { break; } message.tokenAccountState = reader.bool(); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.lamports = SubscribeRequestFilterAccountsFilterLamports.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1516,7 +1561,7 @@ export const SubscribeRequestFilterAccountsFilter = { fromJSON(object: any): SubscribeRequestFilterAccountsFilter { return { memcmp: isSet(object.memcmp) ? SubscribeRequestFilterAccountsFilterMemcmp.fromJSON(object.memcmp) : undefined, - datasize: isSet(object.datasize) ? globalThis.String(object.datasize) : undefined, + datasize: isSet(object.datasize) ? BigInt(object.datasize) : undefined, tokenAccountState: isSet(object.tokenAccountState) ? globalThis.Boolean(object.tokenAccountState) : undefined, lamports: isSet(object.lamports) ? SubscribeRequestFilterAccountsFilterLamports.fromJSON(object.lamports) @@ -1530,7 +1575,7 @@ export const SubscribeRequestFilterAccountsFilter = { obj.memcmp = SubscribeRequestFilterAccountsFilterMemcmp.toJSON(message.memcmp); } if (message.datasize !== undefined) { - obj.datasize = message.datasize; + obj.datasize = message.datasize.toString(); } if (message.tokenAccountState !== undefined) { obj.tokenAccountState = message.tokenAccountState; @@ -1563,12 +1608,15 @@ export const SubscribeRequestFilterAccountsFilter = { }; function createBaseSubscribeRequestFilterAccountsFilterMemcmp(): SubscribeRequestFilterAccountsFilterMemcmp { - return { offset: "0", bytes: undefined, base58: undefined, base64: undefined }; + return { offset: 0n, bytes: undefined, base58: undefined, base64: undefined }; } -export const SubscribeRequestFilterAccountsFilterMemcmp = { - encode(message: SubscribeRequestFilterAccountsFilterMemcmp, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.offset !== "0") { +export const SubscribeRequestFilterAccountsFilterMemcmp: MessageFns = { + encode(message: SubscribeRequestFilterAccountsFilterMemcmp, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.offset !== 0n) { + if (BigInt.asUintN(64, message.offset) !== message.offset) { + throw new globalThis.Error("value provided for field message.offset of type uint64 too large"); + } writer.uint32(8).uint64(message.offset); } if (message.bytes !== undefined) { @@ -1583,53 +1631,57 @@ export const SubscribeRequestFilterAccountsFilterMemcmp = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterAccountsFilterMemcmp { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterAccountsFilterMemcmp { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterAccountsFilterMemcmp(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.offset = longToString(reader.uint64() as Long); + message.offset = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.bytes = reader.bytes(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.base58 = reader.string(); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.base64 = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): SubscribeRequestFilterAccountsFilterMemcmp { return { - offset: isSet(object.offset) ? globalThis.String(object.offset) : "0", + offset: isSet(object.offset) ? BigInt(object.offset) : 0n, bytes: isSet(object.bytes) ? bytesFromBase64(object.bytes) : undefined, base58: isSet(object.base58) ? globalThis.String(object.base58) : undefined, base64: isSet(object.base64) ? globalThis.String(object.base64) : undefined, @@ -1638,8 +1690,8 @@ export const SubscribeRequestFilterAccountsFilterMemcmp = { toJSON(message: SubscribeRequestFilterAccountsFilterMemcmp): unknown { const obj: any = {}; - if (message.offset !== "0") { - obj.offset = message.offset; + if (message.offset !== 0n) { + obj.offset = message.offset.toString(); } if (message.bytes !== undefined) { obj.bytes = base64FromBytes(message.bytes); @@ -1662,7 +1714,7 @@ export const SubscribeRequestFilterAccountsFilterMemcmp = { object: I, ): SubscribeRequestFilterAccountsFilterMemcmp { const message = createBaseSubscribeRequestFilterAccountsFilterMemcmp(); - message.offset = object.offset ?? "0"; + message.offset = object.offset ?? 0n; message.bytes = object.bytes ?? undefined; message.base58 = object.base58 ?? undefined; message.base64 = object.base64 ?? undefined; @@ -1674,89 +1726,108 @@ function createBaseSubscribeRequestFilterAccountsFilterLamports(): SubscribeRequ return { eq: undefined, ne: undefined, lt: undefined, gt: undefined }; } -export const SubscribeRequestFilterAccountsFilterLamports = { - encode(message: SubscribeRequestFilterAccountsFilterLamports, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestFilterAccountsFilterLamports: MessageFns = { + encode( + message: SubscribeRequestFilterAccountsFilterLamports, + writer: BinaryWriter = new BinaryWriter(), + ): BinaryWriter { if (message.eq !== undefined) { + if (BigInt.asUintN(64, message.eq) !== message.eq) { + throw new globalThis.Error("value provided for field message.eq of type uint64 too large"); + } writer.uint32(8).uint64(message.eq); } if (message.ne !== undefined) { + if (BigInt.asUintN(64, message.ne) !== message.ne) { + throw new globalThis.Error("value provided for field message.ne of type uint64 too large"); + } writer.uint32(16).uint64(message.ne); } if (message.lt !== undefined) { + if (BigInt.asUintN(64, message.lt) !== message.lt) { + throw new globalThis.Error("value provided for field message.lt of type uint64 too large"); + } writer.uint32(24).uint64(message.lt); } if (message.gt !== undefined) { + if (BigInt.asUintN(64, message.gt) !== message.gt) { + throw new globalThis.Error("value provided for field message.gt of type uint64 too large"); + } writer.uint32(32).uint64(message.gt); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterAccountsFilterLamports { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterAccountsFilterLamports { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterAccountsFilterLamports(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.eq = longToString(reader.uint64() as Long); + message.eq = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.ne = longToString(reader.uint64() as Long); + message.ne = reader.uint64() as bigint; continue; - case 3: + } + case 3: { if (tag !== 24) { break; } - message.lt = longToString(reader.uint64() as Long); + message.lt = reader.uint64() as bigint; continue; - case 4: + } + case 4: { if (tag !== 32) { break; } - message.gt = longToString(reader.uint64() as Long); + message.gt = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): SubscribeRequestFilterAccountsFilterLamports { return { - eq: isSet(object.eq) ? globalThis.String(object.eq) : undefined, - ne: isSet(object.ne) ? globalThis.String(object.ne) : undefined, - lt: isSet(object.lt) ? globalThis.String(object.lt) : undefined, - gt: isSet(object.gt) ? globalThis.String(object.gt) : undefined, + eq: isSet(object.eq) ? BigInt(object.eq) : undefined, + ne: isSet(object.ne) ? BigInt(object.ne) : undefined, + lt: isSet(object.lt) ? BigInt(object.lt) : undefined, + gt: isSet(object.gt) ? BigInt(object.gt) : undefined, }; }, toJSON(message: SubscribeRequestFilterAccountsFilterLamports): unknown { const obj: any = {}; if (message.eq !== undefined) { - obj.eq = message.eq; + obj.eq = message.eq.toString(); } if (message.ne !== undefined) { - obj.ne = message.ne; + obj.ne = message.ne.toString(); } if (message.lt !== undefined) { - obj.lt = message.lt; + obj.lt = message.lt.toString(); } if (message.gt !== undefined) { - obj.gt = message.gt; + obj.gt = message.gt.toString(); } return obj; }, @@ -1782,8 +1853,8 @@ function createBaseSubscribeRequestFilterSlots(): SubscribeRequestFilterSlots { return { filterByCommitment: undefined, interslotUpdates: undefined }; } -export const SubscribeRequestFilterSlots = { - encode(message: SubscribeRequestFilterSlots, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestFilterSlots: MessageFns = { + encode(message: SubscribeRequestFilterSlots, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.filterByCommitment !== undefined) { writer.uint32(8).bool(message.filterByCommitment); } @@ -1793,32 +1864,34 @@ export const SubscribeRequestFilterSlots = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterSlots { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterSlots { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterSlots(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.filterByCommitment = reader.bool(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.interslotUpdates = reader.bool(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1863,8 +1936,8 @@ function createBaseSubscribeRequestFilterTransactions(): SubscribeRequestFilterT }; } -export const SubscribeRequestFilterTransactions = { - encode(message: SubscribeRequestFilterTransactions, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestFilterTransactions: MessageFns = { + encode(message: SubscribeRequestFilterTransactions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.vote !== undefined) { writer.uint32(8).bool(message.vote); } @@ -1886,60 +1959,66 @@ export const SubscribeRequestFilterTransactions = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterTransactions { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterTransactions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterTransactions(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.vote = reader.bool(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.failed = reader.bool(); continue; - case 5: + } + case 5: { if (tag !== 42) { break; } message.signature = reader.string(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.accountInclude.push(reader.string()); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.accountExclude.push(reader.string()); continue; - case 6: + } + case 6: { if (tag !== 50) { break; } message.accountRequired.push(reader.string()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2007,8 +2086,8 @@ function createBaseSubscribeRequestFilterBlocks(): SubscribeRequestFilterBlocks return { accountInclude: [], includeTransactions: undefined, includeAccounts: undefined, includeEntries: undefined }; } -export const SubscribeRequestFilterBlocks = { - encode(message: SubscribeRequestFilterBlocks, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestFilterBlocks: MessageFns = { + encode(message: SubscribeRequestFilterBlocks, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { for (const v of message.accountInclude) { writer.uint32(10).string(v!); } @@ -2024,46 +2103,50 @@ export const SubscribeRequestFilterBlocks = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterBlocks { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterBlocks { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterBlocks(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.accountInclude.push(reader.string()); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.includeTransactions = reader.bool(); continue; - case 3: + } + case 3: { if (tag !== 24) { break; } message.includeAccounts = reader.bool(); continue; - case 4: + } + case 4: { if (tag !== 32) { break; } message.includeEntries = reader.bool(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2115,14 +2198,14 @@ function createBaseSubscribeRequestFilterBlocksMeta(): SubscribeRequestFilterBlo return {}; } -export const SubscribeRequestFilterBlocksMeta = { - encode(_: SubscribeRequestFilterBlocksMeta, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestFilterBlocksMeta: MessageFns = { + encode(_: SubscribeRequestFilterBlocksMeta, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterBlocksMeta { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterBlocksMeta { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterBlocksMeta(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2131,7 +2214,7 @@ export const SubscribeRequestFilterBlocksMeta = { if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2162,14 +2245,14 @@ function createBaseSubscribeRequestFilterEntry(): SubscribeRequestFilterEntry { return {}; } -export const SubscribeRequestFilterEntry = { - encode(_: SubscribeRequestFilterEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestFilterEntry: MessageFns = { + encode(_: SubscribeRequestFilterEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestFilterEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestFilterEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestFilterEntry(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2178,7 +2261,7 @@ export const SubscribeRequestFilterEntry = { if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2202,64 +2285,72 @@ export const SubscribeRequestFilterEntry = { }; function createBaseSubscribeRequestAccountsDataSlice(): SubscribeRequestAccountsDataSlice { - return { offset: "0", length: "0" }; + return { offset: 0n, length: 0n }; } -export const SubscribeRequestAccountsDataSlice = { - encode(message: SubscribeRequestAccountsDataSlice, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.offset !== "0") { +export const SubscribeRequestAccountsDataSlice: MessageFns = { + encode(message: SubscribeRequestAccountsDataSlice, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.offset !== 0n) { + if (BigInt.asUintN(64, message.offset) !== message.offset) { + throw new globalThis.Error("value provided for field message.offset of type uint64 too large"); + } writer.uint32(8).uint64(message.offset); } - if (message.length !== "0") { + if (message.length !== 0n) { + if (BigInt.asUintN(64, message.length) !== message.length) { + throw new globalThis.Error("value provided for field message.length of type uint64 too large"); + } writer.uint32(16).uint64(message.length); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestAccountsDataSlice { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestAccountsDataSlice { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestAccountsDataSlice(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.offset = longToString(reader.uint64() as Long); + message.offset = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.length = longToString(reader.uint64() as Long); + message.length = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): SubscribeRequestAccountsDataSlice { return { - offset: isSet(object.offset) ? globalThis.String(object.offset) : "0", - length: isSet(object.length) ? globalThis.String(object.length) : "0", + offset: isSet(object.offset) ? BigInt(object.offset) : 0n, + length: isSet(object.length) ? BigInt(object.length) : 0n, }; }, toJSON(message: SubscribeRequestAccountsDataSlice): unknown { const obj: any = {}; - if (message.offset !== "0") { - obj.offset = message.offset; + if (message.offset !== 0n) { + obj.offset = message.offset.toString(); } - if (message.length !== "0") { - obj.length = message.length; + if (message.length !== 0n) { + obj.length = message.length.toString(); } return obj; }, @@ -2273,8 +2364,8 @@ export const SubscribeRequestAccountsDataSlice = { object: I, ): SubscribeRequestAccountsDataSlice { const message = createBaseSubscribeRequestAccountsDataSlice(); - message.offset = object.offset ?? "0"; - message.length = object.length ?? "0"; + message.offset = object.offset ?? 0n; + message.length = object.length ?? 0n; return message; }, }; @@ -2283,33 +2374,34 @@ function createBaseSubscribeRequestPing(): SubscribeRequestPing { return { id: 0 }; } -export const SubscribeRequestPing = { - encode(message: SubscribeRequestPing, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeRequestPing: MessageFns = { + encode(message: SubscribeRequestPing, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.id !== 0) { writer.uint32(8).int32(message.id); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequestPing { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeRequestPing { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeRequestPing(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.id = reader.int32(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2352,133 +2444,144 @@ function createBaseSubscribeUpdate(): SubscribeUpdate { }; } -export const SubscribeUpdate = { - encode(message: SubscribeUpdate, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeUpdate: MessageFns = { + encode(message: SubscribeUpdate, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { for (const v of message.filters) { writer.uint32(10).string(v!); } if (message.account !== undefined) { - SubscribeUpdateAccount.encode(message.account, writer.uint32(18).fork()).ldelim(); + SubscribeUpdateAccount.encode(message.account, writer.uint32(18).fork()).join(); } if (message.slot !== undefined) { - SubscribeUpdateSlot.encode(message.slot, writer.uint32(26).fork()).ldelim(); + SubscribeUpdateSlot.encode(message.slot, writer.uint32(26).fork()).join(); } if (message.transaction !== undefined) { - SubscribeUpdateTransaction.encode(message.transaction, writer.uint32(34).fork()).ldelim(); + SubscribeUpdateTransaction.encode(message.transaction, writer.uint32(34).fork()).join(); } if (message.transactionStatus !== undefined) { - SubscribeUpdateTransactionStatus.encode(message.transactionStatus, writer.uint32(82).fork()).ldelim(); + SubscribeUpdateTransactionStatus.encode(message.transactionStatus, writer.uint32(82).fork()).join(); } if (message.block !== undefined) { - SubscribeUpdateBlock.encode(message.block, writer.uint32(42).fork()).ldelim(); + SubscribeUpdateBlock.encode(message.block, writer.uint32(42).fork()).join(); } if (message.ping !== undefined) { - SubscribeUpdatePing.encode(message.ping, writer.uint32(50).fork()).ldelim(); + SubscribeUpdatePing.encode(message.ping, writer.uint32(50).fork()).join(); } if (message.pong !== undefined) { - SubscribeUpdatePong.encode(message.pong, writer.uint32(74).fork()).ldelim(); + SubscribeUpdatePong.encode(message.pong, writer.uint32(74).fork()).join(); } if (message.blockMeta !== undefined) { - SubscribeUpdateBlockMeta.encode(message.blockMeta, writer.uint32(58).fork()).ldelim(); + SubscribeUpdateBlockMeta.encode(message.blockMeta, writer.uint32(58).fork()).join(); } if (message.entry !== undefined) { - SubscribeUpdateEntry.encode(message.entry, writer.uint32(66).fork()).ldelim(); + SubscribeUpdateEntry.encode(message.entry, writer.uint32(66).fork()).join(); } if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(90).fork()).ldelim(); + Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(90).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdate { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdate { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.filters.push(reader.string()); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.account = SubscribeUpdateAccount.decode(reader, reader.uint32()); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.slot = SubscribeUpdateSlot.decode(reader, reader.uint32()); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.transaction = SubscribeUpdateTransaction.decode(reader, reader.uint32()); continue; - case 10: + } + case 10: { if (tag !== 82) { break; } message.transactionStatus = SubscribeUpdateTransactionStatus.decode(reader, reader.uint32()); continue; - case 5: + } + case 5: { if (tag !== 42) { break; } message.block = SubscribeUpdateBlock.decode(reader, reader.uint32()); continue; - case 6: + } + case 6: { if (tag !== 50) { break; } message.ping = SubscribeUpdatePing.decode(reader, reader.uint32()); continue; - case 9: + } + case 9: { if (tag !== 74) { break; } message.pong = SubscribeUpdatePong.decode(reader, reader.uint32()); continue; - case 7: + } + case 7: { if (tag !== 58) { break; } message.blockMeta = SubscribeUpdateBlockMeta.decode(reader, reader.uint32()); continue; - case 8: + } + case 8: { if (tag !== 66) { break; } message.entry = SubscribeUpdateEntry.decode(reader, reader.uint32()); continue; - case 11: + } + case 11: { if (tag !== 90) { break; } message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2578,15 +2681,18 @@ export const SubscribeUpdate = { }; function createBaseSubscribeUpdateAccount(): SubscribeUpdateAccount { - return { account: undefined, slot: "0", isStartup: false }; + return { account: undefined, slot: 0n, isStartup: false }; } -export const SubscribeUpdateAccount = { - encode(message: SubscribeUpdateAccount, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeUpdateAccount: MessageFns = { + encode(message: SubscribeUpdateAccount, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.account !== undefined) { - SubscribeUpdateAccountInfo.encode(message.account, writer.uint32(10).fork()).ldelim(); + SubscribeUpdateAccountInfo.encode(message.account, writer.uint32(10).fork()).join(); } - if (message.slot !== "0") { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(16).uint64(message.slot); } if (message.isStartup !== false) { @@ -2595,39 +2701,42 @@ export const SubscribeUpdateAccount = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateAccount { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateAccount { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateAccount(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.account = SubscribeUpdateAccountInfo.decode(reader, reader.uint32()); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; - case 3: + } + case 3: { if (tag !== 24) { break; } message.isStartup = reader.bool(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2635,7 +2744,7 @@ export const SubscribeUpdateAccount = { fromJSON(object: any): SubscribeUpdateAccount { return { account: isSet(object.account) ? SubscribeUpdateAccountInfo.fromJSON(object.account) : undefined, - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, isStartup: isSet(object.isStartup) ? globalThis.Boolean(object.isStartup) : false, }; }, @@ -2645,8 +2754,8 @@ export const SubscribeUpdateAccount = { if (message.account !== undefined) { obj.account = SubscribeUpdateAccountInfo.toJSON(message.account); } - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } if (message.isStartup !== false) { obj.isStartup = message.isStartup; @@ -2662,7 +2771,7 @@ export const SubscribeUpdateAccount = { message.account = (object.account !== undefined && object.account !== null) ? SubscribeUpdateAccountInfo.fromPartial(object.account) : undefined; - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; message.isStartup = object.isStartup ?? false; return message; }, @@ -2671,22 +2780,25 @@ export const SubscribeUpdateAccount = { function createBaseSubscribeUpdateAccountInfo(): SubscribeUpdateAccountInfo { return { pubkey: new Uint8Array(0), - lamports: "0", + lamports: 0n, owner: new Uint8Array(0), executable: false, - rentEpoch: "0", + rentEpoch: 0n, data: new Uint8Array(0), - writeVersion: "0", + writeVersion: 0n, txnSignature: undefined, }; } -export const SubscribeUpdateAccountInfo = { - encode(message: SubscribeUpdateAccountInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeUpdateAccountInfo: MessageFns = { + encode(message: SubscribeUpdateAccountInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.pubkey.length !== 0) { writer.uint32(10).bytes(message.pubkey); } - if (message.lamports !== "0") { + if (message.lamports !== 0n) { + if (BigInt.asUintN(64, message.lamports) !== message.lamports) { + throw new globalThis.Error("value provided for field message.lamports of type uint64 too large"); + } writer.uint32(16).uint64(message.lamports); } if (message.owner.length !== 0) { @@ -2695,13 +2807,19 @@ export const SubscribeUpdateAccountInfo = { if (message.executable !== false) { writer.uint32(32).bool(message.executable); } - if (message.rentEpoch !== "0") { + if (message.rentEpoch !== 0n) { + if (BigInt.asUintN(64, message.rentEpoch) !== message.rentEpoch) { + throw new globalThis.Error("value provided for field message.rentEpoch of type uint64 too large"); + } writer.uint32(40).uint64(message.rentEpoch); } if (message.data.length !== 0) { writer.uint32(50).bytes(message.data); } - if (message.writeVersion !== "0") { + if (message.writeVersion !== 0n) { + if (BigInt.asUintN(64, message.writeVersion) !== message.writeVersion) { + throw new globalThis.Error("value provided for field message.writeVersion of type uint64 too large"); + } writer.uint32(56).uint64(message.writeVersion); } if (message.txnSignature !== undefined) { @@ -2710,74 +2828,82 @@ export const SubscribeUpdateAccountInfo = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateAccountInfo { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateAccountInfo { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateAccountInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.pubkey = reader.bytes(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.lamports = longToString(reader.uint64() as Long); + message.lamports = reader.uint64() as bigint; continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.owner = reader.bytes(); continue; - case 4: + } + case 4: { if (tag !== 32) { break; } message.executable = reader.bool(); continue; - case 5: + } + case 5: { if (tag !== 40) { break; } - message.rentEpoch = longToString(reader.uint64() as Long); + message.rentEpoch = reader.uint64() as bigint; continue; - case 6: + } + case 6: { if (tag !== 50) { break; } message.data = reader.bytes(); continue; - case 7: + } + case 7: { if (tag !== 56) { break; } - message.writeVersion = longToString(reader.uint64() as Long); + message.writeVersion = reader.uint64() as bigint; continue; - case 8: + } + case 8: { if (tag !== 66) { break; } message.txnSignature = reader.bytes(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2785,12 +2911,12 @@ export const SubscribeUpdateAccountInfo = { fromJSON(object: any): SubscribeUpdateAccountInfo { return { pubkey: isSet(object.pubkey) ? bytesFromBase64(object.pubkey) : new Uint8Array(0), - lamports: isSet(object.lamports) ? globalThis.String(object.lamports) : "0", + lamports: isSet(object.lamports) ? BigInt(object.lamports) : 0n, owner: isSet(object.owner) ? bytesFromBase64(object.owner) : new Uint8Array(0), executable: isSet(object.executable) ? globalThis.Boolean(object.executable) : false, - rentEpoch: isSet(object.rentEpoch) ? globalThis.String(object.rentEpoch) : "0", + rentEpoch: isSet(object.rentEpoch) ? BigInt(object.rentEpoch) : 0n, data: isSet(object.data) ? bytesFromBase64(object.data) : new Uint8Array(0), - writeVersion: isSet(object.writeVersion) ? globalThis.String(object.writeVersion) : "0", + writeVersion: isSet(object.writeVersion) ? BigInt(object.writeVersion) : 0n, txnSignature: isSet(object.txnSignature) ? bytesFromBase64(object.txnSignature) : undefined, }; }, @@ -2800,8 +2926,8 @@ export const SubscribeUpdateAccountInfo = { if (message.pubkey.length !== 0) { obj.pubkey = base64FromBytes(message.pubkey); } - if (message.lamports !== "0") { - obj.lamports = message.lamports; + if (message.lamports !== 0n) { + obj.lamports = message.lamports.toString(); } if (message.owner.length !== 0) { obj.owner = base64FromBytes(message.owner); @@ -2809,14 +2935,14 @@ export const SubscribeUpdateAccountInfo = { if (message.executable !== false) { obj.executable = message.executable; } - if (message.rentEpoch !== "0") { - obj.rentEpoch = message.rentEpoch; + if (message.rentEpoch !== 0n) { + obj.rentEpoch = message.rentEpoch.toString(); } if (message.data.length !== 0) { obj.data = base64FromBytes(message.data); } - if (message.writeVersion !== "0") { - obj.writeVersion = message.writeVersion; + if (message.writeVersion !== 0n) { + obj.writeVersion = message.writeVersion.toString(); } if (message.txnSignature !== undefined) { obj.txnSignature = base64FromBytes(message.txnSignature); @@ -2830,27 +2956,33 @@ export const SubscribeUpdateAccountInfo = { fromPartial, I>>(object: I): SubscribeUpdateAccountInfo { const message = createBaseSubscribeUpdateAccountInfo(); message.pubkey = object.pubkey ?? new Uint8Array(0); - message.lamports = object.lamports ?? "0"; + message.lamports = object.lamports ?? 0n; message.owner = object.owner ?? new Uint8Array(0); message.executable = object.executable ?? false; - message.rentEpoch = object.rentEpoch ?? "0"; + message.rentEpoch = object.rentEpoch ?? 0n; message.data = object.data ?? new Uint8Array(0); - message.writeVersion = object.writeVersion ?? "0"; + message.writeVersion = object.writeVersion ?? 0n; message.txnSignature = object.txnSignature ?? undefined; return message; }, }; function createBaseSubscribeUpdateSlot(): SubscribeUpdateSlot { - return { slot: "0", parent: undefined, status: 0, deadError: undefined }; + return { slot: 0n, parent: undefined, status: 0, deadError: undefined }; } -export const SubscribeUpdateSlot = { - encode(message: SubscribeUpdateSlot, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== "0") { +export const SubscribeUpdateSlot: MessageFns = { + encode(message: SubscribeUpdateSlot, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(8).uint64(message.slot); } if (message.parent !== undefined) { + if (BigInt.asUintN(64, message.parent) !== message.parent) { + throw new globalThis.Error("value provided for field message.parent of type uint64 too large"); + } writer.uint32(16).uint64(message.parent); } if (message.status !== 0) { @@ -2862,54 +2994,58 @@ export const SubscribeUpdateSlot = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateSlot { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateSlot { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateSlot(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.parent = longToString(reader.uint64() as Long); + message.parent = reader.uint64() as bigint; continue; - case 3: + } + case 3: { if (tag !== 24) { break; } message.status = reader.int32() as any; continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.deadError = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): SubscribeUpdateSlot { return { - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", - parent: isSet(object.parent) ? globalThis.String(object.parent) : undefined, + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, + parent: isSet(object.parent) ? BigInt(object.parent) : undefined, status: isSet(object.status) ? slotStatusFromJSON(object.status) : 0, deadError: isSet(object.deadError) ? globalThis.String(object.deadError) : undefined, }; @@ -2917,11 +3053,11 @@ export const SubscribeUpdateSlot = { toJSON(message: SubscribeUpdateSlot): unknown { const obj: any = {}; - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } if (message.parent !== undefined) { - obj.parent = message.parent; + obj.parent = message.parent.toString(); } if (message.status !== 0) { obj.status = slotStatusToJSON(message.status); @@ -2937,7 +3073,7 @@ export const SubscribeUpdateSlot = { }, fromPartial, I>>(object: I): SubscribeUpdateSlot { const message = createBaseSubscribeUpdateSlot(); - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; message.parent = object.parent ?? undefined; message.status = object.status ?? 0; message.deadError = object.deadError ?? undefined; @@ -2946,46 +3082,51 @@ export const SubscribeUpdateSlot = { }; function createBaseSubscribeUpdateTransaction(): SubscribeUpdateTransaction { - return { transaction: undefined, slot: "0" }; + return { transaction: undefined, slot: 0n }; } -export const SubscribeUpdateTransaction = { - encode(message: SubscribeUpdateTransaction, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeUpdateTransaction: MessageFns = { + encode(message: SubscribeUpdateTransaction, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.transaction !== undefined) { - SubscribeUpdateTransactionInfo.encode(message.transaction, writer.uint32(10).fork()).ldelim(); + SubscribeUpdateTransactionInfo.encode(message.transaction, writer.uint32(10).fork()).join(); } - if (message.slot !== "0") { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(16).uint64(message.slot); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateTransaction { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateTransaction { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateTransaction(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.transaction = SubscribeUpdateTransactionInfo.decode(reader, reader.uint32()); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2993,7 +3134,7 @@ export const SubscribeUpdateTransaction = { fromJSON(object: any): SubscribeUpdateTransaction { return { transaction: isSet(object.transaction) ? SubscribeUpdateTransactionInfo.fromJSON(object.transaction) : undefined, - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, }; }, @@ -3002,8 +3143,8 @@ export const SubscribeUpdateTransaction = { if (message.transaction !== undefined) { obj.transaction = SubscribeUpdateTransactionInfo.toJSON(message.transaction); } - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } return obj; }, @@ -3016,17 +3157,17 @@ export const SubscribeUpdateTransaction = { message.transaction = (object.transaction !== undefined && object.transaction !== null) ? SubscribeUpdateTransactionInfo.fromPartial(object.transaction) : undefined; - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; return message; }, }; function createBaseSubscribeUpdateTransactionInfo(): SubscribeUpdateTransactionInfo { - return { signature: new Uint8Array(0), isVote: false, transaction: undefined, meta: undefined, index: "0" }; + return { signature: new Uint8Array(0), isVote: false, transaction: undefined, meta: undefined, index: 0n }; } -export const SubscribeUpdateTransactionInfo = { - encode(message: SubscribeUpdateTransactionInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeUpdateTransactionInfo: MessageFns = { + encode(message: SubscribeUpdateTransactionInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.signature.length !== 0) { writer.uint32(10).bytes(message.signature); } @@ -3034,64 +3175,72 @@ export const SubscribeUpdateTransactionInfo = { writer.uint32(16).bool(message.isVote); } if (message.transaction !== undefined) { - Transaction.encode(message.transaction, writer.uint32(26).fork()).ldelim(); + Transaction.encode(message.transaction, writer.uint32(26).fork()).join(); } if (message.meta !== undefined) { - TransactionStatusMeta.encode(message.meta, writer.uint32(34).fork()).ldelim(); + TransactionStatusMeta.encode(message.meta, writer.uint32(34).fork()).join(); } - if (message.index !== "0") { + if (message.index !== 0n) { + if (BigInt.asUintN(64, message.index) !== message.index) { + throw new globalThis.Error("value provided for field message.index of type uint64 too large"); + } writer.uint32(40).uint64(message.index); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateTransactionInfo { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateTransactionInfo { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateTransactionInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.signature = reader.bytes(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.isVote = reader.bool(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.transaction = Transaction.decode(reader, reader.uint32()); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.meta = TransactionStatusMeta.decode(reader, reader.uint32()); continue; - case 5: + } + case 5: { if (tag !== 40) { break; } - message.index = longToString(reader.uint64() as Long); + message.index = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -3102,7 +3251,7 @@ export const SubscribeUpdateTransactionInfo = { isVote: isSet(object.isVote) ? globalThis.Boolean(object.isVote) : false, transaction: isSet(object.transaction) ? Transaction.fromJSON(object.transaction) : undefined, meta: isSet(object.meta) ? TransactionStatusMeta.fromJSON(object.meta) : undefined, - index: isSet(object.index) ? globalThis.String(object.index) : "0", + index: isSet(object.index) ? BigInt(object.index) : 0n, }; }, @@ -3120,8 +3269,8 @@ export const SubscribeUpdateTransactionInfo = { if (message.meta !== undefined) { obj.meta = TransactionStatusMeta.toJSON(message.meta); } - if (message.index !== "0") { - obj.index = message.index; + if (message.index !== 0n) { + obj.index = message.index.toString(); } return obj; }, @@ -3141,18 +3290,21 @@ export const SubscribeUpdateTransactionInfo = { message.meta = (object.meta !== undefined && object.meta !== null) ? TransactionStatusMeta.fromPartial(object.meta) : undefined; - message.index = object.index ?? "0"; + message.index = object.index ?? 0n; return message; }, }; function createBaseSubscribeUpdateTransactionStatus(): SubscribeUpdateTransactionStatus { - return { slot: "0", signature: new Uint8Array(0), isVote: false, index: "0", err: undefined }; + return { slot: 0n, signature: new Uint8Array(0), isVote: false, index: 0n, err: undefined }; } -export const SubscribeUpdateTransactionStatus = { - encode(message: SubscribeUpdateTransactionStatus, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== "0") { +export const SubscribeUpdateTransactionStatus: MessageFns = { + encode(message: SubscribeUpdateTransactionStatus, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(8).uint64(message.slot); } if (message.signature.length !== 0) { @@ -3161,80 +3313,88 @@ export const SubscribeUpdateTransactionStatus = { if (message.isVote !== false) { writer.uint32(24).bool(message.isVote); } - if (message.index !== "0") { + if (message.index !== 0n) { + if (BigInt.asUintN(64, message.index) !== message.index) { + throw new globalThis.Error("value provided for field message.index of type uint64 too large"); + } writer.uint32(32).uint64(message.index); } if (message.err !== undefined) { - TransactionError.encode(message.err, writer.uint32(42).fork()).ldelim(); + TransactionError.encode(message.err, writer.uint32(42).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateTransactionStatus { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateTransactionStatus { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateTransactionStatus(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.signature = reader.bytes(); continue; - case 3: + } + case 3: { if (tag !== 24) { break; } message.isVote = reader.bool(); continue; - case 4: + } + case 4: { if (tag !== 32) { break; } - message.index = longToString(reader.uint64() as Long); + message.index = reader.uint64() as bigint; continue; - case 5: + } + case 5: { if (tag !== 42) { break; } message.err = TransactionError.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): SubscribeUpdateTransactionStatus { return { - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, signature: isSet(object.signature) ? bytesFromBase64(object.signature) : new Uint8Array(0), isVote: isSet(object.isVote) ? globalThis.Boolean(object.isVote) : false, - index: isSet(object.index) ? globalThis.String(object.index) : "0", + index: isSet(object.index) ? BigInt(object.index) : 0n, err: isSet(object.err) ? TransactionError.fromJSON(object.err) : undefined, }; }, toJSON(message: SubscribeUpdateTransactionStatus): unknown { const obj: any = {}; - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } if (message.signature.length !== 0) { obj.signature = base64FromBytes(message.signature); @@ -3242,8 +3402,8 @@ export const SubscribeUpdateTransactionStatus = { if (message.isVote !== false) { obj.isVote = message.isVote; } - if (message.index !== "0") { - obj.index = message.index; + if (message.index !== 0n) { + obj.index = message.index.toString(); } if (message.err !== undefined) { obj.err = TransactionError.toJSON(message.err); @@ -3260,10 +3420,10 @@ export const SubscribeUpdateTransactionStatus = { object: I, ): SubscribeUpdateTransactionStatus { const message = createBaseSubscribeUpdateTransactionStatus(); - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; message.signature = object.signature ?? new Uint8Array(0); message.isVote = object.isVote ?? false; - message.index = object.index ?? "0"; + message.index = object.index ?? 0n; message.err = (object.err !== undefined && object.err !== null) ? TransactionError.fromPartial(object.err) : undefined; @@ -3273,193 +3433,221 @@ export const SubscribeUpdateTransactionStatus = { function createBaseSubscribeUpdateBlock(): SubscribeUpdateBlock { return { - slot: "0", + slot: 0n, blockhash: "", rewards: undefined, blockTime: undefined, blockHeight: undefined, - parentSlot: "0", + parentSlot: 0n, parentBlockhash: "", - executedTransactionCount: "0", + executedTransactionCount: 0n, transactions: [], - updatedAccountCount: "0", + updatedAccountCount: 0n, accounts: [], - entriesCount: "0", + entriesCount: 0n, entries: [], }; } -export const SubscribeUpdateBlock = { - encode(message: SubscribeUpdateBlock, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== "0") { +export const SubscribeUpdateBlock: MessageFns = { + encode(message: SubscribeUpdateBlock, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(8).uint64(message.slot); } if (message.blockhash !== "") { writer.uint32(18).string(message.blockhash); } if (message.rewards !== undefined) { - Rewards.encode(message.rewards, writer.uint32(26).fork()).ldelim(); + Rewards.encode(message.rewards, writer.uint32(26).fork()).join(); } if (message.blockTime !== undefined) { - UnixTimestamp.encode(message.blockTime, writer.uint32(34).fork()).ldelim(); + UnixTimestamp.encode(message.blockTime, writer.uint32(34).fork()).join(); } if (message.blockHeight !== undefined) { - BlockHeight.encode(message.blockHeight, writer.uint32(42).fork()).ldelim(); + BlockHeight.encode(message.blockHeight, writer.uint32(42).fork()).join(); } - if (message.parentSlot !== "0") { + if (message.parentSlot !== 0n) { + if (BigInt.asUintN(64, message.parentSlot) !== message.parentSlot) { + throw new globalThis.Error("value provided for field message.parentSlot of type uint64 too large"); + } writer.uint32(56).uint64(message.parentSlot); } if (message.parentBlockhash !== "") { writer.uint32(66).string(message.parentBlockhash); } - if (message.executedTransactionCount !== "0") { + if (message.executedTransactionCount !== 0n) { + if (BigInt.asUintN(64, message.executedTransactionCount) !== message.executedTransactionCount) { + throw new globalThis.Error( + "value provided for field message.executedTransactionCount of type uint64 too large", + ); + } writer.uint32(72).uint64(message.executedTransactionCount); } for (const v of message.transactions) { - SubscribeUpdateTransactionInfo.encode(v!, writer.uint32(50).fork()).ldelim(); + SubscribeUpdateTransactionInfo.encode(v!, writer.uint32(50).fork()).join(); } - if (message.updatedAccountCount !== "0") { + if (message.updatedAccountCount !== 0n) { + if (BigInt.asUintN(64, message.updatedAccountCount) !== message.updatedAccountCount) { + throw new globalThis.Error("value provided for field message.updatedAccountCount of type uint64 too large"); + } writer.uint32(80).uint64(message.updatedAccountCount); } for (const v of message.accounts) { - SubscribeUpdateAccountInfo.encode(v!, writer.uint32(90).fork()).ldelim(); + SubscribeUpdateAccountInfo.encode(v!, writer.uint32(90).fork()).join(); } - if (message.entriesCount !== "0") { + if (message.entriesCount !== 0n) { + if (BigInt.asUintN(64, message.entriesCount) !== message.entriesCount) { + throw new globalThis.Error("value provided for field message.entriesCount of type uint64 too large"); + } writer.uint32(96).uint64(message.entriesCount); } for (const v of message.entries) { - SubscribeUpdateEntry.encode(v!, writer.uint32(106).fork()).ldelim(); + SubscribeUpdateEntry.encode(v!, writer.uint32(106).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateBlock { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateBlock { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateBlock(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.blockhash = reader.string(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.rewards = Rewards.decode(reader, reader.uint32()); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.blockTime = UnixTimestamp.decode(reader, reader.uint32()); continue; - case 5: + } + case 5: { if (tag !== 42) { break; } message.blockHeight = BlockHeight.decode(reader, reader.uint32()); continue; - case 7: + } + case 7: { if (tag !== 56) { break; } - message.parentSlot = longToString(reader.uint64() as Long); + message.parentSlot = reader.uint64() as bigint; continue; - case 8: + } + case 8: { if (tag !== 66) { break; } message.parentBlockhash = reader.string(); continue; - case 9: + } + case 9: { if (tag !== 72) { break; } - message.executedTransactionCount = longToString(reader.uint64() as Long); + message.executedTransactionCount = reader.uint64() as bigint; continue; - case 6: + } + case 6: { if (tag !== 50) { break; } message.transactions.push(SubscribeUpdateTransactionInfo.decode(reader, reader.uint32())); continue; - case 10: + } + case 10: { if (tag !== 80) { break; } - message.updatedAccountCount = longToString(reader.uint64() as Long); + message.updatedAccountCount = reader.uint64() as bigint; continue; - case 11: + } + case 11: { if (tag !== 90) { break; } message.accounts.push(SubscribeUpdateAccountInfo.decode(reader, reader.uint32())); continue; - case 12: + } + case 12: { if (tag !== 96) { break; } - message.entriesCount = longToString(reader.uint64() as Long); + message.entriesCount = reader.uint64() as bigint; continue; - case 13: + } + case 13: { if (tag !== 106) { break; } message.entries.push(SubscribeUpdateEntry.decode(reader, reader.uint32())); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): SubscribeUpdateBlock { return { - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, blockhash: isSet(object.blockhash) ? globalThis.String(object.blockhash) : "", rewards: isSet(object.rewards) ? Rewards.fromJSON(object.rewards) : undefined, blockTime: isSet(object.blockTime) ? UnixTimestamp.fromJSON(object.blockTime) : undefined, blockHeight: isSet(object.blockHeight) ? BlockHeight.fromJSON(object.blockHeight) : undefined, - parentSlot: isSet(object.parentSlot) ? globalThis.String(object.parentSlot) : "0", + parentSlot: isSet(object.parentSlot) ? BigInt(object.parentSlot) : 0n, parentBlockhash: isSet(object.parentBlockhash) ? globalThis.String(object.parentBlockhash) : "", - executedTransactionCount: isSet(object.executedTransactionCount) - ? globalThis.String(object.executedTransactionCount) - : "0", + executedTransactionCount: isSet(object.executedTransactionCount) ? BigInt(object.executedTransactionCount) : 0n, transactions: globalThis.Array.isArray(object?.transactions) ? object.transactions.map((e: any) => SubscribeUpdateTransactionInfo.fromJSON(e)) : [], - updatedAccountCount: isSet(object.updatedAccountCount) ? globalThis.String(object.updatedAccountCount) : "0", + updatedAccountCount: isSet(object.updatedAccountCount) ? BigInt(object.updatedAccountCount) : 0n, accounts: globalThis.Array.isArray(object?.accounts) ? object.accounts.map((e: any) => SubscribeUpdateAccountInfo.fromJSON(e)) : [], - entriesCount: isSet(object.entriesCount) ? globalThis.String(object.entriesCount) : "0", + entriesCount: isSet(object.entriesCount) ? BigInt(object.entriesCount) : 0n, entries: globalThis.Array.isArray(object?.entries) ? object.entries.map((e: any) => SubscribeUpdateEntry.fromJSON(e)) : [], @@ -3468,8 +3656,8 @@ export const SubscribeUpdateBlock = { toJSON(message: SubscribeUpdateBlock): unknown { const obj: any = {}; - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } if (message.blockhash !== "") { obj.blockhash = message.blockhash; @@ -3483,26 +3671,26 @@ export const SubscribeUpdateBlock = { if (message.blockHeight !== undefined) { obj.blockHeight = BlockHeight.toJSON(message.blockHeight); } - if (message.parentSlot !== "0") { - obj.parentSlot = message.parentSlot; + if (message.parentSlot !== 0n) { + obj.parentSlot = message.parentSlot.toString(); } if (message.parentBlockhash !== "") { obj.parentBlockhash = message.parentBlockhash; } - if (message.executedTransactionCount !== "0") { - obj.executedTransactionCount = message.executedTransactionCount; + if (message.executedTransactionCount !== 0n) { + obj.executedTransactionCount = message.executedTransactionCount.toString(); } if (message.transactions?.length) { obj.transactions = message.transactions.map((e) => SubscribeUpdateTransactionInfo.toJSON(e)); } - if (message.updatedAccountCount !== "0") { - obj.updatedAccountCount = message.updatedAccountCount; + if (message.updatedAccountCount !== 0n) { + obj.updatedAccountCount = message.updatedAccountCount.toString(); } if (message.accounts?.length) { obj.accounts = message.accounts.map((e) => SubscribeUpdateAccountInfo.toJSON(e)); } - if (message.entriesCount !== "0") { - obj.entriesCount = message.entriesCount; + if (message.entriesCount !== 0n) { + obj.entriesCount = message.entriesCount.toString(); } if (message.entries?.length) { obj.entries = message.entries.map((e) => SubscribeUpdateEntry.toJSON(e)); @@ -3515,7 +3703,7 @@ export const SubscribeUpdateBlock = { }, fromPartial, I>>(object: I): SubscribeUpdateBlock { const message = createBaseSubscribeUpdateBlock(); - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; message.blockhash = object.blockhash ?? ""; message.rewards = (object.rewards !== undefined && object.rewards !== null) ? Rewards.fromPartial(object.rewards) @@ -3526,13 +3714,13 @@ export const SubscribeUpdateBlock = { message.blockHeight = (object.blockHeight !== undefined && object.blockHeight !== null) ? BlockHeight.fromPartial(object.blockHeight) : undefined; - message.parentSlot = object.parentSlot ?? "0"; + message.parentSlot = object.parentSlot ?? 0n; message.parentBlockhash = object.parentBlockhash ?? ""; - message.executedTransactionCount = object.executedTransactionCount ?? "0"; + message.executedTransactionCount = object.executedTransactionCount ?? 0n; message.transactions = object.transactions?.map((e) => SubscribeUpdateTransactionInfo.fromPartial(e)) || []; - message.updatedAccountCount = object.updatedAccountCount ?? "0"; + message.updatedAccountCount = object.updatedAccountCount ?? 0n; message.accounts = object.accounts?.map((e) => SubscribeUpdateAccountInfo.fromPartial(e)) || []; - message.entriesCount = object.entriesCount ?? "0"; + message.entriesCount = object.entriesCount ?? 0n; message.entries = object.entries?.map((e) => SubscribeUpdateEntry.fromPartial(e)) || []; return message; }, @@ -3540,149 +3728,170 @@ export const SubscribeUpdateBlock = { function createBaseSubscribeUpdateBlockMeta(): SubscribeUpdateBlockMeta { return { - slot: "0", + slot: 0n, blockhash: "", rewards: undefined, blockTime: undefined, blockHeight: undefined, - parentSlot: "0", + parentSlot: 0n, parentBlockhash: "", - executedTransactionCount: "0", - entriesCount: "0", + executedTransactionCount: 0n, + entriesCount: 0n, }; } -export const SubscribeUpdateBlockMeta = { - encode(message: SubscribeUpdateBlockMeta, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== "0") { +export const SubscribeUpdateBlockMeta: MessageFns = { + encode(message: SubscribeUpdateBlockMeta, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(8).uint64(message.slot); } if (message.blockhash !== "") { writer.uint32(18).string(message.blockhash); } if (message.rewards !== undefined) { - Rewards.encode(message.rewards, writer.uint32(26).fork()).ldelim(); + Rewards.encode(message.rewards, writer.uint32(26).fork()).join(); } if (message.blockTime !== undefined) { - UnixTimestamp.encode(message.blockTime, writer.uint32(34).fork()).ldelim(); + UnixTimestamp.encode(message.blockTime, writer.uint32(34).fork()).join(); } if (message.blockHeight !== undefined) { - BlockHeight.encode(message.blockHeight, writer.uint32(42).fork()).ldelim(); + BlockHeight.encode(message.blockHeight, writer.uint32(42).fork()).join(); } - if (message.parentSlot !== "0") { + if (message.parentSlot !== 0n) { + if (BigInt.asUintN(64, message.parentSlot) !== message.parentSlot) { + throw new globalThis.Error("value provided for field message.parentSlot of type uint64 too large"); + } writer.uint32(48).uint64(message.parentSlot); } if (message.parentBlockhash !== "") { writer.uint32(58).string(message.parentBlockhash); } - if (message.executedTransactionCount !== "0") { + if (message.executedTransactionCount !== 0n) { + if (BigInt.asUintN(64, message.executedTransactionCount) !== message.executedTransactionCount) { + throw new globalThis.Error( + "value provided for field message.executedTransactionCount of type uint64 too large", + ); + } writer.uint32(64).uint64(message.executedTransactionCount); } - if (message.entriesCount !== "0") { + if (message.entriesCount !== 0n) { + if (BigInt.asUintN(64, message.entriesCount) !== message.entriesCount) { + throw new globalThis.Error("value provided for field message.entriesCount of type uint64 too large"); + } writer.uint32(72).uint64(message.entriesCount); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateBlockMeta { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateBlockMeta { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateBlockMeta(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.blockhash = reader.string(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.rewards = Rewards.decode(reader, reader.uint32()); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.blockTime = UnixTimestamp.decode(reader, reader.uint32()); continue; - case 5: + } + case 5: { if (tag !== 42) { break; } message.blockHeight = BlockHeight.decode(reader, reader.uint32()); continue; - case 6: + } + case 6: { if (tag !== 48) { break; } - message.parentSlot = longToString(reader.uint64() as Long); + message.parentSlot = reader.uint64() as bigint; continue; - case 7: + } + case 7: { if (tag !== 58) { break; } message.parentBlockhash = reader.string(); continue; - case 8: + } + case 8: { if (tag !== 64) { break; } - message.executedTransactionCount = longToString(reader.uint64() as Long); + message.executedTransactionCount = reader.uint64() as bigint; continue; - case 9: + } + case 9: { if (tag !== 72) { break; } - message.entriesCount = longToString(reader.uint64() as Long); + message.entriesCount = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): SubscribeUpdateBlockMeta { return { - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, blockhash: isSet(object.blockhash) ? globalThis.String(object.blockhash) : "", rewards: isSet(object.rewards) ? Rewards.fromJSON(object.rewards) : undefined, blockTime: isSet(object.blockTime) ? UnixTimestamp.fromJSON(object.blockTime) : undefined, blockHeight: isSet(object.blockHeight) ? BlockHeight.fromJSON(object.blockHeight) : undefined, - parentSlot: isSet(object.parentSlot) ? globalThis.String(object.parentSlot) : "0", + parentSlot: isSet(object.parentSlot) ? BigInt(object.parentSlot) : 0n, parentBlockhash: isSet(object.parentBlockhash) ? globalThis.String(object.parentBlockhash) : "", - executedTransactionCount: isSet(object.executedTransactionCount) - ? globalThis.String(object.executedTransactionCount) - : "0", - entriesCount: isSet(object.entriesCount) ? globalThis.String(object.entriesCount) : "0", + executedTransactionCount: isSet(object.executedTransactionCount) ? BigInt(object.executedTransactionCount) : 0n, + entriesCount: isSet(object.entriesCount) ? BigInt(object.entriesCount) : 0n, }; }, toJSON(message: SubscribeUpdateBlockMeta): unknown { const obj: any = {}; - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } if (message.blockhash !== "") { obj.blockhash = message.blockhash; @@ -3696,17 +3905,17 @@ export const SubscribeUpdateBlockMeta = { if (message.blockHeight !== undefined) { obj.blockHeight = BlockHeight.toJSON(message.blockHeight); } - if (message.parentSlot !== "0") { - obj.parentSlot = message.parentSlot; + if (message.parentSlot !== 0n) { + obj.parentSlot = message.parentSlot.toString(); } if (message.parentBlockhash !== "") { obj.parentBlockhash = message.parentBlockhash; } - if (message.executedTransactionCount !== "0") { - obj.executedTransactionCount = message.executedTransactionCount; + if (message.executedTransactionCount !== 0n) { + obj.executedTransactionCount = message.executedTransactionCount.toString(); } - if (message.entriesCount !== "0") { - obj.entriesCount = message.entriesCount; + if (message.entriesCount !== 0n) { + obj.entriesCount = message.entriesCount.toString(); } return obj; }, @@ -3716,7 +3925,7 @@ export const SubscribeUpdateBlockMeta = { }, fromPartial, I>>(object: I): SubscribeUpdateBlockMeta { const message = createBaseSubscribeUpdateBlockMeta(); - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; message.blockhash = object.blockhash ?? ""; message.rewards = (object.rewards !== undefined && object.rewards !== null) ? Rewards.fromPartial(object.rewards) @@ -3727,140 +3936,161 @@ export const SubscribeUpdateBlockMeta = { message.blockHeight = (object.blockHeight !== undefined && object.blockHeight !== null) ? BlockHeight.fromPartial(object.blockHeight) : undefined; - message.parentSlot = object.parentSlot ?? "0"; + message.parentSlot = object.parentSlot ?? 0n; message.parentBlockhash = object.parentBlockhash ?? ""; - message.executedTransactionCount = object.executedTransactionCount ?? "0"; - message.entriesCount = object.entriesCount ?? "0"; + message.executedTransactionCount = object.executedTransactionCount ?? 0n; + message.entriesCount = object.entriesCount ?? 0n; return message; }, }; function createBaseSubscribeUpdateEntry(): SubscribeUpdateEntry { return { - slot: "0", - index: "0", - numHashes: "0", + slot: 0n, + index: 0n, + numHashes: 0n, hash: new Uint8Array(0), - executedTransactionCount: "0", - startingTransactionIndex: "0", + executedTransactionCount: 0n, + startingTransactionIndex: 0n, }; } -export const SubscribeUpdateEntry = { - encode(message: SubscribeUpdateEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== "0") { +export const SubscribeUpdateEntry: MessageFns = { + encode(message: SubscribeUpdateEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(8).uint64(message.slot); } - if (message.index !== "0") { + if (message.index !== 0n) { + if (BigInt.asUintN(64, message.index) !== message.index) { + throw new globalThis.Error("value provided for field message.index of type uint64 too large"); + } writer.uint32(16).uint64(message.index); } - if (message.numHashes !== "0") { + if (message.numHashes !== 0n) { + if (BigInt.asUintN(64, message.numHashes) !== message.numHashes) { + throw new globalThis.Error("value provided for field message.numHashes of type uint64 too large"); + } writer.uint32(24).uint64(message.numHashes); } if (message.hash.length !== 0) { writer.uint32(34).bytes(message.hash); } - if (message.executedTransactionCount !== "0") { + if (message.executedTransactionCount !== 0n) { + if (BigInt.asUintN(64, message.executedTransactionCount) !== message.executedTransactionCount) { + throw new globalThis.Error( + "value provided for field message.executedTransactionCount of type uint64 too large", + ); + } writer.uint32(40).uint64(message.executedTransactionCount); } - if (message.startingTransactionIndex !== "0") { + if (message.startingTransactionIndex !== 0n) { + if (BigInt.asUintN(64, message.startingTransactionIndex) !== message.startingTransactionIndex) { + throw new globalThis.Error( + "value provided for field message.startingTransactionIndex of type uint64 too large", + ); + } writer.uint32(48).uint64(message.startingTransactionIndex); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdateEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdateEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdateEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.index = longToString(reader.uint64() as Long); + message.index = reader.uint64() as bigint; continue; - case 3: + } + case 3: { if (tag !== 24) { break; } - message.numHashes = longToString(reader.uint64() as Long); + message.numHashes = reader.uint64() as bigint; continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.hash = reader.bytes(); continue; - case 5: + } + case 5: { if (tag !== 40) { break; } - message.executedTransactionCount = longToString(reader.uint64() as Long); + message.executedTransactionCount = reader.uint64() as bigint; continue; - case 6: + } + case 6: { if (tag !== 48) { break; } - message.startingTransactionIndex = longToString(reader.uint64() as Long); + message.startingTransactionIndex = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): SubscribeUpdateEntry { return { - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", - index: isSet(object.index) ? globalThis.String(object.index) : "0", - numHashes: isSet(object.numHashes) ? globalThis.String(object.numHashes) : "0", + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, + index: isSet(object.index) ? BigInt(object.index) : 0n, + numHashes: isSet(object.numHashes) ? BigInt(object.numHashes) : 0n, hash: isSet(object.hash) ? bytesFromBase64(object.hash) : new Uint8Array(0), - executedTransactionCount: isSet(object.executedTransactionCount) - ? globalThis.String(object.executedTransactionCount) - : "0", - startingTransactionIndex: isSet(object.startingTransactionIndex) - ? globalThis.String(object.startingTransactionIndex) - : "0", + executedTransactionCount: isSet(object.executedTransactionCount) ? BigInt(object.executedTransactionCount) : 0n, + startingTransactionIndex: isSet(object.startingTransactionIndex) ? BigInt(object.startingTransactionIndex) : 0n, }; }, toJSON(message: SubscribeUpdateEntry): unknown { const obj: any = {}; - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } - if (message.index !== "0") { - obj.index = message.index; + if (message.index !== 0n) { + obj.index = message.index.toString(); } - if (message.numHashes !== "0") { - obj.numHashes = message.numHashes; + if (message.numHashes !== 0n) { + obj.numHashes = message.numHashes.toString(); } if (message.hash.length !== 0) { obj.hash = base64FromBytes(message.hash); } - if (message.executedTransactionCount !== "0") { - obj.executedTransactionCount = message.executedTransactionCount; + if (message.executedTransactionCount !== 0n) { + obj.executedTransactionCount = message.executedTransactionCount.toString(); } - if (message.startingTransactionIndex !== "0") { - obj.startingTransactionIndex = message.startingTransactionIndex; + if (message.startingTransactionIndex !== 0n) { + obj.startingTransactionIndex = message.startingTransactionIndex.toString(); } return obj; }, @@ -3870,12 +4100,12 @@ export const SubscribeUpdateEntry = { }, fromPartial, I>>(object: I): SubscribeUpdateEntry { const message = createBaseSubscribeUpdateEntry(); - message.slot = object.slot ?? "0"; - message.index = object.index ?? "0"; - message.numHashes = object.numHashes ?? "0"; + message.slot = object.slot ?? 0n; + message.index = object.index ?? 0n; + message.numHashes = object.numHashes ?? 0n; message.hash = object.hash ?? new Uint8Array(0); - message.executedTransactionCount = object.executedTransactionCount ?? "0"; - message.startingTransactionIndex = object.startingTransactionIndex ?? "0"; + message.executedTransactionCount = object.executedTransactionCount ?? 0n; + message.startingTransactionIndex = object.startingTransactionIndex ?? 0n; return message; }, }; @@ -3884,14 +4114,14 @@ function createBaseSubscribeUpdatePing(): SubscribeUpdatePing { return {}; } -export const SubscribeUpdatePing = { - encode(_: SubscribeUpdatePing, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeUpdatePing: MessageFns = { + encode(_: SubscribeUpdatePing, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdatePing { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdatePing { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdatePing(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3900,7 +4130,7 @@ export const SubscribeUpdatePing = { if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -3927,33 +4157,34 @@ function createBaseSubscribeUpdatePong(): SubscribeUpdatePong { return { id: 0 }; } -export const SubscribeUpdatePong = { - encode(message: SubscribeUpdatePong, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const SubscribeUpdatePong: MessageFns = { + encode(message: SubscribeUpdatePong, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.id !== 0) { writer.uint32(8).int32(message.id); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeUpdatePong { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeUpdatePong { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSubscribeUpdatePong(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.id = reader.int32(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -3980,37 +4211,142 @@ export const SubscribeUpdatePong = { }, }; +function createBaseSubscribeReplayInfoRequest(): SubscribeReplayInfoRequest { + return {}; +} + +export const SubscribeReplayInfoRequest: MessageFns = { + encode(_: SubscribeReplayInfoRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeReplayInfoRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSubscribeReplayInfoRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(_: any): SubscribeReplayInfoRequest { + return {}; + }, + + toJSON(_: SubscribeReplayInfoRequest): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): SubscribeReplayInfoRequest { + return SubscribeReplayInfoRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): SubscribeReplayInfoRequest { + const message = createBaseSubscribeReplayInfoRequest(); + return message; + }, +}; + +function createBaseSubscribeReplayInfoResponse(): SubscribeReplayInfoResponse { + return { firstAvailable: undefined }; +} + +export const SubscribeReplayInfoResponse: MessageFns = { + encode(message: SubscribeReplayInfoResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.firstAvailable !== undefined) { + if (BigInt.asUintN(64, message.firstAvailable) !== message.firstAvailable) { + throw new globalThis.Error("value provided for field message.firstAvailable of type uint64 too large"); + } + writer.uint32(8).uint64(message.firstAvailable); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeReplayInfoResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSubscribeReplayInfoResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.firstAvailable = reader.uint64() as bigint; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SubscribeReplayInfoResponse { + return { firstAvailable: isSet(object.firstAvailable) ? BigInt(object.firstAvailable) : undefined }; + }, + + toJSON(message: SubscribeReplayInfoResponse): unknown { + const obj: any = {}; + if (message.firstAvailable !== undefined) { + obj.firstAvailable = message.firstAvailable.toString(); + } + return obj; + }, + + create, I>>(base?: I): SubscribeReplayInfoResponse { + return SubscribeReplayInfoResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SubscribeReplayInfoResponse { + const message = createBaseSubscribeReplayInfoResponse(); + message.firstAvailable = object.firstAvailable ?? undefined; + return message; + }, +}; + function createBasePingRequest(): PingRequest { return { count: 0 }; } -export const PingRequest = { - encode(message: PingRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const PingRequest: MessageFns = { + encode(message: PingRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.count !== 0) { writer.uint32(8).int32(message.count); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): PingRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): PingRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBasePingRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.count = reader.int32(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -4041,33 +4377,34 @@ function createBasePongResponse(): PongResponse { return { count: 0 }; } -export const PongResponse = { - encode(message: PongResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const PongResponse: MessageFns = { + encode(message: PongResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.count !== 0) { writer.uint32(8).int32(message.count); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): PongResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): PongResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBasePongResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.count = reader.int32(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -4098,33 +4435,34 @@ function createBaseGetLatestBlockhashRequest(): GetLatestBlockhashRequest { return { commitment: undefined }; } -export const GetLatestBlockhashRequest = { - encode(message: GetLatestBlockhashRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const GetLatestBlockhashRequest: MessageFns = { + encode(message: GetLatestBlockhashRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.commitment !== undefined) { writer.uint32(8).int32(message.commitment); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetLatestBlockhashRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): GetLatestBlockhashRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetLatestBlockhashRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.commitment = reader.int32() as any; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -4152,78 +4490,87 @@ export const GetLatestBlockhashRequest = { }; function createBaseGetLatestBlockhashResponse(): GetLatestBlockhashResponse { - return { slot: "0", blockhash: "", lastValidBlockHeight: "0" }; + return { slot: 0n, blockhash: "", lastValidBlockHeight: 0n }; } -export const GetLatestBlockhashResponse = { - encode(message: GetLatestBlockhashResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== "0") { +export const GetLatestBlockhashResponse: MessageFns = { + encode(message: GetLatestBlockhashResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(8).uint64(message.slot); } if (message.blockhash !== "") { writer.uint32(18).string(message.blockhash); } - if (message.lastValidBlockHeight !== "0") { + if (message.lastValidBlockHeight !== 0n) { + if (BigInt.asUintN(64, message.lastValidBlockHeight) !== message.lastValidBlockHeight) { + throw new globalThis.Error("value provided for field message.lastValidBlockHeight of type uint64 too large"); + } writer.uint32(24).uint64(message.lastValidBlockHeight); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetLatestBlockhashResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): GetLatestBlockhashResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetLatestBlockhashResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.blockhash = reader.string(); continue; - case 3: + } + case 3: { if (tag !== 24) { break; } - message.lastValidBlockHeight = longToString(reader.uint64() as Long); + message.lastValidBlockHeight = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): GetLatestBlockhashResponse { return { - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, blockhash: isSet(object.blockhash) ? globalThis.String(object.blockhash) : "", - lastValidBlockHeight: isSet(object.lastValidBlockHeight) ? globalThis.String(object.lastValidBlockHeight) : "0", + lastValidBlockHeight: isSet(object.lastValidBlockHeight) ? BigInt(object.lastValidBlockHeight) : 0n, }; }, toJSON(message: GetLatestBlockhashResponse): unknown { const obj: any = {}; - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } if (message.blockhash !== "") { obj.blockhash = message.blockhash; } - if (message.lastValidBlockHeight !== "0") { - obj.lastValidBlockHeight = message.lastValidBlockHeight; + if (message.lastValidBlockHeight !== 0n) { + obj.lastValidBlockHeight = message.lastValidBlockHeight.toString(); } return obj; }, @@ -4233,9 +4580,9 @@ export const GetLatestBlockhashResponse = { }, fromPartial, I>>(object: I): GetLatestBlockhashResponse { const message = createBaseGetLatestBlockhashResponse(); - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; message.blockhash = object.blockhash ?? ""; - message.lastValidBlockHeight = object.lastValidBlockHeight ?? "0"; + message.lastValidBlockHeight = object.lastValidBlockHeight ?? 0n; return message; }, }; @@ -4244,33 +4591,34 @@ function createBaseGetBlockHeightRequest(): GetBlockHeightRequest { return { commitment: undefined }; } -export const GetBlockHeightRequest = { - encode(message: GetBlockHeightRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const GetBlockHeightRequest: MessageFns = { + encode(message: GetBlockHeightRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.commitment !== undefined) { writer.uint32(8).int32(message.commitment); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetBlockHeightRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): GetBlockHeightRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetBlockHeightRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.commitment = reader.int32() as any; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -4298,48 +4646,52 @@ export const GetBlockHeightRequest = { }; function createBaseGetBlockHeightResponse(): GetBlockHeightResponse { - return { blockHeight: "0" }; + return { blockHeight: 0n }; } -export const GetBlockHeightResponse = { - encode(message: GetBlockHeightResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.blockHeight !== "0") { +export const GetBlockHeightResponse: MessageFns = { + encode(message: GetBlockHeightResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockHeight !== 0n) { + if (BigInt.asUintN(64, message.blockHeight) !== message.blockHeight) { + throw new globalThis.Error("value provided for field message.blockHeight of type uint64 too large"); + } writer.uint32(8).uint64(message.blockHeight); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetBlockHeightResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): GetBlockHeightResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetBlockHeightResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.blockHeight = longToString(reader.uint64() as Long); + message.blockHeight = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): GetBlockHeightResponse { - return { blockHeight: isSet(object.blockHeight) ? globalThis.String(object.blockHeight) : "0" }; + return { blockHeight: isSet(object.blockHeight) ? BigInt(object.blockHeight) : 0n }; }, toJSON(message: GetBlockHeightResponse): unknown { const obj: any = {}; - if (message.blockHeight !== "0") { - obj.blockHeight = message.blockHeight; + if (message.blockHeight !== 0n) { + obj.blockHeight = message.blockHeight.toString(); } return obj; }, @@ -4349,7 +4701,7 @@ export const GetBlockHeightResponse = { }, fromPartial, I>>(object: I): GetBlockHeightResponse { const message = createBaseGetBlockHeightResponse(); - message.blockHeight = object.blockHeight ?? "0"; + message.blockHeight = object.blockHeight ?? 0n; return message; }, }; @@ -4358,33 +4710,34 @@ function createBaseGetSlotRequest(): GetSlotRequest { return { commitment: undefined }; } -export const GetSlotRequest = { - encode(message: GetSlotRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const GetSlotRequest: MessageFns = { + encode(message: GetSlotRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.commitment !== undefined) { writer.uint32(8).int32(message.commitment); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetSlotRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): GetSlotRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetSlotRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.commitment = reader.int32() as any; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -4412,48 +4765,52 @@ export const GetSlotRequest = { }; function createBaseGetSlotResponse(): GetSlotResponse { - return { slot: "0" }; + return { slot: 0n }; } -export const GetSlotResponse = { - encode(message: GetSlotResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== "0") { +export const GetSlotResponse: MessageFns = { + encode(message: GetSlotResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(8).uint64(message.slot); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetSlotResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): GetSlotResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetSlotResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): GetSlotResponse { - return { slot: isSet(object.slot) ? globalThis.String(object.slot) : "0" }; + return { slot: isSet(object.slot) ? BigInt(object.slot) : 0n }; }, toJSON(message: GetSlotResponse): unknown { const obj: any = {}; - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } return obj; }, @@ -4463,7 +4820,7 @@ export const GetSlotResponse = { }, fromPartial, I>>(object: I): GetSlotResponse { const message = createBaseGetSlotResponse(); - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; return message; }, }; @@ -4472,14 +4829,14 @@ function createBaseGetVersionRequest(): GetVersionRequest { return {}; } -export const GetVersionRequest = { - encode(_: GetVersionRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const GetVersionRequest: MessageFns = { + encode(_: GetVersionRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetVersionRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): GetVersionRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetVersionRequest(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4488,7 +4845,7 @@ export const GetVersionRequest = { if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -4515,33 +4872,34 @@ function createBaseGetVersionResponse(): GetVersionResponse { return { version: "" }; } -export const GetVersionResponse = { - encode(message: GetVersionResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const GetVersionResponse: MessageFns = { + encode(message: GetVersionResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.version !== "") { writer.uint32(10).string(message.version); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GetVersionResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): GetVersionResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetVersionResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.version = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -4572,8 +4930,8 @@ function createBaseIsBlockhashValidRequest(): IsBlockhashValidRequest { return { blockhash: "", commitment: undefined }; } -export const IsBlockhashValidRequest = { - encode(message: IsBlockhashValidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const IsBlockhashValidRequest: MessageFns = { + encode(message: IsBlockhashValidRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.blockhash !== "") { writer.uint32(10).string(message.blockhash); } @@ -4583,32 +4941,34 @@ export const IsBlockhashValidRequest = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): IsBlockhashValidRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): IsBlockhashValidRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseIsBlockhashValidRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.blockhash = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.commitment = reader.int32() as any; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -4643,12 +5003,15 @@ export const IsBlockhashValidRequest = { }; function createBaseIsBlockhashValidResponse(): IsBlockhashValidResponse { - return { slot: "0", valid: false }; + return { slot: 0n, valid: false }; } -export const IsBlockhashValidResponse = { - encode(message: IsBlockhashValidResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.slot !== "0") { +export const IsBlockhashValidResponse: MessageFns = { + encode(message: IsBlockhashValidResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.slot !== 0n) { + if (BigInt.asUintN(64, message.slot) !== message.slot) { + throw new globalThis.Error("value provided for field message.slot of type uint64 too large"); + } writer.uint32(8).uint64(message.slot); } if (message.valid !== false) { @@ -4657,47 +5020,49 @@ export const IsBlockhashValidResponse = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): IsBlockhashValidResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): IsBlockhashValidResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseIsBlockhashValidResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.slot = longToString(reader.uint64() as Long); + message.slot = reader.uint64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.valid = reader.bool(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): IsBlockhashValidResponse { return { - slot: isSet(object.slot) ? globalThis.String(object.slot) : "0", + slot: isSet(object.slot) ? BigInt(object.slot) : 0n, valid: isSet(object.valid) ? globalThis.Boolean(object.valid) : false, }; }, toJSON(message: IsBlockhashValidResponse): unknown { const obj: any = {}; - if (message.slot !== "0") { - obj.slot = message.slot; + if (message.slot !== 0n) { + obj.slot = message.slot.toString(); } if (message.valid !== false) { obj.valid = message.valid; @@ -4710,7 +5075,7 @@ export const IsBlockhashValidResponse = { }, fromPartial, I>>(object: I): IsBlockhashValidResponse { const message = createBaseIsBlockhashValidResponse(); - message.slot = object.slot ?? "0"; + message.slot = object.slot ?? 0n; message.valid = object.valid ?? false; return message; }, @@ -4722,72 +5087,87 @@ export const GeyserService = { path: "/geyser.Geyser/Subscribe", requestStream: true, responseStream: true, - requestSerialize: (value: SubscribeRequest) => Buffer.from(SubscribeRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => SubscribeRequest.decode(value), - responseSerialize: (value: SubscribeUpdate) => Buffer.from(SubscribeUpdate.encode(value).finish()), - responseDeserialize: (value: Buffer) => SubscribeUpdate.decode(value), + requestSerialize: (value: SubscribeRequest): Buffer => Buffer.from(SubscribeRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): SubscribeRequest => SubscribeRequest.decode(value), + responseSerialize: (value: SubscribeUpdate): Buffer => Buffer.from(SubscribeUpdate.encode(value).finish()), + responseDeserialize: (value: Buffer): SubscribeUpdate => SubscribeUpdate.decode(value), + }, + subscribeReplayInfo: { + path: "/geyser.Geyser/SubscribeReplayInfo", + requestStream: false, + responseStream: false, + requestSerialize: (value: SubscribeReplayInfoRequest): Buffer => + Buffer.from(SubscribeReplayInfoRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): SubscribeReplayInfoRequest => SubscribeReplayInfoRequest.decode(value), + responseSerialize: (value: SubscribeReplayInfoResponse): Buffer => + Buffer.from(SubscribeReplayInfoResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): SubscribeReplayInfoResponse => SubscribeReplayInfoResponse.decode(value), }, ping: { path: "/geyser.Geyser/Ping", requestStream: false, responseStream: false, - requestSerialize: (value: PingRequest) => Buffer.from(PingRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => PingRequest.decode(value), - responseSerialize: (value: PongResponse) => Buffer.from(PongResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => PongResponse.decode(value), + requestSerialize: (value: PingRequest): Buffer => Buffer.from(PingRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): PingRequest => PingRequest.decode(value), + responseSerialize: (value: PongResponse): Buffer => Buffer.from(PongResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): PongResponse => PongResponse.decode(value), }, getLatestBlockhash: { path: "/geyser.Geyser/GetLatestBlockhash", requestStream: false, responseStream: false, - requestSerialize: (value: GetLatestBlockhashRequest) => + requestSerialize: (value: GetLatestBlockhashRequest): Buffer => Buffer.from(GetLatestBlockhashRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => GetLatestBlockhashRequest.decode(value), - responseSerialize: (value: GetLatestBlockhashResponse) => + requestDeserialize: (value: Buffer): GetLatestBlockhashRequest => GetLatestBlockhashRequest.decode(value), + responseSerialize: (value: GetLatestBlockhashResponse): Buffer => Buffer.from(GetLatestBlockhashResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => GetLatestBlockhashResponse.decode(value), + responseDeserialize: (value: Buffer): GetLatestBlockhashResponse => GetLatestBlockhashResponse.decode(value), }, getBlockHeight: { path: "/geyser.Geyser/GetBlockHeight", requestStream: false, responseStream: false, - requestSerialize: (value: GetBlockHeightRequest) => Buffer.from(GetBlockHeightRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => GetBlockHeightRequest.decode(value), - responseSerialize: (value: GetBlockHeightResponse) => Buffer.from(GetBlockHeightResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => GetBlockHeightResponse.decode(value), + requestSerialize: (value: GetBlockHeightRequest): Buffer => + Buffer.from(GetBlockHeightRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetBlockHeightRequest => GetBlockHeightRequest.decode(value), + responseSerialize: (value: GetBlockHeightResponse): Buffer => + Buffer.from(GetBlockHeightResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): GetBlockHeightResponse => GetBlockHeightResponse.decode(value), }, getSlot: { path: "/geyser.Geyser/GetSlot", requestStream: false, responseStream: false, - requestSerialize: (value: GetSlotRequest) => Buffer.from(GetSlotRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => GetSlotRequest.decode(value), - responseSerialize: (value: GetSlotResponse) => Buffer.from(GetSlotResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => GetSlotResponse.decode(value), + requestSerialize: (value: GetSlotRequest): Buffer => Buffer.from(GetSlotRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetSlotRequest => GetSlotRequest.decode(value), + responseSerialize: (value: GetSlotResponse): Buffer => Buffer.from(GetSlotResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): GetSlotResponse => GetSlotResponse.decode(value), }, isBlockhashValid: { path: "/geyser.Geyser/IsBlockhashValid", requestStream: false, responseStream: false, - requestSerialize: (value: IsBlockhashValidRequest) => Buffer.from(IsBlockhashValidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => IsBlockhashValidRequest.decode(value), - responseSerialize: (value: IsBlockhashValidResponse) => + requestSerialize: (value: IsBlockhashValidRequest): Buffer => + Buffer.from(IsBlockhashValidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): IsBlockhashValidRequest => IsBlockhashValidRequest.decode(value), + responseSerialize: (value: IsBlockhashValidResponse): Buffer => Buffer.from(IsBlockhashValidResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => IsBlockhashValidResponse.decode(value), + responseDeserialize: (value: Buffer): IsBlockhashValidResponse => IsBlockhashValidResponse.decode(value), }, getVersion: { path: "/geyser.Geyser/GetVersion", requestStream: false, responseStream: false, - requestSerialize: (value: GetVersionRequest) => Buffer.from(GetVersionRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => GetVersionRequest.decode(value), - responseSerialize: (value: GetVersionResponse) => Buffer.from(GetVersionResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => GetVersionResponse.decode(value), + requestSerialize: (value: GetVersionRequest): Buffer => Buffer.from(GetVersionRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetVersionRequest => GetVersionRequest.decode(value), + responseSerialize: (value: GetVersionResponse): Buffer => Buffer.from(GetVersionResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): GetVersionResponse => GetVersionResponse.decode(value), }, } as const; export interface GeyserServer extends UntypedServiceImplementation { subscribe: handleBidiStreamingCall; + subscribeReplayInfo: handleUnaryCall; ping: handleUnaryCall; getLatestBlockhash: handleUnaryCall; getBlockHeight: handleUnaryCall; @@ -4800,6 +5180,21 @@ export interface GeyserClient extends Client { subscribe(): ClientDuplexStream; subscribe(options: Partial): ClientDuplexStream; subscribe(metadata: Metadata, options?: Partial): ClientDuplexStream; + subscribeReplayInfo( + request: SubscribeReplayInfoRequest, + callback: (error: ServiceError | null, response: SubscribeReplayInfoResponse) => void, + ): ClientUnaryCall; + subscribeReplayInfo( + request: SubscribeReplayInfoRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: SubscribeReplayInfoResponse) => void, + ): ClientUnaryCall; + subscribeReplayInfo( + request: SubscribeReplayInfoRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: SubscribeReplayInfoResponse) => void, + ): ClientUnaryCall; ping(request: PingRequest, callback: (error: ServiceError | null, response: PongResponse) => void): ClientUnaryCall; ping( request: PingRequest, @@ -4920,7 +5315,7 @@ function base64FromBytes(arr: Uint8Array): string { } } -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; +type Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined; export type DeepPartial = T extends Builtin ? T : T extends globalThis.Array ? globalThis.Array> @@ -4933,13 +5328,13 @@ export type Exact = P extends Builtin ? P : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; function toTimestamp(date: Date): Timestamp { - const seconds = Math.trunc(date.getTime() / 1_000).toString(); + const seconds = BigInt(Math.trunc(date.getTime() / 1_000)); const nanos = (date.getTime() % 1_000) * 1_000_000; return { seconds, nanos }; } function fromTimestamp(t: Timestamp): Date { - let millis = (globalThis.Number(t.seconds) || 0) * 1_000; + let millis = (globalThis.Number(t.seconds.toString()) || 0) * 1_000; millis += (t.nanos || 0) / 1_000_000; return new globalThis.Date(millis); } @@ -4954,15 +5349,6 @@ function fromJsonTimestamp(o: any): Date { } } -function longToString(long: Long) { - return long.toString(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - function isObject(value: any): boolean { return typeof value === "object" && value !== null; } @@ -4970,3 +5356,12 @@ function isObject(value: any): boolean { function isSet(value: any): boolean { return value !== null && value !== undefined; } + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/typescript-sdk/src/grpc/google/protobuf/timestamp.ts b/typescript-sdk/src/grpc/google/protobuf/timestamp.ts index b40f088..45ee7c1 100644 --- a/typescript-sdk/src/grpc/google/protobuf/timestamp.ts +++ b/typescript-sdk/src/grpc/google/protobuf/timestamp.ts @@ -1,12 +1,11 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v1.181.2 -// protoc v6.30.0 +// protoc-gen-ts_proto v2.7.7 +// protoc v3.12.4 // source: google/protobuf/timestamp.proto /* eslint-disable */ -import Long from "long"; -import _m0 from "protobufjs/minimal"; +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; export const protobufPackage = "google.protobuf"; @@ -61,15 +60,7 @@ export const protobufPackage = "google.protobuf"; * Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) * .setNanos((int) ((millis % 1000) * 1000000)).build(); * - * Example 5: Compute Timestamp from Java `Instant.now()`. - * - * Instant now = Instant.now(); - * - * Timestamp timestamp = - * Timestamp.newBuilder().setSeconds(now.getEpochSecond()) - * .setNanos(now.getNano()).build(); - * - * Example 6: Compute Timestamp from current time in Python. + * Example 5: Compute Timestamp from current time in Python. * * timestamp = Timestamp() * timestamp.GetCurrentTime() @@ -98,7 +89,7 @@ export const protobufPackage = "google.protobuf"; * [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with * the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use * the Joda Time's [`ISODateTimeFormat.dateTime()`]( - * http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() + * http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D * ) to obtain a formatter capable of generating timestamps in this format. */ export interface Timestamp { @@ -107,7 +98,7 @@ export interface Timestamp { * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to * 9999-12-31T23:59:59Z inclusive. */ - seconds: string; + seconds: bigint; /** * Non-negative fractions of a second at nanosecond resolution. Negative * second values with fractions must still have non-negative nanos values @@ -118,12 +109,15 @@ export interface Timestamp { } function createBaseTimestamp(): Timestamp { - return { seconds: "0", nanos: 0 }; + return { seconds: 0n, nanos: 0 }; } -export const Timestamp = { - encode(message: Timestamp, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.seconds !== "0") { +export const Timestamp: MessageFns = { + encode(message: Timestamp, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.seconds !== 0n) { + if (BigInt.asIntN(64, message.seconds) !== message.seconds) { + throw new globalThis.Error("value provided for field message.seconds of type int64 too large"); + } writer.uint32(8).int64(message.seconds); } if (message.nanos !== 0) { @@ -132,47 +126,49 @@ export const Timestamp = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): Timestamp { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): Timestamp { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTimestamp(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.seconds = longToString(reader.int64() as Long); + message.seconds = reader.int64() as bigint; continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.nanos = reader.int32(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): Timestamp { return { - seconds: isSet(object.seconds) ? globalThis.String(object.seconds) : "0", + seconds: isSet(object.seconds) ? BigInt(object.seconds) : 0n, nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0, }; }, toJSON(message: Timestamp): unknown { const obj: any = {}; - if (message.seconds !== "0") { - obj.seconds = message.seconds; + if (message.seconds !== 0n) { + obj.seconds = message.seconds.toString(); } if (message.nanos !== 0) { obj.nanos = Math.round(message.nanos); @@ -185,13 +181,13 @@ export const Timestamp = { }, fromPartial, I>>(object: I): Timestamp { const message = createBaseTimestamp(); - message.seconds = object.seconds ?? "0"; + message.seconds = object.seconds ?? 0n; message.nanos = object.nanos ?? 0; return message; }, }; -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; +type Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined; export type DeepPartial = T extends Builtin ? T : T extends globalThis.Array ? globalThis.Array> @@ -203,15 +199,15 @@ type KeysOfUnion = T extends T ? keyof T : never; export type Exact = P extends Builtin ? P : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; -function longToString(long: Long) { - return long.toString(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - function isSet(value: any): boolean { return value !== null && value !== undefined; } + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/typescript-sdk/src/grpc/solana-storage.ts b/typescript-sdk/src/grpc/solana-storage.ts index b8ea6de..6291afb 100644 --- a/typescript-sdk/src/grpc/solana-storage.ts +++ b/typescript-sdk/src/grpc/solana-storage.ts @@ -1,12 +1,11 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v1.181.2 -// protoc v6.30.0 +// protoc-gen-ts_proto v2.7.7 +// protoc v3.12.4 // source: solana-storage.proto /* eslint-disable */ -import Long from "long"; -import _m0 from "protobufjs/minimal"; +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; export const protobufPackage = "solana.storage.ConfirmedBlock"; @@ -64,7 +63,7 @@ export function rewardTypeToJSON(object: RewardType): string { export interface ConfirmedBlock { previousBlockhash: string; blockhash: string; - parentSlot: string; + parentSlot: bigint; transactions: ConfirmedTransaction[]; rewards: Reward[]; blockTime: UnixTimestamp | undefined; @@ -105,9 +104,9 @@ export interface MessageAddressTableLookup { export interface TransactionStatusMeta { err: TransactionError | undefined; - fee: string; - preBalances: string[]; - postBalances: string[]; + fee: bigint; + preBalances: bigint[]; + postBalances: bigint[]; innerInstructions: InnerInstructions[]; innerInstructionsNone: boolean; logMessages: string[]; @@ -124,7 +123,11 @@ export interface TransactionStatusMeta { * Available since Solana v1.10.35 / v1.11.6. * Set to `None` for txs executed on earlier versions. */ - computeUnitsConsumed?: string | undefined; + computeUnitsConsumed?: + | bigint + | undefined; + /** Total transaction cost */ + costUnits?: bigint | undefined; } export interface TransactionError { @@ -176,8 +179,8 @@ export interface ReturnData { export interface Reward { pubkey: string; - lamports: string; - postBalance: string; + lamports: bigint; + postBalance: bigint; rewardType: RewardType; commission: string; } @@ -188,22 +191,22 @@ export interface Rewards { } export interface UnixTimestamp { - timestamp: string; + timestamp: bigint; } export interface BlockHeight { - blockHeight: string; + blockHeight: bigint; } export interface NumPartitions { - numPartitions: string; + numPartitions: bigint; } function createBaseConfirmedBlock(): ConfirmedBlock { return { previousBlockhash: "", blockhash: "", - parentSlot: "0", + parentSlot: 0n, transactions: [], rewards: [], blockTime: undefined, @@ -212,103 +215,114 @@ function createBaseConfirmedBlock(): ConfirmedBlock { }; } -export const ConfirmedBlock = { - encode(message: ConfirmedBlock, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const ConfirmedBlock: MessageFns = { + encode(message: ConfirmedBlock, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.previousBlockhash !== "") { writer.uint32(10).string(message.previousBlockhash); } if (message.blockhash !== "") { writer.uint32(18).string(message.blockhash); } - if (message.parentSlot !== "0") { + if (message.parentSlot !== 0n) { + if (BigInt.asUintN(64, message.parentSlot) !== message.parentSlot) { + throw new globalThis.Error("value provided for field message.parentSlot of type uint64 too large"); + } writer.uint32(24).uint64(message.parentSlot); } for (const v of message.transactions) { - ConfirmedTransaction.encode(v!, writer.uint32(34).fork()).ldelim(); + ConfirmedTransaction.encode(v!, writer.uint32(34).fork()).join(); } for (const v of message.rewards) { - Reward.encode(v!, writer.uint32(42).fork()).ldelim(); + Reward.encode(v!, writer.uint32(42).fork()).join(); } if (message.blockTime !== undefined) { - UnixTimestamp.encode(message.blockTime, writer.uint32(50).fork()).ldelim(); + UnixTimestamp.encode(message.blockTime, writer.uint32(50).fork()).join(); } if (message.blockHeight !== undefined) { - BlockHeight.encode(message.blockHeight, writer.uint32(58).fork()).ldelim(); + BlockHeight.encode(message.blockHeight, writer.uint32(58).fork()).join(); } if (message.numPartitions !== undefined) { - NumPartitions.encode(message.numPartitions, writer.uint32(66).fork()).ldelim(); + NumPartitions.encode(message.numPartitions, writer.uint32(66).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): ConfirmedBlock { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): ConfirmedBlock { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseConfirmedBlock(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.previousBlockhash = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.blockhash = reader.string(); continue; - case 3: + } + case 3: { if (tag !== 24) { break; } - message.parentSlot = longToString(reader.uint64() as Long); + message.parentSlot = reader.uint64() as bigint; continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.transactions.push(ConfirmedTransaction.decode(reader, reader.uint32())); continue; - case 5: + } + case 5: { if (tag !== 42) { break; } message.rewards.push(Reward.decode(reader, reader.uint32())); continue; - case 6: + } + case 6: { if (tag !== 50) { break; } message.blockTime = UnixTimestamp.decode(reader, reader.uint32()); continue; - case 7: + } + case 7: { if (tag !== 58) { break; } message.blockHeight = BlockHeight.decode(reader, reader.uint32()); continue; - case 8: + } + case 8: { if (tag !== 66) { break; } message.numPartitions = NumPartitions.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -317,7 +331,7 @@ export const ConfirmedBlock = { return { previousBlockhash: isSet(object.previousBlockhash) ? globalThis.String(object.previousBlockhash) : "", blockhash: isSet(object.blockhash) ? globalThis.String(object.blockhash) : "", - parentSlot: isSet(object.parentSlot) ? globalThis.String(object.parentSlot) : "0", + parentSlot: isSet(object.parentSlot) ? BigInt(object.parentSlot) : 0n, transactions: globalThis.Array.isArray(object?.transactions) ? object.transactions.map((e: any) => ConfirmedTransaction.fromJSON(e)) : [], @@ -336,8 +350,8 @@ export const ConfirmedBlock = { if (message.blockhash !== "") { obj.blockhash = message.blockhash; } - if (message.parentSlot !== "0") { - obj.parentSlot = message.parentSlot; + if (message.parentSlot !== 0n) { + obj.parentSlot = message.parentSlot.toString(); } if (message.transactions?.length) { obj.transactions = message.transactions.map((e) => ConfirmedTransaction.toJSON(e)); @@ -364,7 +378,7 @@ export const ConfirmedBlock = { const message = createBaseConfirmedBlock(); message.previousBlockhash = object.previousBlockhash ?? ""; message.blockhash = object.blockhash ?? ""; - message.parentSlot = object.parentSlot ?? "0"; + message.parentSlot = object.parentSlot ?? 0n; message.transactions = object.transactions?.map((e) => ConfirmedTransaction.fromPartial(e)) || []; message.rewards = object.rewards?.map((e) => Reward.fromPartial(e)) || []; message.blockTime = (object.blockTime !== undefined && object.blockTime !== null) @@ -384,43 +398,45 @@ function createBaseConfirmedTransaction(): ConfirmedTransaction { return { transaction: undefined, meta: undefined }; } -export const ConfirmedTransaction = { - encode(message: ConfirmedTransaction, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const ConfirmedTransaction: MessageFns = { + encode(message: ConfirmedTransaction, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.transaction !== undefined) { - Transaction.encode(message.transaction, writer.uint32(10).fork()).ldelim(); + Transaction.encode(message.transaction, writer.uint32(10).fork()).join(); } if (message.meta !== undefined) { - TransactionStatusMeta.encode(message.meta, writer.uint32(18).fork()).ldelim(); + TransactionStatusMeta.encode(message.meta, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): ConfirmedTransaction { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): ConfirmedTransaction { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseConfirmedTransaction(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.transaction = Transaction.decode(reader, reader.uint32()); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.meta = TransactionStatusMeta.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -462,43 +478,45 @@ function createBaseTransaction(): Transaction { return { signatures: [], message: undefined }; } -export const Transaction = { - encode(message: Transaction, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const Transaction: MessageFns = { + encode(message: Transaction, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { for (const v of message.signatures) { writer.uint32(10).bytes(v!); } if (message.message !== undefined) { - Message.encode(message.message, writer.uint32(18).fork()).ldelim(); + Message.encode(message.message, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): Transaction { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): Transaction { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTransaction(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.signatures.push(reader.bytes()); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.message = Message.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -547,10 +565,10 @@ function createBaseMessage(): Message { }; } -export const Message = { - encode(message: Message, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const Message: MessageFns = { + encode(message: Message, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.header !== undefined) { - MessageHeader.encode(message.header, writer.uint32(10).fork()).ldelim(); + MessageHeader.encode(message.header, writer.uint32(10).fork()).join(); } for (const v of message.accountKeys) { writer.uint32(18).bytes(v!); @@ -559,71 +577,77 @@ export const Message = { writer.uint32(26).bytes(message.recentBlockhash); } for (const v of message.instructions) { - CompiledInstruction.encode(v!, writer.uint32(34).fork()).ldelim(); + CompiledInstruction.encode(v!, writer.uint32(34).fork()).join(); } if (message.versioned !== false) { writer.uint32(40).bool(message.versioned); } for (const v of message.addressTableLookups) { - MessageAddressTableLookup.encode(v!, writer.uint32(50).fork()).ldelim(); + MessageAddressTableLookup.encode(v!, writer.uint32(50).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): Message { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): Message { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMessage(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.header = MessageHeader.decode(reader, reader.uint32()); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.accountKeys.push(reader.bytes()); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.recentBlockhash = reader.bytes(); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.instructions.push(CompiledInstruction.decode(reader, reader.uint32())); continue; - case 5: + } + case 5: { if (tag !== 40) { break; } message.versioned = reader.bool(); continue; - case 6: + } + case 6: { if (tag !== 50) { break; } message.addressTableLookups.push(MessageAddressTableLookup.decode(reader, reader.uint32())); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -690,8 +714,8 @@ function createBaseMessageHeader(): MessageHeader { return { numRequiredSignatures: 0, numReadonlySignedAccounts: 0, numReadonlyUnsignedAccounts: 0 }; } -export const MessageHeader = { - encode(message: MessageHeader, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const MessageHeader: MessageFns = { + encode(message: MessageHeader, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.numRequiredSignatures !== 0) { writer.uint32(8).uint32(message.numRequiredSignatures); } @@ -704,39 +728,42 @@ export const MessageHeader = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): MessageHeader { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): MessageHeader { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMessageHeader(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.numRequiredSignatures = reader.uint32(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.numReadonlySignedAccounts = reader.uint32(); continue; - case 3: + } + case 3: { if (tag !== 24) { break; } message.numReadonlyUnsignedAccounts = reader.uint32(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -783,8 +810,8 @@ function createBaseMessageAddressTableLookup(): MessageAddressTableLookup { return { accountKey: new Uint8Array(0), writableIndexes: new Uint8Array(0), readonlyIndexes: new Uint8Array(0) }; } -export const MessageAddressTableLookup = { - encode(message: MessageAddressTableLookup, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const MessageAddressTableLookup: MessageFns = { + encode(message: MessageAddressTableLookup, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.accountKey.length !== 0) { writer.uint32(10).bytes(message.accountKey); } @@ -797,39 +824,42 @@ export const MessageAddressTableLookup = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): MessageAddressTableLookup { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): MessageAddressTableLookup { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMessageAddressTableLookup(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.accountKey = reader.bytes(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.writableIndexes = reader.bytes(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.readonlyIndexes = reader.bytes(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -871,7 +901,7 @@ export const MessageAddressTableLookup = { function createBaseTransactionStatusMeta(): TransactionStatusMeta { return { err: undefined, - fee: "0", + fee: 0n, preBalances: [], postBalances: [], innerInstructions: [], @@ -886,29 +916,39 @@ function createBaseTransactionStatusMeta(): TransactionStatusMeta { returnData: undefined, returnDataNone: false, computeUnitsConsumed: undefined, + costUnits: undefined, }; } -export const TransactionStatusMeta = { - encode(message: TransactionStatusMeta, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const TransactionStatusMeta: MessageFns = { + encode(message: TransactionStatusMeta, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.err !== undefined) { - TransactionError.encode(message.err, writer.uint32(10).fork()).ldelim(); + TransactionError.encode(message.err, writer.uint32(10).fork()).join(); } - if (message.fee !== "0") { + if (message.fee !== 0n) { + if (BigInt.asUintN(64, message.fee) !== message.fee) { + throw new globalThis.Error("value provided for field message.fee of type uint64 too large"); + } writer.uint32(16).uint64(message.fee); } writer.uint32(26).fork(); for (const v of message.preBalances) { + if (BigInt.asUintN(64, v) !== v) { + throw new globalThis.Error("a value provided in array field preBalances of type uint64 is too large"); + } writer.uint64(v); } - writer.ldelim(); + writer.join(); writer.uint32(34).fork(); for (const v of message.postBalances) { + if (BigInt.asUintN(64, v) !== v) { + throw new globalThis.Error("a value provided in array field postBalances of type uint64 is too large"); + } writer.uint64(v); } - writer.ldelim(); + writer.join(); for (const v of message.innerInstructions) { - InnerInstructions.encode(v!, writer.uint32(42).fork()).ldelim(); + InnerInstructions.encode(v!, writer.uint32(42).fork()).join(); } if (message.innerInstructionsNone !== false) { writer.uint32(80).bool(message.innerInstructionsNone); @@ -920,13 +960,13 @@ export const TransactionStatusMeta = { writer.uint32(88).bool(message.logMessagesNone); } for (const v of message.preTokenBalances) { - TokenBalance.encode(v!, writer.uint32(58).fork()).ldelim(); + TokenBalance.encode(v!, writer.uint32(58).fork()).join(); } for (const v of message.postTokenBalances) { - TokenBalance.encode(v!, writer.uint32(66).fork()).ldelim(); + TokenBalance.encode(v!, writer.uint32(66).fork()).join(); } for (const v of message.rewards) { - Reward.encode(v!, writer.uint32(74).fork()).ldelim(); + Reward.encode(v!, writer.uint32(74).fork()).join(); } for (const v of message.loadedWritableAddresses) { writer.uint32(98).bytes(v!); @@ -935,41 +975,52 @@ export const TransactionStatusMeta = { writer.uint32(106).bytes(v!); } if (message.returnData !== undefined) { - ReturnData.encode(message.returnData, writer.uint32(114).fork()).ldelim(); + ReturnData.encode(message.returnData, writer.uint32(114).fork()).join(); } if (message.returnDataNone !== false) { writer.uint32(120).bool(message.returnDataNone); } if (message.computeUnitsConsumed !== undefined) { + if (BigInt.asUintN(64, message.computeUnitsConsumed) !== message.computeUnitsConsumed) { + throw new globalThis.Error("value provided for field message.computeUnitsConsumed of type uint64 too large"); + } writer.uint32(128).uint64(message.computeUnitsConsumed); } + if (message.costUnits !== undefined) { + if (BigInt.asUintN(64, message.costUnits) !== message.costUnits) { + throw new globalThis.Error("value provided for field message.costUnits of type uint64 too large"); + } + writer.uint32(136).uint64(message.costUnits); + } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): TransactionStatusMeta { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): TransactionStatusMeta { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTransactionStatusMeta(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.err = TransactionError.decode(reader, reader.uint32()); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.fee = longToString(reader.uint64() as Long); + message.fee = reader.uint64() as bigint; continue; - case 3: + } + case 3: { if (tag === 24) { - message.preBalances.push(longToString(reader.uint64() as Long)); + message.preBalances.push(reader.uint64() as bigint); continue; } @@ -977,16 +1028,17 @@ export const TransactionStatusMeta = { if (tag === 26) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { - message.preBalances.push(longToString(reader.uint64() as Long)); + message.preBalances.push(reader.uint64() as bigint); } continue; } break; - case 4: + } + case 4: { if (tag === 32) { - message.postBalances.push(longToString(reader.uint64() as Long)); + message.postBalances.push(reader.uint64() as bigint); continue; } @@ -994,102 +1046,123 @@ export const TransactionStatusMeta = { if (tag === 34) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { - message.postBalances.push(longToString(reader.uint64() as Long)); + message.postBalances.push(reader.uint64() as bigint); } continue; } break; - case 5: + } + case 5: { if (tag !== 42) { break; } message.innerInstructions.push(InnerInstructions.decode(reader, reader.uint32())); continue; - case 10: + } + case 10: { if (tag !== 80) { break; } message.innerInstructionsNone = reader.bool(); continue; - case 6: + } + case 6: { if (tag !== 50) { break; } message.logMessages.push(reader.string()); continue; - case 11: + } + case 11: { if (tag !== 88) { break; } message.logMessagesNone = reader.bool(); continue; - case 7: + } + case 7: { if (tag !== 58) { break; } message.preTokenBalances.push(TokenBalance.decode(reader, reader.uint32())); continue; - case 8: + } + case 8: { if (tag !== 66) { break; } message.postTokenBalances.push(TokenBalance.decode(reader, reader.uint32())); continue; - case 9: + } + case 9: { if (tag !== 74) { break; } message.rewards.push(Reward.decode(reader, reader.uint32())); continue; - case 12: + } + case 12: { if (tag !== 98) { break; } message.loadedWritableAddresses.push(reader.bytes()); continue; - case 13: + } + case 13: { if (tag !== 106) { break; } message.loadedReadonlyAddresses.push(reader.bytes()); continue; - case 14: + } + case 14: { if (tag !== 114) { break; } message.returnData = ReturnData.decode(reader, reader.uint32()); continue; - case 15: + } + case 15: { if (tag !== 120) { break; } message.returnDataNone = reader.bool(); continue; - case 16: + } + case 16: { if (tag !== 128) { break; } - message.computeUnitsConsumed = longToString(reader.uint64() as Long); + message.computeUnitsConsumed = reader.uint64() as bigint; continue; + } + case 17: { + if (tag !== 136) { + break; + } + + message.costUnits = reader.uint64() as bigint; + continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1097,12 +1170,10 @@ export const TransactionStatusMeta = { fromJSON(object: any): TransactionStatusMeta { return { err: isSet(object.err) ? TransactionError.fromJSON(object.err) : undefined, - fee: isSet(object.fee) ? globalThis.String(object.fee) : "0", - preBalances: globalThis.Array.isArray(object?.preBalances) - ? object.preBalances.map((e: any) => globalThis.String(e)) - : [], + fee: isSet(object.fee) ? BigInt(object.fee) : 0n, + preBalances: globalThis.Array.isArray(object?.preBalances) ? object.preBalances.map((e: any) => BigInt(e)) : [], postBalances: globalThis.Array.isArray(object?.postBalances) - ? object.postBalances.map((e: any) => globalThis.String(e)) + ? object.postBalances.map((e: any) => BigInt(e)) : [], innerInstructions: globalThis.Array.isArray(object?.innerInstructions) ? object.innerInstructions.map((e: any) => InnerInstructions.fromJSON(e)) @@ -1120,7 +1191,9 @@ export const TransactionStatusMeta = { postTokenBalances: globalThis.Array.isArray(object?.postTokenBalances) ? object.postTokenBalances.map((e: any) => TokenBalance.fromJSON(e)) : [], - rewards: globalThis.Array.isArray(object?.rewards) ? object.rewards.map((e: any) => Reward.fromJSON(e)) : [], + rewards: globalThis.Array.isArray(object?.rewards) + ? object.rewards.map((e: any) => Reward.fromJSON(e)) + : [], loadedWritableAddresses: globalThis.Array.isArray(object?.loadedWritableAddresses) ? object.loadedWritableAddresses.map((e: any) => bytesFromBase64(e)) : [], @@ -1129,9 +1202,8 @@ export const TransactionStatusMeta = { : [], returnData: isSet(object.returnData) ? ReturnData.fromJSON(object.returnData) : undefined, returnDataNone: isSet(object.returnDataNone) ? globalThis.Boolean(object.returnDataNone) : false, - computeUnitsConsumed: isSet(object.computeUnitsConsumed) - ? globalThis.String(object.computeUnitsConsumed) - : undefined, + computeUnitsConsumed: isSet(object.computeUnitsConsumed) ? BigInt(object.computeUnitsConsumed) : undefined, + costUnits: isSet(object.costUnits) ? BigInt(object.costUnits) : undefined, }; }, @@ -1140,14 +1212,14 @@ export const TransactionStatusMeta = { if (message.err !== undefined) { obj.err = TransactionError.toJSON(message.err); } - if (message.fee !== "0") { - obj.fee = message.fee; + if (message.fee !== 0n) { + obj.fee = message.fee.toString(); } if (message.preBalances?.length) { - obj.preBalances = message.preBalances; + obj.preBalances = message.preBalances.map((e) => e.toString()); } if (message.postBalances?.length) { - obj.postBalances = message.postBalances; + obj.postBalances = message.postBalances.map((e) => e.toString()); } if (message.innerInstructions?.length) { obj.innerInstructions = message.innerInstructions.map((e) => InnerInstructions.toJSON(e)); @@ -1183,7 +1255,10 @@ export const TransactionStatusMeta = { obj.returnDataNone = message.returnDataNone; } if (message.computeUnitsConsumed !== undefined) { - obj.computeUnitsConsumed = message.computeUnitsConsumed; + obj.computeUnitsConsumed = message.computeUnitsConsumed.toString(); + } + if (message.costUnits !== undefined) { + obj.costUnits = message.costUnits.toString(); } return obj; }, @@ -1196,7 +1271,7 @@ export const TransactionStatusMeta = { message.err = (object.err !== undefined && object.err !== null) ? TransactionError.fromPartial(object.err) : undefined; - message.fee = object.fee ?? "0"; + message.fee = object.fee ?? 0n; message.preBalances = object.preBalances?.map((e) => e) || []; message.postBalances = object.postBalances?.map((e) => e) || []; message.innerInstructions = object.innerInstructions?.map((e) => InnerInstructions.fromPartial(e)) || []; @@ -1213,6 +1288,7 @@ export const TransactionStatusMeta = { : undefined; message.returnDataNone = object.returnDataNone ?? false; message.computeUnitsConsumed = object.computeUnitsConsumed ?? undefined; + message.costUnits = object.costUnits ?? undefined; return message; }, }; @@ -1221,33 +1297,34 @@ function createBaseTransactionError(): TransactionError { return { err: new Uint8Array(0) }; } -export const TransactionError = { - encode(message: TransactionError, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const TransactionError: MessageFns = { + encode(message: TransactionError, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.err.length !== 0) { writer.uint32(10).bytes(message.err); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): TransactionError { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): TransactionError { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTransactionError(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.err = reader.bytes(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1278,43 +1355,45 @@ function createBaseInnerInstructions(): InnerInstructions { return { index: 0, instructions: [] }; } -export const InnerInstructions = { - encode(message: InnerInstructions, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const InnerInstructions: MessageFns = { + encode(message: InnerInstructions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.index !== 0) { writer.uint32(8).uint32(message.index); } for (const v of message.instructions) { - InnerInstruction.encode(v!, writer.uint32(18).fork()).ldelim(); + InnerInstruction.encode(v!, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): InnerInstructions { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): InnerInstructions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseInnerInstructions(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.index = reader.uint32(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.instructions.push(InnerInstruction.decode(reader, reader.uint32())); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1354,8 +1433,8 @@ function createBaseInnerInstruction(): InnerInstruction { return { programIdIndex: 0, accounts: new Uint8Array(0), data: new Uint8Array(0), stackHeight: undefined }; } -export const InnerInstruction = { - encode(message: InnerInstruction, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const InnerInstruction: MessageFns = { + encode(message: InnerInstruction, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.programIdIndex !== 0) { writer.uint32(8).uint32(message.programIdIndex); } @@ -1371,46 +1450,50 @@ export const InnerInstruction = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): InnerInstruction { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): InnerInstruction { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseInnerInstruction(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.programIdIndex = reader.uint32(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.accounts = reader.bytes(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.data = reader.bytes(); continue; - case 4: + } + case 4: { if (tag !== 32) { break; } message.stackHeight = reader.uint32(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1458,8 +1541,8 @@ function createBaseCompiledInstruction(): CompiledInstruction { return { programIdIndex: 0, accounts: new Uint8Array(0), data: new Uint8Array(0) }; } -export const CompiledInstruction = { - encode(message: CompiledInstruction, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const CompiledInstruction: MessageFns = { + encode(message: CompiledInstruction, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.programIdIndex !== 0) { writer.uint32(8).uint32(message.programIdIndex); } @@ -1472,39 +1555,42 @@ export const CompiledInstruction = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): CompiledInstruction { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): CompiledInstruction { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCompiledInstruction(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.programIdIndex = reader.uint32(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.accounts = reader.bytes(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.data = reader.bytes(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1547,8 +1633,8 @@ function createBaseTokenBalance(): TokenBalance { return { accountIndex: 0, mint: "", uiTokenAmount: undefined, owner: "", programId: "" }; } -export const TokenBalance = { - encode(message: TokenBalance, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const TokenBalance: MessageFns = { + encode(message: TokenBalance, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.accountIndex !== 0) { writer.uint32(8).uint32(message.accountIndex); } @@ -1556,7 +1642,7 @@ export const TokenBalance = { writer.uint32(18).string(message.mint); } if (message.uiTokenAmount !== undefined) { - UiTokenAmount.encode(message.uiTokenAmount, writer.uint32(26).fork()).ldelim(); + UiTokenAmount.encode(message.uiTokenAmount, writer.uint32(26).fork()).join(); } if (message.owner !== "") { writer.uint32(34).string(message.owner); @@ -1567,53 +1653,58 @@ export const TokenBalance = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): TokenBalance { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): TokenBalance { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTokenBalance(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } message.accountIndex = reader.uint32(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.mint = reader.string(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.uiTokenAmount = UiTokenAmount.decode(reader, reader.uint32()); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.owner = reader.string(); continue; - case 5: + } + case 5: { if (tag !== 42) { break; } message.programId = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1668,8 +1759,8 @@ function createBaseUiTokenAmount(): UiTokenAmount { return { uiAmount: 0, decimals: 0, amount: "", uiAmountString: "" }; } -export const UiTokenAmount = { - encode(message: UiTokenAmount, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const UiTokenAmount: MessageFns = { + encode(message: UiTokenAmount, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.uiAmount !== 0) { writer.uint32(9).double(message.uiAmount); } @@ -1685,46 +1776,50 @@ export const UiTokenAmount = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): UiTokenAmount { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): UiTokenAmount { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseUiTokenAmount(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 9) { break; } message.uiAmount = reader.double(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } message.decimals = reader.uint32(); continue; - case 3: + } + case 3: { if (tag !== 26) { break; } message.amount = reader.string(); continue; - case 4: + } + case 4: { if (tag !== 34) { break; } message.uiAmountString = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1772,8 +1867,8 @@ function createBaseReturnData(): ReturnData { return { programId: new Uint8Array(0), data: new Uint8Array(0) }; } -export const ReturnData = { - encode(message: ReturnData, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const ReturnData: MessageFns = { + encode(message: ReturnData, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.programId.length !== 0) { writer.uint32(10).bytes(message.programId); } @@ -1783,32 +1878,34 @@ export const ReturnData = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): ReturnData { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): ReturnData { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseReturnData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.programId = reader.bytes(); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.data = reader.bytes(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1843,18 +1940,24 @@ export const ReturnData = { }; function createBaseReward(): Reward { - return { pubkey: "", lamports: "0", postBalance: "0", rewardType: 0, commission: "" }; + return { pubkey: "", lamports: 0n, postBalance: 0n, rewardType: 0, commission: "" }; } -export const Reward = { - encode(message: Reward, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const Reward: MessageFns = { + encode(message: Reward, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.pubkey !== "") { writer.uint32(10).string(message.pubkey); } - if (message.lamports !== "0") { + if (message.lamports !== 0n) { + if (BigInt.asIntN(64, message.lamports) !== message.lamports) { + throw new globalThis.Error("value provided for field message.lamports of type int64 too large"); + } writer.uint32(16).int64(message.lamports); } - if (message.postBalance !== "0") { + if (message.postBalance !== 0n) { + if (BigInt.asUintN(64, message.postBalance) !== message.postBalance) { + throw new globalThis.Error("value provided for field message.postBalance of type uint64 too large"); + } writer.uint32(24).uint64(message.postBalance); } if (message.rewardType !== 0) { @@ -1866,53 +1969,58 @@ export const Reward = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): Reward { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): Reward { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseReward(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.pubkey = reader.string(); continue; - case 2: + } + case 2: { if (tag !== 16) { break; } - message.lamports = longToString(reader.int64() as Long); + message.lamports = reader.int64() as bigint; continue; - case 3: + } + case 3: { if (tag !== 24) { break; } - message.postBalance = longToString(reader.uint64() as Long); + message.postBalance = reader.uint64() as bigint; continue; - case 4: + } + case 4: { if (tag !== 32) { break; } message.rewardType = reader.int32() as any; continue; - case 5: + } + case 5: { if (tag !== 42) { break; } message.commission = reader.string(); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -1920,8 +2028,8 @@ export const Reward = { fromJSON(object: any): Reward { return { pubkey: isSet(object.pubkey) ? globalThis.String(object.pubkey) : "", - lamports: isSet(object.lamports) ? globalThis.String(object.lamports) : "0", - postBalance: isSet(object.postBalance) ? globalThis.String(object.postBalance) : "0", + lamports: isSet(object.lamports) ? BigInt(object.lamports) : 0n, + postBalance: isSet(object.postBalance) ? BigInt(object.postBalance) : 0n, rewardType: isSet(object.rewardType) ? rewardTypeFromJSON(object.rewardType) : 0, commission: isSet(object.commission) ? globalThis.String(object.commission) : "", }; @@ -1932,11 +2040,11 @@ export const Reward = { if (message.pubkey !== "") { obj.pubkey = message.pubkey; } - if (message.lamports !== "0") { - obj.lamports = message.lamports; + if (message.lamports !== 0n) { + obj.lamports = message.lamports.toString(); } - if (message.postBalance !== "0") { - obj.postBalance = message.postBalance; + if (message.postBalance !== 0n) { + obj.postBalance = message.postBalance.toString(); } if (message.rewardType !== 0) { obj.rewardType = rewardTypeToJSON(message.rewardType); @@ -1953,8 +2061,8 @@ export const Reward = { fromPartial, I>>(object: I): Reward { const message = createBaseReward(); message.pubkey = object.pubkey ?? ""; - message.lamports = object.lamports ?? "0"; - message.postBalance = object.postBalance ?? "0"; + message.lamports = object.lamports ?? 0n; + message.postBalance = object.postBalance ?? 0n; message.rewardType = object.rewardType ?? 0; message.commission = object.commission ?? ""; return message; @@ -1965,43 +2073,45 @@ function createBaseRewards(): Rewards { return { rewards: [], numPartitions: undefined }; } -export const Rewards = { - encode(message: Rewards, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +export const Rewards: MessageFns = { + encode(message: Rewards, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { for (const v of message.rewards) { - Reward.encode(v!, writer.uint32(10).fork()).ldelim(); + Reward.encode(v!, writer.uint32(10).fork()).join(); } if (message.numPartitions !== undefined) { - NumPartitions.encode(message.numPartitions, writer.uint32(18).fork()).ldelim(); + NumPartitions.encode(message.numPartitions, writer.uint32(18).fork()).join(); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): Rewards { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): Rewards { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseRewards(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 10) { break; } message.rewards.push(Reward.decode(reader, reader.uint32())); continue; - case 2: + } + case 2: { if (tag !== 18) { break; } message.numPartitions = NumPartitions.decode(reader, reader.uint32()); continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, @@ -2038,48 +2148,52 @@ export const Rewards = { }; function createBaseUnixTimestamp(): UnixTimestamp { - return { timestamp: "0" }; + return { timestamp: 0n }; } -export const UnixTimestamp = { - encode(message: UnixTimestamp, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.timestamp !== "0") { +export const UnixTimestamp: MessageFns = { + encode(message: UnixTimestamp, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.timestamp !== 0n) { + if (BigInt.asIntN(64, message.timestamp) !== message.timestamp) { + throw new globalThis.Error("value provided for field message.timestamp of type int64 too large"); + } writer.uint32(8).int64(message.timestamp); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): UnixTimestamp { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): UnixTimestamp { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseUnixTimestamp(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.timestamp = longToString(reader.int64() as Long); + message.timestamp = reader.int64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): UnixTimestamp { - return { timestamp: isSet(object.timestamp) ? globalThis.String(object.timestamp) : "0" }; + return { timestamp: isSet(object.timestamp) ? BigInt(object.timestamp) : 0n }; }, toJSON(message: UnixTimestamp): unknown { const obj: any = {}; - if (message.timestamp !== "0") { - obj.timestamp = message.timestamp; + if (message.timestamp !== 0n) { + obj.timestamp = message.timestamp.toString(); } return obj; }, @@ -2089,54 +2203,58 @@ export const UnixTimestamp = { }, fromPartial, I>>(object: I): UnixTimestamp { const message = createBaseUnixTimestamp(); - message.timestamp = object.timestamp ?? "0"; + message.timestamp = object.timestamp ?? 0n; return message; }, }; function createBaseBlockHeight(): BlockHeight { - return { blockHeight: "0" }; + return { blockHeight: 0n }; } -export const BlockHeight = { - encode(message: BlockHeight, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.blockHeight !== "0") { +export const BlockHeight: MessageFns = { + encode(message: BlockHeight, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.blockHeight !== 0n) { + if (BigInt.asUintN(64, message.blockHeight) !== message.blockHeight) { + throw new globalThis.Error("value provided for field message.blockHeight of type uint64 too large"); + } writer.uint32(8).uint64(message.blockHeight); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): BlockHeight { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): BlockHeight { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseBlockHeight(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.blockHeight = longToString(reader.uint64() as Long); + message.blockHeight = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): BlockHeight { - return { blockHeight: isSet(object.blockHeight) ? globalThis.String(object.blockHeight) : "0" }; + return { blockHeight: isSet(object.blockHeight) ? BigInt(object.blockHeight) : 0n }; }, toJSON(message: BlockHeight): unknown { const obj: any = {}; - if (message.blockHeight !== "0") { - obj.blockHeight = message.blockHeight; + if (message.blockHeight !== 0n) { + obj.blockHeight = message.blockHeight.toString(); } return obj; }, @@ -2146,54 +2264,58 @@ export const BlockHeight = { }, fromPartial, I>>(object: I): BlockHeight { const message = createBaseBlockHeight(); - message.blockHeight = object.blockHeight ?? "0"; + message.blockHeight = object.blockHeight ?? 0n; return message; }, }; function createBaseNumPartitions(): NumPartitions { - return { numPartitions: "0" }; + return { numPartitions: 0n }; } -export const NumPartitions = { - encode(message: NumPartitions, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.numPartitions !== "0") { +export const NumPartitions: MessageFns = { + encode(message: NumPartitions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.numPartitions !== 0n) { + if (BigInt.asUintN(64, message.numPartitions) !== message.numPartitions) { + throw new globalThis.Error("value provided for field message.numPartitions of type uint64 too large"); + } writer.uint32(8).uint64(message.numPartitions); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): NumPartitions { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; + decode(input: BinaryReader | Uint8Array, length?: number): NumPartitions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseNumPartitions(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 1: { if (tag !== 8) { break; } - message.numPartitions = longToString(reader.uint64() as Long); + message.numPartitions = reader.uint64() as bigint; continue; + } } if ((tag & 7) === 4 || tag === 0) { break; } - reader.skipType(tag & 7); + reader.skip(tag & 7); } return message; }, fromJSON(object: any): NumPartitions { - return { numPartitions: isSet(object.numPartitions) ? globalThis.String(object.numPartitions) : "0" }; + return { numPartitions: isSet(object.numPartitions) ? BigInt(object.numPartitions) : 0n }; }, toJSON(message: NumPartitions): unknown { const obj: any = {}; - if (message.numPartitions !== "0") { - obj.numPartitions = message.numPartitions; + if (message.numPartitions !== 0n) { + obj.numPartitions = message.numPartitions.toString(); } return obj; }, @@ -2203,7 +2325,7 @@ export const NumPartitions = { }, fromPartial, I>>(object: I): NumPartitions { const message = createBaseNumPartitions(); - message.numPartitions = object.numPartitions ?? "0"; + message.numPartitions = object.numPartitions ?? 0n; return message; }, }; @@ -2233,7 +2355,7 @@ function base64FromBytes(arr: Uint8Array): string { } } -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; +type Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined; export type DeepPartial = T extends Builtin ? T : T extends globalThis.Array ? globalThis.Array> @@ -2245,15 +2367,15 @@ type KeysOfUnion = T extends T ? keyof T : never; export type Exact = P extends Builtin ? P : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; -function longToString(long: Long) { - return long.toString(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - function isSet(value: any): boolean { return value !== null && value !== undefined; } + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/typescript-sdk/src/grpc/types.ts b/typescript-sdk/src/grpc/types.ts new file mode 100644 index 0000000..e69de29 diff --git a/typescript-sdk/src/index.ts b/typescript-sdk/src/index.ts index 74fc0b3..9b4b4ed 100644 --- a/typescript-sdk/src/index.ts +++ b/typescript-sdk/src/index.ts @@ -1,300 +1,492 @@ -/** - * @fileoverview Fumarole TypeScript SDK for streaming Solana account and transaction data - * - * Fumarole provides: - * - High availability through multi-node data collection - * - Persistent storage of historical state - * - Horizontal scalability via consumer groups - * - * @see https://github.com/rpcpool/yellowstone-fumarole - */ import { - ChannelCredentials, - credentials, - ChannelOptions, Metadata, + ServiceError, + MetadataValue, + status, + ClientDuplexStream, } from "@grpc/grpc-js"; +import { FumaroleConfig } from "./config/config"; +import { FumaroleClient as GrpcClient } from "./grpc/fumarole"; +import { FumaroleGrpcConnector } from "./connectivity"; + +const X_TOKEN_HEADER = "x-token"; import { + VersionRequest, + VersionResponse, + ControlResponse, + JoinControlPlane, + ControlCommand, + ListConsumerGroupsRequest, + ListConsumerGroupsResponse, + GetConsumerGroupInfoRequest, ConsumerGroupInfo, - CreateStaticConsumerGroupRequest, - CreateStaticConsumerGroupResponse, DeleteConsumerGroupRequest, DeleteConsumerGroupResponse, - FumaroleClient, - GetConsumerGroupInfoRequest, - GetOldestSlotRequest, - GetOldestSlotResponse, - GetSlotLagInfoRequest, - GetSlotLagInfoResponse, - ListAvailableCommitmentLevelsRequest, - ListAvailableCommitmentLevelsResponse, - ListConsumerGroupsResponse, - SubscribeRequest, + CreateConsumerGroupRequest, + CreateConsumerGroupResponse, + InitialOffsetPolicy, } from "./grpc/fumarole"; +import { + SubscribeRequest, + SubscribeUpdate, + CommitmentLevel, +} from "./grpc/geyser"; +import type { + DragonsmouthAdapterSession, + FumaroleSubscribeConfig, +} from "./types"; +import { + DEFAULT_DRAGONSMOUTH_CAPACITY, + DEFAULT_COMMIT_INTERVAL, + DEFAULT_MAX_SLOT_DOWNLOAD_ATTEMPT, + DEFAULT_CONCURRENT_DOWNLOAD_LIMIT_PER_TCP, + DEFAULT_GC_INTERVAL, + DEFAULT_SLOT_MEMORY_RETENTION, + getDefaultFumaroleSubscribeConfig, +} from "./types"; +import { AsyncQueue } from "./runtime/async-queue"; +import { FumaroleSM } from "./runtime/state-machine"; +import { GrpcSlotDownloader } from "./runtime/grpc-slot-downloader"; +import { FumeDragonsmouthRuntime } from "./runtime/runtime"; -export type FumaroleSubscribeRequest = SubscribeRequest; - -/** - * Configuration options for Fumarole subscription - * @example - * ```typescript - * const stream = await client.subscribe({ compression: "gzip" }); - * ``` - */ -export type SubscribeConfig = { - /** Enable gzip compression for reduced bandwidth usage */ - compression?: "gzip"; +(BigInt.prototype as any).toJSON = function () { + return this.toString(); }; -/** - * Main client for interacting with the Fumarole service - */ -export default class Client { - _client: FumaroleClient; - _insecureXToken: string | undefined; - - /** - * Creates a new Fumarole client instance - * - * @param endpoint - The Fumarole service endpoint URL - * @param xToken - Authentication token provided by Triton - * @param channelOptions - Additional gRPC channel options - */ - constructor( - endpoint: string, - xToken: string | undefined, - channelOptions: ChannelOptions | undefined - ) { - let creds: ChannelCredentials; - - const endpointURL = new URL(endpoint); - let port = endpointURL.port; - if (!port) { - switch (endpointURL.protocol) { - case "https:": - port = "443"; - break; - case "http:": - port = "80"; - break; - } - } - - // Check if we need to use TLS. - if (endpointURL.protocol.startsWith("https:")) { - creds = credentials.combineChannelCredentials( - credentials.createSsl(), - credentials.createFromMetadataGenerator((_params, callback) => { - const metadata = new Metadata(); - if (xToken !== undefined) { - metadata.add("x-token", xToken); - } - return callback(null, metadata); - }) - ); - } else { - creds = ChannelCredentials.createInsecure(); - if (xToken !== undefined) { - this._insecureXToken = xToken; - } - } +export class FumaroleClient { + private static readonly logger = console; + private readonly connector: FumaroleGrpcConnector; + private readonly stub: GrpcClient; - this._client = new FumaroleClient( - `${endpointURL.hostname}:${port}`, - creds, - channelOptions + private static safeStringify(obj: unknown): string { + return JSON.stringify(obj, (_, v) => + typeof v === "bigint" ? v.toString() : v ); } - private _getInsecureMetadata(): Metadata { - const metadata = new Metadata(); - if (this._insecureXToken) { - metadata.add("x-token", this._insecureXToken); - } - return metadata; + constructor(connector: FumaroleGrpcConnector, stub: GrpcClient) { + this.connector = connector; + this.stub = stub; } - /** - * Creates a new static consumer group for horizontal scaling - * - * @example - * ```typescript - * const group = await client.createStaticConsumerGroup({ - * commitmentLevel: CommitmentLevel.CONFIRMED, - * consumerGroupLabel: "my-group", - * eventSubscriptionPolicy: EventSubscriptionPolicy.BOTH, - * initialOffsetPolicy: InitialOffsetPolicy.LATEST, - * }); - * ``` - */ - async createStaticConsumerGroup( - request: CreateStaticConsumerGroupRequest - ): Promise { - return await new Promise((resolve, reject) => { - this._client.createStaticConsumerGroup(request, (error, response) => { - if (error === null || error === undefined) { - resolve(response); - } else { + static async connect(config: FumaroleConfig): Promise { + const endpoint = config.endpoint; + const connector = new FumaroleGrpcConnector(config, endpoint); + + FumaroleClient.logger.debug(`Connecting to ${endpoint}`); + FumaroleClient.logger.debug( + "Connection config:", + FumaroleClient.safeStringify({ + endpoint: config.endpoint, + xToken: config.xToken ? "***" : "none", + maxDecodingMessageSizeBytes: config.maxDecodingMessageSizeBytes, + }) + ); + + const client = await connector.connect(); + FumaroleClient.logger.debug(`Connected to ${endpoint}, testing stub...`); + + // Wait for client to be ready + await new Promise((resolve, reject) => { + const deadline = new Date().getTime() + 5000; // 5 second timeout + client.waitForReady(deadline, (error) => { + if (error) { + FumaroleClient.logger.error( + "Client failed to become ready:", + FumaroleClient.safeStringify(error) + ); reject(error); + } else { + FumaroleClient.logger.debug("Client is ready"); + resolve(undefined); } }); }); + + // Verify client methods + if (!client || typeof client.listConsumerGroups !== "function") { + const methods = client + ? Object.getOwnPropertyNames(Object.getPrototypeOf(client)) + : []; + FumaroleClient.logger.error( + "Available methods:", + FumaroleClient.safeStringify(methods) + ); + throw new Error("gRPC client or listConsumerGroups method not available"); + } + + FumaroleClient.logger.debug("gRPC client initialized successfully"); + return new FumaroleClient(connector, client); } - /** - * Lists all available consumer groups - * - * @param request - List request parameters - * @returns Promise resolving to list of consumer groups - */ - async listConsumerGroups( - request: ListAvailableCommitmentLevelsRequest - ): Promise { - return await new Promise((resolve, reject) => { - this._client.listConsumerGroups(request, (error, response) => { - if (error === null || error === undefined) { - resolve(response); - } else { + async version(): Promise { + FumaroleClient.logger.debug("Sending version request"); + const request = {} as VersionRequest; + return new Promise((resolve, reject) => { + this.stub.version(request, (error, response) => { + if (error) { + FumaroleClient.logger.error( + "Version request failed:", + FumaroleClient.safeStringify(error) + ); reject(error); + } else { + FumaroleClient.logger.debug( + "Version response:", + FumaroleClient.safeStringify(response) + ); + resolve(response); } }); }); } - /** - * Gets detailed information about a specific consumer group - * - * @param request - Consumer group info request - * @returns Promise resolving to consumer group details - */ - async getConsumerGroupInfo( - request: GetConsumerGroupInfoRequest - ): Promise { - return await new Promise((resolve, reject) => { - this._client.getConsumerGroupInfo(request, (error, response) => { - if (error === null || error === undefined) { - resolve(response); - } else { - reject(error); - } - }); - }); + async dragonsmouthSubscribe( + consumerGroupName: string, + request: SubscribeRequest, + xToken: string + ): Promise { + return this.dragonsmouthSubscribeWithConfig( + consumerGroupName, + request, + getDefaultFumaroleSubscribeConfig(), + xToken + ); } - /** - * Deletes an existing consumer group - * - * @param request - Delete request parameters - * @returns Promise resolving when deletion is complete - */ - async deleteConsumerGroup( - request: DeleteConsumerGroupRequest - ): Promise { - return await new Promise((resolve, reject) => { - this._client.deleteConsumerGroup(request, (error, response) => { - if (error === null || error === undefined) { - resolve(response); - } else { - reject(error); + public async dragonsmouthSubscribeWithConfig( + consumerGroupName: string, + request: SubscribeRequest, + config: FumaroleSubscribeConfig, + xToken: string + ): Promise { + // Queues + const dragonsmouthOutlet = new AsyncQueue( + config.dataChannelCapacity + ); + const fumeControlPlaneQ = new AsyncQueue<{}>(100); // sink queue + const fumeControlPlaneRxQ = new AsyncQueue<{}>(100); // source queue + + // Send initial join command + const initialJoin: JoinControlPlane = { consumerGroupName }; + const initialJoinCommand: ControlCommand = { initialJoin }; + await fumeControlPlaneQ.put(initialJoinCommand); + console.log(`Sent initial join command ONE:`, initialJoinCommand); + + const metadata = new Metadata(); + metadata.add("x-subscription-id", xToken); + metadata.add("x-token", xToken); + + console.log("SUBSCRIBE METADATA"); + console.log(metadata.getMap()); + + // Create duplex stream + const fumeControlPlaneStreamRx = this.stub.subscribe( + metadata, {} + ) as ClientDuplexStream; + + const controlPlaneWriter = (async () => { + try { + while (true) { + const update = await fumeControlPlaneQ.get(); + const ok = fumeControlPlaneStreamRx.write(update); + if (!ok) { + await new Promise((res) => + fumeControlPlaneStreamRx.once("drain", res) + ); + } } - }); - }); + } catch (err) { + console.error("Writer error:", err); + } + })(); + + + + // Task: read from duplex stream into a queue + const controlPlaneReader = (async () => { + try { + for await (const update of fumeControlPlaneStreamRx) { + // console.log("UPDATE"); + // console.log(JSON.stringify(update)); + + await fumeControlPlaneRxQ.put(update); + } + } catch (err) { + console.log("failed to read from duplex stream into a queue"); + console.log(err); + + // stream ended or error occurred + } + })(); + + // Wait for initial response from control plane + const controlResponse: ControlResponse = await fumeControlPlaneRxQ.get(); + const init = (controlResponse as ControlResponse).init; + if (!init) + throw new Error(`Unexpected initial response: ${controlResponse}`); + console.log(`Control response:`, controlResponse); + + const lastCommittedOffset = init.lastCommittedOffsets[0]; + if (lastCommittedOffset == null) + throw new Error("No last committed offset"); + + // Initialize state machine and queues + const sm = new FumaroleSM(lastCommittedOffset, config.slotMemoryRetention); + const subscribeRequestQueue = new AsyncQueue(100); + + // Connect data plane and create slot downloader + const dataPlaneClient = await this.connector.connect(); + const grpcSlotDownloader = new GrpcSlotDownloader(dataPlaneClient); + + // Create Fume runtime + const rt = new FumeDragonsmouthRuntime( + sm, + grpcSlotDownloader, + subscribeRequestQueue, + request, + consumerGroupName, + fumeControlPlaneQ, + fumeControlPlaneRxQ, + dragonsmouthOutlet, + config.commitInterval, + config.gcInterval, + config.concurrentDownloadLimit + ); + + const fumaroleHandle = rt.run(); + console.log(`Fumarole handle created:`, fumaroleHandle); + + return { + sink: subscribeRequestQueue, + source: dragonsmouthOutlet, + fumaroleHandle, + }; } - /** - * Gets information about slot lag for a subscription - * - * @param request - Slot lag info request - * @returns Promise resolving to slot lag details - */ - async getSlotLagInfo( - request: GetSlotLagInfoRequest - ): Promise { - return await new Promise((resolve, reject) => { - this._client.getSlotLagInfo(request, (error, response) => { - if (error === null || error === undefined) { - resolve(response); + async listConsumerGroups(): Promise { + if (!this.stub) { + throw new Error("gRPC stub not initialized"); + } + if (!this.stub.listConsumerGroups) { + throw new Error("listConsumerGroups method not available on stub"); + } + + FumaroleClient.logger.debug("Preparing listConsumerGroups request"); + const request = {} as ListConsumerGroupsRequest; + const metadata = new Metadata(); + + return new Promise((resolve, reject) => { + let hasResponded = false; + const timeout = setTimeout(() => { + if (!hasResponded) { + FumaroleClient.logger.error("ListConsumerGroups timeout after 30s"); + if (call) { + try { + call.cancel(); + } catch (e) { + FumaroleClient.logger.error("Error cancelling call:", e); + } + } + reject(new Error("gRPC call timed out after 30 seconds")); + } + }, 30000); // 30 second timeout + + let call: any; + try { + FumaroleClient.logger.debug("Starting gRPC listConsumerGroups call"); + call = this.stub.listConsumerGroups( + request, + metadata, + { + deadline: Date.now() + 30000, // 30 second deadline + }, + ( + error: ServiceError | null, + response: ListConsumerGroupsResponse + ) => { + hasResponded = true; + clearTimeout(timeout); + + if (error) { + const errorDetails = { + code: error.code, + details: error.details, + metadata: error.metadata?.getMap(), + stack: error.stack, + message: error.message, + name: error.name, + }; + FumaroleClient.logger.error( + "ListConsumerGroups error:", + errorDetails + ); + reject(error); + } else { + FumaroleClient.logger.debug( + "ListConsumerGroups success - Response:", + FumaroleClient.safeStringify(response) + ); + resolve(response); + } + } + ); + + // Monitor call state + if (call) { + call.on("metadata", (metadata: Metadata) => { + FumaroleClient.logger.debug( + "Received metadata:", + metadata.getMap() + ); + }); + + call.on("status", (status: any) => { + FumaroleClient.logger.debug("Call status:", status); + }); + + call.on("error", (error: Error) => { + FumaroleClient.logger.error("Call stream error:", error); + if (!hasResponded) { + hasResponded = true; + clearTimeout(timeout); + reject(error); + } + }); } else { - reject(error); + FumaroleClient.logger.error("Failed to create gRPC call object"); + hasResponded = true; + clearTimeout(timeout); + reject(new Error("Failed to create gRPC call")); } - }); + } catch (setupError) { + hasResponded = true; + clearTimeout(timeout); + FumaroleClient.logger.error("Error setting up gRPC call:", setupError); + reject(setupError); + } }); } - /** - * Gets the oldest available slot in the persistence store - * - * @param request - Oldest slot request parameters - * @returns Promise resolving to oldest slot information - */ - async getOldestSlot( - request: GetOldestSlotRequest - ): Promise { - return await new Promise((resolve, reject) => { - this._client.getOldestSlot(request, (error, response) => { - if (error === null || error === undefined) { - resolve(response); - } else { - reject(error); + async getConsumerGroupInfo( + consumerGroupName: string + ): Promise { + FumaroleClient.logger.debug( + "Sending getConsumerGroupInfo request:", + consumerGroupName + ); + const request = { consumerGroupName } as GetConsumerGroupInfoRequest; + return new Promise((resolve, reject) => { + this.stub.getConsumerGroupInfo( + request, + (error: ServiceError | null, response: ConsumerGroupInfo) => { + if (error) { + if (error.code === 14) { + // grpc.status.NOT_FOUND + FumaroleClient.logger.debug( + "Consumer group not found:", + consumerGroupName + ); + resolve(null); + } else { + FumaroleClient.logger.error("GetConsumerGroupInfo error:", error); + reject(error); + } + } else { + FumaroleClient.logger.debug( + "GetConsumerGroupInfo response:", + response + ); + resolve(response); + } } - }); + ); }); } - /** - * Lists available commitment levels for subscriptions - * - * @param request - List commitment levels request - * @returns Promise resolving to available commitment levels - */ - async listAvailableCommitmentLevels( - request: ListAvailableCommitmentLevelsRequest - ): Promise { - return await new Promise((resolve, reject) => { - this._client.listAvailableCommitmentLevels(request, (error, response) => { - if (error === null || error === undefined) { - resolve(response); - } else { - reject(error); + async deleteConsumerGroup( + consumerGroupName: string + ): Promise { + FumaroleClient.logger.debug( + "Sending deleteConsumerGroup request:", + consumerGroupName + ); + const request = { consumerGroupName } as DeleteConsumerGroupRequest; + return new Promise((resolve, reject) => { + this.stub.deleteConsumerGroup( + request, + (error: ServiceError | null, response: DeleteConsumerGroupResponse) => { + if (error) { + FumaroleClient.logger.error("DeleteConsumerGroup error:", error); + reject(error); + } else { + FumaroleClient.logger.debug( + "DeleteConsumerGroup response:", + response + ); + resolve(response); + } } - }); + ); }); } - /** - * Subscribes to account and transaction updates - * - * @example - * ```typescript - * const stream = await client.subscribe({ compression: "gzip" }); - * - * stream.on('data', (data) => console.log(data)); - * stream.write({ - * accounts: { - * tokenKeg: { - * account: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"], - * filters: [], - * owner: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"], - * } - * }, - * consumerGroupLabel: "my-group" - * }); - * ``` - */ - async subscribe(config?: SubscribeConfig) { - const options: any = {}; - if (config) { - if (config.compression) { - switch (config.compression) { - case "gzip": - options["grpc.default_compression_algorithm"] = 2; // set compression to: gzip - break; - default: - options["grpc.default_compression_algorithm"] = 0; // set compression to: none - break; - } - } + async deleteAllConsumerGroups(): Promise { + const response = await this.listConsumerGroups(); + const deletePromises = response.consumerGroups.map((group) => + this.deleteConsumerGroup(group.consumerGroupName) + ); + + const results = await Promise.all(deletePromises); + + // Check for any failures + const failures = results.filter((result) => !result.success); + if (failures.length > 0) { + throw new Error( + `Failed to delete some consumer groups: ${FumaroleClient.safeStringify( + failures + )}` + ); } - return await this._client.subscribe(this._getInsecureMetadata(), options); + } + + async createConsumerGroup( + request: CreateConsumerGroupRequest + ): Promise { + FumaroleClient.logger.debug( + "Sending createConsumerGroup request:", + request + ); + return new Promise((resolve, reject) => { + this.stub.createConsumerGroup( + request, + (error: ServiceError | null, response: CreateConsumerGroupResponse) => { + if (error) { + FumaroleClient.logger.error("CreateConsumerGroup error:", error); + reject(error); + } else { + FumaroleClient.logger.debug( + "CreateConsumerGroup response:", + response + ); + resolve(response); + } + } + ); + }); } } + +export { + FumaroleConfig, + InitialOffsetPolicy, + CommitmentLevel, + SubscribeRequest, + SubscribeUpdate, + DEFAULT_DRAGONSMOUTH_CAPACITY, + DEFAULT_COMMIT_INTERVAL, + DEFAULT_MAX_SLOT_DOWNLOAD_ATTEMPT, + DEFAULT_CONCURRENT_DOWNLOAD_LIMIT_PER_TCP, +}; + +export type { DragonsmouthAdapterSession, FumaroleSubscribeConfig }; diff --git a/typescript-sdk/src/runtime/async-queue.ts b/typescript-sdk/src/runtime/async-queue.ts new file mode 100644 index 0000000..b40afc8 --- /dev/null +++ b/typescript-sdk/src/runtime/async-queue.ts @@ -0,0 +1,78 @@ +export class AsyncQueue { + private items: T[] = []; + private maxSize: number; + private closed: boolean = false; + + constructor(maxSize: number = Infinity) { + this.maxSize = maxSize; + } + + async put(item: T): Promise { + if (this.closed) { + throw new Error("Queue shutdown"); + } + + if (this.items.length >= this.maxSize) { + throw new Error("Queue full"); + } + + this.items.push(item); + } + + async get(): Promise { + if (this.closed && this.items.length === 0) { + throw new Error("Queue shutdown"); + } + + // Wait for an item to be available + while (this.items.length === 0) { + await new Promise((resolve) => setTimeout(resolve, 10)); + } + + return this.items.shift()!; + } + + /** Non-blocking shift. Returns undefined if queue is empty. */ + shift(): T | undefined { + if (this.closed && this.items.length === 0) { + return undefined; + } + return this.items.shift(); + } + + isEmpty(): boolean { + return this.items.length === 0; + } + + isFull(): boolean { + return this.items.length >= this.maxSize; + } + + size(): number { + return this.items.length; + } + + close(): void { + this.closed = true; + } + + [Symbol.asyncIterator](): AsyncIterator { + return { + next: async (): Promise> => { + if (this.closed && this.isEmpty()) { + return { done: true, value: undefined }; + } + + try { + const value = await this.get(); + return { done: false, value }; + } catch (error: any) { + if (error.message === "Queue shutdown") { + return { done: true, value: undefined }; + } + throw error; + } + }, + }; + } +} diff --git a/typescript-sdk/src/runtime/base-downloader.ts b/typescript-sdk/src/runtime/base-downloader.ts new file mode 100644 index 0000000..e69de29 diff --git a/typescript-sdk/src/runtime/binary-heap.ts b/typescript-sdk/src/runtime/binary-heap.ts new file mode 100644 index 0000000..df15f81 --- /dev/null +++ b/typescript-sdk/src/runtime/binary-heap.ts @@ -0,0 +1,76 @@ +export class BinaryHeap { + private heap: T[]; + private compare: (a: T, b: T) => number; + + constructor(compare: (a: T, b: T) => number) { + this.heap = []; + this.compare = compare; + } + + public push(value: T): void { + this.heap.push(value); + this.bubbleUp(this.heap.length - 1); + } + + public pop(): T | undefined { + if (this.heap.length === 0) return undefined; + const result = this.heap[0]; + const last = this.heap.pop()!; + if (this.heap.length > 0) { + this.heap[0] = last; + this.bubbleDown(0); + } + return result; + } + + public peek(): T | undefined { + return this.heap[0]; + } + + public get length(): number { + return this.heap.length; + } + + private bubbleUp(index: number): void { + while (index > 0) { + const parentIndex = Math.floor((index - 1) / 2); + if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) { + break; + } + [this.heap[index], this.heap[parentIndex]] = [ + this.heap[parentIndex], + this.heap[index], + ]; + index = parentIndex; + } + } + + private bubbleDown(index: number): void { + while (true) { + let smallest = index; + const leftChild = 2 * index + 1; + const rightChild = 2 * index + 2; + + if ( + leftChild < this.heap.length && + this.compare(this.heap[leftChild], this.heap[smallest]) < 0 + ) { + smallest = leftChild; + } + if ( + rightChild < this.heap.length && + this.compare(this.heap[rightChild], this.heap[smallest]) < 0 + ) { + smallest = rightChild; + } + + if (smallest === index) break; + + [this.heap[index], this.heap[smallest]] = [ + this.heap[smallest], + this.heap[index], + ]; + index = smallest; + } + } +} diff --git a/typescript-sdk/src/runtime/fumarole-client.ts b/typescript-sdk/src/runtime/fumarole-client.ts new file mode 100644 index 0000000..e69de29 diff --git a/typescript-sdk/src/runtime/grpc-downloader.ts b/typescript-sdk/src/runtime/grpc-downloader.ts new file mode 100644 index 0000000..e69de29 diff --git a/typescript-sdk/src/runtime/grpc-slot-downloader.ts b/typescript-sdk/src/runtime/grpc-slot-downloader.ts new file mode 100644 index 0000000..08f84a9 --- /dev/null +++ b/typescript-sdk/src/runtime/grpc-slot-downloader.ts @@ -0,0 +1,273 @@ +import { ClientReadableStream, Metadata, ServiceError, status } from "@grpc/grpc-js"; +import { + BlockFilters, + DataResponse, + DownloadBlockShard, + FumaroleClient, +} from "../grpc/fumarole"; +import { SubscribeRequest, SubscribeUpdate } from "../grpc/geyser"; +import { AsyncQueue } from "./async-queue"; +import { FumeDownloadRequest, FumeShardIdx } from "./state-machine"; +import bs58 from "bs58"; +// Constants +const DEFAULT_GC_INTERVAL = 5; + +const DEFAULT_SLOT_MEMORY_RETENTION = 10000; + +export class CompletedDownloadBlockTask { + constructor( + public slot: bigint, + public blockUid: Uint8Array, + public shardIdx: FumeShardIdx, + public totalEventDownloaded: number + ) {} +} + +export type DownloadBlockErrorKind = + | "Disconnected" + | "OutletDisconnected" + | "BlockShardNotFound" + | "FailedDownload" + | "Fatal"; + +export class DownloadBlockError { + constructor(public kind: DownloadBlockErrorKind, public message: string) {} +} + +export type DownloadTaskResultKind = "Ok" | "Err"; + +export class DownloadTaskResult { + constructor( + public kind: DownloadTaskResultKind, + public completed?: CompletedDownloadBlockTask, + public slot?: bigint, + public err?: DownloadBlockError + ) {} +} + +export class DownloadTaskArgs { + constructor( + public downloadRequest: FumeDownloadRequest, + // TODO: figure out a type for this + public dragonsmouthOutlet: AsyncQueue + ) {} +} + +export abstract class AsyncSlotDownloader { + abstract runDownload( + subscribeRequest: SubscribeRequest, + spec: DownloadTaskArgs + ): Promise; +} + +export class GrpcDownloadBlockTaskRun { + public downloadRequest: FumeDownloadRequest; + public client: FumaroleClient; + public filters?: BlockFilters | null; + public dragonsmouthOutlet: AsyncQueue; + + constructor( + downloadRequest: FumeDownloadRequest, + client: FumaroleClient, + filters: BlockFilters | null, + dragonsmouthOutlet: AsyncQueue + ) { + this.downloadRequest = downloadRequest; + this.client = client; + this.filters = filters; + this.dragonsmouthOutlet = dragonsmouthOutlet; + } + + public mapTonicErrorCodeToDownloadBlockError( + e: ServiceError + ): DownloadBlockError { + const code = e.code; + + if (code === status.NOT_FOUND) { + return new DownloadBlockError( + "BlockShardNotFound", + "Block shard not found" + ); + } else if (code === status.UNAVAILABLE) { + return new DownloadBlockError("Disconnected", "Disconnected"); + } else if ( + code === status.INTERNAL || + code === status.ABORTED || + code === status.DATA_LOSS || + code === status.RESOURCE_EXHAUSTED || + code === status.UNKNOWN || + code === status.CANCELLED || + code === status.DEADLINE_EXCEEDED + ) { + return new DownloadBlockError("FailedDownload", "Failed download"); + } else if (code === status.INVALID_ARGUMENT) { + throw new Error("Invalid argument"); + } else { + return new DownloadBlockError("Fatal", `Unknown error: ${code}`); + } + } + + public async run(): Promise { + const downloadRequest: DownloadBlockShard = { + blockchainId: this.downloadRequest.blockchainId, + blockUid: this.downloadRequest.blockUid, + shardIdx: 0, + blockFilters: this.filters === null ? undefined : this.filters, + }; + + let downloadResponse: ClientReadableStream; + + try { + console.log( + `Requesting download for block ${bs58.encode(this.downloadRequest.blockUid)} at slot ${ + this.downloadRequest.slot + } with filters ${JSON.stringify(downloadRequest.blockFilters)}` + ); + + const metadata = new Metadata(); + metadata.add("x-token", "7b042cd6-ea1e-46af-b46b-653bdce119f6") + metadata.add("x-subscription-id", "091d7d4f-a38d-4a2e-b4f9-91643170ff0e6") + + console.log("DOWNLOAD METADATA"); + console.log(metadata.getMap()); + + downloadResponse = this.client.downloadBlock(downloadRequest, metadata); + } catch (e: any) { + console.log(`Download block error ${e}`); + return { + kind: "Err", + slot: this.downloadRequest.slot, + err: this.mapTonicErrorCodeToDownloadBlockError(e), + }; + } + + let totalEventDownloaded = 0; + + // Wrap the event-driven API in a Promise + return new Promise((resolve, reject) => { + downloadResponse.on("data", async (data: DataResponse) => { + try { + console.log("DATA DATA\n\n"); + console.log(JSON.stringify(data)) + console.log("\n\n"); + if (data.update) { + // === case: update === + const update = data.update; + totalEventDownloaded += 1; + + try { + await this.dragonsmouthOutlet.put(update); + } catch (err: any) { + // TODO: figure out a type for this + console.error("Dragonsmouth outlet is disconnected"); + resolve({ + kind: "Err", + slot: this.downloadRequest.slot, + err: { + kind: "OutletDisconnected", + message: "Outlet disconnected", + }, + }); + } + } else if (data.blockShardDownloadFinish) { + + // === case: block_shard_download_finish === + console.log( + `Download finished for block ${bs58.encode(this.downloadRequest.blockUid)} at slot ${ + this.downloadRequest.slot + }` + ); + resolve({ + kind: "Ok", + completed: { + slot: this.downloadRequest.slot, + blockUid: this.downloadRequest.blockUid, + shardIdx: 0, + totalEventDownloaded, + }, + }); + } else { + // === unexpected === + reject( + new Error(`Unexpected DataResponse: ${JSON.stringify(data)}`) + ); + } + } catch (err) { + reject(err); + } + }); + + // TODO: figure out a type for this + downloadResponse.on("error", (err: any) => { + console.error("stream error", err); + reject(this.mapTonicErrorCodeToDownloadBlockError(err)); + }); + + downloadResponse.on("end", (e: any) => { + console.log(`stream ended without blockShardDownloadFinish for block ${bs58.encode(this.downloadRequest.blockUid)} with slot ${this.downloadRequest.slot}`); + + resolve({ + kind: "Err", + slot: this.downloadRequest.slot, + err: { + kind: "FailedDownload", + message: "Stream ended unexpectedly", + }, + }); + }); + }); + } +} + +export class GrpcSlotDownloader extends AsyncSlotDownloader { + public fumaroleClient: FumaroleClient; + + constructor(fumaroleClient: FumaroleClient) { + super(); + this.fumaroleClient = fumaroleClient; + } + + public async runDownload( + subscribeRequest: SubscribeRequest, + spec: DownloadTaskArgs + ): Promise { + const downloadTask = new GrpcDownloadBlockTaskRun( + spec.downloadRequest, + this.fumaroleClient, + { + accounts: subscribeRequest.accounts, + transactions: subscribeRequest.transactions, + entries: subscribeRequest.entry, + blocksMeta: subscribeRequest.blocksMeta, + }, + spec.dragonsmouthOutlet + ); + + console.log(`Running download task for slot ${spec.downloadRequest.slot}`); + + return await downloadTask.run(); + } +} + +export class DownloadTaskRunnerCommand { + kind: string; + subscribeRequest?: SubscribeRequest; + + private constructor(kind: string, subscribeRequest?: SubscribeRequest) { + this.kind = kind; + this.subscribeRequest = subscribeRequest; + } + + static UpdateSubscribeRequest(subscribeRequest: SubscribeRequest): DownloadTaskRunnerCommand { + return new DownloadTaskRunnerCommand("UpdateSubscribeRequest", subscribeRequest); + } +} + +export class DownloadTaskRunnerChannels { + constructor( + public downloadTaskQueueTx: AsyncQueue<{}>, + public cncTx: AsyncQueue<{}>, + public downloadResultRx: AsyncQueue<{}> + ) {} +} + diff --git a/typescript-sdk/src/runtime/index.ts b/typescript-sdk/src/runtime/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/typescript-sdk/src/runtime/runtime.ts b/typescript-sdk/src/runtime/runtime.ts new file mode 100644 index 0000000..b6d3cf7 --- /dev/null +++ b/typescript-sdk/src/runtime/runtime.ts @@ -0,0 +1,395 @@ +import { + ControlCommand, + ControlResponse, +} from "../grpc/fumarole"; +import { + CommitmentLevel, + SlotStatus, + SubscribeRequest, + SubscribeUpdate, +} from "../grpc/geyser"; +import { Interval } from "../utils/interval"; +import { AsyncQueue } from "./async-queue"; +import { + AsyncSlotDownloader, + DownloadTaskArgs, + DownloadTaskResult, +} from "./grpc-slot-downloader"; +import { + FumaroleSM, + FumeDownloadRequest, + FumeOffset, + FumeSlotStatus, +} from "./state-machine"; +import { waitFirstCompleted } from "./wait-first-completed"; + +type TaskName = + | "dragonsmouth_bidi" + | "control_plane_rx" + | "download_task" + | "commit_tick"; + +export class FumeDragonsmouthRuntime { + public stateMachine: FumaroleSM; + public slotDownloader: AsyncSlotDownloader; + public subscribeRequestUpdateQueue: AsyncQueue<{}>; + public subscribeRequest: SubscribeRequest; + public consumerGroupName: string; + public controlPlaneTransmitQueue: AsyncQueue<{}>; + public controlPlaneReceiveQueue: AsyncQueue<{}>; + public dragonsmouthOutlet: AsyncQueue; + public commitInterval: number; // in seconds + public gcInterval: number; + public maxConcurrentDownload: number; + public downloadTasks: Map, FumeDownloadRequest>; + public innerRuntimeChannel: AsyncQueue<{}>; + public lastCommit: number; + + constructor( + stateMachine: FumaroleSM, + slotDownloader: AsyncSlotDownloader, + subscribeRequestUpdateQueue: AsyncQueue<{}>, + subscribeRequest: SubscribeRequest, + consumerGroupName: string, + controlPlaneTransmitQueue: AsyncQueue<{}>, + controlPlaneReceiveQueue: AsyncQueue<{}>, + dragonsmouthOutlet: AsyncQueue, + commitInterval: number, + gcInterval: number, + maxConcurrentDownload: number = 10 + ) { + this.stateMachine = stateMachine; + this.slotDownloader = slotDownloader; + this.subscribeRequestUpdateQueue = subscribeRequestUpdateQueue; + this.subscribeRequest = subscribeRequest; + this.consumerGroupName = consumerGroupName; + this.controlPlaneTransmitQueue = controlPlaneTransmitQueue; + this.controlPlaneReceiveQueue = controlPlaneReceiveQueue; + this.dragonsmouthOutlet = dragonsmouthOutlet; + this.commitInterval = commitInterval; + this.gcInterval = gcInterval; + this.maxConcurrentDownload = maxConcurrentDownload; + this.downloadTasks = new Map(); + this.innerRuntimeChannel = new AsyncQueue<{}>(); + this.lastCommit = Date.now() / 1000; // seconds since epoch; to match python syntax + } + + private buildPollHistoryCmd(fromOffset?: FumeOffset): ControlCommand { + // Build a command to poll the blockchain history + return { + pollHist: { + shardId: 0, + limit: undefined, + }, + }; + } + + private buildCommitOffsetCmd(offset: FumeOffset): ControlCommand { + return { + commitOffset: { + offset, + shardId: 0, + }, + }; + } + + private handleControlResponse(controlResponse: ControlResponse): void { + // Determine which oneof field is set + if (controlResponse.pollHist) { + const pollHist = controlResponse.pollHist; + console.log(`Received poll history ${pollHist.events.length} events`); + this.stateMachine.queueBlockchainEvent(pollHist.events); + } else if (controlResponse.commitOffset) { + const commitOffset = controlResponse.commitOffset; + console.log(`Received commit offset: ${JSON.stringify(commitOffset)}`); + this.stateMachine.updateCommittedOffset(commitOffset.offset); + } else if (controlResponse.pong) { + console.log("Received pong"); + } else { + throw new Error("Unexpected control response"); + } + } + + public get commitmentLevel(): CommitmentLevel | undefined { + return this.subscribeRequest.commitment; + } + + public async pollHistoryIfNeeded(): Promise { + // Poll the history if the state machine needs new events. + if (this.stateMachine.needNewBlockchainEvents()) { + const cmd = this.buildPollHistoryCmd( + this.stateMachine.committableOffset + ); + await this.controlPlaneTransmitQueue.put(cmd); + } + } + + private scheduleDownloadTaskIfAny(): void { + while (true) { + console.log("Checking for download tasks to schedule"); + + if (this.downloadTasks.size >= this.maxConcurrentDownload) { + break; + } + + console.log("Popping slot to download"); + const downloadRequest = this.stateMachine.popSlotToDownload( + this.commitmentLevel + ); + if (!downloadRequest) { + console.log("No download request available"); + break; + } + + console.log(`Download request for slot ${downloadRequest.slot} popped`); + if (!downloadRequest.blockchainId) { + throw new Error("Download request must have a blockchain ID"); + } + + const downloadTaskArgs: DownloadTaskArgs = { + downloadRequest, + dragonsmouthOutlet: this.dragonsmouthOutlet, + }; + + // In TS, calling async fn returns a Promise (like create_task) + const downloadTask = this.slotDownloader.runDownload( + this.subscribeRequest, + downloadTaskArgs + ); + + // Track the promise alongside the request + this.downloadTasks.set(downloadTask, downloadRequest); + + console.log( + `Scheduling download task for slot ${downloadRequest.slot}` + ); + } + } + + private handleDownloadResult(downloadResult: DownloadTaskResult): void { + /** Handles the result of a download task. */ + if (downloadResult.kind === "Ok") { + const completed = downloadResult.completed!; + console.log( + `Download completed for slot ${completed.slot}, shard ${completed.shardIdx}, ${completed.totalEventDownloaded} total events` + ); + + this.stateMachine.makeSlotDownloadProgress( + completed.slot, + completed.shardIdx + ); + } else { + const slot = downloadResult.slot; + const err = downloadResult.err; + throw new Error(`Failed to download slot ${slot}: ${err!.message}`); + } + } + + private async forceCommitOffset(): Promise { + console.log( + `Force committing offset ${this.stateMachine.committableOffset}` + ); + + await this.controlPlaneTransmitQueue.put( + this.buildCommitOffsetCmd(this.stateMachine.committableOffset) + ); + } + + private async commitOffset(): Promise { + if ( + this.stateMachine.lastCommittedOffset < + this.stateMachine.committableOffset + ) { + console.log( + `Committing offset ${this.stateMachine.committableOffset}` + ); + await this.forceCommitOffset(); + } + this.lastCommit = Date.now() / 1000; // seconds since epoch; to match python syntax + } + + private async drainSlotStatus(): Promise { + const commitment = this.subscribeRequest.commitment; + const slotStatusVec: FumeSlotStatus[] = []; + + let slotStatus: FumeSlotStatus | null; + while ((slotStatus = this.stateMachine.popNextSlotStatus())) { + slotStatusVec.push(slotStatus); + } + + if (slotStatusVec.length === 0) { + return; + } + + console.log(`Draining ${slotStatusVec.length} slot status`); + + for (const slotStatus of slotStatusVec) { + const matchedFilters: string[] = []; + + for (const [filterName, filter] of Object.entries( + this.subscribeRequest.slots + )) { + if ( + filter.filterByCommitment && + slotStatus.commitmentLevel === commitment + ) { + matchedFilters.push(filterName); + } else if (!filter.filterByCommitment) { + matchedFilters.push(filterName); + } + } + + if (matchedFilters.length > 0) { + const update: SubscribeUpdate = { + filters: matchedFilters, + createdAt: undefined, + slot: { + slot: slotStatus.slot, + parent: slotStatus.parentSlot, + status: slotStatus.commitmentLevel as number as SlotStatus, + deadError: slotStatus.deadError, + }, + }; + + try { + await this.dragonsmouthOutlet.put(update); + } catch (err) { + // TODO make proper error types + if (err === "Queue full") { + return; + } + throw err; + } + } + + this.stateMachine.markEventAsProcessed(slotStatus.sessionSequence); + } + } + + private async handleControlPlaneResp( + result: ControlResponse | Error + ): Promise { + if (result instanceof Error) { + await this.dragonsmouthOutlet.put(result); + return false; + } + + this.handleControlResponse(result); + return true; + } + + public handleNewSubscribeRequest(subscribeRequest: SubscribeRequest) { + this.subscribeRequest = subscribeRequest; + } + + public async run() { + console.log("Fumarole runtime starting..."); + + await this.controlPlaneTransmitQueue.put( + this.buildPollHistoryCmd(undefined) + ); + console.log("Initial poll history command sent"); + + await this.forceCommitOffset(); + console.log("Initial commit offset command sent"); + + let ticks = 0; + let pending = new Set>(); + let taskMap = new Map, TaskName>(); + + // Initial tasks + const task1 = this.subscribeRequestUpdateQueue.get(); + taskMap.set(task1, "dragonsmouth_bidi"); + pending.add(task1); + + const task2 = this.controlPlaneReceiveQueue.get(); + taskMap.set(task2, "control_plane_rx"); + pending.add(task2); + + const task3 = new Interval(this.commitInterval).tick(); + taskMap.set(task3, "commit_tick"); + pending.add(task3); + + while (pending.size > 0) { + ticks += 1; + console.log("Runtime loop tick"); + + if (ticks % this.gcInterval === 0) { + console.log("Running garbage collection"); + this.stateMachine.gc(); + ticks = 0; + } + + console.log("Polling history if needed"); + await this.pollHistoryIfNeeded(); + + console.log("Scheduling download tasks if any"); + this.scheduleDownloadTaskIfAny(); + for (const [t] of this.downloadTasks.entries()) { + pending.add(t); + taskMap.set(t, "download_task"); + } + + const downloadTaskInflight = this.downloadTasks.size; + console.log( + `Current download tasks in flight: ${downloadTaskInflight} / ${this.maxConcurrentDownload}` + ); + + // Wait for at least one task to finish + console.log("UP UP"); + + // const { done, pending: newPending } = await Promise.race(pending); + const { done, pending: newPending } = await waitFirstCompleted(Array.from(pending)); + console.log("DOWN DOWN"); + pending = new Set(newPending); + + for (const t of done) { + const result = await t; + const name = taskMap.get(t)!; + taskMap.delete(t); + + switch (name) { + case "dragonsmouth_bidi": + console.log("Dragonsmouth subscribe request received"); + this.handleNewSubscribeRequest(result); + const newTask1 = this.subscribeRequestUpdateQueue.get(); + taskMap.set(newTask1, "dragonsmouth_bidi"); + pending.add(newTask1); + break; + + case "control_plane_rx": + console.log("Control plane response received"); + if (!(await this.handleControlPlaneResp(result))) { + console.log("Control plane error"); + return; + } + const newTask2 = this.controlPlaneReceiveQueue.get(); + taskMap.set(newTask2, "control_plane_rx"); + pending.add(newTask2); + break; + + case "download_task": + console.log("Download task result received"); + this.downloadTasks.delete(t); + this.handleDownloadResult(result); + break; + + case "commit_tick": + console.log("Commit tick reached"); + await this.commitOffset(); + const newTask3 = new Interval(this.commitInterval).tick(); + taskMap.set(newTask3, "commit_tick"); + pending.add(newTask3); + break; + + default: + throw new Error(`Unexpected task name: ${name}`); + } + } + + await this.drainSlotStatus(); + } + + console.log("Fumarole runtime exiting"); + } +} diff --git a/typescript-sdk/src/runtime/state-machine.ts b/typescript-sdk/src/runtime/state-machine.ts new file mode 100644 index 0000000..7a2f440 --- /dev/null +++ b/typescript-sdk/src/runtime/state-machine.ts @@ -0,0 +1,407 @@ +// import { OrderedSet } from "@js-sdsl/ordered-set"; +import { OrderedSet } from "@js-sdsl/ordered-set"; +import { BlockchainEvent } from "../grpc/fumarole"; +import { CommitmentLevel } from "../grpc/geyser"; +import { AsyncQueue } from "./async-queue"; +import { BinaryHeap } from "./binary-heap"; +import { Deque } from "@datastructures-js/deque"; + +// class Queue { +// private items: T[] = []; + +// push(item: T): void { +// this.items.push(item); +// } + +// shift(): T | undefined { +// return this.items.shift(); +// } + +// get length(): number { +// return this.items.length; +// } +// } + +// Constants +export const DEFAULT_SLOT_MEMORY_RETENTION = 10000; +export const MINIMUM_UNPROCESSED_BLOCKCHAIN_EVENT = 10; + +// Type aliases +export type FumeBlockchainId = Uint8Array; // Equivalent to [u8; 16] +export type FumeBlockUID = Uint8Array; // Equivalent to [u8; 16] +export type FumeNumShards = number; // Equivalent to u32 +export type FumeShardIdx = number; // Equivalent to u32 +export type FumeOffset = bigint; // Equivalent to i64 +export type FumeSessionSequence = bigint; // Equivalent to u64 +export type Slot = bigint; // From solana_sdk::clock::Slot + +// Data structures +export class FumeDownloadRequest { + constructor( + public slot: Slot, + public blockchainId: FumeBlockchainId, + public blockUid: FumeBlockUID, + public numShards: FumeNumShards, + public commitmentLevel: CommitmentLevel + ) {} +} + +export class FumeSlotStatus { + constructor( + public readonly sessionSequence: FumeSessionSequence, + public readonly offset: FumeOffset, + public readonly slot: Slot, + public readonly parentSlot: Slot | undefined, + public readonly commitmentLevel: CommitmentLevel, + public readonly deadError: string | undefined + ) {} +} + +export class SlotCommitmentProgression { + processedCommitmentLevels = new Set(); + + // public hasProcessedCommitment(level: CommitmentLevel): boolean { + // return this.processedCommitmentLevels.has(level); + // } + + // public addProcessedCommitment(level: CommitmentLevel): void { + // this.processedCommitmentLevels.add(level); + // } +} + +export class SlotDownloadProgress { + private numShards: number; + private shardRemaining: boolean[]; + + constructor(numShards: number) { + this.numShards = numShards; + this.shardRemaining = new Array(numShards).fill(false); + } + + doProgress(shardIdx: number): SlotDownloadState { + this.shardRemaining[shardIdx % this.numShards] = true; + return this.shardRemaining.every(Boolean) + ? SlotDownloadState.Done + : SlotDownloadState.Downloading; + } +} + +export enum SlotDownloadState { + Downloading = "Downloading", + Done = "Done", +} + +export function orderedSetContains(set: OrderedSet, value: T): boolean { + return !set.find(value).equals(set.end()); +} + +export class FumaroleSM { + lastCommittedOffset: FumeOffset; + slotCommitmentProgression: Map; + downloadedSlotSet: OrderedSet; + inflightSlotShardDownload: Map; + blockedSlotStatusUpdate: Map>; + slotStatusUpdateQueue: Deque; + + // processedOffset: [bigint, FumeOffset][]; // min-heap equivalent + processedOffset: BinaryHeap<[FumeSessionSequence, FumeOffset]>; + + committableOffset: FumeOffset; + maxSlotDetected: bigint; + unprocessedBlockchainEvent: Deque<[FumeSessionSequence, BlockchainEvent]>; + sequence: bigint; + lastProcessedFumeSequence: bigint; + sequenceToOffset: Map; + slotMemoryRetention: number; + + constructor(lastCommittedOffset: FumeOffset, slotMemoryRetention: number) { + this.lastCommittedOffset = lastCommittedOffset; + this.slotCommitmentProgression = new Map(); + this.downloadedSlotSet = new OrderedSet(); + this.inflightSlotShardDownload = new Map(); + this.blockedSlotStatusUpdate = new Map(); + this.slotStatusUpdateQueue = new Deque(); + this.processedOffset = new BinaryHeap<[FumeSessionSequence, FumeOffset]>( + (a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0) // min-heap by sequence number + ); + this.committableOffset = lastCommittedOffset; + this.maxSlotDetected = 0n; + this.unprocessedBlockchainEvent = new Deque(); + this.sequence = 1n; + this.lastProcessedFumeSequence = 0n; + this.sequenceToOffset = new Map(); + this.slotMemoryRetention = slotMemoryRetention; + } + + updateCommittedOffset(offset: FumeOffset): void { + console.log("OFFSET"); + console.log(offset); + console.log("this.LAST_COMMITTED_OFFSET"); + console.log(this.lastCommittedOffset); + + if (offset >= this.lastCommittedOffset) { + throw new Error("Offset must be >= last committed offset"); + } + this.lastCommittedOffset = offset; + } + + nextSequence(): bigint { + const ret = this.sequence; + this.sequence += 1n; + return ret; + } + + gc(): void { + // Garbage collect old slots to respect memory retention limit. + while (this.downloadedSlotSet.size() > this.slotMemoryRetention) { + // mimic pythons downloaded_slot.popfirst() + const ds = this.downloadedSlotSet.getElementByPos(0); + this.downloadedSlotSet.eraseElementByPos(0); + + const slot = ds ?? null; + if (slot === null) { + break; + } + this.slotCommitmentProgression.delete(slot); + this.inflightSlotShardDownload.delete(slot); + this.blockedSlotStatusUpdate.delete(slot); + } + } + + queueBlockchainEvent(events: BlockchainEvent[]): void { + // Queue blockchain events for processing. + for (const blockchainEvent of events) { + if (blockchainEvent.offset < this.lastCommittedOffset) { + continue; + } + + if (blockchainEvent.slot > this.maxSlotDetected) { + this.maxSlotDetected = blockchainEvent.slot; + } + + const sequence = this.nextSequence(); + this.sequenceToOffset.set(sequence, blockchainEvent.offset); + + if (orderedSetContains(this.downloadedSlotSet, blockchainEvent.slot)) { + const fumeStatus: FumeSlotStatus = { + sessionSequence: sequence, + offset: blockchainEvent.offset, + slot: blockchainEvent.slot, + parentSlot: blockchainEvent.parentSlot, + commitmentLevel: blockchainEvent.commitmentLevel, + deadError: blockchainEvent.deadError, + }; + + if (this.inflightSlotShardDownload.has(blockchainEvent.slot)) { + this.blockedSlotStatusUpdate + .get(blockchainEvent.slot) + ?.pushBack(fumeStatus); + } else { + this.slotStatusUpdateQueue.pushBack(fumeStatus); + } + } else { + this.unprocessedBlockchainEvent.pushBack([sequence, blockchainEvent]); + } + } + } + + makeSlotDownloadProgress( + slot: Slot, + shardIdx: FumeShardIdx + ): SlotDownloadState { + // Update download progress for a given slot. + const downloadProgress = this.inflightSlotShardDownload.get(slot); + if (!downloadProgress) { + throw new Error("Slot not in download"); + } + + const downloadState = downloadProgress.doProgress(shardIdx); + + if (downloadState === SlotDownloadState.Done) { + this.inflightSlotShardDownload.delete(slot); + this.downloadedSlotSet.insert(slot); + + if (!this.slotCommitmentProgression.has(slot)) { + this.slotCommitmentProgression.set( + slot, + new SlotCommitmentProgression() + ); + } + + const blockedStatuses = + this.blockedSlotStatusUpdate.get(slot) ?? new Deque(); + this.blockedSlotStatusUpdate.delete(slot); + + for (const status of blockedStatuses.toArray()) { + this.slotStatusUpdateQueue.pushBack(status); + } + } + + return downloadState; + } + + popNextSlotStatus(): FumeSlotStatus | null { + // Pop the next slot status to process. + while (!this.slotStatusUpdateQueue.isEmpty()) { + const slotStatus = this.slotStatusUpdateQueue.popFront(); + if (!slotStatus) { + continue; + } + + const commitmentHistory = this.slotCommitmentProgression.get( + slotStatus.slot + ); + + if ( + commitmentHistory && + !commitmentHistory.processedCommitmentLevels.has( + slotStatus.commitmentLevel + ) + ) { + commitmentHistory.processedCommitmentLevels.add( + slotStatus.commitmentLevel + ); + return slotStatus; + } else if (!commitmentHistory) { + throw new Error("Slot status should not be available here"); + } + } + return null; + } + + makeSureSlotCommitmentProgressionExists( + slot: Slot + ): SlotCommitmentProgression { + // Ensure a slot has a commitment progression entry. + if (!this.slotCommitmentProgression.has(slot)) { + this.slotCommitmentProgression.set(slot, new SlotCommitmentProgression()); + } + return this.slotCommitmentProgression.get(slot)!; + } + + popSlotToDownload(commitment?: CommitmentLevel): FumeDownloadRequest | null { + // Pop the next slot to download. + const minCommitment = commitment ?? CommitmentLevel.PROCESSED; + + while (!this.unprocessedBlockchainEvent.isEmpty()) { + const [sessionSequence, blockchainEvent] = + this.unprocessedBlockchainEvent.popFront()!; + + const eventCommitmentLevel = blockchainEvent.commitmentLevel; + + if (eventCommitmentLevel !== minCommitment) { + this.slotStatusUpdateQueue.pushBack( + new FumeSlotStatus( + sessionSequence, + blockchainEvent.offset, + blockchainEvent.slot, + blockchainEvent.parentSlot, + eventCommitmentLevel, + blockchainEvent.deadError + ) + ); + this.makeSureSlotCommitmentProgressionExists(blockchainEvent.slot); + continue; + } + + if (orderedSetContains(this.downloadedSlotSet, blockchainEvent.slot)) { + this.makeSureSlotCommitmentProgressionExists(blockchainEvent.slot); + const progression = this.slotCommitmentProgression.get( + blockchainEvent.slot + )!; + + if (progression.processedCommitmentLevels.has(eventCommitmentLevel)) { + this.markEventAsProcessed(sessionSequence); + continue; + } + + this.slotStatusUpdateQueue.pushBack( + new FumeSlotStatus( + sessionSequence, + blockchainEvent.offset, + blockchainEvent.slot, + blockchainEvent.parentSlot, + eventCommitmentLevel, + blockchainEvent.deadError + ) + ); + } else { + const blockchainId = blockchainEvent.blockchainId; + const blockUid = blockchainEvent.blockUid; + + if (!this.blockedSlotStatusUpdate.get(blockchainEvent.slot)) { + this.blockedSlotStatusUpdate.set(blockchainEvent.slot, new Deque()); + } + // this won't be undefined because if it is then we just created it above + this.blockedSlotStatusUpdate.get(blockchainEvent.slot)!.pushBack( + new FumeSlotStatus( + sessionSequence, + blockchainEvent.offset, + blockchainEvent.slot, + blockchainEvent.parentSlot, + eventCommitmentLevel, + blockchainEvent.deadError + ) + ); + + if (!this.inflightSlotShardDownload.has(blockchainEvent.slot)) { + const downloadRequest = new FumeDownloadRequest( + blockchainEvent.slot, + blockchainId, + blockUid, + blockchainEvent.numShards, + eventCommitmentLevel + ); + const downloadProgress = new SlotDownloadProgress( + blockchainEvent.numShards + ); + this.inflightSlotShardDownload.set( + blockchainEvent.slot, + downloadProgress + ); + return downloadRequest; + } + } + } + return null; + } + + markEventAsProcessed(eventSeqNumber: FumeSessionSequence): void { + const fumeOffset = this.sequenceToOffset.get(eventSeqNumber); + this.sequenceToOffset.delete(eventSeqNumber); + + if (fumeOffset === undefined) { + throw new Error("Event sequence number not found"); + } + + // push into min-heap (compare by sequence number) + this.processedOffset.push([eventSeqNumber, fumeOffset]); + + while (this.processedOffset.length > 0) { + const [seq, offset] = this.processedOffset.peek()!; + + if (seq !== this.lastProcessedFumeSequence + 1n) { + break; + } + + this.processedOffset.pop(); + this.committableOffset = offset; + this.lastProcessedFumeSequence = seq; + } + } + + slotStatusUpdateQueueLen(): number { + return this.slotStatusUpdateQueue.size(); + } + + processedOffsetQueueLen(): number { + return this.processedOffset.length; + } + + needNewBlockchainEvents(): boolean { + return ( + this.slotStatusUpdateQueue.size() === 0 && + this.blockedSlotStatusUpdate.size === 0 + ); + } +} diff --git a/typescript-sdk/src/runtime/wait-first-completed.ts b/typescript-sdk/src/runtime/wait-first-completed.ts new file mode 100644 index 0000000..4b140cf --- /dev/null +++ b/typescript-sdk/src/runtime/wait-first-completed.ts @@ -0,0 +1,35 @@ +type WaitResult = { + done: Promise[]; + pending: Promise[]; +}; + +export async function waitFirstCompleted(promises: Promise[]): Promise> { + if (promises.length === 0) { + return { done: [], pending: [] }; + } + + return new Promise>((resolve) => { + let settled = false; + + promises.forEach((p) => { + p.then( + () => { + if (!settled) { + settled = true; + const done = [p]; + const pending = promises.filter((q) => q !== p); + resolve({ done, pending }); + } + }, + () => { + if (!settled) { + settled = true; + const done = [p]; + const pending = promises.filter((q) => q !== p); + resolve({ done, pending }); + } + } + ); + }); + }); +} diff --git a/typescript-sdk/src/tests/grpc-slot-downloader.test.ts b/typescript-sdk/src/tests/grpc-slot-downloader.test.ts new file mode 100644 index 0000000..fdea884 --- /dev/null +++ b/typescript-sdk/src/tests/grpc-slot-downloader.test.ts @@ -0,0 +1,198 @@ +import { jest } from "@jest/globals"; + + +import { EventEmitter } from "events"; +import { status, ServiceError } from "@grpc/grpc-js"; +import { + GrpcDownloadBlockTaskRun, + DownloadBlockError, + DownloadTaskResult, + GrpcSlotDownloader, + DownloadTaskArgs, +} from "../runtime/grpc-slot-downloader"; +import { FumaroleClient } from "../grpc/fumarole"; +import { AsyncQueue } from "../runtime/async-queue"; +import { CommitmentLevel, SubscribeRequest, SubscribeUpdate } from "../grpc/geyser"; + +// === helpers === +class MockReadableStream extends EventEmitter { + cancel = jest.fn(); +} + +// mock AsyncQueue that can simulate disconnection +class MockAsyncQueue extends AsyncQueue { + public put = jest.fn(async (_: T) => {}); +} + +describe("GrpcDownloadBlockTaskRun", () => { + let mockClient: jest.Mocked; + let mockQueue: MockAsyncQueue; + let downloadRequest: any; + + beforeEach(() => { + mockClient = { + downloadBlock: jest.fn(), + } as any; + + mockQueue = new MockAsyncQueue(); + + downloadRequest = { + blockchainId: 0, + blockUid: new Uint8Array([1, 2, 3]), + slot: BigInt(42), + }; + }); + + test("mapTonicErrorCodeToDownloadBlockError returns correct mapping", () => { + const task = new GrpcDownloadBlockTaskRun( + downloadRequest, + mockClient, + null, + mockQueue + ); + + const codes: [number, string][] = [ + [status.NOT_FOUND, "BlockShardNotFound"], + [status.UNAVAILABLE, "Disconnected"], + [status.INTERNAL, "FailedDownload"], + [status.INVALID_ARGUMENT, "throw"], + [12345, "Fatal"], + ]; + + for (const [code, expected] of codes) { + const err = { code } as ServiceError; + if (expected === "throw") { + expect(() => task.mapTonicErrorCodeToDownloadBlockError(err)).toThrow( + "Invalid argument" + ); + } else { + const mapped = task.mapTonicErrorCodeToDownloadBlockError(err); + expect(mapped.kind).toBe(expected); + } + } + }); + + test("run resolves with Ok when blockShardDownloadFinish is received", async () => { + const stream = new MockReadableStream(); + mockClient.downloadBlock.mockReturnValue(stream as any); + + const task = new GrpcDownloadBlockTaskRun( + downloadRequest, + mockClient, + null, + mockQueue + ); + + const promise = task.run(); + + // emit update first + stream.emit("data", { update: { foo: "bar" } }); + // emit finish + stream.emit("data", { blockShardDownloadFinish: true }); + + const result = await promise; + expect(result.kind).toBe("Ok"); + expect(result.completed?.slot).toBe(BigInt(42)); + expect(mockQueue.put).toHaveBeenCalled(); + }); + + test("run resolves with Err when outlet is disconnected", async () => { + const stream = new MockReadableStream(); + mockClient.downloadBlock.mockReturnValue(stream as any); + + // simulate queue.put throwing + mockQueue.put.mockRejectedValueOnce(new Error("disconnected")); + + const task = new GrpcDownloadBlockTaskRun( + downloadRequest, + mockClient, + null, + mockQueue + ); + + const promise = task.run(); + + stream.emit("data", { update: { foo: "bar" } }); + + const result = await promise; + expect(result.kind).toBe("Err"); + expect(result.err?.kind).toBe("OutletDisconnected"); + }); + + test("run rejects when stream emits error", async () => { + const stream = new MockReadableStream(); + mockClient.downloadBlock.mockReturnValue(stream as any); + + const task = new GrpcDownloadBlockTaskRun( + downloadRequest, + mockClient, + null, + mockQueue + ); + + const promise = task.run(); + + const err = { code: status.UNAVAILABLE } as ServiceError; + stream.emit("error", err); + + await expect(promise).rejects.toBeInstanceOf(DownloadBlockError); + }); + + test("run resolves Err when stream ends without finish", async () => { + const stream = new MockReadableStream(); + mockClient.downloadBlock.mockReturnValue(stream as any); + + const task = new GrpcDownloadBlockTaskRun( + downloadRequest, + mockClient, + null, + mockQueue + ); + + const promise = task.run(); + + stream.emit("end"); + + const result = await promise; + expect(result.kind).toBe("Err"); + expect(result.err?.kind).toBe("FailedDownload"); + }); +}); + +describe("GrpcSlotDownloader", () => { + test("runDownload delegates to GrpcDownloadBlockTaskRun", async () => { + const mockClient = { + downloadBlock: jest.fn(() => new MockReadableStream()), + } as any as FumaroleClient; + + const downloader = new GrpcSlotDownloader(mockClient); + + const spec = new DownloadTaskArgs( + { + blockchainId: new Uint8Array([0,0,0]), + blockUid: new Uint8Array([1, 2, 3]), + slot: BigInt(42), + numShards: 1, + commitmentLevel: CommitmentLevel.CONFIRMED + }, + new MockAsyncQueue() + ); + + const subscribeRequest: any = { + accounts: {}, + transactions: {}, + entry: {}, + blocksMeta: {}, + }; + + // stub GrpcDownloadBlockTaskRun.run + const runSpy = jest + .spyOn(GrpcDownloadBlockTaskRun.prototype, "run") + .mockResolvedValue({ kind: "Ok" } as DownloadTaskResult); + + const result = await downloader.runDownload(subscribeRequest, spec); + + expect(runSpy).toHaveBeenCalled(); + expect(result.kind).toBe("Ok"); + }); +}); diff --git a/typescript-sdk/src/tests/state-machine.test.ts b/typescript-sdk/src/tests/state-machine.test.ts new file mode 100644 index 0000000..2e402ac --- /dev/null +++ b/typescript-sdk/src/tests/state-machine.test.ts @@ -0,0 +1,131 @@ +import { CommitmentLevel } from '../grpc/geyser'; +import { BlockchainEvent } from '../grpc/fumarole'; +import { FumaroleSM, DEFAULT_SLOT_MEMORY_RETENTION, SlotDownloadState } from '../runtime/state-machine'; +import { randomBytes } from 'crypto'; + +function randomBlockchainEvent( + offset: bigint, + slot: bigint, + commitment_level: CommitmentLevel, +): BlockchainEvent { + const nilBlockchainId = new Uint8Array(16); // UUID.nil() + const randomBlockUid = randomBytes(16); // UUID.v4() + + return { + offset, + blockchainId: nilBlockchainId, + blockUid: randomBlockUid, + numShards: 1, + slot, + parentSlot: undefined, + commitmentLevel: commitment_level as number, + blockchainShardId: 0, + deadError: undefined, + }; +} + +describe('FumaroleSM', () => { + describe('happy path', () => { + it('should handle basic flow correctly', () => { + const sm = new FumaroleSM(0n, DEFAULT_SLOT_MEMORY_RETENTION); + + const event = randomBlockchainEvent(1n, 1n, CommitmentLevel.PROCESSED); + sm.queueBlockchainEvent([event]); + + // Slot status should not be available, since we didn't download it yet + const downloadReq = sm.popSlotToDownload(); + expect(downloadReq).toBeDefined(); + expect(downloadReq?.slot).toBe(1n); + + expect(sm.popSlotToDownload()).toBeNull(); + expect(sm.popNextSlotStatus()).toBeNull(); + + const downloadState = sm.makeSlotDownloadProgress(1n, 0); + expect(downloadState).toBe(SlotDownloadState.Done); + + const status = sm.popNextSlotStatus(); + expect(status).toBeDefined(); + expect(status?.slot).toBe(1n); + expect(status?.commitmentLevel).toBe(CommitmentLevel.PROCESSED); + if (status) { + sm.markEventAsProcessed(status.sessionSequence); + } + + // All subsequent commitment level should be available right away + const event2 = { + ...event, + offset: event.offset + 1n, + commitmentLevel: CommitmentLevel.CONFIRMED as number, + }; + sm.queueBlockchainEvent([event2]); + + // It should not cause new slot download request + expect(sm.popSlotToDownload()).toBeNull(); + + const status2 = sm.popNextSlotStatus(); + expect(status2).toBeDefined(); + expect(status2?.slot).toBe(1n); + expect(status2?.commitmentLevel).toBe(CommitmentLevel.CONFIRMED); + if (status2) { + sm.markEventAsProcessed(status2.sessionSequence); + } + + expect(sm.committableOffset).toBe(event2.offset); + }); + }); + + describe('slot status deduplication', () => { + it('should deduplicate slot status', () => { + const sm = new FumaroleSM(0n, DEFAULT_SLOT_MEMORY_RETENTION); + + const event = randomBlockchainEvent(1n, 1n, CommitmentLevel.PROCESSED); + sm.queueBlockchainEvent([event]); + + // Slot status should not be available, since we didn't download it yet + expect(sm.popNextSlotStatus()).toBeNull(); + + const downloadReq = sm.popSlotToDownload(); + expect(downloadReq).toBeDefined(); + expect(downloadReq?.slot).toBe(1n); + + expect(sm.popSlotToDownload()).toBeNull(); + + sm.makeSlotDownloadProgress(1n, 0); + + const status = sm.popNextSlotStatus(); + expect(status).toBeDefined(); + expect(status?.slot).toBe(1n); + expect(status?.commitmentLevel).toBe(CommitmentLevel.PROCESSED); + + // Putting the same event back should be ignored + sm.queueBlockchainEvent([event]); + + expect(sm.popSlotToDownload()).toBeNull(); + expect(sm.popNextSlotStatus()).toBeNull(); + }); + }); + + describe('minimum commitment level', () => { + it('should handle min commitment level correctly', () => { + const sm = new FumaroleSM(0n, DEFAULT_SLOT_MEMORY_RETENTION); + + const event = randomBlockchainEvent(1n, 1n, CommitmentLevel.PROCESSED); + sm.queueBlockchainEvent([event]); + + // Slot status should not be available, since we didn't download it yet + expect(sm.popNextSlotStatus()).toBeNull(); + + // Use finalized commitment level here + const downloadReq = sm.popSlotToDownload(CommitmentLevel.FINALIZED); + expect(downloadReq).toBeNull(); + + expect(sm.popSlotToDownload()).toBeNull(); + + // It should not cause the slot status to be available here even if we have a finalized commitment level filtered out before + const status = sm.popNextSlotStatus(); + expect(status).toBeDefined(); + expect(status?.slot).toBe(1n); + expect(status?.commitmentLevel).toBe(CommitmentLevel.PROCESSED); + }); + }); +}); diff --git a/typescript-sdk/src/types/core.ts b/typescript-sdk/src/types/core.ts new file mode 100644 index 0000000..e69de29 diff --git a/typescript-sdk/src/types/index.ts b/typescript-sdk/src/types/index.ts new file mode 100644 index 0000000..0e5a445 --- /dev/null +++ b/typescript-sdk/src/types/index.ts @@ -0,0 +1,93 @@ +import { SubscribeRequest, SubscribeUpdate } from "../grpc/geyser"; +import { ControlCommand, ControlResponse } from "../grpc/fumarole"; +import { AsyncQueue } from "../runtime/async-queue"; + +export interface FumaroleSubscribeConfig { + concurrentDownloadLimit: number; + commitInterval: number; + maxFailedSlotDownloadAttempt: number; + dataChannelCapacity: number; + gcInterval: number; + slotMemoryRetention: number; +} + +export function getDefaultFumaroleSubscribeConfig(): FumaroleSubscribeConfig { + return { + concurrentDownloadLimit: DEFAULT_CONCURRENT_DOWNLOAD_LIMIT_PER_TCP, + commitInterval: DEFAULT_COMMIT_INTERVAL, + maxFailedSlotDownloadAttempt: DEFAULT_MAX_SLOT_DOWNLOAD_ATTEMPT, + dataChannelCapacity: DEFAULT_DRAGONSMOUTH_CAPACITY, + gcInterval: DEFAULT_GC_INTERVAL, + slotMemoryRetention: DEFAULT_SLOT_MEMORY_RETENTION + }; +} + +// export class AsyncQueue { +// private queue: T[] = []; +// private waitingResolvers: ((value: T) => void)[] = []; +// private closed = false; + +// constructor(private maxSize: number) {} + +// async put(item: T): Promise { +// if (this.closed) { +// throw new Error("Queue is closed"); +// } +// if (this.waitingResolvers.length > 0) { +// const resolve = this.waitingResolvers.shift()!; +// resolve(item); +// } else { +// if (this.queue.length >= this.maxSize) { +// await new Promise((resolve) => { +// this.waitingResolvers.push(() => resolve()); +// }); +// } +// this.queue.push(item); +// } +// } + +// async get(): Promise { +// if (this.queue.length > 0) { +// const item = this.queue.shift()!; +// if (this.waitingResolvers.length > 0) { +// const resolve = this.waitingResolvers.shift()!; +// resolve(undefined as any); +// } +// return item; +// } + +// if (this.closed) { +// throw new Error("Queue shutdown"); +// } + +// return new Promise((resolve) => { +// this.waitingResolvers.push(resolve); +// }); +// } + +// close() { +// this.closed = true; +// // Resolve all waiting getters with error +// while (this.waitingResolvers.length > 0) { +// const resolve = this.waitingResolvers.shift()!; +// resolve(undefined as any); +// } +// } +// } + +export interface DragonsmouthAdapterSession { + /** Queue for sending subscribe requests */ + sink: AsyncQueue; + /** Queue for receiving subscription updates */ + source: AsyncQueue; + /** Handle for tracking the fumarole runtime */ + fumaroleHandle: Promise; +} + +// Constants +export const DEFAULT_DRAGONSMOUTH_CAPACITY = 10000; +export const DEFAULT_COMMIT_INTERVAL = 5.0; // seconds +export const DEFAULT_MAX_SLOT_DOWNLOAD_ATTEMPT = 3; +export const DEFAULT_CONCURRENT_DOWNLOAD_LIMIT_PER_TCP = 10; +export const DEFAULT_GC_INTERVAL = 60; // seconds +export const DEFAULT_SLOT_MEMORY_RETENTION = 300; // seconds diff --git a/typescript-sdk/src/utils/interval.ts b/typescript-sdk/src/utils/interval.ts new file mode 100644 index 0000000..cec69d8 --- /dev/null +++ b/typescript-sdk/src/utils/interval.ts @@ -0,0 +1,11 @@ +export class Interval { + private ms: number; + + constructor(ms: number) { + this.ms = ms; + } + + async tick(): Promise { + return new Promise((resolve) => setTimeout(resolve, this.ms)); + } +} diff --git a/typescript-sdk/test/fumarole-integration.test.ts b/typescript-sdk/test/fumarole-integration.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/typescript-sdk/tsconfig.cjs.json b/typescript-sdk/tsconfig.cjs.json index 9227db7..8ab4792 100644 --- a/typescript-sdk/tsconfig.cjs.json +++ b/typescript-sdk/tsconfig.cjs.json @@ -1,16 +1,7 @@ { + "extends": "./tsconfig.json", "compilerOptions": { "module": "CommonJS", - "esModuleInterop": true, - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "sourceMap": true, - "allowJs": true, - "outDir": "dist/cjs", - "moduleResolution": "Node" - }, - "files": ["src/index.ts"], - "include": ["src/**/*"], - "exclude": ["node_modules", "**/*.test.js"] -} \ No newline at end of file + "outDir": "./dist/cjs" + } +} diff --git a/typescript-sdk/tsconfig.esm.json b/typescript-sdk/tsconfig.esm.json index fe32f25..c571fac 100644 --- a/typescript-sdk/tsconfig.esm.json +++ b/typescript-sdk/tsconfig.esm.json @@ -1,14 +1,6 @@ { + "extends": "./tsconfig.json", "compilerOptions": { - "module": "ESNext", - "target": "ES2022", - "moduleResolution": "Node", - "esModuleInterop": true, - "outDir": "dist/esm", - "declaration": true, - "declarationDir": "dist/types" - }, - "files": ["src/index.ts"], - "include": ["src/**/*"], - "exclude": ["node_modules", "**/*.test.js"] + "outDir": "./dist/esm" + } } diff --git a/typescript-sdk/tsconfig.json b/typescript-sdk/tsconfig.json index 26ba6c4..5c9a4b7 100644 --- a/typescript-sdk/tsconfig.json +++ b/typescript-sdk/tsconfig.json @@ -1,8 +1,23 @@ { "compilerOptions": { + "target": "ES2020", + "module": "ES2020", + "lib": ["ES2020"], + "declaration": true, + "declarationDir": "./dist/types", + "strict": true, "esModuleInterop": true, - "outDir": "dist", - "rootDir": "src", - "declaration": true - } + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "outDir": "./dist/esm", + "rootDir": "./src", + "composite": true, + "incremental": true, + "typeRoots": ["./node_modules/@types", "./src/types"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] }