From e2b88d57d965b17dcf24d1e203ef67de7955a76e Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 5 Sep 2023 21:24:59 -0500 Subject: [PATCH] pipeline: process kind 5 deletion events --- src/pipeline.ts | 16 ++++++++++++++++ src/tags.ts | 14 ++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/tags.ts diff --git a/src/pipeline.ts b/src/pipeline.ts index 4bdec81..dddc0f6 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 0000000..98efc7d --- /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 };