diff --git a/packages/api-base/src/types/rpc.ts b/packages/api-base/src/types/rpc.ts index d442ccada3..fd6c18c656 100644 --- a/packages/api-base/src/types/rpc.ts +++ b/packages/api-base/src/types/rpc.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { Observable } from 'rxjs'; -import type { AnyFunction, Callback, DefinitionRpc } from '@polkadot/types/types'; +import type { AnyFunction, AnyJson, Callback, DefinitionRpc } from '@polkadot/types/types'; import { ApiTypes, PromiseResult, Push, RxResult, UnsubscribePromise } from './base'; @@ -29,6 +29,8 @@ export type DecoratedRpcSection = { : never } +export type RawRpcType = (method: string, ...params: unknown[]) => ApiType extends 'rxjs' ? Observable : Promise; + export type DecoratedRpc = { [S in keyof AllSections]: DecoratedRpcSection -} +} & RawRpcType diff --git a/packages/api/src/base/Decorate.ts b/packages/api/src/base/Decorate.ts index f3a35079d3..f436266dca 100644 --- a/packages/api/src/base/Decorate.ts +++ b/packages/api/src/base/Decorate.ts @@ -8,7 +8,7 @@ import type { StorageKey, Text, u64 } from '@polkadot/types'; import type { Call, Hash, RuntimeVersion } from '@polkadot/types/interfaces'; import type { DecoratedMeta } from '@polkadot/types/metadata/decorate/types'; import type { StorageEntry } from '@polkadot/types/primitive/types'; -import type { AnyFunction, AnyTuple, CallFunction, Codec, DefinitionCallNamed, DefinitionRpc, DefinitionRpcSub, DefinitionsCall, DefinitionsCallEntry, DetectCodec, IMethod, IStorageKey, Registry, RegistryError, RegistryTypes } from '@polkadot/types/types'; +import type { AnyFunction, AnyJson, AnyTuple, CallFunction, Codec, DefinitionCallNamed, DefinitionRpc, DefinitionRpcSub, DefinitionsCall, DefinitionsCallEntry, DetectCodec, IMethod, IStorageKey, Registry, RegistryError, RegistryTypes } from '@polkadot/types/types'; import type { HexString } from '@polkadot/util/types'; import type { SubmittableExtrinsic } from '../submittable/types'; import type { ApiDecoration, ApiInterfaceRx, ApiOptions, ApiTypes, AugmentedQuery, DecoratedErrors, DecoratedEvents, DecoratedRpc, DecorateMethod, GenericStorageEntryFunction, PaginationOptions, QueryableConsts, QueryableStorage, QueryableStorageEntry, QueryableStorageEntryAt, QueryableStorageMulti, QueryableStorageMultiArg, SubmittableExtrinsicFunction, SubmittableExtrinsics } from '../types'; @@ -21,7 +21,7 @@ import { memo, RpcCore } from '@polkadot/rpc-core'; import { WsProvider } from '@polkadot/rpc-provider'; import { expandMetadata, GenericExtrinsic, Metadata, typeDefinitions, TypeRegistry } from '@polkadot/types'; import { getSpecRuntime } from '@polkadot/types-known'; -import { arrayChunk, arrayFlatten, assertReturn, BN, compactStripLength, lazyMethod, lazyMethods, logger, nextTick, objectSpread, stringCamelCase, stringUpperFirst, u8aConcatStrict, u8aToHex } from '@polkadot/util'; +import { arrayChunk, arrayFlatten, assertReturn, BN, compactStripLength, lazyMethod, lazyMethods, logger, nextTick, objectSpread, stringCamelCase, stringify, stringUpperFirst, u8aConcatStrict, u8aToHex } from '@polkadot/util'; import { blake2AsHex } from '@polkadot/util-crypto'; import { createSubmittable } from '../submittable'; @@ -401,15 +401,23 @@ export abstract class Decorate extends Events { const [k, { method, section }] = allKnown[i]; if (hasResults && !exposed.includes(k) && k !== 'rpc_methods') { - if ((this._rpc as Record>)[section]) { - delete (this._rpc as Record>)[section][method]; - delete (this._rx.rpc as Record>)[section][method]; + if ((this._rpc as unknown as Record>)[section]) { + delete (this._rpc as unknown as Record>)[section][method]; + delete (this._rx.rpc as unknown as Record>)[section][method]; } } } } - protected _decorateRpc (rpc: RpcCore & RpcInterface, decorateMethod: DecorateMethod, input: Partial> = {}): DecoratedRpc { + private _rpcSubmitter (decorateMethod: DecorateMethod): DecoratedRpc { + const method = (method: string, ...params: any[]) => { + return from(this._rpcCore.provider.send(method, params.map((p) => stringify(p)))); + }; + + return decorateMethod(method) as DecoratedRpc; + } + + protected _decorateRpc (rpc: RpcCore & RpcInterface, decorateMethod: DecorateMethod, input: Partial> = this._rpcSubmitter(decorateMethod)): DecoratedRpc { const out: Record> = input; const decorateFn = (section: string, method: string): unknown => { @@ -446,7 +454,7 @@ export abstract class Decorate extends Events { } } - return out as DecoratedRpc; + return out as unknown as DecoratedRpc; } // add all definition entries diff --git a/packages/api/src/base/Init.ts b/packages/api/src/base/Init.ts index efedd10b44..baecb34f1b 100644 --- a/packages/api/src/base/Init.ts +++ b/packages/api/src/base/Init.ts @@ -271,7 +271,7 @@ export abstract class Init extends Decorate { for (let s = 0; s < sections.length; s++) { const section = sections[s]; - const methods = Object.keys((source.rpc as Record>)[section]); + const methods = Object.keys((source.rpc as unknown as Record>)[section]); for (let m = 0; m < methods.length; m++) { rpcs.push(`${section}_${methods[m]}`);