import { EventEmitter } from "eventemitter3"; import type { Provider, ProviderEventMap, RequestArguments, } from "./types/provider.js"; import type { Signer } from "./types/signer.js"; import { YiSigner } from "./yiSigner.js"; export class ProviderEventEmitter extends EventEmitter< keyof ProviderEventMap > {} export class YiProvider extends ProviderEventEmitter implements Provider { private readonly projectId: string; private signer: Signer | null; constructor(projectId: string) { super(); this.projectId = projectId; this.signer = null; } public async request(args: RequestArguments): Promise { try { if (!this.signer) { switch (args.method) { case "eth_requestAccounts": { const signer = this.initSigner(); await signer.handshake(args, this.projectId); this.signer = signer; break; } default: { throw new Error( "Must call 'eth_requestAccounts' before other methods", ); } } } return this.signer.request(args) as Promise; } catch (err) { return Promise.reject(err); } } async disconnect() { this.signer?.cleanup(); this.signer = null; this.emit("disconnect"); } private initSigner() { return new YiSigner({ callback: this.emit.bind(this), projectId: this.projectId, }); } }