176 lines
4.6 KiB
Markdown
176 lines
4.6 KiB
Markdown
# Patterns de cache d'événements
|
|
|
|
**Date** : 2024-12-19
|
|
**Auteur** : Équipe 4NK
|
|
|
|
## Introduction
|
|
|
|
Ce document décrit les patterns à utiliser pour cacher des événements Nostr dans IndexedDB.
|
|
|
|
## Pattern recommandé : Utilisation des helpers de cache
|
|
|
|
### Cache d'événements groupés par hash
|
|
|
|
Pour les objets qui ont plusieurs versions (publications, series), utiliser `groupAndCacheEventsByHash` :
|
|
|
|
```typescript
|
|
import { groupAndCacheEventsByHash } from '@/lib/helpers/eventCacheHelper'
|
|
import { extractPublicationFromEvent } from '@/lib/metadataExtractor'
|
|
import { parseObjectId } from '@/lib/urlGenerator'
|
|
import { extractTagsFromEvent } from '@/lib/nostrTagSystem'
|
|
|
|
await groupAndCacheEventsByHash(events, {
|
|
objectType: 'publication',
|
|
extractor: extractPublicationFromEvent,
|
|
getHash: (extracted: unknown): string | null => {
|
|
const id = (extracted as { id?: string })?.id
|
|
if (!id) {
|
|
return null
|
|
}
|
|
const parsed = parseObjectId(id)
|
|
return parsed.hash ?? id
|
|
},
|
|
getIndex: (extracted: unknown): number => {
|
|
return (extracted as { index?: number })?.index ?? 0
|
|
},
|
|
getVersion: (event: Event): number => {
|
|
return extractTagsFromEvent(event).version ?? 0
|
|
},
|
|
getHidden: (event: Event): boolean => {
|
|
return extractTagsFromEvent(event).hidden ?? false
|
|
},
|
|
})
|
|
```
|
|
|
|
### Cache d'événements simples
|
|
|
|
Pour les objets sans versioning (purchases, sponsoring, review tips), utiliser `writeObjectToCache` :
|
|
|
|
```typescript
|
|
import { writeObjectToCache } from '@/lib/helpers/writeObjectHelper'
|
|
|
|
await writeObjectToCache({
|
|
objectType: 'purchase',
|
|
hash: purchase.hash,
|
|
event,
|
|
parsed: purchase,
|
|
index: purchase.index,
|
|
})
|
|
```
|
|
|
|
### Cache avec extraction automatique
|
|
|
|
Pour combiner extraction et cache en une seule opération :
|
|
|
|
```typescript
|
|
import { extractAndWriteObject } from '@/lib/helpers/writeObjectHelper'
|
|
import { extractPurchaseFromEvent } from '@/lib/metadataExtractor'
|
|
|
|
const cached = await extractAndWriteObject(
|
|
event,
|
|
'purchase',
|
|
extractPurchaseFromEvent
|
|
)
|
|
|
|
if (cached) {
|
|
console.log('Event cached successfully')
|
|
}
|
|
```
|
|
|
|
## Pattern de cache dans les boucles
|
|
|
|
### Optimisation : Cache l'import de writeService
|
|
|
|
Le helper `writeObjectToCache` cache automatiquement l'import de `writeService`, donc pas besoin d'optimiser manuellement :
|
|
|
|
```typescript
|
|
// ✅ Bon : writeObjectToCache gère le cache automatiquement
|
|
for (const event of events) {
|
|
await writeObjectToCache({
|
|
objectType: 'purchase',
|
|
hash: purchase.hash,
|
|
event,
|
|
parsed: purchase,
|
|
})
|
|
}
|
|
|
|
// ❌ Éviter : Import répété dans la boucle
|
|
for (const event of events) {
|
|
const { writeService } = await import('./writeService')
|
|
await writeService.writeObject(...)
|
|
}
|
|
```
|
|
|
|
## Gestion des versions
|
|
|
|
Pour les objets avec versioning, `groupAndCacheEventsByHash` :
|
|
1. Groupe les événements par hash
|
|
2. Sélectionne la dernière version avec `getLatestVersion`
|
|
3. Cache uniquement la dernière version
|
|
|
|
```typescript
|
|
// Les événements sont automatiquement groupés par hash
|
|
// Seule la dernière version est cachée
|
|
await groupAndCacheEventsByHash(events, {
|
|
objectType: 'publication',
|
|
extractor: extractPublicationFromEvent,
|
|
// ... config
|
|
})
|
|
```
|
|
|
|
## Bonnes pratiques
|
|
|
|
1. **Utiliser les helpers appropriés** :
|
|
- `groupAndCacheEventsByHash` pour objets avec versioning
|
|
- `writeObjectToCache` pour objets simples
|
|
- `extractAndWriteObject` pour combiner extraction et cache
|
|
|
|
2. **Ne pas dupliquer la logique de cache** : Toujours utiliser les helpers centralisés
|
|
|
|
3. **Gérer les erreurs** : Les helpers propagent les erreurs, les gérer en amont
|
|
|
|
4. **Typage strict** : Utiliser les types TypeScript pour `parsed`
|
|
|
|
5. **Performance** : Les helpers optimisent automatiquement les imports
|
|
|
|
## Exemples complets
|
|
|
|
### Cache de publications avec groupement
|
|
|
|
```typescript
|
|
import { groupAndCacheEventsByHash } from '@/lib/helpers/eventCacheHelper'
|
|
import { cachePublicationsByHash } from '@/lib/helpers/syncContentCacheHelpers'
|
|
|
|
// Utiliser le helper spécialisé
|
|
await cachePublicationsByHash(events)
|
|
```
|
|
|
|
### Cache de purchases
|
|
|
|
```typescript
|
|
import { cachePurchases } from '@/lib/helpers/syncCacheHelpers'
|
|
|
|
await cachePurchases(events)
|
|
```
|
|
|
|
### Cache personnalisé
|
|
|
|
```typescript
|
|
import { writeObjectToCache } from '@/lib/helpers/writeObjectHelper'
|
|
|
|
for (const event of events) {
|
|
const extracted = await extractMyObjectFromEvent(event)
|
|
if (extracted?.hash) {
|
|
await writeObjectToCache({
|
|
objectType: 'my_object',
|
|
hash: extracted.hash,
|
|
event,
|
|
parsed: extracted,
|
|
version: extractTagsFromEvent(event).version,
|
|
hidden: extractTagsFromEvent(event).hidden,
|
|
index: extracted.index,
|
|
})
|
|
}
|
|
}
|
|
```
|