Update api-observable to UI version (#189)
* Update api-observable to UI version * Cleanup lint
This commit is contained in:
@@ -32,6 +32,8 @@
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"@polkadot/api": "^0.30.21",
|
||||
"@polkadot/api-provider": "^0.30.21",
|
||||
"@polkadot/extrinsics": "^0.30.21",
|
||||
"@polkadot/storage": "^0.30.21",
|
||||
"@types/rx": "^4.1.1",
|
||||
"rxjs": "^6.3.2"
|
||||
}
|
||||
|
||||
@@ -5,12 +5,13 @@
|
||||
import { RxApiInterface, RxApiInterface$Method, RxApiInterface$Section } from '@polkadot/api-rx/types';
|
||||
import { Method } from '@polkadot/jsonrpc/types';
|
||||
|
||||
import { Observable, combineLatest, from } from 'rxjs';
|
||||
import { EMPTY, Observable, combineLatest, from } from 'rxjs';
|
||||
import { defaultIfEmpty, map } from 'rxjs/operators';
|
||||
import extrinsicsFromMeta from '@polkadot/extrinsics/fromMetadata';
|
||||
import extrinsicsStatic from '@polkadot/extrinsics/static';
|
||||
import storageFromMeta from '@polkadot/storage/fromMetadata';
|
||||
import storageStatic from '@polkadot/storage/static';
|
||||
import { Vector } from '@polkadot/types/codec';
|
||||
import { Hash } from '@polkadot/types/index';
|
||||
import { StorageFunction } from '@polkadot/types/StorageKey';
|
||||
import assert from '@polkadot/util/assert';
|
||||
@@ -69,7 +70,6 @@ export default class ApiBase {
|
||||
|
||||
protected combine = <T, R> (observables: Array<Observable<any>>, mapfn: MapFn<R, T> = defaultMapFn): Observable<T> => {
|
||||
return combineLatest(...observables).pipe(
|
||||
// FIXME There are a couple of places now where this casting happens after rxjs 6.3.2
|
||||
defaultIfEmpty([] as any),
|
||||
map(mapfn)
|
||||
);
|
||||
@@ -95,26 +95,35 @@ export default class ApiBase {
|
||||
return fn.apply(null, params);
|
||||
}
|
||||
|
||||
rawStorage = <T> (key: StorageFunction, ...params: Array<any>): Observable<T> => {
|
||||
rawStorage = <T> (key: StorageFunction, ...params: Array<any>): Observable<T | undefined> => {
|
||||
return this
|
||||
.rawStorageMulti([key, ...params] as [StorageFunction, any])
|
||||
.pipe(
|
||||
// @ts-ignore After upgrade to 6.3.2
|
||||
map(([result]: Array<T>): T =>
|
||||
map((result: Array<T>): T | undefined =>
|
||||
result
|
||||
? result[0]
|
||||
: undefined
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
rawStorageMulti = <T> (...keys: Array<[StorageFunction] | [StorageFunction, any]>): Observable<T> => {
|
||||
return this._api.state
|
||||
.storage(keys)
|
||||
.pipe(
|
||||
map((result?: any) =>
|
||||
isUndefined(result)
|
||||
? []
|
||||
: result
|
||||
)
|
||||
);
|
||||
rawStorageMulti = <T extends []> (...keys: Array<[StorageFunction] | [StorageFunction, any]>): Observable<T> => {
|
||||
let observable;
|
||||
|
||||
try {
|
||||
observable = this._api.state.storage(keys);
|
||||
} catch (error) {
|
||||
observable = EMPTY;
|
||||
}
|
||||
|
||||
return observable.pipe(
|
||||
defaultIfEmpty(),
|
||||
map((result?: Vector<any>): T =>
|
||||
isUndefined(result)
|
||||
? [] as T
|
||||
// FIXME When Vector extends Array, this mapping can be removed
|
||||
: result.map((item: any) => item) as T
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
import { Observable } from 'rxjs';
|
||||
import { defaultIfEmpty, map } from 'rxjs/operators';
|
||||
import { BlockNumber, Header, SignedBlock } from '@polkadot/types/index';
|
||||
import { BlockNumber, Hash, Header, SignedBlock, UncheckedMortalExtrinsic } from '@polkadot/types/index';
|
||||
|
||||
import ApiQueries from './Queries';
|
||||
|
||||
@@ -12,7 +12,7 @@ import ApiQueries from './Queries';
|
||||
export default class ApiCalls extends ApiQueries {
|
||||
bestNumber = (): Observable<BlockNumber | undefined> => {
|
||||
return this
|
||||
.chainNewHead()
|
||||
.newHead()
|
||||
.pipe(
|
||||
map((header?: Header): BlockNumber | undefined =>
|
||||
header && header.blockNumber
|
||||
@@ -22,13 +22,29 @@ export default class ApiCalls extends ApiQueries {
|
||||
);
|
||||
}
|
||||
|
||||
chainGetBlock = (hash: Uint8Array): Observable<SignedBlock | undefined> => {
|
||||
chain = (): Observable<Text | undefined> => {
|
||||
return this._api.system.chain();
|
||||
}
|
||||
|
||||
getBlock = (hash: Uint8Array): Observable<SignedBlock | undefined> => {
|
||||
return this._api.chain.getBlock(hash);
|
||||
}
|
||||
|
||||
chainNewHead = (): Observable<Header | undefined> => {
|
||||
newHead = (): Observable<Header | undefined> => {
|
||||
return this._api.chain.newHead().pipe(
|
||||
defaultIfEmpty()
|
||||
);
|
||||
}
|
||||
|
||||
systemName = (): Observable<Text | undefined> => {
|
||||
return this._api.system.name();
|
||||
}
|
||||
|
||||
systemVersion = (): Observable<Text | undefined> => {
|
||||
return this._api.system.version();
|
||||
}
|
||||
|
||||
submitExtrinsic = (extrinsic: UncheckedMortalExtrinsic): Observable<Hash | undefined> => {
|
||||
return this._api.author.submitExtrinsic(extrinsic);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@ import { RxProposal, RxReferendum } from './classes';
|
||||
// useful extensions, i.e. queries can be made that returns the results from multiple observables,
|
||||
// make the noise for the API users significantly less
|
||||
export default class ApiCombined extends ApiCalls {
|
||||
democracyProposalCount = (): Observable<number> => {
|
||||
publicProposalCount = (): Observable<number> => {
|
||||
return this
|
||||
.democracyPublicProposals()
|
||||
.publicProposals()
|
||||
.pipe(
|
||||
map((proposals: Array<RxProposal>) =>
|
||||
proposals.length
|
||||
@@ -27,10 +27,10 @@ export default class ApiCombined extends ApiCalls {
|
||||
);
|
||||
}
|
||||
|
||||
democracyReferendumInfos = (referendumIds: Array<ReferendumIndex | BN | number>): Observable<Array<RxReferendum>> => {
|
||||
referendumsInfo = (referendumIds: Array<ReferendumIndex | BN | number>): Observable<Array<RxReferendum>> => {
|
||||
return this.combine(
|
||||
referendumIds.map((referendumId) =>
|
||||
this.democracyReferendumInfoOf(referendumId)
|
||||
this.referendumInfo(referendumId)
|
||||
),
|
||||
(referendums: Array<RxReferendum> = []): Array<RxReferendum> =>
|
||||
referendums.filter((referendum) =>
|
||||
@@ -42,7 +42,7 @@ export default class ApiCombined extends ApiCalls {
|
||||
democracyReferendumVoters = (referendumId: ReferendumIndex | BN | number): Observable<Array<RxReferendumVote>> => {
|
||||
return this.combine(
|
||||
[
|
||||
this.democacyVotersFor(referendumId),
|
||||
this.referendumVoters(referendumId),
|
||||
this.democracyVotersBalancesOf(referendumId),
|
||||
this.democracyVotersVotesOf(referendumId)
|
||||
],
|
||||
@@ -55,17 +55,17 @@ export default class ApiCombined extends ApiCalls {
|
||||
);
|
||||
}
|
||||
|
||||
democracyReferendums = (): Observable<Array<RxReferendum>> => {
|
||||
referendums = (): Observable<Array<RxReferendum>> => {
|
||||
return this.combine(
|
||||
[
|
||||
this.democracyReferendumCount(),
|
||||
this.referendumCount(),
|
||||
this.democracyNextTally()
|
||||
]
|
||||
).pipe(
|
||||
// @ts-ignore After upgrade to 6.3.2
|
||||
switchMap(([referendumCount, nextTally]: [ReferendumIndex | undefined, ReferendumIndex | undefined]): Observable<Array<RxReferendum>> =>
|
||||
referendumCount && nextTally && referendumCount.gt(nextTally) && referendumCount.gt(0)
|
||||
? this.democracyReferendumInfos(
|
||||
? this.referendumsInfo(
|
||||
[...Array(referendumCount.toBn().sub(nextTally.toBn()).toNumber())].map((_, i) =>
|
||||
nextTally.add(i).toNumber()
|
||||
)
|
||||
@@ -76,17 +76,17 @@ export default class ApiCombined extends ApiCalls {
|
||||
);
|
||||
}
|
||||
|
||||
democracyVotesOf = (index: ReferendumIndex | BN | number, addresses: Array<AccountId | string>): Observable<boolean> => {
|
||||
referendumVotes = (index: ReferendumIndex | BN | number, addresses: Array<AccountId | string>): Observable<boolean> => {
|
||||
return this.combine(
|
||||
addresses.map((address) =>
|
||||
this.democacyVoteOf(index, address)
|
||||
this.referendumVote(index, address)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
democracyVotersBalancesOf = (referendumId: ReferendumIndex | BN | number): Observable<Array<Balance>> => {
|
||||
return this
|
||||
.democacyVotersFor(referendumId)
|
||||
.referendumVoters(referendumId)
|
||||
.pipe(
|
||||
switchMap((voters: Array<AccountId> = []) =>
|
||||
this.votingBalances(...voters)
|
||||
@@ -102,10 +102,10 @@ export default class ApiCombined extends ApiCalls {
|
||||
|
||||
democracyVotersVotesOf = (referendumId: ReferendumIndex | BN | number): Observable<Array<Bool>> => {
|
||||
return this
|
||||
.democacyVotersFor(referendumId)
|
||||
.referendumVoters(referendumId)
|
||||
.pipe(
|
||||
switchMap((voters: Array<AccountId> = []) =>
|
||||
this.democracyVotesOf(referendumId, voters)
|
||||
this.referendumVotes(referendumId, voters)
|
||||
),
|
||||
defaultIfEmpty([] as any)
|
||||
);
|
||||
@@ -200,7 +200,7 @@ export default class ApiCombined extends ApiCalls {
|
||||
sessionBrokenValue = (): Observable<Moment | undefined> => {
|
||||
return this.combine(
|
||||
[
|
||||
this.timestampNow(),
|
||||
this.blockNow(),
|
||||
this.sessionTimeExpected(),
|
||||
this.sessionTimeRemaining(),
|
||||
this.sessionCurrentStart()
|
||||
@@ -220,7 +220,7 @@ export default class ApiCombined extends ApiCalls {
|
||||
return this.combine(
|
||||
[
|
||||
this.sessionLength(),
|
||||
this.timestampBlockPeriod()
|
||||
this.blockPeriod()
|
||||
],
|
||||
([sessionLength, blockPeriod]: [BlockNumber | undefined, Moment | undefined]): Moment | undefined =>
|
||||
sessionLength && blockPeriod
|
||||
@@ -235,7 +235,7 @@ export default class ApiCombined extends ApiCalls {
|
||||
return this.combine(
|
||||
[
|
||||
this.sessionBlockRemaining(),
|
||||
this.timestampBlockPeriod()
|
||||
this.blockPeriod()
|
||||
],
|
||||
([sessionBlockRemaining, blockPeriod]: [BlockNumber | undefined, Moment | undefined]): Moment | undefined =>
|
||||
blockPeriod && sessionBlockRemaining
|
||||
@@ -292,8 +292,8 @@ export default class ApiCombined extends ApiCalls {
|
||||
|
||||
return this.combine(
|
||||
[
|
||||
this.stakingFreeBalanceOf(address),
|
||||
this.stakingReservedBalanceOf(address)
|
||||
this.balanceFree(address),
|
||||
this.balanceReserved(address)
|
||||
],
|
||||
([freeBalance = new Balance(0), reservedBalance = new Balance(0)]: [Balance | undefined, Balance | undefined]): RxBalance => ({
|
||||
address,
|
||||
|
||||
@@ -16,6 +16,26 @@ import { RxProposal, RxProposalDeposits, RxReferendum } from './classes';
|
||||
|
||||
// Perform storage queries to the API endpoints.
|
||||
export default class ApiQueries extends ApiBase {
|
||||
accountNonce = (address: AccountId | string): Observable<Index | undefined> => {
|
||||
return this.rawStorage(storage.system.accountNonce, address);
|
||||
}
|
||||
|
||||
balanceFree = (address: AccountId | string): Observable<Balance | undefined> => {
|
||||
return this.rawStorage(storage.balances.freeBalance, address);
|
||||
}
|
||||
|
||||
balanceReserved = (address: AccountId | string): Observable<Balance | undefined> => {
|
||||
return this.rawStorage(storage.balances.reservedBalance, address);
|
||||
}
|
||||
|
||||
blockPeriod = (): Observable<Moment | undefined> => {
|
||||
return this.rawStorage(storage.timestamp.blockPeriod);
|
||||
}
|
||||
|
||||
blockNow = (): Observable<Moment | undefined> => {
|
||||
return this.rawStorage(storage.timestamp.now);
|
||||
}
|
||||
|
||||
democracyLaunchPeriod = (): Observable<BlockNumber | undefined> => {
|
||||
return this.rawStorage(storage.democracy.launchPeriod);
|
||||
}
|
||||
@@ -24,7 +44,7 @@ export default class ApiQueries extends ApiBase {
|
||||
return this.rawStorage(storage.democracy.nextTally);
|
||||
}
|
||||
|
||||
democracyProposalDeposits = (proposalId: PropIndex | BN | number): Observable<RxProposalDeposits | undefined> => {
|
||||
proposalDeposits = (proposalId: PropIndex | BN | number): Observable<RxProposalDeposits | undefined> => {
|
||||
return this
|
||||
.rawStorage(storage.democracy.depositOf, proposalId)
|
||||
.pipe(
|
||||
@@ -37,7 +57,7 @@ export default class ApiQueries extends ApiBase {
|
||||
);
|
||||
}
|
||||
|
||||
democracyPublicProposals = (): Observable<Array<RxProposal>> => {
|
||||
publicProposals = (): Observable<Array<RxProposal>> => {
|
||||
return this
|
||||
.rawStorage(storage.democracy.publicProps)
|
||||
.pipe(
|
||||
@@ -56,11 +76,11 @@ export default class ApiQueries extends ApiBase {
|
||||
);
|
||||
}
|
||||
|
||||
democracyReferendumCount = (): Observable<ReferendumIndex | undefined> => {
|
||||
referendumCount = (): Observable<ReferendumIndex | undefined> => {
|
||||
return this.rawStorage(storage.democracy.referendumCount);
|
||||
}
|
||||
|
||||
democracyReferendumInfoOf = (referendumId: ReferendumIndex | BN | number): Observable<RxReferendum | undefined> => {
|
||||
referendumInfo = (referendumId: ReferendumIndex | BN | number): Observable<RxReferendum | undefined> => {
|
||||
return this
|
||||
.rawStorage(storage.democracy.referendumInfoOf, referendumId)
|
||||
.pipe(
|
||||
@@ -73,11 +93,11 @@ export default class ApiQueries extends ApiBase {
|
||||
);
|
||||
}
|
||||
|
||||
democacyVoteOf = (index: ReferendumIndex | BN | number, address: AccountId | string): Observable<Bool> => {
|
||||
referendumVote = (index: ReferendumIndex | BN | number, address: AccountId | string): Observable<Bool | undefined> => {
|
||||
return this.rawStorage(storage.democracy.voteOf, index, address);
|
||||
}
|
||||
|
||||
democacyVotersFor = (index: ReferendumIndex | BN | number): Observable<Array<AccountId>> => {
|
||||
referendumVoters = (index: ReferendumIndex | BN | number): Observable<Array<AccountId>> => {
|
||||
return this
|
||||
.rawStorage(storage.democracy.votersFor, index)
|
||||
.pipe(
|
||||
@@ -167,11 +187,6 @@ export default class ApiQueries extends ApiBase {
|
||||
);
|
||||
}
|
||||
|
||||
// FIXME -> freeBalance
|
||||
stakingFreeBalanceOf = (address: AccountId | string): Observable<Balance | undefined> => {
|
||||
return this.rawStorage(storage.balances.freeBalance, address);
|
||||
}
|
||||
|
||||
stakingNominatorsFor = (address: AccountId | string): Observable<Array<AccountId>> => {
|
||||
return this
|
||||
.rawStorage(storage.staking.nominatorsFor, address)
|
||||
@@ -187,24 +202,7 @@ export default class ApiQueries extends ApiBase {
|
||||
return this.rawStorage(storage.staking.nominating, address);
|
||||
}
|
||||
|
||||
// FIXME -> reservedBalance
|
||||
stakingReservedBalanceOf = (address: AccountId | string): Observable<Balance | undefined> => {
|
||||
return this.rawStorage(storage.balances.reservedBalance, address);
|
||||
}
|
||||
|
||||
timestampBlockPeriod = (): Observable<Moment | undefined> => {
|
||||
return this.rawStorage(storage.timestamp.blockPeriod);
|
||||
}
|
||||
|
||||
timestampNow = (): Observable<Moment | undefined> => {
|
||||
return this.rawStorage(storage.timestamp.now);
|
||||
}
|
||||
|
||||
systemAccountIndexOf = (address: AccountId | string): Observable<Index | undefined> => {
|
||||
return this.rawStorage(storage.system.accountNonce, address);
|
||||
}
|
||||
|
||||
validatorCount = (): Observable<u32> => {
|
||||
validatorCount = (): Observable<u32 | undefined> => {
|
||||
return this.rawStorage(storage.staking.validatorCount);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user