Update api-observable to UI version (#189)

* Update api-observable to UI version

* Cleanup lint
This commit is contained in:
Jaco Greeff
2018-10-04 14:14:54 +02:00
committed by GitHub
parent 67a3e75f31
commit 605f11d768
5 changed files with 91 additions and 66 deletions
+2
View File
@@ -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"
}
+24 -15
View File
@@ -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
)
);
}
}
+20 -4
View File
@@ -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);
}
}
+18 -18
View File
@@ -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,
+27 -29
View File
@@ -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);
}
}