6 changed files with 123 additions and 22 deletions
@ -0,0 +1,68 @@ |
|||||||
|
/** |
||||||
|
* Track deletion requests to prevent re-caching deleted events |
||||||
|
* Uses cached kind 5 (deletion request) events from the cache |
||||||
|
*/ |
||||||
|
|
||||||
|
import { getDB } from './indexeddb-store.js'; |
||||||
|
import { KIND } from '../../types/kind-lookup.js'; |
||||||
|
import type { CachedEvent } from './event-cache.js'; |
||||||
|
|
||||||
|
/** |
||||||
|
* Get all event IDs that have deletion requests |
||||||
|
* Queries the cache for kind 5 events and extracts event IDs from their 'e' tags |
||||||
|
*/ |
||||||
|
async function getDeletedEventIdsFromCache(): Promise<Set<string>> { |
||||||
|
const deletedSet = new Set<string>(); |
||||||
|
try { |
||||||
|
const db = await getDB(); |
||||||
|
const tx = db.transaction('events', 'readonly'); |
||||||
|
const index = tx.store.index('kind'); |
||||||
|
|
||||||
|
// Get all kind 5 (deletion request) events
|
||||||
|
for await (const cursor of index.iterate(KIND.EVENT_DELETION)) { |
||||||
|
const deletionEvent = cursor.value as CachedEvent; |
||||||
|
// Extract event IDs from 'e' tags
|
||||||
|
if (deletionEvent.tags) { |
||||||
|
for (const tag of deletionEvent.tags) { |
||||||
|
if (tag[0] === 'e' && tag[1]) { |
||||||
|
deletedSet.add(tag[1]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
await tx.done; |
||||||
|
} catch (error) { |
||||||
|
console.debug('Error getting deleted event IDs from cache:', error); |
||||||
|
} |
||||||
|
|
||||||
|
return deletedSet; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check if an event is marked as deleted (has a deletion request in cache) |
||||||
|
*/ |
||||||
|
export async function isEventDeleted(eventId: string): Promise<boolean> { |
||||||
|
try { |
||||||
|
const deletedIds = await getDeletedEventIdsFromCache(); |
||||||
|
return deletedIds.has(eventId); |
||||||
|
} catch (error) { |
||||||
|
console.debug('Error checking if event is deleted:', error); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check if any of the given event IDs are marked as deleted |
||||||
|
* Returns a Set of deleted event IDs for efficient lookup |
||||||
|
*/ |
||||||
|
export async function getDeletedEventIds(eventIds: string[]): Promise<Set<string>> { |
||||||
|
try { |
||||||
|
const deletedIds = await getDeletedEventIdsFromCache(); |
||||||
|
// Return intersection of requested IDs and deleted IDs
|
||||||
|
return new Set(eventIds.filter(id => deletedIds.has(id))); |
||||||
|
} catch (error) { |
||||||
|
console.debug('Error checking deleted events:', error); |
||||||
|
return new Set<string>(); |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue