Add basic derive.bagsList support (#4723)
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
// Copyright 2017-2022 @polkadot/api-derive authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Observable } from 'rxjs';
|
||||
import type { Option, StorageKey, u64 } from '@polkadot/types';
|
||||
import type { PalletBagsListListBag } from '@polkadot/types/lookup';
|
||||
import type { BN } from '@polkadot/util';
|
||||
import type { DeriveApi } from '../types';
|
||||
import type { BagBase } from './types';
|
||||
|
||||
import { map } from 'rxjs';
|
||||
|
||||
import { bnToBn } from '@polkadot/util';
|
||||
|
||||
import { memo } from '../util';
|
||||
|
||||
export function all (instanceId: string, api: DeriveApi): () => Observable<BagBase[]> {
|
||||
return memo(instanceId, (): Observable<BagBase[]> =>
|
||||
api.query.bagsList.listBags.entries().pipe(
|
||||
map((entries: [StorageKey<[u64]>, Option<PalletBagsListListBag>][]) =>
|
||||
entries.map(([{ args: [id] }, opt]) => ({
|
||||
bag: opt.unwrapOr(null),
|
||||
id
|
||||
}))
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function get (instanceId: string, api: DeriveApi): (id: BN | number) => Observable<BagBase> {
|
||||
return memo(instanceId, (_id: BN | number): Observable<BagBase> => {
|
||||
const id = bnToBn(_id);
|
||||
|
||||
return api.query.bagsList.listBags(id).pipe(
|
||||
map((opt: Option<PalletBagsListListBag>) => ({
|
||||
bag: opt.unwrapOr(null),
|
||||
id
|
||||
}))
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
// Copyright 2017-2022 @polkadot/api-derive authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Observable } from 'rxjs';
|
||||
import type { BN } from '@polkadot/util';
|
||||
import type { DeriveApi } from '../types';
|
||||
import type { Bag } from './types';
|
||||
|
||||
import { map, switchMap } from 'rxjs';
|
||||
|
||||
import { memo } from '../util';
|
||||
|
||||
export function getExpanded (instanceId: string, api: DeriveApi): (id: BN | number) => Observable<Bag> {
|
||||
return memo(instanceId, (id: BN | number): Observable<Bag> =>
|
||||
api.derive.bagsList.get(id).pipe(
|
||||
switchMap((base) =>
|
||||
api.derive.bagsList.listNodes(base.bag).pipe(
|
||||
map((nodes) => ({ ...base, nodes }))
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
// Copyright 2017-2022 @polkadot/api-derive authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
export * from './get';
|
||||
export * from './getExpanded';
|
||||
export * from './listNodes';
|
||||
@@ -0,0 +1,41 @@
|
||||
// Copyright 2017-2022 @polkadot/api-derive authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Observable } from 'rxjs';
|
||||
import type { Option } from '@polkadot/types';
|
||||
import type { AccountId32 } from '@polkadot/types/interfaces';
|
||||
import type { PalletBagsListListBag, PalletBagsListListNode } from '@polkadot/types/lookup';
|
||||
import type { DeriveApi } from '../types';
|
||||
|
||||
import { BehaviorSubject, map, of, switchMap, tap, toArray } from 'rxjs';
|
||||
|
||||
import { memo } from '../util';
|
||||
|
||||
function traverseLinks (api: DeriveApi, head: AccountId32 | string): Observable<PalletBagsListListNode[]> {
|
||||
const subject = new BehaviorSubject<AccountId32 | string>(head);
|
||||
|
||||
return subject.pipe(
|
||||
switchMap((account) =>
|
||||
api.query.bagsList.listNodes(account)
|
||||
),
|
||||
tap((node: Option<PalletBagsListListNode>): void => {
|
||||
setTimeout((): void => {
|
||||
node.isSome && (node.value as PalletBagsListListNode).next.isSome
|
||||
? subject.next(node.unwrap().next.unwrap())
|
||||
: subject.complete();
|
||||
}, 0);
|
||||
}),
|
||||
toArray(), // toArray since we want to startSubject to be completed
|
||||
map((all: Option<PalletBagsListListNode>[]) =>
|
||||
all.map((o) => o.unwrap())
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function listNodes (instanceId: string, api: DeriveApi): (bag: PalletBagsListListBag | null) => Observable<PalletBagsListListNode[]> {
|
||||
return memo(instanceId, (bag: PalletBagsListListBag | null): Observable<PalletBagsListListNode[]> =>
|
||||
bag && bag.head.isSome
|
||||
? traverseLinks(api, bag.head.unwrap())
|
||||
: of([])
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
// Copyright 2017-2022 @polkadot/api-derive authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { PalletBagsListListBag, PalletBagsListListNode } from '@polkadot/types/lookup';
|
||||
import type { BN } from '@polkadot/util';
|
||||
|
||||
export interface BagBase {
|
||||
bag: PalletBagsListListBag | null;
|
||||
id: BN;
|
||||
}
|
||||
|
||||
export interface Bag extends BagBase {
|
||||
|
||||
nodes: PalletBagsListListNode[];
|
||||
}
|
||||
@@ -22,6 +22,10 @@ export { lazyDeriveSection };
|
||||
|
||||
// Enable derive only if some of these modules are available
|
||||
const checks: Record<string, Avail> = {
|
||||
bagsList: {
|
||||
instances: ['bagsList'],
|
||||
methods: []
|
||||
},
|
||||
contracts: {
|
||||
instances: ['contracts'],
|
||||
methods: []
|
||||
|
||||
@@ -60,17 +60,17 @@ function _eventTriggerAll (api: DeriveApi, paraId: string | number | BN): Observ
|
||||
}
|
||||
|
||||
function _getKeysPaged (api: DeriveApi, childKey: string): Observable<StorageKey[]> {
|
||||
const startSubject = new BehaviorSubject<string | undefined>(undefined);
|
||||
const subject = new BehaviorSubject<string | undefined>(undefined);
|
||||
|
||||
return startSubject.pipe(
|
||||
return subject.pipe(
|
||||
switchMap((startKey) =>
|
||||
api.rpc.childstate.getKeysPaged(childKey, '0x', PAGE_SIZE_K, startKey)
|
||||
),
|
||||
tap((keys): void => {
|
||||
setTimeout((): void => {
|
||||
keys.length === PAGE_SIZE_K
|
||||
? startSubject.next(keys[PAGE_SIZE_K - 1].toHex())
|
||||
: startSubject.complete();
|
||||
? subject.next(keys[PAGE_SIZE_K - 1].toHex())
|
||||
: subject.complete();
|
||||
}, 0);
|
||||
}),
|
||||
toArray(), // toArray since we want to startSubject to be completed
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
import type { AnyFunction } from '@polkadot/types/types';
|
||||
|
||||
import * as accounts from './accounts';
|
||||
import * as bagsList from './bagsList';
|
||||
import * as balances from './balances';
|
||||
import * as bounties from './bounties';
|
||||
import * as chain from './chain';
|
||||
@@ -22,7 +23,7 @@ import * as technicalCommittee from './technicalCommittee';
|
||||
import * as treasury from './treasury';
|
||||
import * as tx from './tx';
|
||||
|
||||
export const derive = { accounts, balances, bounties, chain, contracts, council, crowdloan, democracy, elections, imOnline, membership, parachains, session, society, staking, technicalCommittee, treasury, tx };
|
||||
export const derive = { accounts, bagsList, balances, bounties, chain, contracts, council, crowdloan, democracy, elections, imOnline, membership, parachains, session, society, staking, technicalCommittee, treasury, tx };
|
||||
|
||||
type DeriveSection<Section> = {
|
||||
[M in keyof Section]: Section[M] extends AnyFunction
|
||||
|
||||
@@ -23,17 +23,17 @@ const ERA_CHUNK_SIZE = 14;
|
||||
function chunkEras <T> (eras: EraIndex[], fn: (eras: EraIndex[]) => Observable<T[]>): Observable<T[]> {
|
||||
const chunked = arrayChunk(eras, ERA_CHUNK_SIZE);
|
||||
let index = 0;
|
||||
const startSubject = new BehaviorSubject<EraIndex[]>(chunked[index]);
|
||||
const subject = new BehaviorSubject<EraIndex[]>(chunked[index]);
|
||||
|
||||
return startSubject.pipe(
|
||||
return subject.pipe(
|
||||
switchMap(fn),
|
||||
tap((): void => {
|
||||
setTimeout((): void => {
|
||||
index++;
|
||||
|
||||
index === chunked.length
|
||||
? startSubject.complete()
|
||||
: startSubject.next(chunked[index]);
|
||||
? subject.complete()
|
||||
: subject.next(chunked[index]);
|
||||
}, 0);
|
||||
}),
|
||||
toArray(),
|
||||
|
||||
Reference in New Issue
Block a user