From c1facd8b1ca59e0093a6cf7c8811ac57b9f97a94 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 9 Mar 2020 22:57:09 +0100 Subject: [PATCH] memo for range & entries --- packages/api-derive/src/staking/erasExposure.ts | 4 ++-- packages/api-derive/src/staking/erasPoints.ts | 6 +++--- packages/api-derive/src/staking/validators.ts | 4 ++-- packages/api/src/base/Decorate.ts | 13 +++++++------ packages/rpc-core/src/index.ts | 4 ++++ 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/api-derive/src/staking/erasExposure.ts b/packages/api-derive/src/staking/erasExposure.ts index 66be4afc2e..6f6924b346 100644 --- a/packages/api-derive/src/staking/erasExposure.ts +++ b/packages/api-derive/src/staking/erasExposure.ts @@ -7,7 +7,7 @@ import { Exposure } from '@polkadot/types/interfaces'; import { DeriveEraExposure, DeriveEraExposures, DeriveEraPointsAll, DeriveEraValPoints } from '../types'; import { Observable, combineLatest, of } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { map, switchMap, take } from 'rxjs/operators'; import { StorageKey } from '@polkadot/types'; import { memo } from '../util'; @@ -35,7 +35,7 @@ export function erasExposure (api: ApiInterfaceRx): (withActive?: boolean) => Ob // we could just do entries over the full set, however the set can be quite large - split it into // batches - may need to re-visit this, or alternatively use pages keys for exceptionally large sets allPoints.map(({ era }): Observable<[StorageKey, Exposure][]> => - api.query.staking.erasStakers.entries(era) + api.query.staking.erasStakers.entries(era).pipe(take(1)) ) ) ]) diff --git a/packages/api-derive/src/staking/erasPoints.ts b/packages/api-derive/src/staking/erasPoints.ts index 72712dd3c7..4551d7e058 100644 --- a/packages/api-derive/src/staking/erasPoints.ts +++ b/packages/api-derive/src/staking/erasPoints.ts @@ -7,7 +7,7 @@ import { ActiveEraInfo, Balance, EraIndex, EraRewardPoints } from '@polkadot/typ import { DeriveEraPointsAll, DeriveEraValPoints } from '../types'; import { Observable, combineLatest, of } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { map, switchMap, take } from 'rxjs/operators'; import { Option, u32 } from '@polkadot/types'; import { memo } from '../util'; @@ -53,10 +53,10 @@ export function erasPoints (api: ApiInterfaceRx): (withActive?: boolean) => Obse combineLatest([ of(indexes), indexes.length - ? api.query.staking.erasRewardPoints.multi(indexes) + ? api.query.staking.erasRewardPoints.multi(indexes).pipe(take(1)) : of([]), indexes.length - ? api.query.staking.erasValidatorReward.multi>(indexes) + ? api.query.staking.erasValidatorReward.multi>(indexes).pipe(take(1)) : of([]) ]) ), diff --git a/packages/api-derive/src/staking/validators.ts b/packages/api-derive/src/staking/validators.ts index ca183f8048..85a52028a8 100644 --- a/packages/api-derive/src/staking/validators.ts +++ b/packages/api-derive/src/staking/validators.ts @@ -7,7 +7,7 @@ import { AccountId, Exposure } from '@polkadot/types/interfaces'; import { DeriveStakingValidators } from '../types'; import { Observable, combineLatest, of } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { map, switchMap, take } from 'rxjs/operators'; import { StorageKey } from '@polkadot/types'; import { memo } from '../util'; @@ -17,7 +17,7 @@ function queryNextStakers (api: ApiInterfaceRx): Observable { // subscriptions, so we need a trigger - currentIndex acts as that trigger to refresh return api.derive.session.indexes().pipe( switchMap(({ activeEra }): Observable<[StorageKey, Exposure][]> => - api.query.staking.erasStakers.entries(activeEra.addn(1)) + api.query.staking.erasStakers.entries(activeEra.addn(1)).pipe(take(1)) ), map((entries): AccountId[] => entries.map(([key]): AccountId => key.args[1] as AccountId) diff --git a/packages/api/src/base/Decorate.ts b/packages/api/src/base/Decorate.ts index 4d1afca7af..e0764c6fbc 100644 --- a/packages/api/src/base/Decorate.ts +++ b/packages/api/src/base/Decorate.ts @@ -11,8 +11,9 @@ import { ApiInterfaceRx, ApiOptions, ApiTypes, DecorateMethod, DecoratedRpc, Dec import BN from 'bn.js'; import { BehaviorSubject, Observable, combineLatest, of } from 'rxjs'; -import { first, map, switchMap } from 'rxjs/operators'; +import { map, switchMap, take } from 'rxjs/operators'; import decorateDerive, { ExactDerive } from '@polkadot/api-derive'; +import { memo } from '@polkadot/api-derive/util'; import DecoratedMeta from '@polkadot/metadata/Decorated'; import getHasher from '@polkadot/metadata/Decorated/storage/fromMetadata/getHasher'; import RpcCore from '@polkadot/rpc-core'; @@ -314,8 +315,8 @@ export default abstract class Decorate extends Events decorated.at = decorateMethod((hash: Hash, arg1?: Arg, arg2?: Arg): Observable => this._rpcCore.state.getStorage(getArgs(arg1, arg2), hash)); - decorated.entries = decorateMethod((doubleMapArg?: Arg): Observable<[StorageKey, Codec][]> => - this.retrieveMapEntries(creator, doubleMapArg)); + decorated.entries = decorateMethod(memo((doubleMapArg?: Arg): Observable<[StorageKey, Codec][]> => + this.retrieveMapEntries(creator, doubleMapArg))); decorated.hash = decorateMethod((arg1?: Arg, arg2?: Arg): Observable => this._rpcCore.state.getStorageHash(getArgs(arg1, arg2))); @@ -333,8 +334,8 @@ export default abstract class Decorate extends Events args.map((arg: Arg[] | Arg): [StorageEntry, Arg | Arg[]] => [creator, arg]))); } - decorated.range = decorateMethod((range: [Hash, Hash?], arg1?: Arg, arg2?: Arg): Observable<[Hash, Codec][]> => - this.decorateStorageRange(decorated, [arg1, arg2], range)); + decorated.range = decorateMethod(memo((range: [Hash, Hash?], arg1?: Arg, arg2?: Arg): Observable<[Hash, Codec][]> => + this.decorateStorageRange(decorated, [arg1, arg2], range))); decorated.size = decorateMethod((arg1?: Arg, arg2?: Arg): Observable => this._rpcCore.state.getStorageSize(getArgs(arg1, arg2))); @@ -457,7 +458,7 @@ export default abstract class Decorate extends Events of(keys.map((key) => key.decodeArgsFromMeta(meta))), // since we have a default constructed key, we have Option as the result // TODO Don't keep the subscription here active, retrieve and get out of Dodge - this._rpcCore.state.subscribeStorage[]>(keys).pipe(first()) + this._rpcCore.state.subscribeStorage[]>(keys).pipe(take(1)) ]) ), map(([keys, values]): [StorageKey, Codec][] => diff --git a/packages/rpc-core/src/index.ts b/packages/rpc-core/src/index.ts index 39b7f9fbb0..42054811ef 100644 --- a/packages/rpc-core/src/index.ts +++ b/packages/rpc-core/src/index.ts @@ -360,6 +360,10 @@ export default class Rpc implements RpcInterface { // - null - The storage key is empty return keys.reduce((results, key: StorageKey): Codec[] => { try { + // if (changes.some(([, val]) => val && val.length > 5000)) { + // console.error(`LARGE ${key.section}.${key.method}`); + // } + results.push(this.formatStorageSet(key, changes, withCache)); } catch (error) { console.error(`Unable to decode storage ${key.section}.${key.method}:`, error.message);