UNPKG

@reactive-dot/wallet-mimir

Version:

Mimir adapter for Reactive DOT

55 lines 2.01 kB
import { MimirPAPISigner } from "@mimirdev/papi-signer"; import { BaseError } from "@reactive-dot/core"; import { Wallet, } from "@reactive-dot/core/wallets.js"; import { BehaviorSubject, Observable, of } from "rxjs"; import { map, switchMap } from "rxjs/operators"; export class MimirWallet extends Wallet { id = "mimir"; name = "Mimir"; #mimir$ = new BehaviorSubject(undefined); connected$ = this.#mimir$.pipe(map((mimir) => mimir !== undefined)); accounts$ = this.#mimir$.pipe(switchMap((mimir) => { if (mimir === undefined) { return of([]); } return new Observable((subscriber) => { subscriber.add(mimir.subscribeAccounts((accounts) => subscriber.next(this.#toPolkadotSignerAccount(mimir, accounts)))); }); })); constructor(options) { super(options); } async getAccounts() { const mimir = this.#mimir$.getValue(); if (mimir === undefined) { throw new BaseError("Mimir is not connected"); } return this.#toPolkadotSignerAccount(mimir, await mimir.getAccounts()); } async initialize() { if (this.storage.getItem("connected") !== null) { await this.connect(); } } async connect() { const signer = new MimirPAPISigner(); const { result } = await signer.enable(this.options?.originName ?? globalThis.origin); if (!result) { throw new BaseError("Failed to connect to Mimir"); } this.#mimir$.next(signer); this.storage.setItem("connected", JSON.stringify(true)); } disconnect() { this.#mimir$.next(undefined); this.storage.removeItem("connected"); } #toPolkadotSignerAccount(mimir, accounts) { return accounts.map((account, index) => ({ id: index.toString(), polkadotSigner: mimir.getPolkadotSigner(account.address), ...account, })); } } //# sourceMappingURL=mimir-wallet.js.map