From ccd89ef0a6edadfdf5889de4c80a12778b0d7923 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 1 Mar 2021 16:57:27 +0100 Subject: [PATCH] Trigger validator shash retrievals on Bonded events (#3251) --- packages/api-derive/src/staking/stashes.ts | 31 +++++++++++++++++++--- packages/api/src/base/Decorate.ts | 8 +++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/packages/api-derive/src/staking/stashes.ts b/packages/api-derive/src/staking/stashes.ts index 6e190590dd..c788b2e881 100644 --- a/packages/api-derive/src/staking/stashes.ts +++ b/packages/api-derive/src/staking/stashes.ts @@ -5,16 +5,41 @@ import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { AccountId } from '@polkadot/types/interfaces'; import type { Observable } from '@polkadot/x-rxjs'; -import { map } from '@polkadot/x-rxjs/operators'; +import { map, startWith, switchMap } from '@polkadot/x-rxjs/operators'; -import { memo } from '../util'; +import { drr, memo } from '../util'; + +function onBondedEvent (api: ApiInterfaceRx): Observable { + let current = Date.now(); + + return api.query.system.events().pipe( + map((events): number => { + current = events.filter(({ event, phase }): boolean => { + try { + return phase.isApplyExtrinsic && + event.section === 'staking' && + event.method === 'Bonded'; + } catch { + return false; + } + }) + ? Date.now() + : current; + + return current; + }), + startWith(current), + drr({ skipTimeout: true }) + ); +} /** * @description Retrieve the list of all validator stashes */ export function stashes (instanceId: string, api: ApiInterfaceRx): () => Observable { return memo(instanceId, (): Observable => - api.query.staking.validators.keys().pipe( + onBondedEvent(api).pipe( + switchMap(() => api.query.staking.validators.keys()), map((keys) => keys.map(({ args: [validatorId] }) => validatorId).filter((a) => a)) ) ); diff --git a/packages/api/src/base/Decorate.ts b/packages/api/src/base/Decorate.ts index 7ddc48fdae..a218a7703c 100644 --- a/packages/api/src/base/Decorate.ts +++ b/packages/api/src/base/Decorate.ts @@ -492,9 +492,11 @@ export abstract class Decorate extends Events { ) ), tap((keys): void => { - keys.length === PAGE_SIZE - ? startSubject.next(keys[PAGE_SIZE - 1].toHex()) - : startSubject.complete(); + setTimeout((): void => { + keys.length === PAGE_SIZE + ? startSubject.next(keys[PAGE_SIZE - 1].toHex()) + : startSubject.complete(); + }, 0); }), toArray(), // toArray since we want to startSubject to be completed map((keysArr: StorageKey[][]) => arrayFlatten(keysArr))