{"version":3,"file":"BitcoinWalletConnector-CS0BshOl.mjs","sources":["../src/utils/StateChannel.ts","../src/BitcoinWalletConnector.ts"],"sourcesContent":["export type StateChannelListener<T> = (value: T) => void\n\nexport interface StateChannelSubscription {\n  unsubscribe: () => void\n}\n\nexport class StateChannel<T> {\n  private listeners = new Set<StateChannelListener<T>>()\n  constructor(private value: T) {}\n\n  getValue(): T {\n    return this.value\n  }\n\n  setValue(value: T): void {\n    this.value = value\n    this.emit()\n  }\n\n  update(updater: (current: T) => T): void {\n    this.setValue(updater(this.value))\n  }\n\n  subscribe(listener: StateChannelListener<T>): StateChannelSubscription {\n    this.listeners.add(listener)\n    listener(this.value)\n    return {\n      unsubscribe: () => {\n        this.listeners.delete(listener)\n      },\n    }\n  }\n\n  private emit(): void {\n    for (const listener of this.listeners) {\n      listener(this.value)\n    }\n  }\n}\n","import { LOCAL_STORAGE_KEY_PREFIX } from \"./constants\"\nimport { AvailabilitySubscription } from \"./utils/createAdapterAvailability\"\nimport { StateChannel, StateChannelListener } from \"./utils/StateChannel\"\nimport {\n  WalletAdapter,\n  WalletAdapterFactory,\n  WalletAdapterNotConnectedError,\n} from \"./WalletAdapters.types\"\n\nconst localStorageKeyPrefix = `${LOCAL_STORAGE_KEY_PREFIX}:BitcoinWalletConnector`\nconst previousConnectWalletAdapterId_localStorageKey = `${localStorageKeyPrefix}:previousConnectWallet`\n\nexport interface ConnectInfo {\n  adapterId: string\n  adapter: WalletAdapter\n}\n\nexport type AdapterEntry = readonly [string, WalletAdapter]\n\nexport class BitcoinWalletConnector {\n  private availableAdaptersState = new StateChannel<AdapterEntry[]>([])\n  private connectedInfoState = new StateChannel<null | ConnectInfo>(null)\n  private autoConnectRunning = false\n  private availabilitySubscriptions: AvailabilitySubscription[] = []\n  private adapterOrder = new Map<string, number>()\n\n  constructor(private factories: WalletAdapterFactory<WalletAdapter>[]) {\n    this.adapterOrder = new Map(\n      factories.map((factory, index) => [factory.adapterId, index]),\n    )\n    this.initializeAdapterAvailability()\n  }\n\n  dispose(): void {\n    this.availabilitySubscriptions.forEach(s => s.unsubscribe())\n    this.availabilitySubscriptions = []\n    this.availableAdaptersState = new StateChannel<AdapterEntry[]>([])\n    this.connectedInfoState = new StateChannel<null | ConnectInfo>(null)\n  }\n\n  subscribeAvailableAdapters(\n    listener: StateChannelListener<AdapterEntry[]>,\n  ): AvailabilitySubscription {\n    return this.availableAdaptersState.subscribe(listener)\n  }\n  getAvailableAdapters(): AdapterEntry[] {\n    return this.availableAdaptersState.getValue()\n  }\n\n  subscribeConnectedInfo(\n    listener: StateChannelListener<null | ConnectInfo>,\n  ): AvailabilitySubscription {\n    return this.connectedInfoState.subscribe(listener)\n  }\n  getConnectedInfo(): null | ConnectInfo {\n    return this.connectedInfoState.getValue()\n  }\n\n  private initializeAdapterAvailability(): void {\n    this.availabilitySubscriptions = this.factories.map(factory => {\n      return factory.getAdapter().subscribe(adapter => {\n        this.addOrUpdateAvailableAdapter(factory.adapterId, adapter)\n      })\n    })\n  }\n\n  private addOrUpdateAvailableAdapter(\n    adapterId: string,\n    adapter: WalletAdapter,\n  ): void {\n    this.availableAdaptersState.update(current => {\n      const next = [...current]\n      const existingIndex = current.findIndex(([id]) => id === adapterId)\n      if (existingIndex === -1) {\n        next.push([adapterId, adapter] as const)\n      } else {\n        next[existingIndex] = [adapterId, adapter] as const\n      }\n\n      next.sort(\n        (a, b) =>\n          (this.adapterOrder.get(a[0]) ?? Number.MAX_SAFE_INTEGER) -\n          (this.adapterOrder.get(b[0]) ?? Number.MAX_SAFE_INTEGER),\n      )\n      return next\n    })\n\n    void this.autoConnect()\n  }\n\n  async connect(adapterId: string, adapter: WalletAdapter): Promise<void> {\n    const finalAdapter = adapter\n\n    await finalAdapter.connect()\n    localStorage.setItem(\n      previousConnectWalletAdapterId_localStorageKey,\n      adapterId,\n    )\n\n    this.connectedInfoState.setValue({ adapterId, adapter: finalAdapter })\n  }\n\n  async disconnect(): Promise<void> {\n    const info = this.connectedInfoState.getValue()\n    if (info == null) return\n\n    await info.adapter.disconnect()\n    localStorage.removeItem(previousConnectWalletAdapterId_localStorageKey)\n\n    this.connectedInfoState.setValue(null)\n  }\n\n  private async autoConnect(): Promise<void> {\n    if (this.isConnected || this.autoConnectRunning) return\n\n    const previousAdapterId = this.previousConnectedWallet\n    if (previousAdapterId == null) return\n\n    const adapter = this.availableAdaptersState\n      .getValue()\n      .find(a => a[0] === previousAdapterId)?.[1]\n    if (adapter == null) return\n\n    this.autoConnectRunning = true\n    try {\n      await adapter.getAddresses()\n    } catch (err: unknown) {\n      if (err instanceof WalletAdapterNotConnectedError) {\n        this.autoConnectRunning = false\n        return\n      }\n\n      this.autoConnectRunning = false\n      throw err\n    }\n\n    try {\n      await this.connect(previousAdapterId, adapter)\n    } finally {\n      this.autoConnectRunning = false\n    }\n  }\n\n  private get previousConnectedWallet(): string | undefined {\n    const adapterId =\n      localStorage.getItem(previousConnectWalletAdapterId_localStorageKey) ||\n      undefined\n\n    if (this.factories.some(factory => factory.adapterId === adapterId)) {\n      return adapterId\n    }\n    return undefined\n  }\n\n  private get isConnected(): boolean {\n    return this.connectedInfoState.getValue() != null\n  }\n}\n"],"names":["StateChannel","value","updater","listener","localStorageKeyPrefix","LOCAL_STORAGE_KEY_PREFIX","previousConnectWalletAdapterId_localStorageKey","BitcoinWalletConnector","factories","factory","index","s","adapter","adapterId","current","next","existingIndex","id","a","b","finalAdapter","info","previousAdapterId","err","WalletAdapterNotConnectedError"],"mappings":"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"}