chore: add a map in relay controller for storing events
This commit is contained in:
parent
0733849b25
commit
c6831f3fb2
@ -14,6 +14,7 @@ import { MetadataController, UserRelaysType } from './metadata'
|
|||||||
*/
|
*/
|
||||||
export class RelayController {
|
export class RelayController {
|
||||||
private static instance: RelayController
|
private static instance: RelayController
|
||||||
|
private events = new Map<string, Event>()
|
||||||
private debug = true
|
private debug = true
|
||||||
public connectedRelays: Relay[] = []
|
public connectedRelays: Relay[] = []
|
||||||
|
|
||||||
@ -151,6 +152,16 @@ export class RelayController {
|
|||||||
// Wait for all publish operations to complete (either fulfilled or rejected)
|
// Wait for all publish operations to complete (either fulfilled or rejected)
|
||||||
await Promise.allSettled(publishPromises)
|
await Promise.allSettled(publishPromises)
|
||||||
|
|
||||||
|
if (publishedOnRelays.length > 0) {
|
||||||
|
// if the event was successfully published to relays then check if it contains the `aTag`
|
||||||
|
// if so, then cache the event
|
||||||
|
|
||||||
|
const aTag = event.tags.find((item) => item[0] === 'a')
|
||||||
|
if (aTag && aTag[1]) {
|
||||||
|
this.events.set(aTag[1], event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Return the list of relay URLs where the event was published
|
// Return the list of relay URLs where the event was published
|
||||||
return publishedOnRelays
|
return publishedOnRelays
|
||||||
}
|
}
|
||||||
@ -335,13 +346,35 @@ export class RelayController {
|
|||||||
filter: Filter,
|
filter: Filter,
|
||||||
relays: string[] = []
|
relays: string[] = []
|
||||||
): Promise<Event | null> => {
|
): Promise<Event | null> => {
|
||||||
|
// first check if event is present in cached map then return that
|
||||||
|
// otherwise query relays
|
||||||
|
if (filter['#a']) {
|
||||||
|
const aTag = filter['#a'][0]
|
||||||
|
const cachedEvent = this.events.get(aTag)
|
||||||
|
|
||||||
|
if (cachedEvent) return cachedEvent
|
||||||
|
}
|
||||||
|
|
||||||
const events = await this.fetchEvents(filter, relays)
|
const events = await this.fetchEvents(filter, relays)
|
||||||
|
|
||||||
// Sort events by creation date in descending order
|
// Sort events by creation date in descending order
|
||||||
events.sort((a, b) => b.created_at - a.created_at)
|
events.sort((a, b) => b.created_at - a.created_at)
|
||||||
|
|
||||||
// Return the most recent event, or null if no events were received
|
if (events.length > 0) {
|
||||||
return events[0] || null
|
const event = events[0]
|
||||||
|
|
||||||
|
// if the aTag was specified in filter then cache the fetched event before returning
|
||||||
|
if (filter['#a']) {
|
||||||
|
const aTag = filter['#a'][0]
|
||||||
|
this.events.set(aTag, event)
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the event
|
||||||
|
return event
|
||||||
|
}
|
||||||
|
|
||||||
|
// return null if event array is empty
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -358,6 +391,15 @@ export class RelayController {
|
|||||||
hexKey: string,
|
hexKey: string,
|
||||||
userRelaysType: UserRelaysType
|
userRelaysType: UserRelaysType
|
||||||
) => {
|
) => {
|
||||||
|
// first check if event is present in cached map then return that
|
||||||
|
// otherwise query relays
|
||||||
|
if (filter['#a']) {
|
||||||
|
const aTag = filter['#a'][0]
|
||||||
|
const cachedEvent = this.events.get(aTag)
|
||||||
|
|
||||||
|
if (cachedEvent) return cachedEvent
|
||||||
|
}
|
||||||
|
|
||||||
// Get an instance of the MetadataController, which manages user metadata and relays
|
// Get an instance of the MetadataController, which manages user metadata and relays
|
||||||
const metadataController = await MetadataController.getInstance()
|
const metadataController = await MetadataController.getInstance()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user