@reactive-dot/wallet-mimir
Version:
Mimir adapter for Reactive DOT
55 lines • 2.01 kB
JavaScript
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