RelayEventHandlers.ts raw

   1  import {
   2    FavoriteRelayAdded,
   3    FavoriteRelayRemoved,
   4    FavoriteRelaysPublished,
   5    RelaySetCreated,
   6    RelaySetUpdated,
   7    RelaySetDeleted,
   8    MailboxRelayAdded,
   9    MailboxRelayRemoved,
  10    MailboxRelayScopeChanged,
  11    RelayListPublished
  12  } from '@/domain/relay/events'
  13  import { EventHandler, eventDispatcher } from '@/domain/shared'
  14  
  15  /**
  16   * Handlers for Relay domain events
  17   *
  18   * These handlers coordinate cross-context updates when relay configuration changes.
  19   * They enable coordination between Relay, Feed, and Identity contexts.
  20   */
  21  
  22  /**
  23   * Handler for favorite relay added events
  24   * Can be used to:
  25   * - Update relay picker UI
  26   * - Add relay to connection pool
  27   */
  28  export const handleFavoriteRelayAdded: EventHandler<FavoriteRelayAdded> = async (event) => {
  29    console.debug('[RelayEventHandler] Favorite relay added:', {
  30      owner: event.owner.formatted,
  31      relay: event.relayUrl.value
  32    })
  33  
  34    // Future: Update relay picker options
  35    // Future: Pre-connect to new favorite relay
  36  }
  37  
  38  /**
  39   * Handler for favorite relay removed events
  40   * Can be used to:
  41   * - Update relay picker UI
  42   * - Close connection if no longer needed
  43   */
  44  export const handleFavoriteRelayRemoved: EventHandler<FavoriteRelayRemoved> = async (event) => {
  45    console.debug('[RelayEventHandler] Favorite relay removed:', {
  46      owner: event.owner.formatted,
  47      relay: event.relayUrl.value
  48    })
  49  
  50    // Future: Update relay picker options
  51  }
  52  
  53  /**
  54   * Handler for favorite relays published events
  55   * Can be used to:
  56   * - Invalidate relay preference caches
  57   * - Sync with remote state
  58   */
  59  export const handleFavoriteRelaysPublished: EventHandler<FavoriteRelaysPublished> = async (event) => {
  60    console.debug('[RelayEventHandler] Favorite relays published:', {
  61      owner: event.owner.formatted,
  62      relayCount: event.relayCount
  63    })
  64  
  65    // Future: Invalidate caches
  66  }
  67  
  68  /**
  69   * Handler for relay set created events
  70   * Can be used to:
  71   * - Update feed type options in UI
  72   * - Add new relay set to navigation
  73   */
  74  export const handleRelaySetCreated: EventHandler<RelaySetCreated> = async (event) => {
  75    console.debug('[RelayEventHandler] Relay set created:', {
  76      owner: event.owner.formatted,
  77      setId: event.setId,
  78      name: event.name,
  79      relayCount: event.relays.length
  80    })
  81  
  82    // Future: Update feed selector options
  83    // Future: Add to relay set navigation
  84  }
  85  
  86  /**
  87   * Handler for relay set updated events
  88   * Can be used to:
  89   * - Refresh active feed if using this relay set
  90   * - Update relay set display
  91   */
  92  export const handleRelaySetUpdated: EventHandler<RelaySetUpdated> = async (event) => {
  93    console.debug('[RelayEventHandler] Relay set updated:', {
  94      owner: event.owner.formatted,
  95      setId: event.setId,
  96      nameChanged: event.nameChanged,
  97      changes: {
  98        addedCount: event.changes.addedRelays?.length ?? 0,
  99        removedCount: event.changes.removedRelays?.length ?? 0
 100      }
 101    })
 102  
 103    // Future: Refresh feed if currently using this relay set
 104    // Future: Update relay set display
 105  }
 106  
 107  /**
 108   * Handler for relay set deleted events
 109   * Can be used to:
 110   * - Switch to different feed if current feed uses deleted set
 111   * - Remove from navigation
 112   */
 113  export const handleRelaySetDeleted: EventHandler<RelaySetDeleted> = async (event) => {
 114    console.debug('[RelayEventHandler] Relay set deleted:', {
 115      owner: event.owner.formatted,
 116      setId: event.setId
 117    })
 118  
 119    // Future: Switch feed if currently using this relay set
 120    // Future: Remove from feed selector options
 121  }
 122  
 123  /**
 124   * Handler for mailbox relay added events
 125   * Can be used to:
 126   * - Update relay list display
 127   * - Connect to new mailbox relay
 128   */
 129  export const handleMailboxRelayAdded: EventHandler<MailboxRelayAdded> = async (event) => {
 130    console.debug('[RelayEventHandler] Mailbox relay added:', {
 131      owner: event.owner.formatted,
 132      relay: event.relayUrl.value,
 133      scope: event.scope
 134    })
 135  
 136    // Future: Update relay list in settings
 137    // Future: Connect to relay based on scope
 138  }
 139  
 140  /**
 141   * Handler for mailbox relay removed events
 142   * Can be used to:
 143   * - Update relay list display
 144   * - Disconnect if no longer needed
 145   */
 146  export const handleMailboxRelayRemoved: EventHandler<MailboxRelayRemoved> = async (event) => {
 147    console.debug('[RelayEventHandler] Mailbox relay removed:', {
 148      owner: event.owner.formatted,
 149      relay: event.relayUrl.value
 150    })
 151  
 152    // Future: Update relay list in settings
 153  }
 154  
 155  /**
 156   * Handler for mailbox relay scope changed events
 157   * Can be used to:
 158   * - Update relay list display
 159   * - Adjust connection strategy
 160   */
 161  export const handleMailboxRelayScopeChanged: EventHandler<MailboxRelayScopeChanged> = async (event) => {
 162    console.debug('[RelayEventHandler] Mailbox relay scope changed:', {
 163      owner: event.owner.formatted,
 164      relay: event.relayUrl.value,
 165      fromScope: event.fromScope,
 166      toScope: event.toScope
 167    })
 168  
 169    // Future: Update relay list in settings
 170    // Future: Adjust write/read connection strategy
 171  }
 172  
 173  /**
 174   * Handler for relay list published events
 175   * Can be used to:
 176   * - Invalidate relay caches
 177   * - Trigger feed refresh if relay configuration changed
 178   */
 179  export const handleRelayListPublished: EventHandler<RelayListPublished> = async (event) => {
 180    console.debug('[RelayEventHandler] Relay list published:', {
 181      owner: event.owner.formatted,
 182      readRelayCount: event.readRelayCount,
 183      writeRelayCount: event.writeRelayCount
 184    })
 185  
 186    // Future: Invalidate relay caches
 187    // Future: Trigger feed refresh if needed
 188  }
 189  
 190  /**
 191   * Register all relay event handlers with the event dispatcher
 192   */
 193  export function registerRelayEventHandlers(): void {
 194    eventDispatcher.on('relay.favorite_added', handleFavoriteRelayAdded)
 195    eventDispatcher.on('relay.favorite_removed', handleFavoriteRelayRemoved)
 196    eventDispatcher.on('relay.favorites_published', handleFavoriteRelaysPublished)
 197    eventDispatcher.on('relay.set_created', handleRelaySetCreated)
 198    eventDispatcher.on('relay.set_updated', handleRelaySetUpdated)
 199    eventDispatcher.on('relay.set_deleted', handleRelaySetDeleted)
 200    eventDispatcher.on('relay.mailbox_added', handleMailboxRelayAdded)
 201    eventDispatcher.on('relay.mailbox_removed', handleMailboxRelayRemoved)
 202    eventDispatcher.on('relay.mailbox_scope_changed', handleMailboxRelayScopeChanged)
 203    eventDispatcher.on('relay.list_published', handleRelayListPublished)
 204  }
 205  
 206  /**
 207   * Unregister all relay event handlers
 208   */
 209  export function unregisterRelayEventHandlers(): void {
 210    eventDispatcher.off('relay.favorite_added', handleFavoriteRelayAdded)
 211    eventDispatcher.off('relay.favorite_removed', handleFavoriteRelayRemoved)
 212    eventDispatcher.off('relay.favorites_published', handleFavoriteRelaysPublished)
 213    eventDispatcher.off('relay.set_created', handleRelaySetCreated)
 214    eventDispatcher.off('relay.set_updated', handleRelaySetUpdated)
 215    eventDispatcher.off('relay.set_deleted', handleRelaySetDeleted)
 216    eventDispatcher.off('relay.mailbox_added', handleMailboxRelayAdded)
 217    eventDispatcher.off('relay.mailbox_removed', handleMailboxRelayRemoved)
 218    eventDispatcher.off('relay.mailbox_scope_changed', handleMailboxRelayScopeChanged)
 219    eventDispatcher.off('relay.list_published', handleRelayListPublished)
 220  }
 221