From 641fe5c3801b9cf35a8edd2aed601312e1523a3e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 3 Apr 2020 14:47:39 +0200 Subject: [PATCH] Refresh on scheduler entries (#2135) * Refresh on scheduler entries * Cleanups --- .../api-derive/src/democracy/dispatchQueue.ts | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/packages/api-derive/src/democracy/dispatchQueue.ts b/packages/api-derive/src/democracy/dispatchQueue.ts index 7678d990a8..10c6099a6a 100644 --- a/packages/api-derive/src/democracy/dispatchQueue.ts +++ b/packages/api-derive/src/democracy/dispatchQueue.ts @@ -2,14 +2,14 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. -import { BlockNumber, Hash, ReferendumIndex } from '@polkadot/types/interfaces'; +import { BlockNumber, Hash, ReferendumIndex, Scheduled } from '@polkadot/types/interfaces'; import { ITuple } from '@polkadot/types/types'; import { DeriveDispatch, DeriveProposalImage } from '../types'; import { Observable, combineLatest, of } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { ApiInterfaceRx } from '@polkadot/api/types'; -import { Vec, u64 } from '@polkadot/types'; +import { Option, Vec, u64 } from '@polkadot/types'; import { stringToHex } from '@polkadot/util'; import { memo } from '../util'; @@ -42,14 +42,32 @@ function queryQueue (api: ApiInterfaceRx): Observable { ); } -function queryScheduler (api: ApiInterfaceRx): Observable { +function schedulerEntries (api: ApiInterfaceRx): Observable<[BlockNumber[], Option[][]]> { + // We don't get entries, but rather we get the keys (triggered via finished referendums) and + // the subscribe to those keys - this means we pickup when the schedulers actually executes + // at a block, the entry for that block will become empty return api.derive.democracy.referendumsFinished().pipe( - switchMap(() => api.query.scheduler.agenda.entries()), - switchMap((all): Observable<[SchedulerInfo[], (DeriveProposalImage | undefined)[]]> => { - const info = all.reduce((result: SchedulerInfo[], [key, allScheduled]): SchedulerInfo[] => { - const at = key.args[0] as BlockNumber; + switchMap(() => + api.query.scheduler.agenda.keys() + ), + switchMap((keys) => { + const blockNumbers = keys.map((key) => key.args[0] as BlockNumber); - allScheduled.filter((optScheduled) => optScheduled.isSome).forEach((optScheduled): void => { + return combineLatest([ + of(blockNumbers), + api.query.scheduler.agenda.multi>>(blockNumbers) + ]); + }) + ); +} + +function queryScheduler (api: ApiInterfaceRx): Observable { + return schedulerEntries(api).pipe( + switchMap(([blockNumbers, agendas]): Observable<[SchedulerInfo[], (DeriveProposalImage | undefined)[]]> => { + const result: SchedulerInfo[] = []; + + blockNumbers.forEach((at, index): void => { + agendas[index].filter((optScheduled) => optScheduled.isSome).forEach((optScheduled): void => { const scheduled = optScheduled.unwrap(); if (scheduled.maybeId.isSome) { @@ -63,13 +81,11 @@ function queryScheduler (api: ApiInterfaceRx): Observable { } } }); - - return result; - }, []); + }); return combineLatest([ - of(info), - api.derive.democracy.preimages(info.map(({ imageHash }) => imageHash)) + of(result), + api.derive.democracy.preimages(result.map(({ imageHash }) => imageHash)) ]); }), map(([infos, images]): DeriveDispatch[] =>