Map messages to rooms using tracker

This commit is contained in:
Jon Staab
2024-09-11 14:08:04 -07:00
parent e0eb37cd04
commit 648b15a1c4
3 changed files with 28 additions and 17 deletions
+1 -1
View File
@@ -32,7 +32,7 @@
const event = createEvent(MESSAGE, { const event = createEvent(MESSAGE, {
content: $editor.getText(), content: $editor.getText(),
tags: [["-"], ["relay", url], ...topicTags, ...mentionTags, ...imetaTags], tags: [["-"], ...topicTags, ...mentionTags, ...imetaTags],
}) })
publishThunk(makeThunk({event, relays: [url]})) publishThunk(makeThunk({event, relays: [url]}))
+24 -15
View File
@@ -24,6 +24,7 @@ import {
getDefaultAppContext, getDefaultAppContext,
getDefaultNetContext, getDefaultNetContext,
makeRouter, makeRouter,
trackerStore,
} from "@welshman/app" } from "@welshman/app"
import type {SubscribeRequestWithHandlers} from "@welshman/net" import type {SubscribeRequestWithHandlers} from "@welshman/net"
import {deriveEvents, deriveEventsMapped, withGetter} from "@welshman/store" import {deriveEvents, deriveEventsMapped, withGetter} from "@welshman/store"
@@ -32,7 +33,7 @@ export const MESSAGE = 209
export const REPLY = 210 export const REPLY = 210
export const MEMBERSHIPS = 30209 export const MEMBERSHIPS = 10209
export const INDEXER_RELAYS = ["wss://purplepag.es/", "wss://relay.damus.io/", "wss://nos.lol/"] export const INDEXER_RELAYS = ["wss://purplepag.es/", "wss://relay.damus.io/", "wss://nos.lol/"]
@@ -118,22 +119,16 @@ export const {
// Messages // Messages
export type Message = { export type Message = {
url: string
chat: string
topic: string topic: string
event: TrustedEvent event: TrustedEvent
} }
export const readMessage = (event: TrustedEvent): Maybe<Message[]> => { export const readMessage = (event: TrustedEvent): Maybe<Message> => {
const urls = getRelayTagValues(event.tags)
const topics = getTopicTagValues(event.tags) const topics = getTopicTagValues(event.tags)
if (topics.length > 1 || urls.length !== 1) return undefined if (topics.length > 1) return undefined
const topic = topics[0] || "" return {topic: topics[0] || "", event}
const url = urls[0]
return urls.map(url => ({url, topic, chat: makeChatId(url, topic), event}))
} }
export const messages = deriveEventsMapped<Message>(repository, { export const messages = deriveEventsMapped<Message>(repository, {
@@ -155,12 +150,26 @@ export const makeChatId = (url: string, topic: string) => `${url}'${topic}`
export const splitChatId = (id: string) => id.split("'") export const splitChatId = (id: string) => id.split("'")
export const chats = derived(messages, $messages => export const chats = derived(
Array.from(groupBy($message => $message.chat, $messages).values()).map(messages => { [trackerStore, messages],
const {chat, url, topic} = messages[0] ([$tracker, $messages]) => {
const messagesByChatId = new Map<string, Message[]>()
return {id: chat, url, topic, messages} for (const message of $messages) {
}), for (const url of $tracker.getRelays(message.event.id)) {
const chatId = makeChatId(url, message.topic)
pushToMapKey(messagesByChatId, chatId, message)
}
}
return Array.from(messagesByChatId.entries())
.map(([id, messages]) => {
const [url, topic] = splitChatId(id)
return {id, url, topic, messages}
})
}
) )
export const { export const {
+3 -1
View File
@@ -19,6 +19,7 @@
plaintext, plaintext,
freshness, freshness,
storageAdapters, storageAdapters,
tracker,
} from "@welshman/app" } from "@welshman/app"
import * as app from "@welshman/app" import * as app from "@welshman/app"
import {createEventStore} from "@welshman/store" import {createEventStore} from "@welshman/store"
@@ -63,7 +64,7 @@
ready = db ready = db
? Promise.resolve() ? Promise.resolve()
: initStorage("flotilla", 2, { : initStorage("flotilla", 3, {
events: { events: {
keyPath: "id", keyPath: "id",
store: createEventStore(repository), store: createEventStore(repository),
@@ -79,6 +80,7 @@
publishStatus: storageAdapters.fromObjectStore(publishStatusData), publishStatus: storageAdapters.fromObjectStore(publishStatusData),
freshness: storageAdapters.fromObjectStore(freshness), freshness: storageAdapters.fromObjectStore(freshness),
plaintext: storageAdapters.fromObjectStore(plaintext), plaintext: storageAdapters.fromObjectStore(plaintext),
tracker: storageAdapters.fromTracker(tracker),
}).then(() => sleep(300)) // Wait an extra few ms because of repository throttle }).then(() => sleep(300)) // Wait an extra few ms because of repository throttle
dialog.addEventListener("close", () => { dialog.addEventListener("close", () => {