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