diff --git a/.changeset/pretty-bugs-bathe.md b/.changeset/pretty-bugs-bathe.md new file mode 100644 index 000000000..9271dc923 --- /dev/null +++ b/.changeset/pretty-bugs-bathe.md @@ -0,0 +1,11 @@ +--- +"@onflow/fcl-react-native": minor +"@onflow/transport-grpc": minor +"@onflow/transport-http": minor +"@onflow/fcl-core": minor +"@onflow/typedefs": minor +"@onflow/fcl": minor +"@onflow/sdk": minor +--- + +Add GetNodeVersionInfo SDK Interaction diff --git a/packages/fcl-core/src/fcl-core.ts b/packages/fcl-core/src/fcl-core.ts index 25152d1ca..8910f88d0 100644 --- a/packages/fcl-core/src/fcl-core.ts +++ b/packages/fcl-core/src/fcl-core.ts @@ -32,6 +32,7 @@ export {send} from "@onflow/sdk" export {decode} from "@onflow/sdk" export {account} from "@onflow/sdk" export {block} from "@onflow/sdk" +export {nodeVersionInfo} from "@onflow/sdk" export {isOk, isBad, why, pipe, build} from "@onflow/sdk" export {withPrefix, sansPrefix, display} from "@onflow/util-address" export {template as cadence} from "@onflow/util-template" @@ -56,6 +57,7 @@ export {getCollection} from "@onflow/sdk" export {getTransactionStatus} from "@onflow/sdk" export {getTransaction} from "@onflow/sdk" export {getNetworkParameters} from "@onflow/sdk" +export {getNodeVersionInfo} from "@onflow/sdk" export {authorizations, authorization} from "@onflow/sdk" export {subscribeEvents} from "@onflow/sdk" export {args, arg} from "@onflow/sdk" diff --git a/packages/fcl-react-native/src/fcl-react-native.ts b/packages/fcl-react-native/src/fcl-react-native.ts index 0b7ea0586..9d1860654 100644 --- a/packages/fcl-react-native/src/fcl-react-native.ts +++ b/packages/fcl-react-native/src/fcl-react-native.ts @@ -46,6 +46,7 @@ export { getTransactionStatus, getTransaction, getNetworkParameters, + getNodeVersionInfo, authorizations, authorization, args, @@ -59,6 +60,7 @@ export { validator, invariant, subscribeEvents, + nodeVersionInfo, } from "@onflow/fcl-core" import {getMutate, getCurrentUser, initServiceRegistry, setIsReactNative} from "@onflow/fcl-core" diff --git a/packages/fcl/src/fcl.ts b/packages/fcl/src/fcl.ts index 09bd30b5c..1d8b583e3 100644 --- a/packages/fcl/src/fcl.ts +++ b/packages/fcl/src/fcl.ts @@ -46,6 +46,7 @@ export { getTransactionStatus, getTransaction, getNetworkParameters, + getNodeVersionInfo, authorizations, authorization, args, @@ -58,7 +59,8 @@ export { param, validator, invariant, - subscribeEvents + subscribeEvents, + nodeVersionInfo, } from "@onflow/fcl-core" import {getMutate, getCurrentUser, initServiceRegistry } from "@onflow/fcl-core" diff --git a/packages/sdk/src/build/build-get-node-version-info.test.ts b/packages/sdk/src/build/build-get-node-version-info.test.ts new file mode 100644 index 000000000..e1515e7d5 --- /dev/null +++ b/packages/sdk/src/build/build-get-node-version-info.test.ts @@ -0,0 +1,10 @@ +import {initInteraction, isGetNodeVersionInfo} from "../interaction/interaction" +import {getNodeVersionInfo} from "./build-get-node-version-info" + +describe("Build Get Node Version Info", () => { + test("Get Node Version Info", async () => { + let ix = await getNodeVersionInfo()(initInteraction()) + + expect(isGetNodeVersionInfo(ix)).toBe(true) + }) +}) diff --git a/packages/sdk/src/build/build-get-node-version-info.ts b/packages/sdk/src/build/build-get-node-version-info.ts new file mode 100644 index 000000000..e69580676 --- /dev/null +++ b/packages/sdk/src/build/build-get-node-version-info.ts @@ -0,0 +1,17 @@ +import { Ok, makeGetNodeVerionInfo, pipe } from "../interaction/interaction" + +/** + * @description - A builder function that returns the interaction to get a block header + * @param {boolean} [isSealed] - Whether or not the block should be sealed + * @returns {Function} - An interaction object + */ +export function getNodeVersionInfo(isSealed = null) { + return pipe([ + makeGetNodeVerionInfo, + ix => { + ix.block.isSealed = isSealed + return Ok(ix) + }, + ]) +} + diff --git a/packages/sdk/src/decode/decode.js b/packages/sdk/src/decode/decode.js index 2adb1c39d..23a041b9d 100644 --- a/packages/sdk/src/decode/decode.js +++ b/packages/sdk/src/decode/decode.js @@ -231,9 +231,15 @@ export const decodeResponse = async (response, customDecoders = {}) => { chainId: formattedChainId, } } else if (response.streamConnection) { - return decodeStream(response.streamConnection, decodeResponse, customDecoders) + return decodeStream( + response.streamConnection, + decodeResponse, + customDecoders + ) } else if (response.heartbeat) { return response.heartbeat + } else if (response.nodeVersionInfo) { + return response.nodeVersionInfo } return null diff --git a/packages/sdk/src/interaction/interaction.test.ts b/packages/sdk/src/interaction/interaction.test.ts index 595a3ca50..cb2a5b9a0 100644 --- a/packages/sdk/src/interaction/interaction.test.ts +++ b/packages/sdk/src/interaction/interaction.test.ts @@ -1,5 +1,6 @@ +import {InteractionAccount} from "@onflow/typedefs" import {resolveAccounts} from "../sdk" -import {InteractionAccount, prepAccount, initAccount, initInteraction} from "./interaction" +import {prepAccount, initAccount, initInteraction} from "./interaction" describe("prepAccount", () => { test("prepAccount converts account object keyId to integer", async () => { @@ -14,8 +15,11 @@ describe("prepAccount", () => { }), } - const ix = prepAccount(acct, {role: "proposer"})({...initInteraction(), accounts: {}}) - expect(ix.accounts[ix.proposer||""].keyId).toBe(parseInt(keyId)) + const ix = prepAccount(acct, {role: "proposer"})({ + ...initInteraction(), + accounts: {}, + }) + expect(ix.accounts[ix.proposer || ""].keyId).toBe(parseInt(keyId)) }) test("prepAccount converts authorization function keyId to integer", async () => { diff --git a/packages/sdk/src/interaction/interaction.ts b/packages/sdk/src/interaction/interaction.ts index bec6d10aa..74ecfd485 100644 --- a/packages/sdk/src/interaction/interaction.ts +++ b/packages/sdk/src/interaction/interaction.ts @@ -268,6 +268,9 @@ export const makeGetNetworkParameters /* */ = makeIx( export const makeSubscribeEvents /* */ = makeIx( InteractionTag.SUBSCRIBE_EVENTS ) +export const makeGetNodeVerionInfo /* */ = makeIx( + InteractionTag.GET_NODE_VERSION_INFO +) const is = (wat: InteractionTag) => (ix: Interaction) => ix.tag === wat @@ -291,6 +294,9 @@ export const isGetCollection /* */ = is(InteractionTag.GET_COLLECTION) export const isGetNetworkParameters /* */ = is( InteractionTag.GET_NETWORK_PARAMETERS ) +export const isGetNodeVersionInfo /* */ = is( + InteractionTag.GET_NODE_VERSION_INFO +) export const isSubscribeEvents /* */ = is( InteractionTag.SUBSCRIBE_EVENTS ) diff --git a/packages/sdk/src/node-version-info/node-version-info.ts b/packages/sdk/src/node-version-info/node-version-info.ts new file mode 100644 index 000000000..c905a76cd --- /dev/null +++ b/packages/sdk/src/node-version-info/node-version-info.ts @@ -0,0 +1,14 @@ +import {send} from "../send/send.js" +import {decodeResponse as decode} from "../decode/decode.js" +import {getNodeVersionInfo} from "../build/build-get-node-version-info" +import {NodeVersionInfo} from "@onflow/typedefs" + +/** + * @description Returns the version information from to connected node + * @returns A promise that resolves to a block response + */ +export async function nodeVersionInfo( + opts: any = {} +): Promise { + return send([getNodeVersionInfo()], opts).then(decode) +} diff --git a/packages/sdk/src/response/__snapshots__/response.test.ts.snap b/packages/sdk/src/response/__snapshots__/response.test.ts.snap index 00b7921b0..fb409075f 100644 --- a/packages/sdk/src/response/__snapshots__/response.test.ts.snap +++ b/packages/sdk/src/response/__snapshots__/response.test.ts.snap @@ -11,6 +11,7 @@ exports[`Response - Snapshot 1`] = ` "heartbeat": null, "latestBlock": null, "networkParameters": null, + "nodeVersionInfo": null, "streamConnection": null, "tag": null, "transaction": null, diff --git a/packages/sdk/src/response/response.ts b/packages/sdk/src/response/response.ts index 904bcf14c..4dc062959 100644 --- a/packages/sdk/src/response/response.ts +++ b/packages/sdk/src/response/response.ts @@ -12,7 +12,8 @@ const DEFAULT_RESPONSE = { "collection":null, "networkParameters":null, "streamConnection":null, - "heartbeat":null + "heartbeat":null, + "nodeVersionInfo": null, } export const response = () => ({...DEFAULT_RESPONSE}) diff --git a/packages/sdk/src/sdk.ts b/packages/sdk/src/sdk.ts index 39a48c653..cca459fbf 100644 --- a/packages/sdk/src/sdk.ts +++ b/packages/sdk/src/sdk.ts @@ -46,6 +46,7 @@ export {template as cdc} from "@onflow/util-template" // Helpers export {account} from "./account/account.js" export {block} from "./block/block.js" +export {nodeVersionInfo} from "./node-version-info/node-version-info" // Builders export {authorizations, authorization} from "./build/build-authorizations.js" @@ -61,6 +62,7 @@ export {getCollection} from "./build/build-get-collection" export {getTransactionStatus} from "./build/build-get-transaction-status.js" export {getTransaction} from "./build/build-get-transaction.js" export {getNetworkParameters} from "./build/build-get-network-parameters.js" +export {getNodeVersionInfo} from "./build/build-get-node-version-info" export {limit} from "./build/build-limit.js" export {args, arg} from "./build/build-arguments" export {proposer} from "./build/build-proposer.js" diff --git a/packages/transport-grpc/src/sdk-send-grpc.js b/packages/transport-grpc/src/sdk-send-grpc.js index e40ce0374..0671936ce 100644 --- a/packages/transport-grpc/src/sdk-send-grpc.js +++ b/packages/transport-grpc/src/sdk-send-grpc.js @@ -17,4 +17,5 @@ export {sendGetTransactionStatus} from "./send-get-transaction-status.js" export {sendPing} from "./send-ping.js" export {sendTransaction} from "./send-transaction.js" export {sendGetNetworkParameters} from "./send-get-network-parameters.js" +export {sendGetNodeVersionInfo} from "./send-get-node-version-info.js" export {send} from "./send-grpc.js" \ No newline at end of file diff --git a/packages/transport-grpc/src/send-get-node-version-info.js b/packages/transport-grpc/src/send-get-node-version-info.js new file mode 100644 index 000000000..3e41aa120 --- /dev/null +++ b/packages/transport-grpc/src/send-get-node-version-info.js @@ -0,0 +1,39 @@ +import {invariant} from "@onflow/util-invariant" +import {AccessAPI, GetNodeVersionInfoRequest} from "@onflow/protobuf" +import {unary as defaultUnary} from "./unary" + +const u8ToHex = (u8, context) => context.Buffer.from(u8).toString("hex") + +export async function sendGetNodeVersionInfo(ix, context = {}, opts = {}) { + invariant( + opts.node, + `SDK Send Get Node Version Info Error: opts.node must be defined.` + ) + invariant( + context.response, + `SDK Send Get Node Version INfo Error: context.response must be defined.` + ) + + const unary = opts.unary || defaultUnary + + ix = await ix + + const req = new GetNodeVersionInfoRequest() + + const res = await unary(opts.node, AccessAPI.GetNodeVersionInfo, req, context) + + let ret = context.response() + ret.tag = ix.tag + + let nodeVersionInfo = res.getInfo() + ret.nodeVersionInfo = { + semver: nodeVersionInfo.getSemver(), + commit: nodeVersionInfo.getCommit(), + sporkId: u8ToHex(nodeVersionInfo.getSporkId_asU8(), context), + protocolVersion: parseInt(nodeVersionInfo.getProtocolVersion()), + sporkRootBlockHeight: parseInt(nodeVersionInfo.getSporkRootBlockHeight()), + nodeRootBlockHeight: parseInt(nodeVersionInfo.getNodeRootBlockHeight()), + } + + return ret +} diff --git a/packages/transport-grpc/src/send-get-node-version-info.test.js b/packages/transport-grpc/src/send-get-node-version-info.test.js new file mode 100644 index 000000000..f18a46669 --- /dev/null +++ b/packages/transport-grpc/src/send-get-node-version-info.test.js @@ -0,0 +1,56 @@ +import {AccessAPI} from "@onflow/protobuf" +import {sendGetNodeVersionInfo} from "./send-get-node-version-info" +import { + build, + getNodeVersionInfo, + resolve, + response as responseADT, +} from "@onflow/sdk" + +describe("Get Network Parameters", () => { + test("GetNetworkParametersResult", async () => { + const unaryMock = jest.fn() + + unaryMock.mockReturnValue({ + getInfo: () => ({ + getSemver: () => "0.0.0", + getCommit: () => "0123456789abcdef", + getSporkId_asU8: () => new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), + getProtocolVersion: () => "999", + getSporkRootBlockHeight: () => "123", + getNodeRootBlockHeight: () => "456", + }), + }) + + const response = await sendGetNodeVersionInfo( + await resolve(await build([getNodeVersionInfo()])), + { + Buffer, + response: responseADT, + }, + { + unary: unaryMock, + node: "localhost:3000", + } + ) + + expect(unaryMock.mock.calls.length).toEqual(1) + + const unaryMockArgs = unaryMock.mock.calls[0] + + expect(unaryMockArgs.length).toEqual(4) + + const unaryType = unaryMock.mock.calls[0][1] + + expect(unaryType).toEqual(AccessAPI.GetNodeVersionInfo) + + expect(response.nodeVersionInfo).toStrictEqual({ + semver: "0.0.0", + commit: "0123456789abcdef", + sporkId: "00010203040506070809", + protocolVersion: 999, + sporkRootBlockHeight: 123, + nodeRootBlockHeight: 456, + }) + }) +}) diff --git a/packages/transport-grpc/src/send-grpc.js b/packages/transport-grpc/src/send-grpc.js index 63a3332ef..9f7fa336b 100644 --- a/packages/transport-grpc/src/send-grpc.js +++ b/packages/transport-grpc/src/send-grpc.js @@ -49,6 +49,11 @@ export const send = async (ix, context = {}, opts = {}) => { return opts.sendSubscribeEvents(ix, context, opts) else throw new Error(`SDK Send Error: subscribeEvents is not supported by this transport.`) + case context.ix.isGetNodeVersionInfo?.(ix): + if (opts.sendGetNodeVersionInfo) + return opts.sendGetNodeVersionInfo(ix, context, opts) + else + throw new Error(`SDK Send Error: getNodeVersionInfo is not supported by this transport.`) default: return ix } diff --git a/packages/transport-http/src/sdk-send-http.ts b/packages/transport-http/src/sdk-send-http.ts index 9b4424fe4..08a5f76df 100644 --- a/packages/transport-http/src/sdk-send-http.ts +++ b/packages/transport-http/src/sdk-send-http.ts @@ -9,6 +9,7 @@ export {sendGetTransactionStatus} from "./send-get-transaction-status" export {sendPing} from "./send-ping" export {sendTransaction} from "./send-transaction" export {sendGetNetworkParameters} from "./send-get-network-parameters" +export {sendGetNodeVersionInfo} from "./send-get-node-version-info" export {connectSubscribeEvents} from "./connect-subscribe-events" export {send} from "./send-http" export {WebsocketError} from "./connect-ws" diff --git a/packages/transport-http/src/send-get-node-version-info.test.ts b/packages/transport-http/src/send-get-node-version-info.test.ts new file mode 100644 index 000000000..1a0c39025 --- /dev/null +++ b/packages/transport-http/src/send-get-node-version-info.test.ts @@ -0,0 +1,60 @@ +import {sendGetNodeVersionInfo} from "./send-get-node-version-info" +import { + build, + getNodeVersionInfo, + resolve, + response as responseADT, +} from "@onflow/sdk" + +describe("Get Node Version Info", () => { + test("GetNodeVersionInfo", async () => { + const httpRequestMock = jest.fn() + + const returnedNodeVersionInfo = { + semver: "v0.33.11-access-register-cache", + commit: "4ffc02f147654ef3a936ab1b435e00a5d5d37701", + spork_id: + "709530929e4968daff19c303ef1fc5f0a7649b3a1ce7d5ee5202056969524c94", + protocol_version: "32", + spork_root_block_height: "65264619", + node_root_block_height: "65264619", + } + + httpRequestMock.mockReturnValue(returnedNodeVersionInfo) + + const response = await sendGetNodeVersionInfo( + await resolve(await build([getNodeVersionInfo()])), + { + response: responseADT, + }, + { + httpRequest: httpRequestMock, + node: "localhost:8888", + } + ) + + expect(httpRequestMock.mock.calls.length).toEqual(1) + + const httpRequestMockArgs = httpRequestMock.mock.calls[0] + + expect(httpRequestMockArgs.length).toEqual(1) + + const valueSent = httpRequestMock.mock.calls[0][0] + + expect(valueSent).toEqual({ + hostname: "localhost:8888", + path: "/v1/node_version_info", + method: "GET", + }) + + expect(response.nodeVersionInfo).toStrictEqual({ + semver: "v0.33.11-access-register-cache", + commit: "4ffc02f147654ef3a936ab1b435e00a5d5d37701", + sporkId: + "709530929e4968daff19c303ef1fc5f0a7649b3a1ce7d5ee5202056969524c94", + protocolVersion: 32, + sporkRootBlockHeight: 65264619, + nodeRootBlockHeight: 65264619, + }) + }) +}) diff --git a/packages/transport-http/src/send-get-node-version-info.ts b/packages/transport-http/src/send-get-node-version-info.ts new file mode 100644 index 000000000..0a89bf775 --- /dev/null +++ b/packages/transport-http/src/send-get-node-version-info.ts @@ -0,0 +1,41 @@ +import {invariant} from "@onflow/util-invariant" +import {httpRequest as defaultHttpRequest} from "./http-request.js" +import {Interaction} from "@onflow/typedefs" + +export async function sendGetNodeVersionInfo( + ix: Interaction | Promise, + context: any = {}, + opts: any = {} +) { + invariant( + opts.node, + `SDK Send Get Node Version Info Error: opts.node must be defined.` + ) + invariant( + context.response, + `SDK Send Get Node Verison Info Error: context.response must be defined.` + ) + + const httpRequest = opts.httpRequest || defaultHttpRequest + + ix = await ix + + const res = await httpRequest({ + hostname: opts.node, + path: `/v1/node_version_info`, + method: "GET", + }) + + let ret = context.response() + ret.tag = ix.tag + + ret.nodeVersionInfo = { + semver: res.semver, + commit: res.commit, + sporkId: res.spork_id, + protocolVersion: parseInt(res.protocol_version), + sporkRootBlockHeight: parseInt(res.spork_root_block_height), + nodeRootBlockHeight: parseInt(res.node_root_block_height), + } + return ret +} diff --git a/packages/transport-http/src/send-http.ts b/packages/transport-http/src/send-http.ts index 8af2e20a7..3ea87d3f9 100644 --- a/packages/transport-http/src/send-http.ts +++ b/packages/transport-http/src/send-http.ts @@ -12,23 +12,25 @@ import {sendGetCollection} from "./send-get-collection.js" import {sendPing, ISendPingContext} from "./send-ping" import {sendGetNetworkParameters} from "./send-get-network-parameters.js" import {Interaction} from "@onflow/typedefs" +import {sendGetNodeVersionInfo} from "./send-get-node-version-info.js" interface InteractionModule { - isTransaction: (ix: Interaction) => boolean; - isGetTransactionStatus: (ix: Interaction) => boolean; - isGetTransaction: (ix: Interaction) => boolean; - isScript: (ix: Interaction) => boolean; - isGetAccount: (ix: Interaction) => boolean; - isGetEvents: (ix: Interaction) => boolean; - isGetBlock: (ix: Interaction) => boolean; - isGetBlockHeader: (ix: Interaction) => boolean; - isGetCollection: (ix: Interaction) => boolean; - isPing: (ix: Interaction) => boolean; - isGetNetworkParameters: (ix: Interaction) => boolean; - isSubscribeEvents: (ix: Interaction) => boolean; + isTransaction: (ix: Interaction) => boolean + isGetTransactionStatus: (ix: Interaction) => boolean + isGetTransaction: (ix: Interaction) => boolean + isScript: (ix: Interaction) => boolean + isGetAccount: (ix: Interaction) => boolean + isGetEvents: (ix: Interaction) => boolean + isGetBlock: (ix: Interaction) => boolean + isGetBlockHeader: (ix: Interaction) => boolean + isGetCollection: (ix: Interaction) => boolean + isPing: (ix: Interaction) => boolean + isGetNetworkParameters: (ix: Interaction) => boolean + isSubscribeEvents?: (ix: Interaction) => boolean + isGetNodeVersionInfo?: (ix: Interaction) => boolean } -interface IContext extends ISendPingContext{ - ix: InteractionModule; +interface IContext extends ISendPingContext { + ix: InteractionModule } interface IOptsCommon { @@ -36,21 +38,70 @@ interface IOptsCommon { } interface IOpts extends IOptsCommon { - sendTransaction?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - sendGetTransactionStatus?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - sendGetTransaction?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - sendExecuteScript?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - sendGetAccount?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - sendGetEvents?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - sendGetBlockHeader?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - sendGetCollection?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void + sendTransaction?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + sendGetTransactionStatus?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + sendGetTransaction?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + sendExecuteScript?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + sendGetAccount?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + sendGetEvents?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + sendGetBlockHeader?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + sendGetCollection?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void sendPing?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void sendGetBlock?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - sendGetNetworkParameters?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void - connectSubscribeEvents?: (ix: Interaction, context: IContext, opts: IOptsCommon) => void + sendGetNetworkParameters?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + connectSubscribeEvents?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void + sendGetNodeVersionInfo?: ( + ix: Interaction, + context: IContext, + opts: IOptsCommon + ) => void } -export const send = async (ix: Interaction, context: IContext, opts: IOpts = {}) => { +export const send = async ( + ix: Interaction, + context: IContext, + opts: IOpts = {} +) => { invariant( Boolean(opts?.node), `SDK Send Error: Either opts.node or "accessNode.api" in config must be defined.` @@ -73,7 +124,7 @@ export const send = async (ix: Interaction, context: IContext, opts: IOpts = {}) return opts.sendGetAccount ? opts.sendGetAccount(ix, context, opts) : sendGetAccount(ix, context, opts) case context.ix.isGetEvents(ix): return opts.sendGetEvents ? opts.sendGetEvents(ix, context, opts) : sendGetEvents(ix, context, opts) - case context.ix.isSubscribeEvents(ix): + case context.ix.isSubscribeEvents?.(ix): return opts.connectSubscribeEvents ? opts.connectSubscribeEvents(ix, context, opts) : connectSubscribeEvents(ix, context, opts) case context.ix.isGetBlock(ix): return opts.sendGetBlock ? opts.sendGetBlock(ix, context, opts) : sendGetBlock(ix, context, opts) @@ -85,6 +136,8 @@ export const send = async (ix: Interaction, context: IContext, opts: IOpts = {}) return opts.sendPing ? opts.sendPing(ix, context, opts) : sendPing(ix, context, opts) case context.ix.isGetNetworkParameters(ix): return opts.sendGetNetworkParameters ? opts.sendGetNetworkParameters(ix, context, opts) : sendGetNetworkParameters(ix, context, opts) + case context.ix.isGetNodeVersionInfo?.(ix): + return opts.sendGetNodeVersionInfo ? opts.sendGetNodeVersionInfo(ix, context, opts) : sendGetNodeVersionInfo(ix, context, opts) default: return ix } diff --git a/packages/typedefs/src/index.ts b/packages/typedefs/src/index.ts index 06e91eff7..edaefe17c 100644 --- a/packages/typedefs/src/index.ts +++ b/packages/typedefs/src/index.ts @@ -288,6 +288,32 @@ export type Provider = { */ name: string } +export type NodeVersionInfo = { + /** + * - The semver version of the node. + */ + semver: string + /** + * - The commit hash of the node. + */ + commit: string + /** + * - The spork id of the node. + */ + sporkId: string + /** + * - The protocol version of the node. + */ + protocolVersion: number + /** + * - The spork root block height of the node. + */ + sporkRootBlockHeight: number + /** + * - The node root block height of the node. + */ + nodeRootBlockHeight: number +} export interface StreamConnection { on( channel: C, diff --git a/packages/typedefs/src/interaction.ts b/packages/typedefs/src/interaction.ts index db0f86ce8..259da6094 100644 --- a/packages/typedefs/src/interaction.ts +++ b/packages/typedefs/src/interaction.ts @@ -12,6 +12,7 @@ export enum InteractionTag { GET_COLLECTION = "GET_COLLECTION", GET_NETWORK_PARAMETERS = "GET_NETWORK_PARAMETERS", SUBSCRIBE_EVENTS = "SUBSCRIBE_EVENTS", + GET_NODE_VERSION_INFO = "GET_NODE_VERSION_INFO", } export enum InteractionStatus {