├── .gitignore ├── .yarn ├── cache │ ├── @babel-runtime-npm-7.26.0-9afa3c4ef6-9f4ea1c1d5.zip │ ├── @cspotcode-source-map-support-npm-0.8.1-964f2de99d-b6e38a1712.zip │ ├── @ioredis-commands-npm-1.2.0-47541de88b-a8253c9539.zip │ ├── @isaacs-cliui-npm-8.0.2-f4364666d5-e9ed5fd27c.zip │ ├── @isaacs-fs-minipass-npm-4.0.1-677026e841-4412e9e671.zip │ ├── @jridgewell-resolve-uri-npm-3.1.2-5bc4245992-97106439d7.zip │ ├── @jridgewell-sourcemap-codec-npm-1.5.0-dfd9126d71-4ed6123217.zip │ ├── @jridgewell-trace-mapping-npm-0.3.9-91625cd7fb-83deafb8e7.zip │ ├── @noble-curves-npm-1.8.0-ad3f3798b7-c54ce84cf5.zip │ ├── @noble-hashes-npm-1.7.0-32d1fa52c5-ab038a816c.zip │ ├── @npmcli-agent-npm-3.0.0-169e79294f-775c9a7eb1.zip │ ├── @npmcli-fs-npm-4.0.0-1d9cc8a27b-405c4490e1.zip │ ├── @pkgjs-parseargs-npm-0.11.0-cd2a3fe948-115e8ceeec.zip │ ├── @solana-buffer-layout-npm-4.0.1-4100001d9d-c64b996b83.zip │ ├── @solana-web3.js-npm-1.98.0-018d59a711-b4d398c89a.zip │ ├── @swc-helpers-npm-0.5.15-a7a06a73bc-e3f32c6dee.zip │ ├── @tsconfig-node10-npm-1.0.11-ab23db00e2-51fe47d55f.zip │ ├── @tsconfig-node12-npm-1.0.11-9710d1c61b-5ce29a41b1.zip │ ├── @tsconfig-node14-npm-1.0.3-15321421d2-19275fe80c.zip │ ├── @tsconfig-node16-npm-1.0.4-b7cb87d859-2023197859.zip │ ├── @types-chai-npm-4.3.20-468371f41f-94fd87036f.zip │ ├── @types-connect-npm-3.4.38-a8a4c38337-7eb1bc5342.zip │ ├── @types-json5-npm-0.0.29-f63a7916bd-4e5aed58ca.zip │ ├── @types-mocha-npm-10.0.10-1e025e7c6e-4e3b61ed51.zip │ ├── @types-node-npm-12.20.55-88487587a4-1f916a06ff.zip │ ├── @types-node-npm-20.17.12-ee47450752-d4748de76c.zip │ ├── @types-node-npm-22.10.5-cd9f5f929b-a5366961ff.zip │ ├── @types-semaphore-npm-1.1.4-b96da08cbb-bd07f2ea5e.zip │ ├── @types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip │ ├── @types-ws-npm-7.4.7-d0c95c0958-5236b6c548.zip │ ├── @types-ws-npm-8.5.13-7564c96514-21369beafa.zip │ ├── JSONStream-npm-1.3.5-1987f2e6dd-e30daf7b9b.zip │ ├── abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip │ ├── acorn-npm-8.14.0-dc46f61424-6df29c3555.zip │ ├── acorn-walk-npm-8.3.4-a75fa85ead-871386764e.zip │ ├── agent-base-npm-7.1.3-b2c16e72fb-3db6d8d465.zip │ ├── agentkeepalive-npm-4.6.0-6b61ca2a37-80c546bd88.zip │ ├── ansi-colors-npm-4.1.3-8ffd0ae6c7-43d6e2fc7b.zip │ ├── ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip │ ├── ansi-regex-npm-6.1.0-abe011aae4-495834a53b.zip │ ├── ansi-styles-npm-4.3.0-245c7d42c7-b4494dfbfc.zip │ ├── ansi-styles-npm-6.2.1-d43647018c-70fdf883b7.zip │ ├── anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip │ ├── arg-npm-4.1.3-1748b966a8-969b491082.zip │ ├── argparse-npm-2.0.1-faff7999e6-18640244e6.zip │ ├── arrify-npm-1.0.1-affafba9fe-745075dd4a.zip │ ├── assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip │ ├── balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip │ ├── base-x-npm-3.0.10-2d05c06792-5230773955.zip │ ├── base64-js-npm-1.5.1-b2f7275641-669632eb37.zip │ ├── bigint-buffer-npm-1.1.5-785f4ccd92-be70c7ad00.zip │ ├── binary-extensions-npm-2.3.0-bd3f20d865-bcad01494e.zip │ ├── bindings-npm-1.5.0-77ce1d213c-593d5ae975.zip │ ├── bn.js-npm-5.2.1-dc952b1965-7a7e8764d7.zip │ ├── borsh-npm-0.7.0-c3e1c21bb3-e51a9395da.zip │ ├── brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip │ ├── braces-npm-3.0.3-582c14023c-fad11a0d46.zip │ ├── browser-stdout-npm-1.3.1-6b2376bf3f-ac70a84e34.zip │ ├── bs58-npm-4.0.1-8d2a7822b1-b3c5365bb9.zip │ ├── buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip │ ├── buffer-npm-6.0.3-cd90dfedfe-b6bc68237e.zip │ ├── bufferutil-npm-4.0.9-956b9c83fa-335bb716d4.zip │ ├── cacache-npm-19.0.1-395cba1936-ea026b27b1.zip │ ├── camelcase-npm-6.3.0-e5e42a0d15-8c96818a90.zip │ ├── chai-npm-4.5.0-428447e206-cde341aee1.zip │ ├── chalk-npm-4.1.2-ba8b67ab80-cb3f3e5949.zip │ ├── check-error-npm-1.0.3-137994eabc-e2131025cf.zip │ ├── chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip │ ├── chownr-npm-3.0.0-5275e85d25-b63cb1f73d.zip │ ├── cliui-npm-7.0.4-d6b8a9edb6-db858c49af.zip │ ├── cluster-key-slot-npm-1.1.2-0571a28825-516ed8b5e1.zip │ ├── color-convert-npm-2.0.1-79730e935b-fa00c91b43.zip │ ├── color-name-npm-1.1.4-025792b0ea-b044585952.zip │ ├── commander-npm-2.20.3-d8dcbaa39b-90c5b68986.zip │ ├── create-require-npm-1.1.1-839884ca2e-a9a1503d43.zip │ ├── cross-spawn-npm-7.0.6-264bddf921-0d52657d7a.zip │ ├── debug-npm-4.4.0-f6efe76023-1847944c2e.zip │ ├── decamelize-npm-4.0.0-12410e3409-b7d09b8265.zip │ ├── deep-eql-npm-4.1.4-bc4d39c2ca-f04f4d581f.zip │ ├── delay-npm-5.0.0-1d1c758b46-62f151151e.zip │ ├── denque-npm-2.1.0-578d0b6297-8ea0532157.zip │ ├── diff-npm-3.5.0-a321a0df19-cfbc2df98d.zip │ ├── diff-npm-4.0.2-73133c7102-ec09ec2101.zip │ ├── diff-npm-5.2.0-f523a581f3-01b7b440f8.zip │ ├── eastasianwidth-npm-0.2.0-c37eb16bd1-9b1d3e1bae.zip │ ├── emoji-regex-npm-8.0.0-213764015c-c72d67a682.zip │ ├── emoji-regex-npm-9.2.2-e6fac8d058-915acf859c.zip │ ├── encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip │ ├── env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip │ ├── err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip │ ├── es6-promise-npm-4.2.8-c9f5b11f66-b250c55523.zip │ ├── es6-promisify-npm-5.0.0-3726550934-fbed9d7915.zip │ ├── escalade-npm-3.2.0-19b50dd48f-9d7169e396.zip │ ├── escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip │ ├── eventemitter3-npm-5.0.1-5e423b7df3-ac6423ec31.zip │ ├── exponential-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip │ ├── eyes-npm-0.1.8-4f28ed333f-58480c1f4c.zip │ ├── fast-stable-stringify-npm-1.0.0-040fa045a5-e4743ae52f.zip │ ├── file-uri-to-path-npm-1.0.0-1043ac6206-b648580bdd.zip │ ├── fill-range-npm-7.1.1-bf491486db-a7095cb39e.zip │ ├── find-up-npm-5.0.0-e03e9b796d-07955e3573.zip │ ├── flat-npm-5.0.2-12748102a5-72479e651c.zip │ ├── foreground-child-npm-3.3.0-b8be745271-e3a60480f3.zip │ ├── fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip │ ├── fs.realpath-npm-1.0.0-c8f05d8126-e703107c28.zip │ ├── fsevents-npm-2.3.3-ce9fb0ffae-4c1ade961d.zip │ ├── fsevents-patch-6b67494872-10.zip │ ├── get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip │ ├── get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip │ ├── glob-npm-10.4.5-8c63175f05-698dfe1182.zip │ ├── glob-npm-8.1.0-65f64af8b1-9aab1c75eb.zip │ ├── glob-parent-npm-5.1.2-021ab32634-32cd106ce8.zip │ ├── graceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip │ ├── has-flag-npm-4.0.0-32af9f0536-261a135703.zip │ ├── he-npm-1.2.0-3b73a2ff07-d09b2243da.zip │ ├── http-cache-semantics-npm-4.1.1-1120131375-362d5ed66b.zip │ ├── http-proxy-agent-npm-7.0.2-643ed7cc33-d062acfa0c.zip │ ├── https-proxy-agent-npm-7.0.6-27a95c2690-784b628cbd.zip │ ├── humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip │ ├── iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip │ ├── ieee754-npm-1.2.1-fb63b3caeb-d9f2557a59.zip │ ├── imurmurhash-npm-0.1.4-610c5068a0-2d30b157a9.zip │ ├── inflight-npm-1.0.6-ccedb4b908-d2ebd65441.zip │ ├── inherits-npm-2.0.4-c66b3957a0-cd45e923be.zip │ ├── ioredis-npm-5.4.2-d393ad1d4d-1ba306dfb5.zip │ ├── ip-address-npm-9.0.5-9fa024d42a-1ed81e0672.zip │ ├── is-binary-path-npm-2.1.0-e61d46f557-078e51b4f9.zip │ ├── is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip │ ├── is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip │ ├── is-glob-npm-4.0.3-cb87bf1bdb-3ed74f2b0c.zip │ ├── is-number-npm-7.0.0-060086935c-6a6c3383f6.zip │ ├── is-plain-obj-npm-2.1.0-8dffd7ae9c-cec9100678.zip │ ├── is-unicode-supported-npm-0.1.0-0833e1bbfb-a2aab86ee7.zip │ ├── isexe-npm-2.0.0-b58870bd2e-7c9f715c03.zip │ ├── isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip │ ├── isomorphic-ws-npm-4.0.1-aa39192848-d7190eadef.zip │ ├── jackspeak-npm-3.4.3-546bfad080-96f8786eaa.zip │ ├── jayson-npm-4.1.3-aed7722911-3d6c35d278.zip │ ├── js-yaml-npm-4.1.0-3606f32312-c138a34a3f.zip │ ├── jsbn-npm-1.1.0-1da0181838-bebe7ae829.zip │ ├── json-stringify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip │ ├── json5-npm-1.0.2-9607f93e30-a78d812dbb.zip │ ├── jsonparse-npm-1.3.1-b6fde74828-24531e956f.zip │ ├── locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip │ ├── lodash.defaults-npm-4.2.0-c5dea025ab-6a2a9ea5ad.zip │ ├── lodash.isarguments-npm-3.1.0-9e74d350b8-e5186d5fe0.zip │ ├── log-symbols-npm-4.1.0-0a13492d8b-fce1497b31.zip │ ├── loupe-npm-2.3.7-f294c2ef33-635c8f0914.zip │ ├── lru-cache-npm-10.4.3-30c10b861a-e6e9026736.zip │ ├── make-error-npm-1.3.6-ccb85d9458-b86e5e0e25.zip │ ├── make-fetch-happen-npm-14.0.3-23b30e8691-fce0385840.zip │ ├── minimatch-npm-5.1.6-1e71429f4c-126b36485b.zip │ ├── minimatch-npm-9.0.5-9aa93d97fa-dd6a8927b0.zip │ ├── minimist-npm-1.2.8-d7af7b1dce-908491b6cc.zip │ ├── minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip │ ├── minipass-fetch-npm-4.0.0-d4e49e0194-4b0772dbee.zip │ ├── minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip │ ├── minipass-npm-3.3.6-b8d93a945b-a5c6ef069f.zip │ ├── minipass-npm-7.1.2-3a5327d36d-c25f0ee819.zip │ ├── minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip │ ├── minipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip │ ├── minizlib-npm-3.0.1-4bdabd978f-622cb85f51.zip │ ├── mkdirp-npm-0.5.6-dcd5a6b97b-0c91b721bb.zip │ ├── mkdirp-npm-3.0.1-f94bfa769e-16fd79c286.zip │ ├── mocha-npm-10.8.2-4295e5e50b-903bbffcb1.zip │ ├── ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip │ ├── negotiator-npm-1.0.0-47d727e27e-b5734e8729.zip │ ├── node-fetch-npm-2.7.0-587d57004e-b24f8a3dc9.zip │ ├── node-gyp-build-npm-4.8.4-106c2a0b4f-6a7d62289d.zip │ ├── node-gyp-npm-11.0.0-669e34db1b-5d07430e88.zip │ ├── nopt-npm-8.0.0-98d6bf6d52-2d137f64b6.zip │ ├── normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip │ ├── once-npm-1.4.0-ccf03ef07a-cd0a885013.zip │ ├── p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip │ ├── p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip │ ├── p-map-npm-7.0.3-93bbec0d8c-2ef48ccfc6.zip │ ├── package-json-from-dist-npm-1.0.1-4631a88465-58ee9538f2.zip │ ├── path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip │ ├── path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip │ ├── path-scurry-npm-1.11.1-aaf8c339af-5e8845c159.zip │ ├── pathval-npm-1.1.1-ce0311d7e0-b50a475106.zip │ ├── picomatch-npm-2.3.1-c782cfd986-60c2595003.zip │ ├── prettier-npm-2.8.8-430828a36c-00cdb6ab02.zip │ ├── proc-log-npm-5.0.0-405173f9b4-35610bdb01.zip │ ├── promise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip │ ├── randombytes-npm-2.1.0-e3da76bccf-4efd1ad3d8.zip │ ├── rate-limiter-flexible-npm-4.0.1-06bd5d7298-c86b9b1883.zip │ ├── readdirp-npm-3.6.0-f950cc74ab-196b30ef6c.zip │ ├── redis-errors-npm-1.2.0-a81fd9b0f1-001c11f63d.zip │ ├── redis-parser-npm-3.0.0-7ebe40abcb-b10846844b.zip │ ├── regenerator-runtime-npm-0.14.1-a6c97c609a-5db3161abb.zip │ ├── require-directory-npm-2.1.1-8608aee50b-a72468e258.zip │ ├── retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip │ ├── rimraf-npm-5.0.10-d0c6647697-f3b8ce81ee.zip │ ├── rpc-websockets-npm-9.0.4-a4d909a61e-cb5b721214.zip │ ├── safe-buffer-npm-5.2.1-3481c8aa9b-32872cd0ff.zip │ ├── safer-buffer-npm-2.1.2-8d5c0b705e-7eaf7a0cf3.zip │ ├── semver-npm-7.6.3-57e82c14d5-36b1fbe1a2.zip │ ├── serialize-javascript-npm-6.0.2-cc09461d45-445a420a6f.zip │ ├── shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip │ ├── shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip │ ├── signal-exit-npm-4.1.0-61fb957687-c9fa63bbbd.zip │ ├── smart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip │ ├── socks-npm-2.8.3-3532b59899-ffcb622c22.zip │ ├── socks-proxy-agent-npm-8.0.5-24d77a90dc-ee99e1daca.zip │ ├── source-map-npm-0.6.1-1a3621db16-59ef7462f1.zip │ ├── source-map-support-npm-0.5.21-09ca99e250-8317e12d84.zip │ ├── sprintf-js-npm-1.1.3-b99efd75b2-e7587128c4.zip │ ├── ssri-npm-12.0.0-97c0e53d2e-7024c1a6e3.zip │ ├── standard-as-callback-npm-2.1.0-8e47620bd4-88bec83ee2.zip │ ├── string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip │ ├── string-width-npm-5.1.2-bf60531341-7369deaa29.zip │ ├── strip-ansi-npm-6.0.1-caddc7cb40-ae3b5436d3.zip │ ├── strip-ansi-npm-7.1.0-7453b80b79-475f53e9c4.zip │ ├── strip-bom-npm-3.0.0-71e8f81ff9-8d50ff27b7.zip │ ├── strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip │ ├── superstruct-npm-2.0.2-105f89beae-10e1944a9d.zip │ ├── supports-color-npm-7.2.0-606bfcf7da-c8bb7afd56.zip │ ├── supports-color-npm-8.1.1-289e937149-157b534df8.zip │ ├── tar-npm-7.4.3-1dbbd1ffc3-12a2a4fc6d.zip │ ├── text-encoding-utf-8-npm-1.0.2-d3a9fb552b-845bb4bd05.zip │ ├── through-npm-2.3.8-df5f72a16e-5da78346f7.zip │ ├── to-regex-range-npm-5.0.1-f1e8263b00-10dda13571.zip │ ├── tr46-npm-0.0.3-de53018915-8f1f5aa6cb.zip │ ├── ts-mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip │ ├── ts-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip │ ├── ts-node-npm-7.0.1-dfa4b9e69b-c1e0f15828.zip │ ├── tsconfig-paths-npm-3.15.0-ff68930e0e-2041beaedc.zip │ ├── tslib-npm-2.8.1-66590b21b8-3e2e043d5c.zip │ ├── type-detect-npm-4.1.0-171d011a73-e363bf0352.zip │ ├── typescript-npm-4.9.5-6427b65ee6-458f7220ab.zip │ ├── typescript-patch-32ada147aa-7f0623212a.zip │ ├── undici-types-npm-6.19.8-9f12285b7a-cf0b48ed4f.zip │ ├── undici-types-npm-6.20.0-bd21e669af-583ac7bbf4.zip │ ├── unique-filename-npm-4.0.0-bfc100c4e3-6a62094fca.zip │ ├── unique-slug-npm-5.0.0-11508c0469-beafdf3d6f.zip │ ├── utf-8-validate-npm-5.0.10-93e9b6f750-b89cbc13b4.zip │ ├── uuid-npm-8.3.2-eca0baba53-9a5f7aa1d6.zip │ ├── v8-compile-cache-lib-npm-3.0.1-4886071ece-88d3423a52.zip │ ├── webidl-conversions-npm-3.0.1-60310f6a2b-b65b9f8d68.zip │ ├── whatwg-url-npm-5.0.0-374fb45e60-f95adbc1e8.zip │ ├── which-npm-2.0.2-320ddf72f7-4782f8a1d6.zip │ ├── which-npm-5.0.0-15aa39eb60-6ec99e89ba.zip │ ├── workerpool-npm-6.5.1-7e0dd85ca7-b1b00139fe.zip │ ├── wrap-ansi-npm-7.0.0-ad6e1a0554-cebdaeca3a.zip │ ├── wrap-ansi-npm-8.1.0-26a4e6ae28-7b1e4b35e9.zip │ ├── wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip │ ├── ws-npm-7.5.10-878ccb886b-9c796b84ba.zip │ ├── ws-npm-8.18.0-56f68bc4d6-70dfe53f23.zip │ ├── y18n-npm-5.0.8-5f3a0a7e62-5f1b5f95e3.zip │ ├── yallist-npm-4.0.0-b493d9e907-4cb02b42b8.zip │ ├── yallist-npm-5.0.0-8732dd9f1c-1884d272d4.zip │ ├── yargs-npm-16.2.0-547873d425-807fa21211.zip │ ├── yargs-parser-npm-20.2.9-a1d19e598d-0188f430a0.zip │ ├── yargs-unparser-npm-2.0.0-930f3ff3f6-68f9a542c6.zip │ ├── yn-npm-2.0.0-3ad11617c1-9d49527cb3.zip │ ├── yn-npm-3.1.1-8ad4259784-2c487b0e14.zip │ └── yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip ├── install-state.gz └── releases │ └── yarn-4.3.0.cjs ├── .yarnrc.yml ├── README.md ├── package-lock.json ├── package.json ├── src ├── index.ts └── transport-manager.ts ├── tests └── transport-manager.test.ts ├── tsconfig.base.json ├── tsconfig.cjs.json ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Private keys/secrets 2 | *.jks 3 | *.p8 4 | *.p12 5 | *.key 6 | .env 7 | 8 | # macOS 9 | .DS_Store 10 | 11 | # WSL 12 | *:Zone.Identifier 13 | 14 | # Temp files 15 | *.orig.* 16 | *.swp 17 | *.log 18 | 19 | # Node/tsc 20 | node_modules/ 21 | npm-debug.* 22 | dist/ 23 | 24 | # Yarn (uncomment for zero-install: https://stackoverflow.com/a/58550620) 25 | #.yarn/ 26 | #!.yarn/cache 27 | #!.yarn/patches 28 | #!.yarn/plugins 29 | !.yarn/releases 30 | #!.yarn/versions 31 | #!.yarn/sdks 32 | # .yarn/unplugged 33 | # .yarn/build-state.yaml 34 | 35 | # IDEs 36 | .idea/ 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /.yarn/cache/@babel-runtime-npm-7.26.0-9afa3c4ef6-9f4ea1c1d5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@babel-runtime-npm-7.26.0-9afa3c4ef6-9f4ea1c1d5.zip -------------------------------------------------------------------------------- /.yarn/cache/@cspotcode-source-map-support-npm-0.8.1-964f2de99d-b6e38a1712.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@cspotcode-source-map-support-npm-0.8.1-964f2de99d-b6e38a1712.zip -------------------------------------------------------------------------------- /.yarn/cache/@ioredis-commands-npm-1.2.0-47541de88b-a8253c9539.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@ioredis-commands-npm-1.2.0-47541de88b-a8253c9539.zip -------------------------------------------------------------------------------- /.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-e9ed5fd27c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-e9ed5fd27c.zip -------------------------------------------------------------------------------- /.yarn/cache/@isaacs-fs-minipass-npm-4.0.1-677026e841-4412e9e671.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@isaacs-fs-minipass-npm-4.0.1-677026e841-4412e9e671.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-resolve-uri-npm-3.1.2-5bc4245992-97106439d7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.2-5bc4245992-97106439d7.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-sourcemap-codec-npm-1.5.0-dfd9126d71-4ed6123217.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.5.0-dfd9126d71-4ed6123217.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-trace-mapping-npm-0.3.9-91625cd7fb-83deafb8e7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.9-91625cd7fb-83deafb8e7.zip -------------------------------------------------------------------------------- /.yarn/cache/@noble-curves-npm-1.8.0-ad3f3798b7-c54ce84cf5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@noble-curves-npm-1.8.0-ad3f3798b7-c54ce84cf5.zip -------------------------------------------------------------------------------- /.yarn/cache/@noble-hashes-npm-1.7.0-32d1fa52c5-ab038a816c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@noble-hashes-npm-1.7.0-32d1fa52c5-ab038a816c.zip -------------------------------------------------------------------------------- /.yarn/cache/@npmcli-agent-npm-3.0.0-169e79294f-775c9a7eb1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@npmcli-agent-npm-3.0.0-169e79294f-775c9a7eb1.zip -------------------------------------------------------------------------------- /.yarn/cache/@npmcli-fs-npm-4.0.0-1d9cc8a27b-405c4490e1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@npmcli-fs-npm-4.0.0-1d9cc8a27b-405c4490e1.zip -------------------------------------------------------------------------------- /.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-115e8ceeec.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-115e8ceeec.zip -------------------------------------------------------------------------------- /.yarn/cache/@solana-buffer-layout-npm-4.0.1-4100001d9d-c64b996b83.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@solana-buffer-layout-npm-4.0.1-4100001d9d-c64b996b83.zip -------------------------------------------------------------------------------- /.yarn/cache/@solana-web3.js-npm-1.98.0-018d59a711-b4d398c89a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@solana-web3.js-npm-1.98.0-018d59a711-b4d398c89a.zip -------------------------------------------------------------------------------- /.yarn/cache/@swc-helpers-npm-0.5.15-a7a06a73bc-e3f32c6dee.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@swc-helpers-npm-0.5.15-a7a06a73bc-e3f32c6dee.zip -------------------------------------------------------------------------------- /.yarn/cache/@tsconfig-node10-npm-1.0.11-ab23db00e2-51fe47d55f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@tsconfig-node10-npm-1.0.11-ab23db00e2-51fe47d55f.zip -------------------------------------------------------------------------------- /.yarn/cache/@tsconfig-node12-npm-1.0.11-9710d1c61b-5ce29a41b1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@tsconfig-node12-npm-1.0.11-9710d1c61b-5ce29a41b1.zip -------------------------------------------------------------------------------- /.yarn/cache/@tsconfig-node14-npm-1.0.3-15321421d2-19275fe80c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@tsconfig-node14-npm-1.0.3-15321421d2-19275fe80c.zip -------------------------------------------------------------------------------- /.yarn/cache/@tsconfig-node16-npm-1.0.4-b7cb87d859-2023197859.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@tsconfig-node16-npm-1.0.4-b7cb87d859-2023197859.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-chai-npm-4.3.20-468371f41f-94fd87036f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-chai-npm-4.3.20-468371f41f-94fd87036f.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-connect-npm-3.4.38-a8a4c38337-7eb1bc5342.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-connect-npm-3.4.38-a8a4c38337-7eb1bc5342.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-json5-npm-0.0.29-f63a7916bd-4e5aed58ca.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-json5-npm-0.0.29-f63a7916bd-4e5aed58ca.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-mocha-npm-10.0.10-1e025e7c6e-4e3b61ed51.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-mocha-npm-10.0.10-1e025e7c6e-4e3b61ed51.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-node-npm-12.20.55-88487587a4-1f916a06ff.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-node-npm-12.20.55-88487587a4-1f916a06ff.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-node-npm-20.17.12-ee47450752-d4748de76c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-node-npm-20.17.12-ee47450752-d4748de76c.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-node-npm-22.10.5-cd9f5f929b-a5366961ff.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-node-npm-22.10.5-cd9f5f929b-a5366961ff.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-semaphore-npm-1.1.4-b96da08cbb-bd07f2ea5e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-semaphore-npm-1.1.4-b96da08cbb-bd07f2ea5e.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-ws-npm-7.4.7-d0c95c0958-5236b6c548.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-ws-npm-7.4.7-d0c95c0958-5236b6c548.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-ws-npm-8.5.13-7564c96514-21369beafa.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/@types-ws-npm-8.5.13-7564c96514-21369beafa.zip -------------------------------------------------------------------------------- /.yarn/cache/JSONStream-npm-1.3.5-1987f2e6dd-e30daf7b9b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/JSONStream-npm-1.3.5-1987f2e6dd-e30daf7b9b.zip -------------------------------------------------------------------------------- /.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip -------------------------------------------------------------------------------- /.yarn/cache/acorn-npm-8.14.0-dc46f61424-6df29c3555.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/acorn-npm-8.14.0-dc46f61424-6df29c3555.zip -------------------------------------------------------------------------------- /.yarn/cache/acorn-walk-npm-8.3.4-a75fa85ead-871386764e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/acorn-walk-npm-8.3.4-a75fa85ead-871386764e.zip -------------------------------------------------------------------------------- /.yarn/cache/agent-base-npm-7.1.3-b2c16e72fb-3db6d8d465.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/agent-base-npm-7.1.3-b2c16e72fb-3db6d8d465.zip -------------------------------------------------------------------------------- /.yarn/cache/agentkeepalive-npm-4.6.0-6b61ca2a37-80c546bd88.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/agentkeepalive-npm-4.6.0-6b61ca2a37-80c546bd88.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-colors-npm-4.1.3-8ffd0ae6c7-43d6e2fc7b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ansi-colors-npm-4.1.3-8ffd0ae6c7-43d6e2fc7b.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-regex-npm-6.1.0-abe011aae4-495834a53b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ansi-regex-npm-6.1.0-abe011aae4-495834a53b.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-b4494dfbfc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-b4494dfbfc.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-70fdf883b7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-70fdf883b7.zip -------------------------------------------------------------------------------- /.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip -------------------------------------------------------------------------------- /.yarn/cache/arg-npm-4.1.3-1748b966a8-969b491082.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/arg-npm-4.1.3-1748b966a8-969b491082.zip -------------------------------------------------------------------------------- /.yarn/cache/argparse-npm-2.0.1-faff7999e6-18640244e6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/argparse-npm-2.0.1-faff7999e6-18640244e6.zip -------------------------------------------------------------------------------- /.yarn/cache/arrify-npm-1.0.1-affafba9fe-745075dd4a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/arrify-npm-1.0.1-affafba9fe-745075dd4a.zip -------------------------------------------------------------------------------- /.yarn/cache/assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip -------------------------------------------------------------------------------- /.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip -------------------------------------------------------------------------------- /.yarn/cache/base-x-npm-3.0.10-2d05c06792-5230773955.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/base-x-npm-3.0.10-2d05c06792-5230773955.zip -------------------------------------------------------------------------------- /.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip -------------------------------------------------------------------------------- /.yarn/cache/bigint-buffer-npm-1.1.5-785f4ccd92-be70c7ad00.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/bigint-buffer-npm-1.1.5-785f4ccd92-be70c7ad00.zip -------------------------------------------------------------------------------- /.yarn/cache/binary-extensions-npm-2.3.0-bd3f20d865-bcad01494e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/binary-extensions-npm-2.3.0-bd3f20d865-bcad01494e.zip -------------------------------------------------------------------------------- /.yarn/cache/bindings-npm-1.5.0-77ce1d213c-593d5ae975.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/bindings-npm-1.5.0-77ce1d213c-593d5ae975.zip -------------------------------------------------------------------------------- /.yarn/cache/bn.js-npm-5.2.1-dc952b1965-7a7e8764d7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/bn.js-npm-5.2.1-dc952b1965-7a7e8764d7.zip -------------------------------------------------------------------------------- /.yarn/cache/borsh-npm-0.7.0-c3e1c21bb3-e51a9395da.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/borsh-npm-0.7.0-c3e1c21bb3-e51a9395da.zip -------------------------------------------------------------------------------- /.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip -------------------------------------------------------------------------------- /.yarn/cache/braces-npm-3.0.3-582c14023c-fad11a0d46.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/braces-npm-3.0.3-582c14023c-fad11a0d46.zip -------------------------------------------------------------------------------- /.yarn/cache/browser-stdout-npm-1.3.1-6b2376bf3f-ac70a84e34.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/browser-stdout-npm-1.3.1-6b2376bf3f-ac70a84e34.zip -------------------------------------------------------------------------------- /.yarn/cache/bs58-npm-4.0.1-8d2a7822b1-b3c5365bb9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/bs58-npm-4.0.1-8d2a7822b1-b3c5365bb9.zip -------------------------------------------------------------------------------- /.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip -------------------------------------------------------------------------------- /.yarn/cache/buffer-npm-6.0.3-cd90dfedfe-b6bc68237e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/buffer-npm-6.0.3-cd90dfedfe-b6bc68237e.zip -------------------------------------------------------------------------------- /.yarn/cache/bufferutil-npm-4.0.9-956b9c83fa-335bb716d4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/bufferutil-npm-4.0.9-956b9c83fa-335bb716d4.zip -------------------------------------------------------------------------------- /.yarn/cache/cacache-npm-19.0.1-395cba1936-ea026b27b1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/cacache-npm-19.0.1-395cba1936-ea026b27b1.zip -------------------------------------------------------------------------------- /.yarn/cache/camelcase-npm-6.3.0-e5e42a0d15-8c96818a90.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/camelcase-npm-6.3.0-e5e42a0d15-8c96818a90.zip -------------------------------------------------------------------------------- /.yarn/cache/chai-npm-4.5.0-428447e206-cde341aee1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/chai-npm-4.5.0-428447e206-cde341aee1.zip -------------------------------------------------------------------------------- /.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-cb3f3e5949.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-cb3f3e5949.zip -------------------------------------------------------------------------------- /.yarn/cache/check-error-npm-1.0.3-137994eabc-e2131025cf.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/check-error-npm-1.0.3-137994eabc-e2131025cf.zip -------------------------------------------------------------------------------- /.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip -------------------------------------------------------------------------------- /.yarn/cache/chownr-npm-3.0.0-5275e85d25-b63cb1f73d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/chownr-npm-3.0.0-5275e85d25-b63cb1f73d.zip -------------------------------------------------------------------------------- /.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-db858c49af.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-db858c49af.zip -------------------------------------------------------------------------------- /.yarn/cache/cluster-key-slot-npm-1.1.2-0571a28825-516ed8b5e1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/cluster-key-slot-npm-1.1.2-0571a28825-516ed8b5e1.zip -------------------------------------------------------------------------------- /.yarn/cache/color-convert-npm-2.0.1-79730e935b-fa00c91b43.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/color-convert-npm-2.0.1-79730e935b-fa00c91b43.zip -------------------------------------------------------------------------------- /.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip -------------------------------------------------------------------------------- /.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-90c5b68986.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-90c5b68986.zip -------------------------------------------------------------------------------- /.yarn/cache/create-require-npm-1.1.1-839884ca2e-a9a1503d43.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/create-require-npm-1.1.1-839884ca2e-a9a1503d43.zip -------------------------------------------------------------------------------- /.yarn/cache/cross-spawn-npm-7.0.6-264bddf921-0d52657d7a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/cross-spawn-npm-7.0.6-264bddf921-0d52657d7a.zip -------------------------------------------------------------------------------- /.yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip -------------------------------------------------------------------------------- /.yarn/cache/decamelize-npm-4.0.0-12410e3409-b7d09b8265.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/decamelize-npm-4.0.0-12410e3409-b7d09b8265.zip -------------------------------------------------------------------------------- /.yarn/cache/deep-eql-npm-4.1.4-bc4d39c2ca-f04f4d581f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/deep-eql-npm-4.1.4-bc4d39c2ca-f04f4d581f.zip -------------------------------------------------------------------------------- /.yarn/cache/delay-npm-5.0.0-1d1c758b46-62f151151e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/delay-npm-5.0.0-1d1c758b46-62f151151e.zip -------------------------------------------------------------------------------- /.yarn/cache/denque-npm-2.1.0-578d0b6297-8ea0532157.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/denque-npm-2.1.0-578d0b6297-8ea0532157.zip -------------------------------------------------------------------------------- /.yarn/cache/diff-npm-3.5.0-a321a0df19-cfbc2df98d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/diff-npm-3.5.0-a321a0df19-cfbc2df98d.zip -------------------------------------------------------------------------------- /.yarn/cache/diff-npm-4.0.2-73133c7102-ec09ec2101.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/diff-npm-4.0.2-73133c7102-ec09ec2101.zip -------------------------------------------------------------------------------- /.yarn/cache/diff-npm-5.2.0-f523a581f3-01b7b440f8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/diff-npm-5.2.0-f523a581f3-01b7b440f8.zip -------------------------------------------------------------------------------- /.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-9b1d3e1bae.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-9b1d3e1bae.zip -------------------------------------------------------------------------------- /.yarn/cache/emoji-regex-npm-8.0.0-213764015c-c72d67a682.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-c72d67a682.zip -------------------------------------------------------------------------------- /.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-915acf859c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-915acf859c.zip -------------------------------------------------------------------------------- /.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip -------------------------------------------------------------------------------- /.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip -------------------------------------------------------------------------------- /.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip -------------------------------------------------------------------------------- /.yarn/cache/es6-promise-npm-4.2.8-c9f5b11f66-b250c55523.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/es6-promise-npm-4.2.8-c9f5b11f66-b250c55523.zip -------------------------------------------------------------------------------- /.yarn/cache/es6-promisify-npm-5.0.0-3726550934-fbed9d7915.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/es6-promisify-npm-5.0.0-3726550934-fbed9d7915.zip -------------------------------------------------------------------------------- /.yarn/cache/escalade-npm-3.2.0-19b50dd48f-9d7169e396.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/escalade-npm-3.2.0-19b50dd48f-9d7169e396.zip -------------------------------------------------------------------------------- /.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip -------------------------------------------------------------------------------- /.yarn/cache/eventemitter3-npm-5.0.1-5e423b7df3-ac6423ec31.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/eventemitter3-npm-5.0.1-5e423b7df3-ac6423ec31.zip -------------------------------------------------------------------------------- /.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip -------------------------------------------------------------------------------- /.yarn/cache/eyes-npm-0.1.8-4f28ed333f-58480c1f4c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/eyes-npm-0.1.8-4f28ed333f-58480c1f4c.zip -------------------------------------------------------------------------------- /.yarn/cache/fast-stable-stringify-npm-1.0.0-040fa045a5-e4743ae52f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/fast-stable-stringify-npm-1.0.0-040fa045a5-e4743ae52f.zip -------------------------------------------------------------------------------- /.yarn/cache/file-uri-to-path-npm-1.0.0-1043ac6206-b648580bdd.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/file-uri-to-path-npm-1.0.0-1043ac6206-b648580bdd.zip -------------------------------------------------------------------------------- /.yarn/cache/fill-range-npm-7.1.1-bf491486db-a7095cb39e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/fill-range-npm-7.1.1-bf491486db-a7095cb39e.zip -------------------------------------------------------------------------------- /.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip -------------------------------------------------------------------------------- /.yarn/cache/flat-npm-5.0.2-12748102a5-72479e651c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/flat-npm-5.0.2-12748102a5-72479e651c.zip -------------------------------------------------------------------------------- /.yarn/cache/foreground-child-npm-3.3.0-b8be745271-e3a60480f3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/foreground-child-npm-3.3.0-b8be745271-e3a60480f3.zip -------------------------------------------------------------------------------- /.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip -------------------------------------------------------------------------------- /.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-e703107c28.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-e703107c28.zip -------------------------------------------------------------------------------- /.yarn/cache/fsevents-npm-2.3.3-ce9fb0ffae-4c1ade961d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/fsevents-npm-2.3.3-ce9fb0ffae-4c1ade961d.zip -------------------------------------------------------------------------------- /.yarn/cache/fsevents-patch-6b67494872-10.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/fsevents-patch-6b67494872-10.zip -------------------------------------------------------------------------------- /.yarn/cache/get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip -------------------------------------------------------------------------------- /.yarn/cache/get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip -------------------------------------------------------------------------------- /.yarn/cache/glob-npm-10.4.5-8c63175f05-698dfe1182.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/glob-npm-10.4.5-8c63175f05-698dfe1182.zip -------------------------------------------------------------------------------- /.yarn/cache/glob-npm-8.1.0-65f64af8b1-9aab1c75eb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/glob-npm-8.1.0-65f64af8b1-9aab1c75eb.zip -------------------------------------------------------------------------------- /.yarn/cache/glob-parent-npm-5.1.2-021ab32634-32cd106ce8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/glob-parent-npm-5.1.2-021ab32634-32cd106ce8.zip -------------------------------------------------------------------------------- /.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip -------------------------------------------------------------------------------- /.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip -------------------------------------------------------------------------------- /.yarn/cache/he-npm-1.2.0-3b73a2ff07-d09b2243da.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/he-npm-1.2.0-3b73a2ff07-d09b2243da.zip -------------------------------------------------------------------------------- /.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-362d5ed66b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-362d5ed66b.zip -------------------------------------------------------------------------------- /.yarn/cache/http-proxy-agent-npm-7.0.2-643ed7cc33-d062acfa0c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/http-proxy-agent-npm-7.0.2-643ed7cc33-d062acfa0c.zip -------------------------------------------------------------------------------- /.yarn/cache/https-proxy-agent-npm-7.0.6-27a95c2690-784b628cbd.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/https-proxy-agent-npm-7.0.6-27a95c2690-784b628cbd.zip -------------------------------------------------------------------------------- /.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip -------------------------------------------------------------------------------- /.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip -------------------------------------------------------------------------------- /.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-d9f2557a59.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-d9f2557a59.zip -------------------------------------------------------------------------------- /.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-2d30b157a9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-2d30b157a9.zip -------------------------------------------------------------------------------- /.yarn/cache/inflight-npm-1.0.6-ccedb4b908-d2ebd65441.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-d2ebd65441.zip -------------------------------------------------------------------------------- /.yarn/cache/inherits-npm-2.0.4-c66b3957a0-cd45e923be.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-cd45e923be.zip -------------------------------------------------------------------------------- /.yarn/cache/ioredis-npm-5.4.2-d393ad1d4d-1ba306dfb5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ioredis-npm-5.4.2-d393ad1d4d-1ba306dfb5.zip -------------------------------------------------------------------------------- /.yarn/cache/ip-address-npm-9.0.5-9fa024d42a-1ed81e0672.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ip-address-npm-9.0.5-9fa024d42a-1ed81e0672.zip -------------------------------------------------------------------------------- /.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-078e51b4f9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-078e51b4f9.zip -------------------------------------------------------------------------------- /.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip -------------------------------------------------------------------------------- /.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip -------------------------------------------------------------------------------- /.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-3ed74f2b0c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-3ed74f2b0c.zip -------------------------------------------------------------------------------- /.yarn/cache/is-number-npm-7.0.0-060086935c-6a6c3383f6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/is-number-npm-7.0.0-060086935c-6a6c3383f6.zip -------------------------------------------------------------------------------- /.yarn/cache/is-plain-obj-npm-2.1.0-8dffd7ae9c-cec9100678.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/is-plain-obj-npm-2.1.0-8dffd7ae9c-cec9100678.zip -------------------------------------------------------------------------------- /.yarn/cache/is-unicode-supported-npm-0.1.0-0833e1bbfb-a2aab86ee7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/is-unicode-supported-npm-0.1.0-0833e1bbfb-a2aab86ee7.zip -------------------------------------------------------------------------------- /.yarn/cache/isexe-npm-2.0.0-b58870bd2e-7c9f715c03.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-7c9f715c03.zip -------------------------------------------------------------------------------- /.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip -------------------------------------------------------------------------------- /.yarn/cache/isomorphic-ws-npm-4.0.1-aa39192848-d7190eadef.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/isomorphic-ws-npm-4.0.1-aa39192848-d7190eadef.zip -------------------------------------------------------------------------------- /.yarn/cache/jackspeak-npm-3.4.3-546bfad080-96f8786eaa.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/jackspeak-npm-3.4.3-546bfad080-96f8786eaa.zip -------------------------------------------------------------------------------- /.yarn/cache/jayson-npm-4.1.3-aed7722911-3d6c35d278.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/jayson-npm-4.1.3-aed7722911-3d6c35d278.zip -------------------------------------------------------------------------------- /.yarn/cache/js-yaml-npm-4.1.0-3606f32312-c138a34a3f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/js-yaml-npm-4.1.0-3606f32312-c138a34a3f.zip -------------------------------------------------------------------------------- /.yarn/cache/jsbn-npm-1.1.0-1da0181838-bebe7ae829.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/jsbn-npm-1.1.0-1da0181838-bebe7ae829.zip -------------------------------------------------------------------------------- /.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip -------------------------------------------------------------------------------- /.yarn/cache/json5-npm-1.0.2-9607f93e30-a78d812dbb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/json5-npm-1.0.2-9607f93e30-a78d812dbb.zip -------------------------------------------------------------------------------- /.yarn/cache/jsonparse-npm-1.3.1-b6fde74828-24531e956f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/jsonparse-npm-1.3.1-b6fde74828-24531e956f.zip -------------------------------------------------------------------------------- /.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip -------------------------------------------------------------------------------- /.yarn/cache/lodash.defaults-npm-4.2.0-c5dea025ab-6a2a9ea5ad.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/lodash.defaults-npm-4.2.0-c5dea025ab-6a2a9ea5ad.zip -------------------------------------------------------------------------------- /.yarn/cache/lodash.isarguments-npm-3.1.0-9e74d350b8-e5186d5fe0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/lodash.isarguments-npm-3.1.0-9e74d350b8-e5186d5fe0.zip -------------------------------------------------------------------------------- /.yarn/cache/log-symbols-npm-4.1.0-0a13492d8b-fce1497b31.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/log-symbols-npm-4.1.0-0a13492d8b-fce1497b31.zip -------------------------------------------------------------------------------- /.yarn/cache/loupe-npm-2.3.7-f294c2ef33-635c8f0914.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/loupe-npm-2.3.7-f294c2ef33-635c8f0914.zip -------------------------------------------------------------------------------- /.yarn/cache/lru-cache-npm-10.4.3-30c10b861a-e6e9026736.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/lru-cache-npm-10.4.3-30c10b861a-e6e9026736.zip -------------------------------------------------------------------------------- /.yarn/cache/make-error-npm-1.3.6-ccb85d9458-b86e5e0e25.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/make-error-npm-1.3.6-ccb85d9458-b86e5e0e25.zip -------------------------------------------------------------------------------- /.yarn/cache/make-fetch-happen-npm-14.0.3-23b30e8691-fce0385840.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/make-fetch-happen-npm-14.0.3-23b30e8691-fce0385840.zip -------------------------------------------------------------------------------- /.yarn/cache/minimatch-npm-5.1.6-1e71429f4c-126b36485b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minimatch-npm-5.1.6-1e71429f4c-126b36485b.zip -------------------------------------------------------------------------------- /.yarn/cache/minimatch-npm-9.0.5-9aa93d97fa-dd6a8927b0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minimatch-npm-9.0.5-9aa93d97fa-dd6a8927b0.zip -------------------------------------------------------------------------------- /.yarn/cache/minimist-npm-1.2.8-d7af7b1dce-908491b6cc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minimist-npm-1.2.8-d7af7b1dce-908491b6cc.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-fetch-npm-4.0.0-d4e49e0194-4b0772dbee.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minipass-fetch-npm-4.0.0-d4e49e0194-4b0772dbee.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a5c6ef069f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a5c6ef069f.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-npm-7.1.2-3a5327d36d-c25f0ee819.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minipass-npm-7.1.2-3a5327d36d-c25f0ee819.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip -------------------------------------------------------------------------------- /.yarn/cache/minizlib-npm-3.0.1-4bdabd978f-622cb85f51.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/minizlib-npm-3.0.1-4bdabd978f-622cb85f51.zip -------------------------------------------------------------------------------- /.yarn/cache/mkdirp-npm-0.5.6-dcd5a6b97b-0c91b721bb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/mkdirp-npm-0.5.6-dcd5a6b97b-0c91b721bb.zip -------------------------------------------------------------------------------- /.yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-16fd79c286.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-16fd79c286.zip -------------------------------------------------------------------------------- /.yarn/cache/mocha-npm-10.8.2-4295e5e50b-903bbffcb1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/mocha-npm-10.8.2-4295e5e50b-903bbffcb1.zip -------------------------------------------------------------------------------- /.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip -------------------------------------------------------------------------------- /.yarn/cache/negotiator-npm-1.0.0-47d727e27e-b5734e8729.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/negotiator-npm-1.0.0-47d727e27e-b5734e8729.zip -------------------------------------------------------------------------------- /.yarn/cache/node-fetch-npm-2.7.0-587d57004e-b24f8a3dc9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/node-fetch-npm-2.7.0-587d57004e-b24f8a3dc9.zip -------------------------------------------------------------------------------- /.yarn/cache/node-gyp-build-npm-4.8.4-106c2a0b4f-6a7d62289d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/node-gyp-build-npm-4.8.4-106c2a0b4f-6a7d62289d.zip -------------------------------------------------------------------------------- /.yarn/cache/node-gyp-npm-11.0.0-669e34db1b-5d07430e88.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/node-gyp-npm-11.0.0-669e34db1b-5d07430e88.zip -------------------------------------------------------------------------------- /.yarn/cache/nopt-npm-8.0.0-98d6bf6d52-2d137f64b6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/nopt-npm-8.0.0-98d6bf6d52-2d137f64b6.zip -------------------------------------------------------------------------------- /.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip -------------------------------------------------------------------------------- /.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip -------------------------------------------------------------------------------- /.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip -------------------------------------------------------------------------------- /.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip -------------------------------------------------------------------------------- /.yarn/cache/p-map-npm-7.0.3-93bbec0d8c-2ef48ccfc6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/p-map-npm-7.0.3-93bbec0d8c-2ef48ccfc6.zip -------------------------------------------------------------------------------- /.yarn/cache/package-json-from-dist-npm-1.0.1-4631a88465-58ee9538f2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/package-json-from-dist-npm-1.0.1-4631a88465-58ee9538f2.zip -------------------------------------------------------------------------------- /.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip -------------------------------------------------------------------------------- /.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip -------------------------------------------------------------------------------- /.yarn/cache/path-scurry-npm-1.11.1-aaf8c339af-5e8845c159.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/path-scurry-npm-1.11.1-aaf8c339af-5e8845c159.zip -------------------------------------------------------------------------------- /.yarn/cache/pathval-npm-1.1.1-ce0311d7e0-b50a475106.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/pathval-npm-1.1.1-ce0311d7e0-b50a475106.zip -------------------------------------------------------------------------------- /.yarn/cache/picomatch-npm-2.3.1-c782cfd986-60c2595003.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/picomatch-npm-2.3.1-c782cfd986-60c2595003.zip -------------------------------------------------------------------------------- /.yarn/cache/prettier-npm-2.8.8-430828a36c-00cdb6ab02.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/prettier-npm-2.8.8-430828a36c-00cdb6ab02.zip -------------------------------------------------------------------------------- /.yarn/cache/proc-log-npm-5.0.0-405173f9b4-35610bdb01.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/proc-log-npm-5.0.0-405173f9b4-35610bdb01.zip -------------------------------------------------------------------------------- /.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip -------------------------------------------------------------------------------- /.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-4efd1ad3d8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-4efd1ad3d8.zip -------------------------------------------------------------------------------- /.yarn/cache/rate-limiter-flexible-npm-4.0.1-06bd5d7298-c86b9b1883.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/rate-limiter-flexible-npm-4.0.1-06bd5d7298-c86b9b1883.zip -------------------------------------------------------------------------------- /.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-196b30ef6c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-196b30ef6c.zip -------------------------------------------------------------------------------- /.yarn/cache/redis-errors-npm-1.2.0-a81fd9b0f1-001c11f63d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/redis-errors-npm-1.2.0-a81fd9b0f1-001c11f63d.zip -------------------------------------------------------------------------------- /.yarn/cache/redis-parser-npm-3.0.0-7ebe40abcb-b10846844b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/redis-parser-npm-3.0.0-7ebe40abcb-b10846844b.zip -------------------------------------------------------------------------------- /.yarn/cache/regenerator-runtime-npm-0.14.1-a6c97c609a-5db3161abb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/regenerator-runtime-npm-0.14.1-a6c97c609a-5db3161abb.zip -------------------------------------------------------------------------------- /.yarn/cache/require-directory-npm-2.1.1-8608aee50b-a72468e258.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/require-directory-npm-2.1.1-8608aee50b-a72468e258.zip -------------------------------------------------------------------------------- /.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip -------------------------------------------------------------------------------- /.yarn/cache/rimraf-npm-5.0.10-d0c6647697-f3b8ce81ee.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/rimraf-npm-5.0.10-d0c6647697-f3b8ce81ee.zip -------------------------------------------------------------------------------- /.yarn/cache/rpc-websockets-npm-9.0.4-a4d909a61e-cb5b721214.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/rpc-websockets-npm-9.0.4-a4d909a61e-cb5b721214.zip -------------------------------------------------------------------------------- /.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-32872cd0ff.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-32872cd0ff.zip -------------------------------------------------------------------------------- /.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-7eaf7a0cf3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-7eaf7a0cf3.zip -------------------------------------------------------------------------------- /.yarn/cache/semver-npm-7.6.3-57e82c14d5-36b1fbe1a2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/semver-npm-7.6.3-57e82c14d5-36b1fbe1a2.zip -------------------------------------------------------------------------------- /.yarn/cache/serialize-javascript-npm-6.0.2-cc09461d45-445a420a6f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/serialize-javascript-npm-6.0.2-cc09461d45-445a420a6f.zip -------------------------------------------------------------------------------- /.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip -------------------------------------------------------------------------------- /.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip -------------------------------------------------------------------------------- /.yarn/cache/signal-exit-npm-4.1.0-61fb957687-c9fa63bbbd.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/signal-exit-npm-4.1.0-61fb957687-c9fa63bbbd.zip -------------------------------------------------------------------------------- /.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip -------------------------------------------------------------------------------- /.yarn/cache/socks-npm-2.8.3-3532b59899-ffcb622c22.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/socks-npm-2.8.3-3532b59899-ffcb622c22.zip -------------------------------------------------------------------------------- /.yarn/cache/socks-proxy-agent-npm-8.0.5-24d77a90dc-ee99e1daca.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/socks-proxy-agent-npm-8.0.5-24d77a90dc-ee99e1daca.zip -------------------------------------------------------------------------------- /.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ef7462f1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ef7462f1.zip -------------------------------------------------------------------------------- /.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-8317e12d84.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-8317e12d84.zip -------------------------------------------------------------------------------- /.yarn/cache/sprintf-js-npm-1.1.3-b99efd75b2-e7587128c4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/sprintf-js-npm-1.1.3-b99efd75b2-e7587128c4.zip -------------------------------------------------------------------------------- /.yarn/cache/ssri-npm-12.0.0-97c0e53d2e-7024c1a6e3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ssri-npm-12.0.0-97c0e53d2e-7024c1a6e3.zip -------------------------------------------------------------------------------- /.yarn/cache/standard-as-callback-npm-2.1.0-8e47620bd4-88bec83ee2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/standard-as-callback-npm-2.1.0-8e47620bd4-88bec83ee2.zip -------------------------------------------------------------------------------- /.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip -------------------------------------------------------------------------------- /.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip -------------------------------------------------------------------------------- /.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-ae3b5436d3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-ae3b5436d3.zip -------------------------------------------------------------------------------- /.yarn/cache/strip-ansi-npm-7.1.0-7453b80b79-475f53e9c4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/strip-ansi-npm-7.1.0-7453b80b79-475f53e9c4.zip -------------------------------------------------------------------------------- /.yarn/cache/strip-bom-npm-3.0.0-71e8f81ff9-8d50ff27b7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/strip-bom-npm-3.0.0-71e8f81ff9-8d50ff27b7.zip -------------------------------------------------------------------------------- /.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip -------------------------------------------------------------------------------- /.yarn/cache/superstruct-npm-2.0.2-105f89beae-10e1944a9d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/superstruct-npm-2.0.2-105f89beae-10e1944a9d.zip -------------------------------------------------------------------------------- /.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-c8bb7afd56.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-c8bb7afd56.zip -------------------------------------------------------------------------------- /.yarn/cache/supports-color-npm-8.1.1-289e937149-157b534df8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/supports-color-npm-8.1.1-289e937149-157b534df8.zip -------------------------------------------------------------------------------- /.yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-12a2a4fc6d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-12a2a4fc6d.zip -------------------------------------------------------------------------------- /.yarn/cache/text-encoding-utf-8-npm-1.0.2-d3a9fb552b-845bb4bd05.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/text-encoding-utf-8-npm-1.0.2-d3a9fb552b-845bb4bd05.zip -------------------------------------------------------------------------------- /.yarn/cache/through-npm-2.3.8-df5f72a16e-5da78346f7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/through-npm-2.3.8-df5f72a16e-5da78346f7.zip -------------------------------------------------------------------------------- /.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-10dda13571.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-10dda13571.zip -------------------------------------------------------------------------------- /.yarn/cache/tr46-npm-0.0.3-de53018915-8f1f5aa6cb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/tr46-npm-0.0.3-de53018915-8f1f5aa6cb.zip -------------------------------------------------------------------------------- /.yarn/cache/ts-mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ts-mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip -------------------------------------------------------------------------------- /.yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip -------------------------------------------------------------------------------- /.yarn/cache/ts-node-npm-7.0.1-dfa4b9e69b-c1e0f15828.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ts-node-npm-7.0.1-dfa4b9e69b-c1e0f15828.zip -------------------------------------------------------------------------------- /.yarn/cache/tsconfig-paths-npm-3.15.0-ff68930e0e-2041beaedc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/tsconfig-paths-npm-3.15.0-ff68930e0e-2041beaedc.zip -------------------------------------------------------------------------------- /.yarn/cache/tslib-npm-2.8.1-66590b21b8-3e2e043d5c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/tslib-npm-2.8.1-66590b21b8-3e2e043d5c.zip -------------------------------------------------------------------------------- /.yarn/cache/type-detect-npm-4.1.0-171d011a73-e363bf0352.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/type-detect-npm-4.1.0-171d011a73-e363bf0352.zip -------------------------------------------------------------------------------- /.yarn/cache/typescript-npm-4.9.5-6427b65ee6-458f7220ab.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/typescript-npm-4.9.5-6427b65ee6-458f7220ab.zip -------------------------------------------------------------------------------- /.yarn/cache/typescript-patch-32ada147aa-7f0623212a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/typescript-patch-32ada147aa-7f0623212a.zip -------------------------------------------------------------------------------- /.yarn/cache/undici-types-npm-6.19.8-9f12285b7a-cf0b48ed4f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/undici-types-npm-6.19.8-9f12285b7a-cf0b48ed4f.zip -------------------------------------------------------------------------------- /.yarn/cache/undici-types-npm-6.20.0-bd21e669af-583ac7bbf4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/undici-types-npm-6.20.0-bd21e669af-583ac7bbf4.zip -------------------------------------------------------------------------------- /.yarn/cache/unique-filename-npm-4.0.0-bfc100c4e3-6a62094fca.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/unique-filename-npm-4.0.0-bfc100c4e3-6a62094fca.zip -------------------------------------------------------------------------------- /.yarn/cache/unique-slug-npm-5.0.0-11508c0469-beafdf3d6f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/unique-slug-npm-5.0.0-11508c0469-beafdf3d6f.zip -------------------------------------------------------------------------------- /.yarn/cache/utf-8-validate-npm-5.0.10-93e9b6f750-b89cbc13b4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/utf-8-validate-npm-5.0.10-93e9b6f750-b89cbc13b4.zip -------------------------------------------------------------------------------- /.yarn/cache/uuid-npm-8.3.2-eca0baba53-9a5f7aa1d6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/uuid-npm-8.3.2-eca0baba53-9a5f7aa1d6.zip -------------------------------------------------------------------------------- /.yarn/cache/v8-compile-cache-lib-npm-3.0.1-4886071ece-88d3423a52.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/v8-compile-cache-lib-npm-3.0.1-4886071ece-88d3423a52.zip -------------------------------------------------------------------------------- /.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-b65b9f8d68.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-b65b9f8d68.zip -------------------------------------------------------------------------------- /.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-f95adbc1e8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-f95adbc1e8.zip -------------------------------------------------------------------------------- /.yarn/cache/which-npm-2.0.2-320ddf72f7-4782f8a1d6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/which-npm-2.0.2-320ddf72f7-4782f8a1d6.zip -------------------------------------------------------------------------------- /.yarn/cache/which-npm-5.0.0-15aa39eb60-6ec99e89ba.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/which-npm-5.0.0-15aa39eb60-6ec99e89ba.zip -------------------------------------------------------------------------------- /.yarn/cache/workerpool-npm-6.5.1-7e0dd85ca7-b1b00139fe.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/workerpool-npm-6.5.1-7e0dd85ca7-b1b00139fe.zip -------------------------------------------------------------------------------- /.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-cebdaeca3a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-cebdaeca3a.zip -------------------------------------------------------------------------------- /.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-7b1e4b35e9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-7b1e4b35e9.zip -------------------------------------------------------------------------------- /.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip -------------------------------------------------------------------------------- /.yarn/cache/ws-npm-7.5.10-878ccb886b-9c796b84ba.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ws-npm-7.5.10-878ccb886b-9c796b84ba.zip -------------------------------------------------------------------------------- /.yarn/cache/ws-npm-8.18.0-56f68bc4d6-70dfe53f23.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/ws-npm-8.18.0-56f68bc4d6-70dfe53f23.zip -------------------------------------------------------------------------------- /.yarn/cache/y18n-npm-5.0.8-5f3a0a7e62-5f1b5f95e3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/y18n-npm-5.0.8-5f3a0a7e62-5f1b5f95e3.zip -------------------------------------------------------------------------------- /.yarn/cache/yallist-npm-4.0.0-b493d9e907-4cb02b42b8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/yallist-npm-4.0.0-b493d9e907-4cb02b42b8.zip -------------------------------------------------------------------------------- /.yarn/cache/yallist-npm-5.0.0-8732dd9f1c-1884d272d4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/yallist-npm-5.0.0-8732dd9f1c-1884d272d4.zip -------------------------------------------------------------------------------- /.yarn/cache/yargs-npm-16.2.0-547873d425-807fa21211.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/yargs-npm-16.2.0-547873d425-807fa21211.zip -------------------------------------------------------------------------------- /.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-0188f430a0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-0188f430a0.zip -------------------------------------------------------------------------------- /.yarn/cache/yargs-unparser-npm-2.0.0-930f3ff3f6-68f9a542c6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/yargs-unparser-npm-2.0.0-930f3ff3f6-68f9a542c6.zip -------------------------------------------------------------------------------- /.yarn/cache/yn-npm-2.0.0-3ad11617c1-9d49527cb3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/yn-npm-2.0.0-3ad11617c1-9d49527cb3.zip -------------------------------------------------------------------------------- /.yarn/cache/yn-npm-3.1.1-8ad4259784-2c487b0e14.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/yn-npm-3.1.1-8ad4259784-2c487b0e14.zip -------------------------------------------------------------------------------- /.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip -------------------------------------------------------------------------------- /.yarn/install-state.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tensor-hq/smart-rpc/4b6c81fcb211fb8c24c737d8166f4b5abf2dc61c/.yarn/install-state.gz -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | compressionLevel: mixed 2 | 3 | enableGlobalCache: false 4 | 5 | nodeLinker: node-modules 6 | 7 | npmScopes: 8 | tensor-hq: 9 | npmAlwaysAuth: true 10 | npmAuthToken: "${GH_AUTH_TOKEN:-}" 11 | npmPublishRegistry: "https://npm.pkg.github.com" 12 | 13 | yarnPath: .yarn/releases/yarn-4.3.0.cjs 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Solana Smart RPC 2 | 3 | Intelligent transport layer for Solana RPCs that handles load balancing, rate limit throttling, failover, fanouts, and retries. Built on top of [@solana/web3.js](https://www.npmjs.com/package/@solana/web3.js). 4 | 5 | ![smart rpc metrics dashboard](https://i.ibb.co/yg9rQL9/Screenshot-2024-02-06-at-12-59-53-PM.png) 6 | 7 | # Getting Started 8 | 9 | Smart RPC is a proxy to the existing Connection class, so migrating should be very simple. Under the hood, when you make requests, it proxies to underlying logic that determines which transport to send your request to. 10 | 11 | ```tsx 12 | import { TransportManager, TransportConfig } from "@tensor-hq/smart-rpc"; 13 | 14 | let defaultTransportConfig: TransportConfig[] = [ 15 | { 16 | rateLimit: 50, 17 | weight: 50, 18 | blacklist: [], 19 | id: "Triton", 20 | url: TRITON_MAINNET_P0, 21 | enableSmartDisable: true, 22 | enableFailover: true, 23 | maxRetries: 2, 24 | }, 25 | { 26 | rateLimit: 50, 27 | weight: 50, 28 | blacklist: [], 29 | id: "Helius", 30 | url: HELIUS_FE_MAINNET_P0, 31 | enableSmartDisable: true, 32 | enableFailover: true, 33 | maxRetries: 2, 34 | }, 35 | ]; 36 | 37 | const smartRpcMetricLogger: MetricCallback = (_, metricValue) => { 38 | console.log(metricValue); 39 | }; 40 | 41 | let optionalConfig: TransportManagerConfig = { 42 | strictPriorityMode: true, // if set, will always try highest weighted provider first instead of load balancing 43 | metricCallback: smartRpcMetricLogger, // callback function for successful and failed requests 44 | queueSize: 1000, // configurable queue size for underlying rate limit queue 45 | timeoutMs: 5000, // configurable timeout for underlying requests 46 | }; 47 | 48 | const transportManager = new TransportManager(defaultTransportConfig, optionalConfig); 49 | export const smartConnection = transportManager.smartConnection; 50 | 51 | const resp = await smartConnection.getLatestBlockhash(); 52 | console.log(resp.blockhash.toString()); 53 | ``` 54 | 55 | # Connection Types 56 | 57 | ## Smart connection 58 | 59 | This is the recommended connection for most cases. It's a drop-in replacement for the existing Connection class within built-in features such as load balancing, failover, and retries. 60 | 61 | ## Fanout connection 62 | 63 | Sometimes you might want to send the same request to multiple connections. One example is `getLatestBlockhash`, since some RPC providers may occasionally lag behind others. When signing transacitons, fetching the most up-to-date blockhash across providers helps increase the chance your transaction will succeed. Another example is `sendTransaction`. You may want to send your transaction to multiple providers to get the fastest confirmation and increase the chance of success. 64 | 65 | ## Race connection 66 | 67 | Assuming most providers are up-to-date, you may want to race among them to get the fastest response. For example, you could send `getAccountInfo` to multiple providers and abort after the fastest provider returns a response. 68 | 69 | # Features 70 | 71 | ## Load Balancing 72 | 73 | By default, Smart RPC will load balance based on the provided weights. You can configure these weights and update them at runtime (e.g. if you need a killswitch for an RPC provider). 74 | 75 | ## In-memory and Redis Rate Limiting 76 | 77 | Smart RPC supports in-memory and pooled rate limiting. By default, rate limting will happen in-memory. If you want to pool rate limits, you can pass in an optional IORedisClient (either a single instance or cluster). 78 | 79 | ## Retries & Failover 80 | 81 | If a particular transport has filled up its rate limit queue or encounters an error, it will automatically failover to the next transport. This makes your requests more likely to succeed if there are transient issues. 82 | 83 | ## Smart Disable 84 | 85 | If a particular transport reaches an error threshold within a short period of time, Smart RPC will shut off requests to that transport for a short cooloff period. This can happen if you hit rate limits or if the RPC provider is having issues. Instead of spamming them, requests will be sent to a different provider. 86 | 87 | # Known Limitations 88 | 89 | Smart RPC doesn't support subscription endpoints, such as `onSlotUpdate`. Smart RPC is a proxy to underlying connections, and doesn't maintain long-lived connections. We recommend using the Connection class directly for subscription endpoints. 90 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@tensor-hq/smart-rpc", 3 | "version": "1.1.5", 4 | "description": "Intelligent transport layer for Solana RPCs.", 5 | "sideEffects": false, 6 | "module": "./dist/esm/index.js", 7 | "main": "./dist/cjs/index.js", 8 | "types": "dist/cjs/index.d.ts", 9 | "files": [ 10 | "/dist/esm/**/*", 11 | "/dist/cjs/**/*" 12 | ], 13 | "scripts": { 14 | "test": "yarn ts-mocha -p ./tsconfig.cjs.json tests/**/*.test.ts", 15 | "build": "rm -rf ./dist && yarn tsc && yarn tsc -p tsconfig.cjs.json", 16 | "publish:private": "yarn build && yarn npm publish", 17 | "publish:public": "yarn build && npm publish --access public --registry https://registry.npmjs.org", 18 | "publish:all": "yarn publish:private && yarn publish:public" 19 | }, 20 | "repository": "https://github.com/tensor-hq/smart-rpc.git", 21 | "license": "MIT", 22 | "publishConfig": { 23 | "@tensor-hq:registry": "https://npm.pkg.github.com" 24 | }, 25 | "dependencies": { 26 | "@solana/web3.js": "^1.91.1", 27 | "ioredis": "^5.3.2", 28 | "rate-limiter-flexible": "^4.0.0" 29 | }, 30 | "devDependencies": { 31 | "@types/chai": "^4.3.5", 32 | "@types/mocha": "^10.0.1", 33 | "@types/node": "^20.10.5", 34 | "@types/semaphore": "^1.1.1", 35 | "@types/ws": "^8", 36 | "chai": "^4.3.10", 37 | "mocha": "^10.2.0", 38 | "prettier": "^2.7.1", 39 | "ts-mocha": "^10.0.0", 40 | "ts-node": "^10.9.1", 41 | "typescript": "^4.7.4" 42 | }, 43 | "packageManager": "yarn@4.3.0" 44 | } 45 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './transport-manager'; -------------------------------------------------------------------------------- /src/transport-manager.ts: -------------------------------------------------------------------------------- 1 | import { Connection } from "@solana/web3.js"; 2 | import Redis, { Cluster } from "ioredis"; 3 | import { RateLimiterMemory, RateLimiterQueue, RateLimiterRedis } from "rate-limiter-flexible"; 4 | 5 | // Ideas: 6 | // - modify weight based on "closeness" to user. For example, first ping each provider and weight by response time. 7 | // - have default in code as a fallback in case our "remote config" doesn't load properly 8 | 9 | export const ERROR_THRESHOLD = 20; 10 | export const ERROR_RESET_MS = 60000; // 60 seconds 11 | export const DISABLED_RESET_MS = 60000; // 60 seconds 12 | const BASE_RETRY_DELAY = 500; // Base delay for the first retry in milliseconds 13 | const MAX_RETRY_DELAY = 3000; // Maximum delay in milliseconds 14 | const DEFAULT_TIMEOUT_MS = 5000; 15 | const KEY_PREFIX = "smart-rpc-rate-limit"; 16 | const DEFAULT_RATE_LIMITER_QUEUE_SIZE = 500; 17 | const LATENCY_WINDOW_MS = 10000; // 10 seconds 18 | const DEFAULT_LATENCY_THRESHOLD_MS = 3000; // 3 seconds 19 | const EWMA_HALF_LIFE_MS = 5000; // Half-life for exponential decay (5 seconds) 20 | const MAX_EWMA_SAMPLE_COUNT = 100; // Cap sample count to maintain responsiveness 21 | 22 | // Method-specific latency thresholds 23 | const METHOD_LATENCY_THRESHOLDS: { [key: string]: number } = { 24 | getProgramAccounts: 60000, // 60 seconds 25 | getTokenLargestAccounts: 5000, // 5 seconds 26 | getTokenAccountsByOwner: 5000, // 5 seconds 27 | }; 28 | 29 | interface MethodLatencyEWMA { 30 | ewma: number; // Exponentially weighted moving average 31 | lastUpdate: number; // Timestamp of last update (using performance.now()) 32 | sampleCount: number; // Count of samples contributing to this EWMA 33 | } 34 | 35 | export interface TransportConfig { 36 | rateLimit: number; 37 | weight: number; 38 | blacklist: string[]; 39 | url: string; 40 | id: string; 41 | enableSmartDisable: boolean; 42 | enableFailover: boolean; 43 | maxRetries: number; 44 | redisClient?: Redis | Cluster; 45 | enableLatencyCooloff: boolean; 46 | } 47 | 48 | interface TransportState { 49 | errorCount: number; 50 | lastErrorResetTime: number; 51 | disabled: boolean; 52 | disabledTime: number; 53 | rateLimiterQueue: RateLimiterQueue; 54 | methodLatencyEWMA: { [methodName: string]: MethodLatencyEWMA }; 55 | lastLatencyCalculation: number; 56 | cachedAverageLatency: number; 57 | } 58 | 59 | export interface Transport { 60 | transportConfig: TransportConfig; 61 | transportState: TransportState; 62 | connection: Connection; 63 | } 64 | 65 | export interface TransportManagerConfig { 66 | strictPriorityMode?: boolean; 67 | skipLastResortSends?: boolean; 68 | metricCallback?: MetricCallback; 69 | queueSize?: number; 70 | timeoutMs?: number; 71 | } 72 | 73 | interface Metric { 74 | method: string; 75 | id: string; 76 | latency: number; 77 | statusCode: number | string | undefined | null; 78 | } 79 | 80 | class TimeoutError extends Error { 81 | constructor(message: string) { 82 | super(message); 83 | this.name = "TimeoutError"; 84 | Object.setPrototypeOf(this, TimeoutError.prototype); 85 | } 86 | } 87 | 88 | export type MetricCallback = (metricName: string, metricValue: Metric) => void; 89 | 90 | export class TransportManager { 91 | private transports: Transport[] = []; 92 | private metricCallback?: MetricCallback; 93 | private strictPriorityMode: boolean = false; 94 | private skipLastResortSends: boolean = false; 95 | private queueSize?: number; 96 | private timeoutMs?: number; 97 | smartConnection: Connection; 98 | fanoutConnection: Connection; 99 | raceConnection: Connection; 100 | 101 | constructor(initialTransports: TransportConfig[], config?: TransportManagerConfig) { 102 | this.strictPriorityMode = config?.strictPriorityMode ?? false; 103 | this.skipLastResortSends = config?.skipLastResortSends ?? false; 104 | this.metricCallback = config?.metricCallback; 105 | this.queueSize = config?.queueSize; 106 | this.timeoutMs = config?.timeoutMs; 107 | this.updateTransports(initialTransports); 108 | 109 | const dummyConnection = new Connection(this.transports[0].transportConfig.url); 110 | 111 | // NB: This does not work with non-async functions (e.g. subscription-related methods). 112 | this.smartConnection = new Proxy(dummyConnection, { 113 | get: (target, prop, receiver) => { 114 | const originalMethod = target[prop]; 115 | if (typeof originalMethod === "function") { 116 | return (...args) => { 117 | return this.smartTransport(prop, ...args); 118 | }; 119 | } 120 | 121 | return Reflect.get(target, prop, receiver); 122 | }, 123 | }); 124 | 125 | this.fanoutConnection = new Proxy(dummyConnection, { 126 | get: (target, prop, receiver) => { 127 | const originalMethod = target[prop]; 128 | if (typeof originalMethod === "function") { 129 | return (...args) => { 130 | return this.fanout(prop, ...args); 131 | }; 132 | } 133 | 134 | return Reflect.get(target, prop, receiver); 135 | }, 136 | }); 137 | 138 | this.raceConnection = new Proxy(dummyConnection, { 139 | get: (target, prop, receiver) => { 140 | const originalMethod = target[prop]; 141 | if (typeof originalMethod === "function") { 142 | return (...args) => { 143 | return this.race(prop, ...args); 144 | }; 145 | } 146 | 147 | return Reflect.get(target, prop, receiver); 148 | }, 149 | }); 150 | } 151 | 152 | settleAllWithTimeout = async (promises: Array>): Promise> => { 153 | const values: T[] = []; 154 | 155 | await Promise.allSettled( 156 | promises.map((promise) => 157 | Promise.race([promise, this.timeout(this.timeoutMs ?? DEFAULT_TIMEOUT_MS)]) 158 | ) 159 | ).then((result) => 160 | result.forEach((d) => { 161 | if (d.status === "fulfilled") { 162 | values.push(d.value as T); 163 | } 164 | }) 165 | ); 166 | 167 | return values; 168 | }; 169 | 170 | // Updates the list of transports based on the new configuration 171 | updateTransports(newTransports: TransportConfig[]): void { 172 | this.transports = newTransports.map((config) => this.createTransport(config)); 173 | } 174 | 175 | updateMockTransports(newTransports: Transport[]) { 176 | this.transports = newTransports; 177 | } 178 | 179 | getTransports(): Transport[] { 180 | return this.transports; 181 | } 182 | 183 | enableStrictPriorityMode(): void { 184 | this.strictPriorityMode = true; 185 | } 186 | 187 | disableStrictPriorityMode(): void { 188 | this.strictPriorityMode = false; 189 | } 190 | 191 | // Creates a transport object from configuration 192 | private createTransport(config: TransportConfig): Transport { 193 | if (config.id === "" || config.id.includes(" ")) { 194 | throw new Error( 195 | "Invalid transport ID. The ID must not be empty and must not contain spaces." 196 | ); 197 | } 198 | 199 | let rateLimiter: RateLimiterRedis | RateLimiterMemory; 200 | 201 | // Create a rateLimiter per transport so we can have separate rate limits. 202 | if (config.redisClient) { 203 | rateLimiter = new RateLimiterRedis({ 204 | storeClient: config.redisClient, 205 | points: config.rateLimit, 206 | duration: 1, 207 | keyPrefix: `${KEY_PREFIX}:${config.id}`, 208 | }); 209 | } else { 210 | rateLimiter = new RateLimiterMemory({ 211 | points: config.rateLimit, 212 | duration: 1, 213 | keyPrefix: `${KEY_PREFIX}:${config.id}`, 214 | }); 215 | } 216 | 217 | let rateLimiterQueue = new RateLimiterQueue(rateLimiter, { 218 | maxQueueSize: this.queueSize ?? DEFAULT_RATE_LIMITER_QUEUE_SIZE, 219 | }); 220 | 221 | const transportState: TransportState = { 222 | errorCount: 0, 223 | lastErrorResetTime: Date.now(), 224 | disabled: false, 225 | disabledTime: 0, 226 | rateLimiterQueue, 227 | methodLatencyEWMA: {}, 228 | lastLatencyCalculation: 0, 229 | cachedAverageLatency: 0 230 | }; 231 | 232 | return { 233 | transportConfig: config, 234 | transportState, 235 | connection: new Connection(config.url, { 236 | commitment: "confirmed", 237 | disableRetryOnRateLimit: true, 238 | }), 239 | }; 240 | } 241 | 242 | private timeout(ms: number): Promise { 243 | return new Promise((_, reject) => { 244 | setTimeout(() => { 245 | reject(new TimeoutError(`Operation timed out after ${ms} milliseconds`)); 246 | }, ms); 247 | }) as Promise; 248 | } 249 | 250 | triggerMetricCallback(metricName: string, metricValue: Metric) { 251 | if (this.metricCallback) { 252 | try { 253 | this.metricCallback(metricName, metricValue); 254 | } catch (e) { 255 | console.error("Error in metric callback:", e); 256 | } 257 | } 258 | } 259 | 260 | // Selects a transport based on their weights 261 | selectTransport(availableTransports: Transport[]): Transport { 262 | if (this.strictPriorityMode) { 263 | // Find and return the transport with the highest weight 264 | return availableTransports.reduce((max, transport) => 265 | max.transportConfig.weight > transport.transportConfig.weight ? max : transport 266 | ); 267 | } 268 | 269 | // Default weighted load balancing logic 270 | let totalWeight = availableTransports.reduce((sum, t) => sum + t.transportConfig.weight, 0); 271 | let randomNum = Math.random() * totalWeight; 272 | 273 | for (const transport of availableTransports) { 274 | randomNum -= transport.transportConfig.weight; 275 | if (randomNum <= 0) { 276 | return transport; 277 | } 278 | } 279 | 280 | // Fallback to the first transport in case of rounding errors. 281 | return availableTransports[0]; 282 | } 283 | 284 | private availableTransportsForMethod(methodName) { 285 | return this.transports.filter((t) => !t.transportConfig.blacklist.includes(methodName)); 286 | } 287 | 288 | private async fanout(methodName, ...args): Promise { 289 | const availableTransports = this.availableTransportsForMethod(methodName); 290 | 291 | const transportPromises = availableTransports.map((transport) => 292 | this.attemptSendWithRetries(transport, methodName, ...args) 293 | ); 294 | 295 | const results = await this.settleAllWithTimeout(transportPromises); 296 | 297 | return results; 298 | } 299 | 300 | private async race(methodName, ...args): Promise { 301 | const availableTransports = this.availableTransportsForMethod(methodName); 302 | 303 | const transportPromises = availableTransports.map((transport) => 304 | Promise.race([ 305 | this.attemptSendWithRetries(transport, methodName, ...args), 306 | this.timeout(this.timeoutMs ?? DEFAULT_TIMEOUT_MS), 307 | ]) 308 | ); 309 | 310 | return new Promise((resolve, reject) => { 311 | let errorCount = 0; 312 | transportPromises.forEach((promise) => { 313 | promise.then(resolve).catch((error) => { 314 | errorCount++; 315 | if (errorCount === transportPromises.length) { 316 | reject(new Error("All transports failed or timed out")); 317 | } 318 | }); 319 | }); 320 | }); 321 | } 322 | 323 | private calculateAverageLatency(transport: Transport, methodName: string): number { 324 | const now = performance.now(); 325 | 326 | // Return cached value if it's less than 1 second old 327 | if (now - transport.transportState.lastLatencyCalculation < 1000) { 328 | return transport.transportState.cachedAverageLatency; 329 | } 330 | 331 | // Get or initialize EWMA for this method 332 | const ewmaData = transport.transportState.methodLatencyEWMA[methodName]; 333 | 334 | if (!ewmaData || ewmaData.sampleCount === 0) { 335 | transport.transportState.cachedAverageLatency = 0; 336 | transport.transportState.lastLatencyCalculation = now; 337 | return 0; 338 | } 339 | 340 | // Apply time-based decay to the EWMA 341 | const timeSinceLastUpdate = now - ewmaData.lastUpdate; 342 | const decayFactor = Math.exp(-timeSinceLastUpdate / EWMA_HALF_LIFE_MS); 343 | const currentEWMA = ewmaData.ewma * decayFactor; 344 | 345 | // Cache the result 346 | transport.transportState.cachedAverageLatency = currentEWMA; 347 | transport.transportState.lastLatencyCalculation = now; 348 | 349 | return currentEWMA; 350 | } 351 | 352 | private getLatencyThreshold(methodName: string): number { 353 | return METHOD_LATENCY_THRESHOLDS[methodName] ?? DEFAULT_LATENCY_THRESHOLD_MS; 354 | } 355 | 356 | private updateLatencyMetrics(transport: Transport, latency: number, methodName: string) { 357 | const now = performance.now(); 358 | 359 | // Get or initialize EWMA for this method 360 | let ewmaData = transport.transportState.methodLatencyEWMA[methodName]; 361 | 362 | if (!ewmaData) { 363 | // Initialize new EWMA data for this method 364 | ewmaData = { 365 | ewma: latency, 366 | lastUpdate: now, 367 | sampleCount: 1 368 | }; 369 | transport.transportState.methodLatencyEWMA[methodName] = ewmaData; 370 | return; 371 | } 372 | 373 | // Calculate time-based decay 374 | const timeSinceLastUpdate = now - ewmaData.lastUpdate; 375 | const decayFactor = Math.exp(-timeSinceLastUpdate / EWMA_HALF_LIFE_MS); 376 | 377 | // Calculate smoothing factor (higher weight for newer values) 378 | // Alpha decreases as sample count increases, but never goes below 0.1 379 | const alpha = Math.max(0.1, 2.0 / (ewmaData.sampleCount + 1)); 380 | 381 | // Update EWMA: apply decay to old value, then blend with new value 382 | const decayedEWMA = ewmaData.ewma * decayFactor; 383 | ewmaData.ewma = alpha * latency + (1 - alpha) * decayedEWMA; 384 | ewmaData.lastUpdate = now; 385 | ewmaData.sampleCount = Math.min(ewmaData.sampleCount + 1, MAX_EWMA_SAMPLE_COUNT); 386 | } 387 | 388 | private async sendRequest(transport: Transport, methodName, ...args): Promise { 389 | let latencyStart = Date.now(); 390 | 391 | try { 392 | const result = await Promise.race([ 393 | transport.connection[methodName](...args), 394 | this.timeout(this.timeoutMs ?? DEFAULT_TIMEOUT_MS), 395 | ]); 396 | 397 | let latencyEnd = Date.now(); 398 | let latency = latencyEnd - latencyStart; 399 | 400 | // Update latency metrics 401 | this.updateLatencyMetrics(transport, latency, methodName); 402 | 403 | this.triggerMetricCallback("SuccessfulRequest", { 404 | method: methodName, 405 | id: transport.transportConfig.id, 406 | latency: latency, 407 | statusCode: 200, 408 | }); 409 | 410 | // Check if average latency is too high even for successful requests 411 | if (transport.transportConfig.enableSmartDisable && transport.transportConfig.enableLatencyCooloff && this.calculateAverageLatency(transport, methodName) > this.getLatencyThreshold(methodName)) { 412 | transport.transportState.disabled = true; 413 | transport.transportState.disabledTime = Date.now(); 414 | } 415 | 416 | if (typeof result === "object" && !!result) { 417 | result.SmartRpcProvider = transport.transportConfig.id; 418 | } 419 | 420 | return result; 421 | } catch (error: any) { 422 | // Timeout exception 423 | let timedOut = error instanceof TimeoutError; 424 | 425 | // Regex to find underlying error code in string. 426 | let match = error.message?.match(/"code"\s*:\s*(\d+)/); 427 | 428 | const currentTime = Date.now(); 429 | 430 | let latencyEnd = currentTime; 431 | let latency = latencyEnd - latencyStart; 432 | 433 | // Update latency metrics even for failed requests 434 | this.updateLatencyMetrics(transport, latency, methodName); 435 | 436 | this.triggerMetricCallback("ErrorRequest", { 437 | method: methodName, 438 | id: transport.transportConfig.id, 439 | latency: latency, 440 | statusCode: timedOut 441 | ? "timeout" 442 | : error.statusCode ?? 443 | (error.response ? error.response.status : null) ?? 444 | (match ? parseInt(match[1]) : null), 445 | }); 446 | 447 | // Reset error count if enough time has passed 448 | if (currentTime - transport.transportState.lastErrorResetTime >= ERROR_RESET_MS) { 449 | transport.transportState.errorCount = 0; 450 | transport.transportState.lastErrorResetTime = currentTime; 451 | } 452 | 453 | transport.transportState.errorCount++; 454 | 455 | // Check if the error count exceeds a certain threshold or if average latency is too high 456 | if ( 457 | transport.transportState.errorCount > ERROR_THRESHOLD && 458 | transport.transportConfig.enableSmartDisable 459 | ) { 460 | transport.transportState.disabled = true; 461 | transport.transportState.disabledTime = currentTime; 462 | } else if (transport.transportConfig.enableSmartDisable && transport.transportConfig.enableLatencyCooloff && this.calculateAverageLatency(transport, methodName) > this.getLatencyThreshold(methodName)) { 463 | transport.transportState.disabled = true; 464 | transport.transportState.disabledTime = currentTime; 465 | } 466 | 467 | throw error; 468 | } 469 | } 470 | 471 | private async enqueueRequest(transport: Transport, methodName, ...args): Promise { 472 | // Ensure that the queue exists for this transport 473 | if (!transport.transportState.rateLimiterQueue) { 474 | throw new Error("RateLimiterQueue is not initialized for this transport."); 475 | } 476 | 477 | // If queue is full, promise is rejected. 478 | const p0 = performance.now(); 479 | await transport.transportState.rateLimiterQueue.removeTokens(1); 480 | const rlqLatency = performance.now() - p0; 481 | this.triggerMetricCallback("RateLimiterWait", { 482 | method: methodName, 483 | id: transport.transportConfig.id, 484 | latency: rlqLatency, 485 | statusCode: null, 486 | }); 487 | 488 | return await this.sendRequest(transport, methodName, ...args); 489 | } 490 | 491 | private async attemptSendWithRetries(transport: Transport, methodName, ...args) { 492 | for (let attempt = 0; attempt <= transport.transportConfig.maxRetries; attempt++) { 493 | try { 494 | return await this.enqueueRequest(transport, methodName, ...args); 495 | } catch (error: any) { 496 | let match = error.message?.match(/"code"\s*:\s*(\d+)/); 497 | 498 | // Throw error if max retry attempts has been reached 499 | if (attempt === transport.transportConfig.maxRetries) { 500 | if ( 501 | error.statusCode === 429 || 502 | (error.response && error.response.status === 429) || 503 | (match && parseInt(match[1]) === 429) 504 | ) { 505 | throw new Error("Maximum retry attempts reached for HTTP 429."); 506 | } else { 507 | throw error; 508 | } 509 | } else if ( 510 | error.statusCode === 403 || 511 | (error.response && error.response.status === 403) || 512 | (match && parseInt(match[1]) === 403) 513 | ) { 514 | throw error; 515 | } 516 | 517 | // Exponential backoff 518 | let delay = Math.min(MAX_RETRY_DELAY, BASE_RETRY_DELAY * Math.pow(2, attempt)); 519 | await new Promise((resolve) => setTimeout(resolve, delay)); 520 | } 521 | } 522 | } 523 | 524 | // Smart transport function that selects a transport based on weight and checks for rate limit. 525 | // It includes a retry mechanism with exponential backoff for handling HTTP 429 (Too Many Requests) errors. 526 | async smartTransport(methodName, ...args): Promise { 527 | let availableTransports = this.availableTransportsForMethod(methodName); 528 | let recentError: any = null; 529 | 530 | while (availableTransports.length > 0) { 531 | const transport = this.selectTransport(availableTransports); 532 | 533 | if (transport.transportState.disabled) { 534 | // Check if transport should be re-enabled after cooloff period. 535 | if (Date.now() - transport.transportState.disabledTime >= DISABLED_RESET_MS) { 536 | transport.transportState.disabled = false; 537 | transport.transportState.disabledTime = 0; 538 | } else { 539 | // If transport is still in cooloff period, cycle to next transport. 540 | availableTransports = availableTransports.filter((t) => t !== transport); 541 | 542 | continue; 543 | } 544 | } 545 | 546 | try { 547 | return await this.attemptSendWithRetries(transport, methodName, ...args); 548 | } catch (e) { 549 | // If failover is disabled, surface the error. 550 | if (!transport.transportConfig.enableFailover) { 551 | throw e; 552 | } 553 | recentError = e; 554 | } 555 | 556 | // Remove a transport with exceeded rate limit and retry with the next available one 557 | availableTransports = availableTransports.filter((t) => t !== transport); 558 | } 559 | 560 | if (!this.skipLastResortSends) { 561 | // Worst case scenario, if all transports fall, try sending directly to the underlying connections. 562 | // This bypasses the rate limiter and smart disable system, so it could lead to excess requests to providers. 563 | // These requests also do not retry. 564 | let lastResortTransports = this.availableTransportsForMethod(methodName); 565 | for (let i = 0; i < lastResortTransports.length; i++) { 566 | try { 567 | return await this.sendRequest(lastResortTransports[i], methodName, ...args); 568 | } catch (error) { 569 | console.error(`Final attempt with transport failed: ${error}`); 570 | } 571 | } 572 | } 573 | 574 | // Throw error if all available transports have been tried without success 575 | let error = recentError ?? new Error("No available transports for the requested method."); 576 | throw error; 577 | } 578 | } 579 | -------------------------------------------------------------------------------- /tests/transport-manager.test.ts: -------------------------------------------------------------------------------- 1 | import { Connection } from "@solana/web3.js"; 2 | import { expect } from "chai"; 3 | import { 4 | ERROR_THRESHOLD, 5 | MetricCallback, 6 | Transport, 7 | TransportConfig, 8 | TransportManager, 9 | DISABLED_RESET_MS, 10 | } from "../src/transport-manager"; 11 | import { RateLimiterMemory, RateLimiterQueue } from "rate-limiter-flexible"; 12 | 13 | class HttpError extends Error { 14 | statusCode: number; 15 | 16 | constructor(statusCode: number, message: string) { 17 | super(message); 18 | this.statusCode = statusCode; 19 | this.name = "HttpError"; 20 | } 21 | } 22 | 23 | const MOCK_CONNECTION_ENDPOINT = "https://test.com"; 24 | 25 | const mockConnectionResponse = { blockhash: "mockBlockhash", lastValidBlockHeight: 123456 }; 26 | const mockConnectionSlowResponse = { blockhash: "mockBlockhashSlow", lastValidBlockHeight: 123455 }; 27 | 28 | class MockConnection extends Connection { 29 | async getLatestBlockhash() { 30 | return mockConnectionResponse; 31 | } 32 | } 33 | 34 | class MockConnectionSlow extends Connection { 35 | async getLatestBlockhash(): Promise { 36 | return new Promise((resolve) => { 37 | setTimeout(() => { 38 | resolve(mockConnectionSlowResponse); 39 | }, 50); // 50 milliseconds delay 40 | }); 41 | } 42 | } 43 | 44 | class MockConnectionFlaky extends Connection { 45 | async getLatestBlockhash(): Promise { 46 | return new Promise((resolve, reject) => { 47 | const random = Math.random(); 48 | 49 | // 50% chance to throw an error 50 | if (random < 0.5) { 51 | reject(new Error("Flaky Connection Error")); 52 | } else { 53 | resolve(mockConnectionResponse); 54 | } 55 | }); 56 | } 57 | } 58 | 59 | class MockConnection429 extends Connection { 60 | async getLatestBlockhash() { 61 | throw new HttpError(429, "Too Many Requests"); 62 | 63 | return mockConnectionResponse; 64 | } 65 | } 66 | 67 | class MockConnectionUnexpectedError extends Connection { 68 | async getLatestBlockhash() { 69 | throw new Error("Unexpected error"); 70 | 71 | return mockConnectionResponse; 72 | } 73 | } 74 | 75 | class MockConnectionHighLatency extends Connection { 76 | async getLatestBlockhash(): Promise { 77 | return new Promise((resolve) => { 78 | setTimeout(() => { 79 | resolve(mockConnectionResponse); 80 | }, 4000); // 4 seconds delay 81 | }); 82 | } 83 | } 84 | 85 | const defaultTransportConfig: TransportConfig = { 86 | rateLimit: 50, 87 | weight: 100, 88 | blacklist: [], 89 | id: "MAINNET_BETA", 90 | url: "https://api.mainnet-beta.solana.com", 91 | enableSmartDisable: true, 92 | enableFailover: false, 93 | maxRetries: 0, 94 | enableLatencyCooloff: true 95 | }; 96 | 97 | const defaultTransportState = { 98 | errorCount: 0, 99 | lastErrorResetTime: Date.now(), 100 | disabled: false, 101 | disabledTime: 0, 102 | methodLatencyEWMA: {}, 103 | lastLatencyCalculation: 0, 104 | cachedAverageLatency: 0 105 | }; 106 | 107 | describe("smartTransport Tests", () => { 108 | let transportManager; 109 | 110 | function setupTransportManager(transportsConfig) { 111 | let transports = transportsConfig.map((config) => { 112 | const rateLimiter = new RateLimiterMemory({ 113 | points: config.rateLimiterConfig.points, 114 | duration: config.rateLimiterConfig.duration, 115 | }); 116 | 117 | return { 118 | transportConfig: { ...structuredClone(defaultTransportConfig), ...config.overrides }, 119 | transportState: { 120 | ...structuredClone(defaultTransportState), 121 | rateLimiterQueue: new RateLimiterQueue(rateLimiter, { 122 | maxQueueSize: config.rateLimiterConfig.maxQueueSize, 123 | }), 124 | }, 125 | connection: new config.connectionType(MOCK_CONNECTION_ENDPOINT), 126 | }; 127 | }); 128 | 129 | transportManager = new TransportManager([defaultTransportConfig]); 130 | transportManager.updateMockTransports(transports); 131 | } 132 | 133 | it("should return the expected mock response", async () => { 134 | const transportsConfig = [ 135 | { 136 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 137 | connectionType: MockConnection, 138 | }, 139 | ]; 140 | 141 | setupTransportManager(transportsConfig); 142 | 143 | const response = await transportManager.smartConnection.getLatestBlockhash(); 144 | 145 | expect(response).to.deep.equal(mockConnectionResponse); 146 | }); 147 | 148 | it("should return error metric", async () => { 149 | let statusCode: number | null | undefined = 0; 150 | 151 | const metricCallback: MetricCallback = (metricName, metricValue) => { 152 | statusCode = metricValue.statusCode; 153 | }; 154 | 155 | const config = { 156 | ...defaultTransportConfig, 157 | url: "https://tensor-tensor-ec08.mainnet.rpcpool.com", 158 | }; 159 | 160 | transportManager = new TransportManager([config], { metricCallback: metricCallback }); 161 | 162 | try { 163 | await transportManager.smartConnection.getLatestBlockhash(); 164 | 165 | expect.fail("Expected function to throw a 403 error"); 166 | } catch (error) { 167 | expect(error).to.be.an("error"); 168 | expect(statusCode).to.deep.equal(403); 169 | } 170 | }); 171 | 172 | it("should return 403 error without retries", async () => { 173 | const config = { 174 | ...defaultTransportConfig, 175 | url: "https://tensor-tensor-ec08.mainnet.rpcpool.com", 176 | maxRetries: 4, 177 | }; 178 | 179 | transportManager = new TransportManager([config]); 180 | 181 | try { 182 | await transportManager.smartConnection.getLatestBlockhash(); 183 | 184 | expect.fail("Expected function to throw a single 403 error"); 185 | } catch (error) { 186 | expect(error).to.be.an("error"); 187 | const updatedTransports = transportManager.getTransports(); 188 | expect(updatedTransports[0].transportState.errorCount).to.equal(1); 189 | } 190 | }); 191 | 192 | it("should hit max retries", async () => { 193 | const transportsConfig = [ 194 | { 195 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 196 | connectionType: MockConnection429, 197 | }, 198 | ]; 199 | 200 | setupTransportManager(transportsConfig); 201 | 202 | try { 203 | await transportManager.smartConnection.getLatestBlockhash(); 204 | 205 | expect.fail("Expected function to throw an HTTP 429 error"); 206 | } catch (error) { 207 | expect(error).to.be.an("error"); 208 | expect(error.message).to.include("429"); 209 | } 210 | }); 211 | 212 | it("should enqueue and process successfully", async () => { 213 | const transportsConfig = [ 214 | { 215 | rateLimiterConfig: { points: 1, duration: 0.1, maxQueueSize: 500 }, 216 | connectionType: MockConnection, 217 | }, 218 | ]; 219 | 220 | setupTransportManager(transportsConfig); 221 | 222 | for (var i = 0; i < 2; i++) { 223 | const response = await transportManager.smartConnection.getLatestBlockhash(); 224 | expect(response).to.deep.equal(mockConnectionResponse); 225 | } 226 | }); 227 | 228 | it("should timeout", async () => { 229 | const transports: Transport[] = [ 230 | { 231 | transportConfig: { 232 | ...structuredClone(defaultTransportConfig), 233 | }, 234 | transportState: { 235 | ...structuredClone(defaultTransportState), 236 | rateLimiterQueue: new RateLimiterQueue( 237 | new RateLimiterMemory({ 238 | points: 50, 239 | duration: 1, 240 | }) 241 | ), 242 | }, 243 | connection: new MockConnectionSlow(MOCK_CONNECTION_ENDPOINT), 244 | }, 245 | ]; 246 | 247 | transportManager = new TransportManager([defaultTransportConfig], { timeoutMs: 1 }); 248 | 249 | transportManager.updateMockTransports(transports); 250 | 251 | try { 252 | await transportManager.smartConnection.getLatestBlockhash(); 253 | 254 | expect.fail("Expected function to throw a timeout error"); 255 | } catch (error) { 256 | expect(error).to.be.an("error"); 257 | expect(error.message).to.include("Operation timed out after 1 milliseconds"); 258 | } 259 | }); 260 | 261 | it("should not timeout", async () => { 262 | const transports: Transport[] = [ 263 | { 264 | transportConfig: { 265 | ...structuredClone(defaultTransportConfig), 266 | }, 267 | transportState: { 268 | ...structuredClone(defaultTransportState), 269 | rateLimiterQueue: new RateLimiterQueue( 270 | new RateLimiterMemory({ 271 | points: 50, 272 | duration: 1, 273 | }) 274 | ), 275 | }, 276 | connection: new MockConnectionSlow(MOCK_CONNECTION_ENDPOINT), 277 | }, 278 | ]; 279 | 280 | transportManager = new TransportManager([defaultTransportConfig], { timeoutMs: 1000 }); 281 | 282 | transportManager.updateMockTransports(transports); 283 | 284 | const response = await transportManager.smartConnection.getLatestBlockhash(); 285 | expect(response).to.deep.equal(mockConnectionSlowResponse); 286 | }); 287 | 288 | it("should exceed queue size and handle successes and failures", async () => { 289 | const transportsConfig = [ 290 | { 291 | rateLimiterConfig: { points: 1, duration: 0.01, maxQueueSize: 9 }, 292 | connectionType: MockConnection, 293 | }, 294 | ]; 295 | 296 | setupTransportManager(transportsConfig); 297 | 298 | const promises: Promise< 299 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 300 | >[] = []; 301 | for (var i = 0; i < 20; i++) { 302 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 303 | } 304 | 305 | const results = await Promise.allSettled(promises); 306 | 307 | const successResponses = results.filter((r) => r.status === "fulfilled"); 308 | const failureResponses = results.filter((r) => r.status === "rejected"); 309 | 310 | expect(successResponses.length).to.equal(10, "Expected 10 successful responses"); 311 | expect(failureResponses.length).to.equal(10, "Expected 10 failed responses"); 312 | 313 | failureResponses.forEach((response) => { 314 | expect(response.reason.message).to.equal( 315 | "Number of requests reached it's maximum 9", 316 | "Error message should indicate maximum requests reached" 317 | ); 318 | }); 319 | }); 320 | 321 | it("should exceed queue size and handle retries", async () => { 322 | const transportsConfig = [ 323 | { 324 | overrides: { weight: 70, enableFailover: true, maxRetries: 2 }, 325 | rateLimiterConfig: { points: 1, duration: 0.01, maxQueueSize: 9 }, 326 | connectionType: MockConnection, 327 | }, 328 | ]; 329 | 330 | setupTransportManager(transportsConfig); 331 | 332 | const promises: Promise< 333 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 334 | >[] = []; 335 | for (var i = 0; i < 20; i++) { 336 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 337 | } 338 | 339 | const results = await Promise.allSettled(promises); 340 | 341 | const successResponses = results.filter((r) => r.status === "fulfilled"); 342 | const failureResponses = results.filter((r) => r.status === "rejected"); 343 | 344 | expect(successResponses.length).to.equal(20, "Expected 20 successful responses"); 345 | expect(failureResponses.length).to.equal(0, "Expected 0 failed responses"); 346 | 347 | failureResponses.forEach((response) => { 348 | expect(response.reason.message).to.equal( 349 | "Number of requests reached it's maximum 9", 350 | "Error message should indicate maximum requests reached" 351 | ); 352 | }); 353 | }); 354 | 355 | it("should handle burst", async () => { 356 | const transportsConfig = [ 357 | { 358 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 359 | connectionType: MockConnection, 360 | }, 361 | ]; 362 | 363 | setupTransportManager(transportsConfig); 364 | 365 | const promises: Promise< 366 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 367 | >[] = []; 368 | for (var i = 0; i < 200; i++) { 369 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 370 | } 371 | 372 | const results = await Promise.allSettled(promises); 373 | 374 | const successResponses = results.filter((r) => r.status === "fulfilled"); 375 | 376 | expect(successResponses.length).to.equal(200, "Expected 200 successful responses"); 377 | }); 378 | 379 | it("should handle burst to multiple connections", async () => { 380 | const transportsConfig = [ 381 | { 382 | overrides: { weight: 25 }, 383 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 1000 }, 384 | connectionType: MockConnection, 385 | }, 386 | { 387 | overrides: { weight: 25, enableFailover: true, maxRetries: 1 }, 388 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 389 | connectionType: MockConnectionFlaky, 390 | }, 391 | { 392 | overrides: { weight: 25 }, 393 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 1000 }, 394 | connectionType: MockConnectionSlow, 395 | }, 396 | { 397 | overrides: { weight: 25, enableFailover: true }, 398 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 399 | connectionType: MockConnection429, 400 | }, 401 | ]; 402 | 403 | setupTransportManager(transportsConfig); 404 | 405 | const promises: Promise< 406 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 407 | >[] = []; 408 | for (var i = 0; i < 2000; i++) { 409 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 410 | } 411 | 412 | const results = await Promise.allSettled(promises); 413 | 414 | const successResponses = results.filter((r) => r.status === "fulfilled"); 415 | 416 | expect(successResponses.length).to.equal(2000, "Expected 2000 successful responses"); 417 | }); 418 | 419 | it("should handle burst to multiple connections with last resort", async () => { 420 | const transportsConfig = [ 421 | { 422 | overrides: { weight: 25, enableFailover: true }, 423 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 100 }, 424 | connectionType: MockConnection, 425 | }, 426 | { 427 | overrides: { weight: 25, enableFailover: true }, 428 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 100 }, 429 | connectionType: MockConnection, 430 | }, 431 | ]; 432 | 433 | setupTransportManager(transportsConfig); 434 | 435 | const promises: Promise< 436 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 437 | >[] = []; 438 | for (var i = 0; i < 2000; i++) { 439 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 440 | } 441 | 442 | const results = await Promise.allSettled(promises); 443 | 444 | const successResponses = results.filter((r) => r.status === "fulfilled"); 445 | 446 | expect(successResponses.length).to.equal(2000, "Expected 2000 successful responses"); 447 | 448 | for (var i = 0; i < successResponses.length; i++) { 449 | expect(successResponses[i].value).to.equal(mockConnectionResponse); 450 | } 451 | }); 452 | 453 | it("should handle burst failures", async () => { 454 | const transportsConfig = [ 455 | { 456 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 25 }, 457 | connectionType: MockConnection429, 458 | }, 459 | { 460 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 25 }, 461 | connectionType: MockConnectionUnexpectedError, 462 | }, 463 | ]; 464 | 465 | setupTransportManager(transportsConfig); 466 | 467 | const promises: Promise< 468 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 469 | >[] = []; 470 | for (var i = 0; i < 1000; i++) { 471 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 472 | } 473 | 474 | const results = await Promise.allSettled(promises); 475 | 476 | const successResponses = results.filter((r) => r.status === "rejected"); 477 | 478 | expect(successResponses.length).to.equal(1000, "Expected 1000 failed responses"); 479 | }); 480 | 481 | it("should handle burst with failover", async () => { 482 | const transportsConfig = [ 483 | { 484 | overrides: { weight: 70, enableFailover: true }, 485 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 486 | connectionType: MockConnection429, 487 | }, 488 | { 489 | overrides: { weight: 10 }, 490 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 491 | connectionType: MockConnection, 492 | }, 493 | { 494 | overrides: { weight: 20, enableFailover: true }, 495 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 496 | connectionType: MockConnectionUnexpectedError, 497 | }, 498 | ]; 499 | 500 | setupTransportManager(transportsConfig); 501 | 502 | const promises: Promise< 503 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 504 | >[] = []; 505 | for (var i = 0; i < 200; i++) { 506 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 507 | } 508 | 509 | const results = await Promise.allSettled(promises); 510 | 511 | const successResponses = results.filter((r) => r.status === "fulfilled"); 512 | 513 | expect(successResponses.length).to.equal(200, "Expected 200 successful responses"); 514 | }); 515 | 516 | it("should handle burst with retries", async () => { 517 | const transportsConfig = [ 518 | { 519 | overrides: { weight: 70, enableFailover: true, maxRetries: 2 }, 520 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 25 }, 521 | connectionType: MockConnection429, 522 | }, 523 | { 524 | overrides: { weight: 10, maxRetries: 2 }, 525 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 526 | connectionType: MockConnection, 527 | }, 528 | ]; 529 | 530 | setupTransportManager(transportsConfig); 531 | 532 | const promises: Promise< 533 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 534 | >[] = []; 535 | for (var i = 0; i < 200; i++) { 536 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 537 | } 538 | 539 | const results = await Promise.allSettled(promises); 540 | 541 | const successResponses = results.filter((r) => r.status === "fulfilled"); 542 | 543 | expect(successResponses.length).to.equal(200, "Expected 200 successful responses"); 544 | }); 545 | 546 | it("should handle flaky connection with retries", async () => { 547 | const transportsConfig = [ 548 | { 549 | overrides: { weight: 70, maxRetries: 2 }, 550 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 551 | connectionType: MockConnectionFlaky, 552 | }, 553 | ]; 554 | 555 | setupTransportManager(transportsConfig); 556 | 557 | const promises: Promise< 558 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 559 | >[] = []; 560 | for (var i = 0; i < 200; i++) { 561 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 562 | } 563 | 564 | const results = await Promise.allSettled(promises); 565 | 566 | const successResponses = results.filter((r) => r.status === "fulfilled"); 567 | 568 | expect(successResponses.length).to.be.greaterThanOrEqual( 569 | 150, 570 | "Expected over 150 successful responses" 571 | ); 572 | }); 573 | 574 | it("should handle flaky connection with retries and failover", async () => { 575 | const transportsConfig = [ 576 | { 577 | overrides: { weight: 70, maxRetries: 2, enableFailover: true }, 578 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 579 | connectionType: MockConnectionFlaky, 580 | }, 581 | { 582 | overrides: { weight: 30, maxRetries: 0 }, 583 | rateLimiterConfig: { points: 25, duration: 0.01, maxQueueSize: 500 }, 584 | connectionType: MockConnection, 585 | }, 586 | ]; 587 | 588 | setupTransportManager(transportsConfig); 589 | 590 | const promises: Promise< 591 | Readonly<{ blockhash: string; lastValidBlockHeight: number }> | Error 592 | >[] = []; 593 | for (var i = 0; i < 200; i++) { 594 | promises.push(transportManager.smartConnection.getLatestBlockhash()); 595 | } 596 | 597 | const results = await Promise.allSettled(promises); 598 | 599 | const successResponses = results.filter((r) => r.status === "fulfilled"); 600 | 601 | expect(successResponses.length).to.equal(200, "Expected 200 successful responses"); 602 | }); 603 | 604 | it("should hit blacklisted method", async () => { 605 | const transportsConfig = [ 606 | { 607 | overrides: { blacklist: ["getLatestBlockhash"] }, 608 | rateLimiterConfig: { points: 1, duration: 1, maxQueueSize: 500 }, 609 | connectionType: MockConnection, 610 | }, 611 | ]; 612 | 613 | setupTransportManager(transportsConfig); 614 | 615 | try { 616 | await transportManager.smartConnection.getLatestBlockhash(); 617 | 618 | expect.fail("Expected function to throw a No available transports error"); 619 | } catch (error) { 620 | expect(error).to.be.an("error"); 621 | expect(error.message).to.include("No available transports for the requested method."); 622 | } 623 | }); 624 | 625 | it("should handle bad weight", async () => { 626 | const transportsConfig = [ 627 | { 628 | overrides: { weight: -1 }, 629 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 630 | connectionType: MockConnection, 631 | }, 632 | ]; 633 | 634 | setupTransportManager(transportsConfig); 635 | 636 | const response = await transportManager.smartConnection.getLatestBlockhash(); 637 | 638 | expect(response).to.deep.equal(mockConnectionResponse); 639 | }); 640 | 641 | it("should handle unexpected transport error", async () => { 642 | const transportsConfig = [ 643 | { 644 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 645 | connectionType: MockConnectionUnexpectedError, 646 | }, 647 | ]; 648 | 649 | setupTransportManager(transportsConfig); 650 | 651 | try { 652 | await transportManager.smartConnection.getLatestBlockhash(); 653 | 654 | expect.fail("Expected function to throw an unexpected error"); 655 | } catch (error) { 656 | expect(error).to.be.an("error"); 657 | expect(error.message).to.include("Unexpected error"); 658 | } 659 | }); 660 | 661 | it("should disable transport", async () => { 662 | const transportsConfig = [ 663 | { 664 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 665 | connectionType: MockConnectionUnexpectedError, 666 | }, 667 | ]; 668 | 669 | setupTransportManager(transportsConfig); 670 | 671 | for (var i = 0; i <= ERROR_THRESHOLD; i++) { 672 | const updatedTransports = transportManager.getTransports(); 673 | expect(updatedTransports[0].transportState.disabled).to.equal(false); 674 | 675 | try { 676 | await transportManager.smartConnection.getLatestBlockhash(); 677 | 678 | expect.fail("Expected function to throw an unexpected error"); 679 | } catch (error) { 680 | expect(error).to.be.an("error"); 681 | expect(error.message).to.include("Unexpected error"); 682 | } 683 | } 684 | 685 | const updatedTransports = transportManager.getTransports(); 686 | expect(updatedTransports[0].transportState.disabled).to.equal(true); 687 | }); 688 | 689 | it("should handle updating transports", async () => { 690 | const transportsConfig = [ 691 | { 692 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 693 | connectionType: MockConnectionUnexpectedError, 694 | }, 695 | ]; 696 | 697 | setupTransportManager(transportsConfig); 698 | 699 | try { 700 | await transportManager.smartConnection.getLatestBlockhash(); 701 | 702 | expect.fail("Expected function to throw an unexpected error"); 703 | } catch (error) { 704 | expect(error).to.be.an("error"); 705 | expect(error.message).to.include("Unexpected error"); 706 | } 707 | 708 | let updatedTransports: Transport[] = [ 709 | { 710 | transportConfig: structuredClone(defaultTransportConfig), 711 | transportState: { 712 | ...structuredClone(defaultTransportState), 713 | rateLimiterQueue: new RateLimiterQueue( 714 | new RateLimiterMemory({ 715 | points: 50, 716 | duration: 1, 717 | }), 718 | { maxQueueSize: 500 } 719 | ), 720 | }, 721 | connection: new MockConnection(MOCK_CONNECTION_ENDPOINT), 722 | }, 723 | ]; 724 | 725 | transportManager.updateMockTransports(updatedTransports); 726 | 727 | const response = await transportManager.smartConnection.getLatestBlockhash(); 728 | 729 | expect(response).to.deep.equal(mockConnectionResponse); 730 | }); 731 | 732 | it("should handle failover", async () => { 733 | const transportsConfig = [ 734 | { 735 | overrides: { enableFailover: true }, 736 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 737 | connectionType: MockConnectionUnexpectedError, 738 | }, 739 | { 740 | overrides: { weight: 0 }, 741 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 742 | connectionType: MockConnection, 743 | }, 744 | ]; 745 | 746 | setupTransportManager(transportsConfig); 747 | 748 | const response = await transportManager.smartConnection.getLatestBlockhash(); 749 | expect(response).to.deep.equal(mockConnectionResponse); 750 | }); 751 | 752 | // Fanout Tests 753 | it("should return multiple results", async () => { 754 | const transportsConfig = [ 755 | { 756 | overrides: { weight: 50 }, 757 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 758 | connectionType: MockConnection, 759 | }, 760 | { 761 | overrides: { weight: 50, id: "TEST", url: "https://test.connection" }, 762 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 763 | connectionType: MockConnection, 764 | }, 765 | ]; 766 | 767 | setupTransportManager(transportsConfig); 768 | 769 | let results = await transportManager.fanoutConnection.getLatestBlockhash(); 770 | expect(results).to.deep.equal([mockConnectionResponse, mockConnectionResponse]); 771 | }); 772 | 773 | it("should return 1 result", async () => { 774 | const transportsConfig = [ 775 | { 776 | overrides: { weight: 50 }, 777 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 778 | connectionType: MockConnection, 779 | }, 780 | { 781 | overrides: { weight: 50, id: "TEST", url: "https://test.connection" }, 782 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 783 | connectionType: MockConnection429, 784 | }, 785 | ]; 786 | 787 | setupTransportManager(transportsConfig); 788 | 789 | let results = await transportManager.fanoutConnection.getLatestBlockhash(); 790 | expect(results).to.deep.equal([mockConnectionResponse]); 791 | }); 792 | 793 | it("should return no results due to errors", async () => { 794 | const transportsConfig = [ 795 | { 796 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 797 | connectionType: MockConnectionUnexpectedError, 798 | }, 799 | ]; 800 | 801 | setupTransportManager(transportsConfig); 802 | 803 | let results = await transportManager.fanoutConnection.getLatestBlockhash(); 804 | expect(results).to.deep.equal([]); 805 | }); 806 | 807 | it("should return no results due to rate limit", async () => { 808 | const transportsConfig = [ 809 | { 810 | rateLimiterConfig: { points: 0, duration: 1, maxQueueSize: 500 }, 811 | connectionType: MockConnection, 812 | }, 813 | ]; 814 | 815 | setupTransportManager(transportsConfig); 816 | 817 | let results = await transportManager.fanoutConnection.getLatestBlockhash(); 818 | expect(results).to.deep.equal([]); 819 | }); 820 | 821 | it("should return no results due to blacklist", async () => { 822 | const transportsConfig = [ 823 | { 824 | overrides: { blacklist: ["getLatestBlockhash"] }, 825 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 826 | connectionType: MockConnection, 827 | }, 828 | ]; 829 | 830 | setupTransportManager(transportsConfig); 831 | 832 | let results = await transportManager.fanoutConnection.getLatestBlockhash(); 833 | expect(results).to.deep.equal([]); 834 | }); 835 | 836 | // Race Tests 837 | it("should return faster response", async () => { 838 | const transportsConfig = [ 839 | { 840 | overrides: { weight: 50, id: "TEST", url: "https://test.connection" }, 841 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 842 | connectionType: MockConnectionSlow, 843 | }, 844 | { 845 | overrides: { weight: 50 }, 846 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 847 | connectionType: MockConnection, 848 | }, 849 | ]; 850 | 851 | setupTransportManager(transportsConfig); 852 | 853 | let results = await transportManager.raceConnection.getLatestBlockhash(); 854 | expect(results).to.deep.equal(mockConnectionResponse); 855 | }); 856 | 857 | it("should return response without error", async () => { 858 | const transportsConfig = [ 859 | { 860 | overrides: { weight: 50 }, 861 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 862 | connectionType: MockConnection429, 863 | }, 864 | { 865 | overrides: { weight: 50, id: "TEST", url: "https://test.connection" }, 866 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 867 | connectionType: MockConnectionSlow, 868 | }, 869 | ]; 870 | 871 | setupTransportManager(transportsConfig); 872 | 873 | let results = await transportManager.raceConnection.getLatestBlockhash(); 874 | expect(results).to.deep.equal(mockConnectionSlowResponse); 875 | }); 876 | 877 | it("should return all transports failed error", async () => { 878 | const transportsConfig = [ 879 | { 880 | overrides: { weight: 50 }, 881 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 882 | connectionType: MockConnection429, 883 | }, 884 | ]; 885 | 886 | setupTransportManager(transportsConfig); 887 | 888 | try { 889 | let results = await transportManager.raceConnection.getLatestBlockhash(); 890 | 891 | expect.fail("Error: All transports failed or timed out"); 892 | } catch (e) { 893 | expect(e).to.be.an("error"); 894 | expect(e.message).to.include("All transports failed or timed out"); 895 | } 896 | }); 897 | 898 | it("should disable transport due to high latency", async () => { 899 | const transportsConfig = [ 900 | { 901 | overrides: { enableLatencyCooloff: true }, 902 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 903 | connectionType: MockConnectionHighLatency, 904 | }, 905 | ]; 906 | 907 | setupTransportManager(transportsConfig); 908 | 909 | // Make a few requests to build up latency metrics 910 | for (let i = 0; i < 2; i++) { 911 | try { 912 | await transportManager.smartConnection.getLatestBlockhash(); 913 | } catch (error) { 914 | // Ignore timeouts 915 | } 916 | } 917 | 918 | // Check if transport was disabled 919 | const updatedTransports = transportManager.getTransports(); 920 | expect(updatedTransports[0].transportState.disabled).to.equal(true); 921 | }).timeout(20000); 922 | 923 | it("should not disable transport when latency cooloff is disabled", async () => { 924 | const transportsConfig = [ 925 | { 926 | overrides: { enableLatencyCooloff: false }, 927 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 928 | connectionType: MockConnectionHighLatency, 929 | }, 930 | ]; 931 | 932 | setupTransportManager(transportsConfig); 933 | 934 | // Make a few requests to build up latency metrics 935 | for (let i = 0; i < 2; i++) { 936 | try { 937 | await transportManager.smartConnection.getLatestBlockhash(); 938 | } catch (error) { 939 | // Ignore timeouts 940 | } 941 | } 942 | 943 | // Check that transport was not disabled 944 | const updatedTransports = transportManager.getTransports(); 945 | expect(updatedTransports[0].transportState.disabled).to.equal(false); 946 | }).timeout(20000); 947 | 948 | it("should track latency metrics correctly", async () => { 949 | const transportsConfig = [ 950 | { 951 | overrides: { enableLatencyCooloff: true }, 952 | rateLimiterConfig: { points: 50, duration: 1, maxQueueSize: 500 }, 953 | connectionType: MockConnectionHighLatency, 954 | }, 955 | ]; 956 | 957 | setupTransportManager(transportsConfig); 958 | 959 | // Make a request 960 | try { 961 | await transportManager.smartConnection.getLatestBlockhash(); 962 | } catch (error) { 963 | // Ignore timeouts 964 | } 965 | 966 | // Check that latency metrics were recorded 967 | const updatedTransports = transportManager.getTransports(); 968 | const ewmaData = updatedTransports[0].transportState.methodLatencyEWMA['getLatestBlockhash']; 969 | expect(ewmaData).to.not.be.undefined; 970 | expect(ewmaData.sampleCount).to.be.greaterThan(0); 971 | expect(ewmaData.ewma).to.be.greaterThan(3000); 972 | }).timeout(20000); 973 | }); 974 | 975 | describe("selectTransport Tests", () => { 976 | const transports: Transport[] = [ 977 | { 978 | transportConfig: { 979 | ...structuredClone(defaultTransportConfig), 980 | rateLimit: 50, 981 | weight: 0, 982 | }, 983 | transportState: { 984 | ...structuredClone(defaultTransportState), 985 | rateLimiterQueue: new RateLimiterQueue( 986 | new RateLimiterMemory({ 987 | points: 50, 988 | duration: 1, 989 | }) 990 | ), 991 | }, 992 | connection: new MockConnection429(MOCK_CONNECTION_ENDPOINT), 993 | }, 994 | { 995 | transportConfig: { 996 | ...structuredClone(defaultTransportConfig), 997 | rateLimit: 20, 998 | weight: 100, 999 | }, 1000 | transportState: { 1001 | ...structuredClone(defaultTransportState), 1002 | rateLimiterQueue: new RateLimiterQueue( 1003 | new RateLimiterMemory({ 1004 | points: 50, 1005 | duration: 1, 1006 | }) 1007 | ), 1008 | }, 1009 | connection: new MockConnection429(MOCK_CONNECTION_ENDPOINT), 1010 | }, 1011 | { 1012 | transportConfig: { 1013 | ...structuredClone(defaultTransportConfig), 1014 | rateLimit: 30, 1015 | weight: 0, 1016 | }, 1017 | transportState: { 1018 | ...structuredClone(defaultTransportState), 1019 | rateLimiterQueue: new RateLimiterQueue( 1020 | new RateLimiterMemory({ 1021 | points: 50, 1022 | duration: 1, 1023 | }) 1024 | ), 1025 | }, 1026 | connection: new MockConnection429(MOCK_CONNECTION_ENDPOINT), 1027 | }, 1028 | ]; 1029 | 1030 | it("should always return a transport object", () => { 1031 | const transportManager = new TransportManager([defaultTransportConfig]); 1032 | const selected = transportManager.selectTransport(transports); 1033 | expect(selected).to.be.an("object"); 1034 | }); 1035 | 1036 | it("should return the second transport", () => { 1037 | const transportManager = new TransportManager([defaultTransportConfig]); 1038 | const selected = transportManager.selectTransport(transports); 1039 | expect(selected).to.equal(transports[1]); 1040 | }); 1041 | 1042 | it("should return the third transport", () => { 1043 | transports[1].transportConfig.weight = 0; 1044 | transports[2].transportConfig.weight = 100; 1045 | 1046 | const transportManager = new TransportManager([defaultTransportConfig]); 1047 | const selected = transportManager.selectTransport(transports); 1048 | expect(selected).to.equal(transports[2]); 1049 | }); 1050 | 1051 | it("should handle strict priority mode", () => { 1052 | transports[0].transportConfig.weight = 25; 1053 | transports[1].transportConfig.weight = 60; 1054 | transports[2].transportConfig.weight = 15; 1055 | 1056 | const transportManager = new TransportManager([defaultTransportConfig], { 1057 | strictPriorityMode: true, 1058 | }); 1059 | 1060 | for (var i = 0; i < 100; i++) { 1061 | const selected = transportManager.selectTransport(transports); 1062 | expect(selected).to.equal(transports[1]); 1063 | } 1064 | }); 1065 | 1066 | }); -------------------------------------------------------------------------------- /tsconfig.base.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["./src/**/*"], 3 | "compilerOptions": { 4 | "skipLibCheck": true, 5 | // See https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping 6 | "lib": ["esnext", "dom"], 7 | "strict": true, 8 | 9 | "sourceMap": true, 10 | "declaration": true, 11 | "declarationMap": true, 12 | "allowSyntheticDefaultImports": true, 13 | "experimentalDecorators": true, 14 | "emitDecoratorMetadata": true, 15 | "noImplicitAny": false, 16 | "esModuleInterop": true, 17 | "resolveJsonModule": true, 18 | "composite": true, 19 | "baseUrl": ".", 20 | "typeRoots": ["node_modules/@types"] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.cjs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "module": "CommonJS", 5 | "target": "ES2022", 6 | "outDir": "dist/cjs/", 7 | "rootDir": "./src" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "moduleResolution": "node", 5 | "module": "ES2022", 6 | "target": "ES2022", 7 | "outDir": "dist/esm/", 8 | "rootDir": "./src" 9 | } 10 | } 11 | --------------------------------------------------------------------------------