events.ts raw
1 import { DomainEvent } from '../shared/events'
2 import { Pubkey } from '../shared/value-objects/Pubkey'
3 import { RelayUrl } from '../shared/value-objects/RelayUrl'
4
5 // ============================================================================
6 // Favorite Relay Events
7 // ============================================================================
8
9 /**
10 * Raised when a favorite relay is added
11 */
12 export class FavoriteRelayAdded extends DomainEvent {
13 get eventType(): string {
14 return 'relay.favorite_added'
15 }
16
17 constructor(
18 readonly owner: Pubkey,
19 readonly relayUrl: RelayUrl
20 ) {
21 super()
22 }
23 }
24
25 /**
26 * Raised when a favorite relay is removed
27 */
28 export class FavoriteRelayRemoved extends DomainEvent {
29 get eventType(): string {
30 return 'relay.favorite_removed'
31 }
32
33 constructor(
34 readonly owner: Pubkey,
35 readonly relayUrl: RelayUrl
36 ) {
37 super()
38 }
39 }
40
41 /**
42 * Raised when favorite relays list is published
43 */
44 export class FavoriteRelaysPublished extends DomainEvent {
45 get eventType(): string {
46 return 'relay.favorites_published'
47 }
48
49 constructor(
50 readonly owner: Pubkey,
51 readonly relayCount: number,
52 readonly setCount: number
53 ) {
54 super()
55 }
56 }
57
58 // ============================================================================
59 // Relay Set Events
60 // ============================================================================
61
62 /**
63 * Raised when a new relay set is created
64 */
65 export class RelaySetCreated extends DomainEvent {
66 get eventType(): string {
67 return 'relay.set_created'
68 }
69
70 constructor(
71 readonly owner: Pubkey,
72 readonly setId: string,
73 readonly name: string,
74 readonly relays: readonly RelayUrl[]
75 ) {
76 super()
77 }
78 }
79
80 /**
81 * Changes that can be made to a relay set
82 */
83 export interface RelaySetChanges {
84 name?: { from: string; to: string }
85 addedRelays?: RelayUrl[]
86 removedRelays?: RelayUrl[]
87 }
88
89 /**
90 * Raised when a relay set is updated
91 */
92 export class RelaySetUpdated extends DomainEvent {
93 get eventType(): string {
94 return 'relay.set_updated'
95 }
96
97 constructor(
98 readonly owner: Pubkey,
99 readonly setId: string,
100 readonly changes: RelaySetChanges
101 ) {
102 super()
103 }
104
105 get nameChanged(): boolean {
106 return this.changes.name !== undefined
107 }
108
109 get relaysChanged(): boolean {
110 return (
111 (this.changes.addedRelays?.length ?? 0) > 0 ||
112 (this.changes.removedRelays?.length ?? 0) > 0
113 )
114 }
115 }
116
117 /**
118 * Raised when a relay set is deleted
119 */
120 export class RelaySetDeleted extends DomainEvent {
121 get eventType(): string {
122 return 'relay.set_deleted'
123 }
124
125 constructor(
126 readonly owner: Pubkey,
127 readonly setId: string
128 ) {
129 super()
130 }
131 }
132
133 // ============================================================================
134 // Mailbox Relay (NIP-65) Events
135 // ============================================================================
136
137 /**
138 * Raised when a relay is added to the user's relay list
139 */
140 export class MailboxRelayAdded extends DomainEvent {
141 get eventType(): string {
142 return 'relay.mailbox_added'
143 }
144
145 constructor(
146 readonly owner: Pubkey,
147 readonly relayUrl: RelayUrl,
148 readonly scope: 'read' | 'write' | 'both'
149 ) {
150 super()
151 }
152 }
153
154 /**
155 * Raised when a relay is removed from the user's relay list
156 */
157 export class MailboxRelayRemoved extends DomainEvent {
158 get eventType(): string {
159 return 'relay.mailbox_removed'
160 }
161
162 constructor(
163 readonly owner: Pubkey,
164 readonly relayUrl: RelayUrl
165 ) {
166 super()
167 }
168 }
169
170 /**
171 * Raised when a relay's scope is changed
172 */
173 export class MailboxRelayScopeChanged extends DomainEvent {
174 get eventType(): string {
175 return 'relay.mailbox_scope_changed'
176 }
177
178 constructor(
179 readonly owner: Pubkey,
180 readonly relayUrl: RelayUrl,
181 readonly fromScope: 'read' | 'write' | 'both',
182 readonly toScope: 'read' | 'write' | 'both'
183 ) {
184 super()
185 }
186 }
187
188 /**
189 * Raised when the relay list is published
190 */
191 export class RelayListPublished extends DomainEvent {
192 get eventType(): string {
193 return 'relay.list_published'
194 }
195
196 constructor(
197 readonly owner: Pubkey,
198 readonly readRelayCount: number,
199 readonly writeRelayCount: number
200 ) {
201 super()
202 }
203 }
204