events.ts raw
1 import { DomainEvent } from '../shared/events'
2 import { Pubkey } from '../shared/value-objects/Pubkey'
3 import { EventId } from '../shared/value-objects/EventId'
4 import { Timestamp } from '../shared/value-objects/Timestamp'
5 import { FeedType } from './FeedType'
6 import { ContentFilter } from './ContentFilter'
7
8 // ============================================================================
9 // Feed Configuration Events
10 // ============================================================================
11
12 /**
13 * Raised when the active feed is switched
14 */
15 export class FeedSwitched extends DomainEvent {
16 get eventType(): string {
17 return 'feed.switched'
18 }
19
20 constructor(
21 readonly owner: Pubkey | null,
22 readonly fromType: FeedType | null,
23 readonly toType: FeedType,
24 readonly relaySetId?: string
25 ) {
26 super()
27 }
28 }
29
30 /**
31 * Raised when the content filter settings are updated
32 */
33 export class ContentFilterUpdated extends DomainEvent {
34 get eventType(): string {
35 return 'feed.content_filter_updated'
36 }
37
38 constructor(
39 readonly owner: Pubkey,
40 readonly previousFilter: ContentFilter,
41 readonly newFilter: ContentFilter
42 ) {
43 super()
44 }
45 }
46
47 /**
48 * Raised when a feed is manually refreshed
49 */
50 export class FeedRefreshed extends DomainEvent {
51 get eventType(): string {
52 return 'feed.refreshed'
53 }
54
55 constructor(
56 readonly owner: Pubkey | null,
57 readonly feedType: FeedType
58 ) {
59 super()
60 }
61 }
62
63 // ============================================================================
64 // Note Lifecycle Events
65 // ============================================================================
66
67 /**
68 * Raised when a new note is created/published by the current user
69 */
70 export class NoteCreated extends DomainEvent {
71 get eventType(): string {
72 return 'feed.note_created'
73 }
74
75 constructor(
76 readonly author: Pubkey,
77 readonly noteId: EventId,
78 readonly replyTo: EventId | null,
79 readonly quotedNote: EventId | null,
80 readonly mentions: readonly Pubkey[],
81 readonly hashtags: readonly string[]
82 ) {
83 super()
84 }
85
86 get isReply(): boolean {
87 return this.replyTo !== null
88 }
89
90 get isQuote(): boolean {
91 return this.quotedNote !== null
92 }
93
94 get hasMentions(): boolean {
95 return this.mentions.length > 0
96 }
97 }
98
99 /**
100 * Raised when a note is deleted (deletion event received)
101 */
102 export class NoteDeleted extends DomainEvent {
103 get eventType(): string {
104 return 'feed.note_deleted'
105 }
106
107 constructor(
108 readonly author: Pubkey,
109 readonly noteId: EventId
110 ) {
111 super()
112 }
113 }
114
115 /**
116 * Raised when a reply is received for a note the user cares about
117 */
118 export class NoteReplied extends DomainEvent {
119 get eventType(): string {
120 return 'feed.note_replied'
121 }
122
123 constructor(
124 readonly originalNoteId: EventId,
125 readonly originalAuthor: Pubkey,
126 readonly replyNoteId: EventId,
127 readonly replier: Pubkey
128 ) {
129 super()
130 }
131 }
132
133 /**
134 * Raised when users are mentioned in a note
135 */
136 export class UsersMentioned extends DomainEvent {
137 get eventType(): string {
138 return 'feed.users_mentioned'
139 }
140
141 constructor(
142 readonly noteId: EventId,
143 readonly author: Pubkey,
144 readonly mentionedPubkeys: readonly Pubkey[]
145 ) {
146 super()
147 }
148 }
149
150 // ============================================================================
151 // Timeline Events
152 // ============================================================================
153
154 /**
155 * Raised when new events arrive in the active timeline
156 */
157 export class TimelineEventsReceived extends DomainEvent {
158 get eventType(): string {
159 return 'feed.timeline_events_received'
160 }
161
162 constructor(
163 readonly feedType: FeedType,
164 readonly eventCount: number,
165 readonly newestTimestamp: Timestamp,
166 readonly isHistorical: boolean
167 ) {
168 super()
169 }
170 }
171
172 /**
173 * Raised when end-of-stored-events is received from all relays
174 */
175 export class TimelineEOSED extends DomainEvent {
176 get eventType(): string {
177 return 'feed.timeline_eosed'
178 }
179
180 constructor(
181 readonly feedType: FeedType,
182 readonly totalEvents: number
183 ) {
184 super()
185 }
186 }
187
188 /**
189 * Raised when more events are loaded (pagination)
190 */
191 export class TimelineLoadedMore extends DomainEvent {
192 get eventType(): string {
193 return 'feed.timeline_loaded_more'
194 }
195
196 constructor(
197 readonly feedType: FeedType,
198 readonly loadedCount: number,
199 readonly oldestTimestamp: Timestamp
200 ) {
201 super()
202 }
203 }
204