@polkadot/api
Version:
Promise and RxJS wrappers around the Polkadot JS RPC
143 lines (142 loc) • 7.91 kB
TypeScript
/// <reference types="bn.js" />
import type { Observable } from 'rxjs';
import type { AugmentedCall, QueryableCalls } from '@polkadot/api-base/types';
import type { RpcInterface } from '@polkadot/rpc-core/types';
import type { Metadata, Text } from '@polkadot/types';
import type { Hash, RuntimeVersion } from '@polkadot/types/interfaces';
import type { DecoratedMeta } from '@polkadot/types/metadata/decorate/types';
import type { AnyFunction, Codec, DefinitionCallNamed, DefinitionRpc, DefinitionRpcSub, DefinitionsCall, DefinitionsCallEntry, DetectCodec, Registry, RegistryTypes } from '@polkadot/types/types';
import type { HexString } from '@polkadot/util/types';
import type { ApiDecoration, ApiInterfaceRx, ApiOptions, ApiTypes, DecoratedErrors, DecoratedEvents, DecoratedRpc, DecorateMethod, QueryableConsts, QueryableStorage, QueryableStorageMulti, SubmittableExtrinsics } from '../types/index.js';
import type { AllDerives } from '../util/decorate.js';
import type { VersionedRegistry } from './types.js';
import { BehaviorSubject } from 'rxjs';
import { RpcCore } from '@polkadot/rpc-core';
import { BN } from '@polkadot/util';
import { Events } from './Events.js';
interface FullDecoration<ApiType extends ApiTypes> {
createdAt?: Uint8Array | undefined;
decoratedApi: ApiDecoration<ApiType>;
decoratedMeta: DecoratedMeta;
}
export declare abstract class Decorate<ApiType extends ApiTypes> extends Events {
#private;
protected __phantom: BN;
protected _type: ApiTypes;
protected _call: QueryableCalls<ApiType>;
protected _consts: QueryableConsts<ApiType>;
protected _derive?: ReturnType<Decorate<ApiType>['_decorateDerive']>;
protected _errors: DecoratedErrors<ApiType>;
protected _events: DecoratedEvents<ApiType>;
protected _extrinsics?: SubmittableExtrinsics<ApiType>;
protected _extrinsicType: number;
protected _genesisHash?: Hash;
protected _isConnected: BehaviorSubject<boolean>;
protected _isReady: boolean;
protected _query: QueryableStorage<ApiType>;
protected _queryMulti?: QueryableStorageMulti<ApiType>;
protected _rpc?: DecoratedRpc<ApiType, RpcInterface>;
protected _rpcCore: RpcCore & RpcInterface;
protected _runtimeMap: Record<HexString, string>;
protected _runtimeChain?: Text;
protected _runtimeMetadata?: Metadata;
protected _runtimeVersion?: RuntimeVersion;
protected _rx: ApiInterfaceRx;
protected readonly _options: ApiOptions;
/**
* This is the one and only method concrete children classes need to implement.
* It's a higher-order function, which takes one argument
* `method: Method extends (...args: any[]) => Observable<any>`
* (and one optional `options`), and should return the user facing method.
* For example:
* - For ApiRx, `decorateMethod` should just be identity, because the input
* function is already an Observable
* - For ApiPromise, `decorateMethod` should return a function that takes all
* the parameters from `method`, adds an optional `callback` argument, and
* returns a Promise.
*
* We could easily imagine other user-facing interfaces, which are simply
* implemented by transforming the Observable to Stream/Iterator/Kefir/Bacon
* via `decorateMethod`.
*/
protected _decorateMethod: DecorateMethod<ApiType>;
/**
* @description Create an instance of the class
*
* @param options Options object to create API instance or a Provider instance
*
* @example
* <BR>
*
* ```javascript
* import Api from '@polkadot/api/promise';
*
* const api = new Api().isReady();
*
* api.rpc.subscribeNewHeads((header) => {
* console.log(`new block #${header.number.toNumber()}`);
* });
* ```
*/
constructor(options: ApiOptions, type: ApiTypes, decorateMethod: DecorateMethod<ApiType>);
abstract at(blockHash: Uint8Array | string, knownVersion?: RuntimeVersion): Promise<ApiDecoration<ApiType>>;
/**
* @description Return the current used registry
*/
get registry(): Registry;
/**
* @description Creates an instance of a type as registered
*/
createType<T extends Codec = Codec, K extends string = string>(type: K, ...params: unknown[]): DetectCodec<T, K>;
/**
* @description Register additional user-defined of chain-specific types in the type registry
*/
registerTypes(types?: RegistryTypes): void;
/**
* @returns `true` if the API operates with subscriptions
*/
get hasSubscriptions(): boolean;
/**
* @returns `true` if the API decorate multi-key queries
*/
get supportMulti(): boolean;
protected _emptyDecorated(registry: Registry, blockHash?: Uint8Array): ApiDecoration<ApiType>;
protected _createDecorated(registry: VersionedRegistry<ApiType>, fromEmpty: boolean, decoratedApi: ApiDecoration<ApiType> | null, blockHash?: Uint8Array): FullDecoration<ApiType>;
protected _injectMetadata(registry: VersionedRegistry<ApiType>, fromEmpty?: boolean): void;
/**
* @deprecated
* backwards compatible endpoint for metadata injection, may be removed in the future (However, it is still useful for testing injection)
*/
injectMetadata(metadata: Metadata, fromEmpty?: boolean, registry?: Registry): void;
private _decorateFunctionMeta;
protected _filterRpc(methods: string[], additional: Record<string, Record<string, DefinitionRpc | DefinitionRpcSub>>): void;
protected _filterRpcMethods(exposed: string[]): void;
private _rpcSubmitter;
protected _decorateRpc<ApiType extends ApiTypes>(rpc: RpcCore & RpcInterface, decorateMethod: DecorateMethod<ApiType>, input?: Partial<DecoratedRpc<ApiType, RpcInterface>>): DecoratedRpc<ApiType, RpcInterface>;
protected _addRuntimeDef(result: DefinitionsCall, additional?: DefinitionsCall): void;
protected _getRuntimeDefs(registry: Registry, specName: Text, chain?: Text | string): [string, DefinitionsCallEntry[]][];
protected _decorateCalls<ApiType extends ApiTypes>({ registry, runtimeVersion: { apis, specName, specVersion } }: VersionedRegistry<any>, decorateMethod: DecorateMethod<ApiType>, blockHash?: Uint8Array | string | null): QueryableCalls<ApiType>;
protected _decorateCall<ApiType extends ApiTypes>(registry: Registry, def: DefinitionCallNamed, stateCall: (method: string, bytes: Uint8Array) => Observable<Codec>, decorateMethod: DecorateMethod<ApiType>): AugmentedCall<ApiType>;
protected _decorateMulti<ApiType extends ApiTypes>(decorateMethod: DecorateMethod<ApiType>): QueryableStorageMulti<ApiType>;
protected _decorateMultiAt<ApiType extends ApiTypes>(atApi: ApiDecoration<ApiType>, decorateMethod: DecorateMethod<ApiType>, blockHash: Uint8Array | string): QueryableStorageMulti<ApiType>;
protected _decorateExtrinsics<ApiType extends ApiTypes>({ tx }: DecoratedMeta, decorateMethod: DecorateMethod<ApiType>): SubmittableExtrinsics<ApiType>;
private _decorateExtrinsicEntry;
protected _decorateStorage<ApiType extends ApiTypes>({ query, registry }: DecoratedMeta, decorateMethod: DecorateMethod<ApiType>, blockHash?: Uint8Array): QueryableStorage<ApiType>;
private _decorateStorageEntry;
private _decorateStorageEntryAt;
private _queueStorage;
private _decorateStorageCall;
private _retrieveMulti;
private _retrieveMapKeys;
private _retrieveMapKeysPaged;
private _retrieveMapEntries;
private _retrieveMapEntriesPaged;
protected _decorateDeriveRx(decorateMethod: DecorateMethod<ApiType>): AllDerives<'rxjs'>;
protected _decorateDerive(decorateMethod: DecorateMethod<ApiType>): AllDerives<ApiType>;
/**
* Put the `this.onCall` function of ApiRx here, because it is needed by
* `api._rx`.
*/
protected _rxDecorateMethod: <Method extends AnyFunction>(method: Method) => Method;
}
export {};