From f594fdbc48a7b38d11aed69a453860b36328ed35 Mon Sep 17 00:00:00 2001 From: Sergii Date: Tue, 22 Apr 2025 22:48:01 +0300 Subject: [PATCH] refactor: adds support for custom sdk client options --- ts/esbuild.config.mjs | 1 + ts/package-lock.json | 424 +++++++++++++++++- ts/package.json | 9 +- ts/script/protoc-gen-sdk-object.ts | 6 +- ts/src/client/createClientFactory.ts | 10 +- ts/src/client/createServiceClient.spec.ts | 80 ++-- ts/src/client/createServiceClient.ts | 38 +- ts/src/generated/createCosmosSDK.ts | 4 +- ts/src/generated/createNodeSDK.ts | 4 +- ts/src/generated/createProviderSDK.ts | 2 +- ts/src/transport/grpc/createGrpcTransport.ts | 20 +- ts/src/transport/types.ts | 26 +- .../protoc-gen-sdk-object.spec.ts.snap | 4 +- 13 files changed, 516 insertions(+), 112 deletions(-) diff --git a/ts/esbuild.config.mjs b/ts/esbuild.config.mjs index d421d5e0..7682ddde 100644 --- a/ts/esbuild.config.mjs +++ b/ts/esbuild.config.mjs @@ -9,6 +9,7 @@ const baseConfig = (config) => ({ ...config, entryPoints: [ 'src/sdk/nodejs/createProviderSDK.ts', + 'src/sdk/nodejs/createChainNodeSDK.ts', ], bundle: true, sourcemap: true, diff --git a/ts/package-lock.json b/ts/package-lock.json index b6ff6667..50c9009c 100644 --- a/ts/package-lock.json +++ b/ts/package-lock.json @@ -8,7 +8,9 @@ "@connectrpc/connect": "^2.0.1", "@connectrpc/connect-node": "^2.0.1", "@connectrpc/connect-web": "^2.0.1", - "@cosmjs/math": "^0.33.1" + "@cosmjs/math": "^0.33.1", + "@cosmjs/proto-signing": "^0.33.1", + "@cosmjs/stargate": "^0.33.1" }, "devDependencies": { "@bufbuild/protoc-gen-es": "^2.2.3", @@ -32,6 +34,9 @@ "typescript": "^5.8.0", "typescript-eslint": "^8.29.1" }, + "engines": { + "node": "22.14.0" + }, "license": "Apache-2.0", "name": "@akashnetwork/akash-api", "version": "0.0.0" @@ -656,6 +661,54 @@ "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-2.0.1.tgz", "version": "2.0.1" }, + "node_modules/@cosmjs/amino": { + "dependencies": { + "@cosmjs/crypto": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/utils": "^0.33.1" + }, + "integrity": "sha512-WfWiBf2EbIWpwKG9AOcsIIkR717SY+JdlXM/SL/bI66BdrhniAF+/ZNis9Vo9HF6lP2UU5XrSmFA4snAvEgdrg==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.33.1.tgz", + "version": "0.33.1" + }, + "node_modules/@cosmjs/crypto": { + "dependencies": { + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/utils": "^0.33.1", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.6.1", + "libsodium-wrappers-sumo": "^0.7.11" + }, + "integrity": "sha512-U4kGIj/SNBzlb2FGgA0sMR0MapVgJUg8N+oIAiN5+vl4GZ3aefmoL1RDyTrFS/7HrB+M+MtHsxC0tvEu4ic/zA==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.33.1.tgz", + "version": "0.33.1" + }, + "node_modules/@cosmjs/encoding": { + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + }, + "integrity": "sha512-nuNxf29fUcQE14+1p//VVQDwd1iau5lhaW/7uMz7V2AH3GJbFJoJVaKvVyZvdFk+Cnu+s3wCqgq4gJkhRCJfKw==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.33.1.tgz", + "version": "0.33.1" + }, + "node_modules/@cosmjs/json-rpc": { + "dependencies": { + "@cosmjs/stream": "^0.33.1", + "xstream": "^11.14.0" + }, + "integrity": "sha512-T6VtWzecpmuTuMRGZWuBYHsMF/aznWCYUt/cGMWNSz7DBPipVd0w774PKpxXzpEbyt5sr61NiuLXc+Az15S/Cw==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.33.1.tgz", + "version": "0.33.1" + }, "node_modules/@cosmjs/math": { "dependencies": { "bn.js": "^5.2.0" @@ -665,6 +718,81 @@ "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.33.1.tgz", "version": "0.33.1" }, + "node_modules/@cosmjs/proto-signing": { + "dependencies": { + "@cosmjs/amino": "^0.33.1", + "@cosmjs/crypto": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/utils": "^0.33.1", + "cosmjs-types": "^0.9.0" + }, + "integrity": "sha512-Sv4W+MxX+0LVnd+2rU4Fw1HRsmMwSVSYULj7pRkij3wnPwUlTVoJjmKFgKz13ooIlfzPrz/dnNjGp/xnmXChFQ==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.33.1.tgz", + "version": "0.33.1" + }, + "node_modules/@cosmjs/socket": { + "dependencies": { + "@cosmjs/stream": "^0.33.1", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + }, + "integrity": "sha512-KzAeorten6Vn20sMiM6NNWfgc7jbyVo4Zmxev1FXa5EaoLCZy48cmT3hJxUJQvJP/lAy8wPGEjZ/u4rmF11x9A==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.33.1.tgz", + "version": "0.33.1" + }, + "node_modules/@cosmjs/stargate": { + "dependencies": { + "@cosmjs/amino": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/proto-signing": "^0.33.1", + "@cosmjs/stream": "^0.33.1", + "@cosmjs/tendermint-rpc": "^0.33.1", + "@cosmjs/utils": "^0.33.1", + "cosmjs-types": "^0.9.0" + }, + "integrity": "sha512-CnJ1zpSiaZgkvhk+9aTp5IPmgWn2uo+cNEBN8VuD9sD6BA0V4DMjqe251cNFLiMhkGtiE5I/WXFERbLPww3k8g==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.33.1.tgz", + "version": "0.33.1" + }, + "node_modules/@cosmjs/stream": { + "dependencies": { + "xstream": "^11.14.0" + }, + "integrity": "sha512-bMUvEENjeQPSTx+YRzVsWT1uFIdHRcf4brsc14SOoRQ/j5rOJM/aHfsf/BmdSAnYbdOQ3CMKj/8nGAQ7xUdn7w==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.33.1.tgz", + "version": "0.33.1" + }, + "node_modules/@cosmjs/tendermint-rpc": { + "dependencies": { + "@cosmjs/crypto": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/json-rpc": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/socket": "^0.33.1", + "@cosmjs/stream": "^0.33.1", + "@cosmjs/utils": "^0.33.1", + "axios": "^1.6.0", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + }, + "integrity": "sha512-22klDFq2MWnf//C8+rZ5/dYatr6jeGT+BmVbutXYfAK9fmODbtFcumyvB6uWaEORWfNukl8YK1OLuaWezoQvxA==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.33.1.tgz", + "version": "0.33.1" + }, + "node_modules/@cosmjs/utils": { + "integrity": "sha512-UnLHDY6KMmC+UXf3Ufyh+onE19xzEXjT4VZ504Acmk4PXxqyvG4cCPprlKUFnGUX7f0z8Or9MAOHXBx41uHBcg==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.33.1.tgz", + "version": "0.33.1" + }, "node_modules/@cspotcode/source-map-support": { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -1905,6 +2033,18 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "version": "0.3.9" }, + "node_modules/@noble/hashes": { + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "version": "1.8.0" + }, "node_modules/@nodelib/fs.scandir": { "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -2670,6 +2810,12 @@ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "version": "1.0.0" }, + "node_modules/asynckit": { + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "version": "0.4.0" + }, "node_modules/available-typed-arrays": { "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -2686,6 +2832,17 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "version": "1.0.7" }, + "node_modules/axios": { + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "version": "1.8.4" + }, "node_modules/babel-jest": { "dependencies": { "@jest/transform": "^29.7.0", @@ -2809,6 +2966,32 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "version": "1.0.2" }, + "node_modules/base64-js": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "version": "1.5.1" + }, + "node_modules/bech32": { + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "version": "1.1.4" + }, "node_modules/bn.js": { "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "license": "MIT", @@ -2839,6 +3022,12 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "version": "3.0.3" }, + "node_modules/brorand": { + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "version": "1.1.0" + }, "node_modules/browserslist": { "bin": { "browserslist": "cli.js" @@ -2926,7 +3115,6 @@ "es-errors": "^1.3.0", "function-bind": "^1.1.2" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3209,6 +3397,18 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "version": "2.0.20" }, + "node_modules/combined-stream": { + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "version": "1.0.8" + }, "node_modules/commander": { "dev": true, "engines": { @@ -3233,6 +3433,12 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "version": "2.0.0" }, + "node_modules/cosmjs-types": { + "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", + "version": "0.9.0" + }, "node_modules/create-jest": { "bin": { "create-jest": "bin/create-jest.js" @@ -3387,7 +3593,6 @@ "es-errors": "^1.3.0", "gopd": "^1.0.1" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3405,7 +3610,6 @@ "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3417,6 +3621,15 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "version": "1.2.1" }, + "node_modules/delayed-stream": { + "engines": { + "node": ">=0.4.0" + }, + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "version": "1.0.0" + }, "node_modules/detect-indent": { "dev": true, "engines": { @@ -3476,7 +3689,6 @@ "es-errors": "^1.3.0", "gopd": "^1.2.0" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3508,6 +3720,27 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", "version": "1.5.103" }, + "node_modules/elliptic": { + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "version": "6.6.1" + }, + "node_modules/elliptic/node_modules/bn.js": { + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "version": "4.12.1" + }, "node_modules/emittery": { "dev": true, "engines": { @@ -3618,7 +3851,6 @@ "version": "1.23.9" }, "node_modules/es-define-property": { - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3628,7 +3860,6 @@ "version": "1.0.1" }, "node_modules/es-errors": { - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3641,7 +3872,6 @@ "dependencies": { "es-errors": "^1.3.0" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3657,7 +3887,6 @@ "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4259,6 +4488,26 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "version": "3.3.3" }, + "node_modules/follow-redirects": { + "engines": { + "node": ">=4.0" + }, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "license": "MIT", + "peerDependenciesMeta": { + "debug": { + "optional": true + } + }, + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "version": "1.15.9" + }, "node_modules/for-each": { "dependencies": { "is-callable": "^1.2.7" @@ -4275,6 +4524,21 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "version": "0.3.5" }, + "node_modules/form-data": { + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + }, + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "version": "4.0.2" + }, "node_modules/fs.realpath": { "dev": true, "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", @@ -4283,7 +4547,6 @@ "version": "1.0.0" }, "node_modules/function-bind": { - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" }, @@ -4369,7 +4632,6 @@ "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4396,7 +4658,6 @@ "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4512,7 +4773,6 @@ "define-properties": "^1.2.1", "gopd": "^1.0.1" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4525,7 +4785,6 @@ "version": "1.0.4" }, "node_modules/gopd": { - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4578,7 +4837,6 @@ "dependencies": { "es-define-property": "^1.0.0" }, - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" }, @@ -4604,7 +4862,6 @@ "version": "1.2.0" }, "node_modules/has-symbols": { - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4620,7 +4877,6 @@ "dependencies": { "has-symbols": "^1.0.3" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4632,11 +4888,20 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "version": "1.0.2" }, + "node_modules/hash.js": { + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + }, + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "version": "1.1.7" + }, "node_modules/hasown": { "dependencies": { "function-bind": "^1.1.2" }, - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4645,6 +4910,17 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "version": "2.0.2" }, + "node_modules/hmac-drbg": { + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + }, + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "version": "1.0.1" + }, "node_modules/html-escaper": { "dev": true, "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", @@ -4748,7 +5024,6 @@ "version": "1.0.6" }, "node_modules/inherits": { - "dev": true, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -5217,6 +5492,15 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "version": "2.0.0" }, + "node_modules/isomorphic-ws": { + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + }, + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "version": "4.0.1" + }, "node_modules/istanbul-lib-coverage": { "dev": true, "engines": { @@ -6166,6 +6450,21 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "version": "0.4.1" }, + "node_modules/libsodium-sumo": { + "integrity": "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==", + "license": "ISC", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz", + "version": "0.7.15" + }, + "node_modules/libsodium-wrappers-sumo": { + "dependencies": { + "libsodium-sumo": "^0.7.15" + }, + "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==", + "license": "ISC", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", + "version": "0.7.15" + }, "node_modules/lilconfig": { "dev": true, "engines": { @@ -6398,7 +6697,6 @@ "version": "1.0.12" }, "node_modules/math-intrinsics": { - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6438,6 +6736,27 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "version": "4.0.8" }, + "node_modules/mime-db": { + "engines": { + "node": ">= 0.6" + }, + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "version": "1.52.0" + }, + "node_modules/mime-types": { + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + }, + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "version": "2.1.35" + }, "node_modules/mimic-fn": { "dev": true, "engines": { @@ -6464,6 +6783,18 @@ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "version": "5.0.1" }, + "node_modules/minimalistic-assert": { + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "version": "1.0.1" + }, + "node_modules/minimalistic-crypto-utils": { + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "version": "1.0.1" + }, "node_modules/minimatch": { "dependencies": { "brace-expansion": "^1.1.7" @@ -6568,7 +6899,6 @@ "version": "1.13.4" }, "node_modules/object-keys": { - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6998,6 +7328,12 @@ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "version": "2.4.2" }, + "node_modules/proxy-from-env": { + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "version": "1.1.0" + }, "node_modules/punycode": { "dev": true, "engines": { @@ -7053,6 +7389,12 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "version": "18.3.1" }, + "node_modules/readonly-date": { + "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==", + "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", + "version": "1.0.0" + }, "node_modules/reflect.getprototypeof": { "dependencies": { "call-bind": "^1.0.8", @@ -7860,6 +8202,15 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "version": "1.0.0" }, + "node_modules/symbol-observable": { + "engines": { + "node": ">=0.10" + }, + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "version": "2.0.3" + }, "node_modules/test-exclude": { "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -8540,6 +8891,37 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "version": "3.0.7" }, + "node_modules/ws": { + "engines": { + "node": ">=8.3.0" + }, + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + }, + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "version": "7.5.10" + }, + "node_modules/xstream": { + "dependencies": { + "globalthis": "^1.0.1", + "symbol-observable": "^2.0.3" + }, + "integrity": "sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==", + "license": "MIT", + "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz", + "version": "11.14.0" + }, "node_modules/y18n": { "dev": true, "engines": { diff --git a/ts/package.json b/ts/package.json index e046c11d..190e8de1 100644 --- a/ts/package.json +++ b/ts/package.json @@ -12,6 +12,11 @@ "author": "Akash Network Team", "type": "module", "exports": { + "./chain-node": { + "import": "./dist/nodejs/esm/createChainNodeSDK.js", + "require": "./dist/nodejs/cjs/createChainNodeSDK.js", + "types": "./dist/types/sdk/nodejs/createChainNodeSDK.d.ts" + }, "./protos/*": { "types": "./dist/types/generated/protos/*" }, @@ -50,7 +55,9 @@ "@connectrpc/connect": "^2.0.1", "@connectrpc/connect-node": "^2.0.1", "@connectrpc/connect-web": "^2.0.1", - "@cosmjs/math": "^0.33.1" + "@cosmjs/math": "^0.33.1", + "@cosmjs/proto-signing": "^0.33.1", + "@cosmjs/stargate": "^0.33.1" }, "devDependencies": { "@bufbuild/protoc-gen-es": "^2.2.3", diff --git a/ts/script/protoc-gen-sdk-object.ts b/ts/script/protoc-gen-sdk-object.ts index fabdb415..9be97ef9 100755 --- a/ts/script/protoc-gen-sdk-object.ts +++ b/ts/script/protoc-gen-sdk-object.ts @@ -35,7 +35,7 @@ function generateTs(schema: Schema): void { const isMsgService = !!msgServiceExtension && ( hasOption(service, msgServiceExtension) // some cosmos-sdk tx services do not have "cosmos.msg.v1.service" option - || (service.name === "Msg" && service.typeName.startsWith("cosmos.")) + || (service.name === "Msg") ); const serviceImport = f.importSchema(service); const serviceImportPath = normalizePath(serviceImport.from.replace(/\.js$/, importExtension)); @@ -93,8 +93,8 @@ function generateTs(schema: Schema): void { ? `queryTransport: Transport, txTransport: Transport` : `transport: Transport`; f.print(f.export("function", `createSDK(${factoryArgs}, options?: SDKOptions) {\n` - + ` const getClient = createClientFactory(${hasMsgService ? "queryTransport" : "transport"}, options?.clientOptions);\n` - + (hasMsgService ? ` const getMsgClient = createClientFactory(txTransport, options?.clientOptions);\n` : "") + + ` const getClient = createClientFactory(${hasMsgService ? "queryTransport" : "transport"}, options?.clientOptions);\n` + + (hasMsgService ? ` const getMsgClient = createClientFactory(txTransport, options?.clientOptions);\n` : "") + ` return ${indent(stringifyObject(sdkDefs)).trim()};\n` + `}`, )); diff --git a/ts/src/client/createClientFactory.ts b/ts/src/client/createClientFactory.ts index 6a1396aa..9598b419 100644 --- a/ts/src/client/createClientFactory.ts +++ b/ts/src/client/createClientFactory.ts @@ -4,13 +4,13 @@ import type { Transport } from "../transport/types.ts"; import type { Client, ServiceClientOptions } from "./createServiceClient.ts"; import { createServiceClient } from "./createServiceClient.ts"; -export function createClientFactory(transport: Transport, options?: ServiceClientOptions) { - const services = Object.create(null); +export function createClientFactory(transport: Transport, options?: ServiceClientOptions) { + const services: Record> = Object.create(null); - return function getClient(service: T): Client { + return function getClient(service: T): Client { if (!services[service.typeName]) { - services[service.typeName] = createServiceClient(service, transport, options); + services[service.typeName] = createServiceClient(service, transport, options); } - return services[service.typeName] as Client; + return services[service.typeName] as Client; }; } diff --git a/ts/src/client/createServiceClient.spec.ts b/ts/src/client/createServiceClient.spec.ts index 757edbea..36dd7df5 100644 --- a/ts/src/client/createServiceClient.spec.ts +++ b/ts/src/client/createServiceClient.spec.ts @@ -35,11 +35,14 @@ describe(createServiceClient.name, () => { expect(result).toEqual({ result: "result" }); expect(transport.unary).toHaveBeenCalledWith( TestServiceSchema.method.testMethod, - abortSignal, - 1000, - headers, { $typeName: "akash.test.unit.TestInput", test: "input" }, - undefined, + { + signal: abortSignal, + timeoutMs: 1000, + headers, + onHeader, + onTrailer, + }, ); const transportResult = (await transport.unary.mock.results.at(-1)?.value) as Awaited>; @@ -68,9 +71,6 @@ describe(createServiceClient.name, () => { expect(transport.unary).toHaveBeenCalledWith( TestServiceSchema.method.testMethod, - undefined, - undefined, - undefined, { $typeName: "akash.test.unit.TestInput", test: "encode-input" }, undefined, ); @@ -94,9 +94,6 @@ describe(createServiceClient.name, () => { expect(transport.unary).toHaveBeenCalledWith( TestServiceSchema.method.testMethod, - undefined, - undefined, - undefined, { $typeName: "akash.test.unit.TestInput", test: "encode-input" }, undefined, ); @@ -164,13 +161,16 @@ describe(createServiceClient.name, () => { expect(await Array.fromAsync(stream)).toEqual(results); expect(transport.stream).toHaveBeenCalledWith( TestServiceSchema.method.testStreamMethod, - abortSignal, - 1000, - headers, expect.anything(), - undefined, + { + signal: abortSignal, + timeoutMs: 1000, + headers, + onHeader, + onTrailer, + }, ); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual([{ + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual([{ $typeName: "akash.test.unit.TestInput", test: "input", }]); @@ -205,13 +205,10 @@ describe(createServiceClient.name, () => { expect(transport.stream).toHaveBeenCalledWith( TestServiceSchema.method.testStreamMethod, - undefined, - undefined, - undefined, expect.anything(), undefined, ); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual([{ + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual([{ $typeName: "akash.test.unit.TestInput", test: "encode-input", }]); @@ -243,13 +240,10 @@ describe(createServiceClient.name, () => { expect(transport.stream).toHaveBeenCalledWith( TestServiceSchema.method.testStreamMethod, - undefined, - undefined, - undefined, expect.anything(), undefined, ); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual([{ + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual([{ $typeName: "akash.test.unit.TestInput", test: "input", }]); @@ -317,13 +311,16 @@ describe(createServiceClient.name, () => { expect(result).toEqual({ result: "result" }); expect(transport.stream).toHaveBeenCalledWith( TestServiceSchema.method.testClientStreamMethod, - abortSignal, - 1000, - headers, expect.anything(), - undefined, + { + signal: abortSignal, + timeoutMs: 1000, + headers, + onHeader, + onTrailer, + }, ); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual( + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual( input.map((item) => ({ ...item, $typeName: "akash.test.unit.TestInput", @@ -360,13 +357,10 @@ describe(createServiceClient.name, () => { expect(result).toEqual({ result: "decode-result" }); expect(transport.stream).toHaveBeenCalledWith( TestServiceSchema.method.testClientStreamMethod, - undefined, - undefined, - undefined, expect.anything(), undefined, ); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual( + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual( input.map((item) => ({ ...item, $typeName: "akash.test.unit.TestInput", @@ -397,13 +391,10 @@ describe(createServiceClient.name, () => { expect(result).toEqual({ result: "decode-result" }); expect(transport.stream).toHaveBeenCalledWith( TestServiceSchema.method.testClientStreamMethod, - undefined, - undefined, - undefined, expect.anything(), undefined, ); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual( + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual( input.map((item) => ({ ...item, $typeName: "akash.test.unit.TestInput", @@ -473,14 +464,17 @@ describe(createServiceClient.name, () => { expect(await Array.fromAsync(methodsCallResult)).toEqual(results); expect(transport.stream).toHaveBeenCalledWith( TestServiceSchema.method.testBiDiStreamMethod, - abortSignal, - 1000, - headers, expect.anything(), - undefined, + { + signal: abortSignal, + timeoutMs: 1000, + headers, + onHeader, + onTrailer, + }, ); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual( + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual( input.map((item) => ({ ...item, $typeName: "akash.test.unit.TestInput", @@ -523,7 +517,7 @@ describe(createServiceClient.name, () => { ...result, result: `decode-${result.result}`, }))); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual( + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual( input.map((item) => ({ ...item, $typeName: "akash.test.unit.TestInput", @@ -557,7 +551,7 @@ describe(createServiceClient.name, () => { const methodsCallResult = client.testBiDiStreamMethod(createAsyncIterable(input)); expect(await Array.fromAsync(methodsCallResult)).toEqual(results); - expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(4) as AsyncIterable)).toEqual( + expect(await Array.fromAsync(transport.stream.mock.lastCall?.at(1) as AsyncIterable)).toEqual( input.map((item) => ({ ...item, $typeName: "akash.test.unit.TestInput", diff --git a/ts/src/client/createServiceClient.ts b/ts/src/client/createServiceClient.ts index e5d0fb80..c4782a8a 100644 --- a/ts/src/client/createServiceClient.ts +++ b/ts/src/client/createServiceClient.ts @@ -20,20 +20,20 @@ import type { TypePatches } from "../utils/applyPatches.ts"; import { applyPatches } from "../utils/applyPatches.ts"; import { createAsyncIterable, handleStreamResponse, mapStream } from "../utils/stream.ts"; -export type Client = { +export type Client = { [P in keyof Desc["method"]]: - Desc["method"][P] extends DescMethodUnary ? (input: MessageJsonType, options?: CallOptions) => Promise> - : Desc["method"][P] extends DescMethodServerStreaming ? (input: MessageJsonType, options?: CallOptions) => AsyncIterable> - : Desc["method"][P] extends DescMethodClientStreaming ? (input: AsyncIterable>, options?: CallOptions) => Promise> - : Desc["method"][P] extends DescMethodBiDiStreaming ? (input: AsyncIterable>, options?: CallOptions) => AsyncIterable> + Desc["method"][P] extends DescMethodUnary ? (input: MessageJsonType, options?: TCallOptions) => Promise> + : Desc["method"][P] extends DescMethodServerStreaming ? (input: MessageJsonType, options?: TCallOptions) => AsyncIterable> + : Desc["method"][P] extends DescMethodClientStreaming ? (input: AsyncIterable>, options?: TCallOptions) => Promise> + : Desc["method"][P] extends DescMethodBiDiStreaming ? (input: AsyncIterable>, options?: TCallOptions) => AsyncIterable> : never; }; -export function createServiceClient( - service: T, +export function createServiceClient( + service: TSchema, transport: Transport, options?: ServiceClientOptions, -): Client { +): Client { const methodOptions: MethodOptions = options?.typePatches ? { encode: createFromJsonWithPatches(options.typePatches), decode: createToJsonWithPatches(options.typePatches) } : { encode: fromJson, decode: toJson as MethodOptions["decode"] }; @@ -43,7 +43,7 @@ export function createServiceClient( client[methodDesc.localName] = createMethod(methodDesc, transport, methodOptions); } - return client as Client; + return client as Client; } export interface ServiceClientOptions { @@ -83,11 +83,8 @@ function createUnaryFn( return async (input, options) => { const response = await transport.unary( method, - options?.signal, - options?.timeoutMs, - options?.headers, methodOptions.encode(method.input, input as JsonValue), - options?.contextValues, + options, ); options?.onHeader?.(response.header); options?.onTrailer?.(response.trailer); @@ -114,11 +111,8 @@ function createServerStreamingFn< method, transport.stream( method, - options?.signal, - options?.timeoutMs, - options?.headers, createAsyncIterable([methodOptions.encode(method.input, input as JsonValue)]), - options?.contextValues, + options, ), options, methodOptions.decode, @@ -142,11 +136,8 @@ function createClientStreamingFn< return async (input, options) => { const response = await transport.stream( method, - options?.signal, - options?.timeoutMs, - options?.headers, mapStream(input, (json) => methodOptions.encode(method.input, json as JsonValue)), - options?.contextValues, + options, ); options?.onHeader?.(response.header); let singleMessage: MessageShape | undefined; @@ -184,11 +175,8 @@ function createBiDiStreamingFn< method, transport.stream( method, - options?.signal, - options?.timeoutMs, - options?.headers, mapStream(input, (json) => methodOptions.encode(method.input, json as JsonValue)), - options?.contextValues, + options, ), options, methodOptions.decode, diff --git a/ts/src/generated/createCosmosSDK.ts b/ts/src/generated/createCosmosSDK.ts index 89428727..ae3113af 100644 --- a/ts/src/generated/createCosmosSDK.ts +++ b/ts/src/generated/createCosmosSDK.ts @@ -94,8 +94,8 @@ export const serviceLoader = createServiceLoader([ () => import("./protos/cosmos/vesting/v1beta1/tx_pb.ts").then(m => m.Msg) ] as const); export function createSDK(queryTransport: Transport, txTransport: Transport, options?: SDKOptions) { - const getClient = createClientFactory(queryTransport, options?.clientOptions); - const getMsgClient = createClientFactory(txTransport, options?.clientOptions); + const getClient = createClientFactory(queryTransport, options?.clientOptions); + const getMsgClient = createClientFactory(txTransport, options?.clientOptions); return { cosmos: { app: { diff --git a/ts/src/generated/createNodeSDK.ts b/ts/src/generated/createNodeSDK.ts index b0820823..5a47e81d 100644 --- a/ts/src/generated/createNodeSDK.ts +++ b/ts/src/generated/createNodeSDK.ts @@ -43,8 +43,8 @@ export const serviceLoader = createServiceLoader([ () => import("./protos/akash/take/v1/service_pb.ts").then(m => m.Msg) ] as const); export function createSDK(queryTransport: Transport, txTransport: Transport, options?: SDKOptions) { - const getClient = createClientFactory(queryTransport, options?.clientOptions); - const getMsgClient = createClientFactory(txTransport, options?.clientOptions); + const getClient = createClientFactory(queryTransport, options?.clientOptions); + const getMsgClient = createClientFactory(txTransport, options?.clientOptions); return { akash: { audit: { diff --git a/ts/src/generated/createProviderSDK.ts b/ts/src/generated/createProviderSDK.ts index 40fbdc7d..9197d81f 100644 --- a/ts/src/generated/createProviderSDK.ts +++ b/ts/src/generated/createProviderSDK.ts @@ -14,7 +14,7 @@ export const serviceLoader = createServiceLoader([ () => import("./protos/akash/provider/v1/service_pb.ts").then(m => m.ProviderRPC) ] as const); export function createSDK(transport: Transport, options?: SDKOptions) { - const getClient = createClientFactory(transport, options?.clientOptions); + const getClient = createClientFactory(transport, options?.clientOptions); return { akash: { inventory: { diff --git a/ts/src/transport/grpc/createGrpcTransport.ts b/ts/src/transport/grpc/createGrpcTransport.ts index 608e6e2f..2a6bbc8b 100644 --- a/ts/src/transport/grpc/createGrpcTransport.ts +++ b/ts/src/transport/grpc/createGrpcTransport.ts @@ -1,10 +1,22 @@ -import { createGrpcTransport as makeGrpcTransport, type GrpcTransportOptions } from "@connectrpc/connect-node"; +import { createGrpcTransport as makeGrpcTransport, type GrpcTransportOptions as ConnectGrpcTransportOptions } from "@connectrpc/connect-node"; -import type { Transport } from "../types.ts"; +import type { CallOptions, Transport } from "../types.ts"; -export function createGrpcTransport(options: Omit): Transport { - return makeGrpcTransport({ +export type GrpcCallOptions = Omit; +export type GrpcTransportOptions = Omit; + +export function createGrpcTransport(options: GrpcTransportOptions): Transport { + const transport = makeGrpcTransport({ ...options, useBinaryFormat: true, }); + + return { + async unary(method, input, options) { + return transport.unary(method, options?.signal, options?.timeoutMs, options?.headers, input, options?.contextValues); + }, + async stream(method, input, options) { + return transport.stream(method, options?.signal, options?.timeoutMs, options?.headers, input, options?.contextValues); + }, + }; } diff --git a/ts/src/transport/types.ts b/ts/src/transport/types.ts index 84580315..5dca349c 100644 --- a/ts/src/transport/types.ts +++ b/ts/src/transport/types.ts @@ -1,10 +1,30 @@ -import type { CallOptions as ConnectCallOptions } from "@connectrpc/connect"; +import type { DescMessage, DescMethodStreaming, DescMethodUnary, MessageInitShape } from "@bufbuild/protobuf"; +import type { CallOptions as ConnectCallOptions, StreamResponse, UnaryResponse } from "@connectrpc/connect"; +import type { DeliverTxResponse, StdFee } from "@cosmjs/stargate"; -export type { Transport, StreamResponse } from "@connectrpc/connect"; +import type { TxRaw } from "./tx/TxClient.ts"; + +export type { StreamResponse } from "@connectrpc/connect"; // eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface CallOptions extends ConnectCallOptions {} -// eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface TxCallOptions { + afterSign?: (tx: TxRaw) => void; + afterBroadcast?: (tx: DeliverTxResponse) => void; + memo?: string; + fee?: StdFee; +} + +export interface Transport { + /** + * Call a unary RPC - a method that takes a single input message, and + * responds with a single output message. + */ + unary(method: DescMethodUnary, input: MessageInitShape, options?: TCallOptions): Promise>; + /** + * Call a streaming RPC - a method that takes zero or more input messages, + * and responds with zero or more output messages. + */ + stream(method: DescMethodStreaming, input: AsyncIterable>, options?: TCallOptions): Promise>; } diff --git a/ts/test/functional/__snapshots__/protoc-gen-sdk-object.spec.ts.snap b/ts/test/functional/__snapshots__/protoc-gen-sdk-object.spec.ts.snap index 8052cb0a..7812bede 100644 --- a/ts/test/functional/__snapshots__/protoc-gen-sdk-object.spec.ts.snap +++ b/ts/test/functional/__snapshots__/protoc-gen-sdk-object.spec.ts.snap @@ -15,8 +15,8 @@ export const serviceLoader = createServiceLoader([ () => import("./protos/query_pb.none").then(m => m.Query) ] as const); export function createSDK(queryTransport: Transport, txTransport: Transport, options?: SDKOptions) { - const getClient = createClientFactory(queryTransport, options?.clientOptions); - const getMsgClient = createClientFactory(txTransport, options?.clientOptions); + const getClient = createClientFactory(queryTransport, options?.clientOptions); + const getMsgClient = createClientFactory(txTransport, options?.clientOptions); return { akash: { test: {