diff --git a/src/pipeline.ts b/src/pipeline.ts index 4bdec81d..dddc0f65 100644 --- a/src/pipeline.ts +++ b/src/pipeline.ts @@ -7,6 +7,7 @@ import { isEphemeralKind } from '@/kinds.ts'; import * as mixer from '@/mixer.ts'; import { isLocallyFollowed } from '@/queries.ts'; import { Sub } from '@/subs.ts'; +import { getTagSet } from '@/tags.ts'; import { trends } from '@/trends.ts'; import { eventAge, isRelay, nostrDate, Time } from '@/utils.ts'; @@ -22,6 +23,7 @@ async function handleEvent(event: Event): Promise { await Promise.all([ storeEvent(event, data), + processDeletions(event), trackRelays(event), trackHashtags(event), streamOut(event, data), @@ -67,6 +69,20 @@ async function storeEvent(event: Event, data: EventData): Promise { } } +/** Query to-be-deleted events, ensure their pubkey matches, then delete them from the database. */ +async function processDeletions(event: Event): Promise { + if (event.kind === 5) { + const ids = getTagSet(event.tags, 'e'); + const events = await eventsDB.getFilters([{ ids: [...ids] }]); + + const deleteIds = events + .filter(({ pubkey, id }) => pubkey === event.pubkey && ids.has(id)) + .map((event) => event.id); + + await eventsDB.deleteFilters([{ ids: deleteIds }]); + } +} + /** Track whenever a hashtag is used, for processing trending tags. */ function trackHashtags(event: Event): void { const date = nostrDate(event.created_at); diff --git a/src/tags.ts b/src/tags.ts new file mode 100644 index 00000000..98efc7d2 --- /dev/null +++ b/src/tags.ts @@ -0,0 +1,14 @@ +/** Get the values for a tag in a `Set`. */ +function getTagSet(tags: string[][], tagName: string): Set { + const set = new Set(); + + tags.forEach((tag) => { + if (tag[0] === tagName) { + set.add(tag[1]); + } + }); + + return set; +} + +export { getTagSet };