@yarlisai/idempotency
Primitives d'opérations idempotentes — revendication atomique de clés, rejeu des résultats, expiration TTL et nettoyage.
Primitives d'opérations idempotentes pour les webhooks, les pollers et toute opération devant s'exécuter exactement une fois — revendication atomique de clés, stockage et rejeu des résultats, libération en cas de nouvelle tentative, expiration TTL et nettoyage des clés expirées.
Installation
npm install @yarlisai/idempotencySource : packages/idempotency ·
npm ·
CHANGELOG
Pourquoi
@yarlisai/idempotency suit le contrat port/adaptateur : les consommateurs dépendent du port IdempotencyProvider et instancient un adaptateur à l'exécution. Deux adaptateurs sont fournis en v1 :
postgres— basé sur Drizzle, avec un chemin rapide optionnel via un cache compatible Redis. L'appelant injecte son propredb, sa référence à la tableidempotency_keyainsi que les opérateursand/eq/lt, de sorte que le package n'embarque jamais une seconde copie dedrizzle-ormouioredis.memory— Map en mémoire avec TTL, pour les tests et les déploiements à instance unique.
Utilisation
import { createIdempotencyClient } from '@yarlisai/idempotency'
import { and, eq, lt } from 'drizzle-orm'
const webhookIdempotency = createIdempotencyClient({
adapter: 'postgres',
db,
table: idempotencyKey,
operators: { and, eq, lt },
namespace: 'webhook',
ttlSeconds: 60 * 60 * 24 * 7,
})
const claim = await webhookIdempotency.atomicallyClaim('stripe', event.id)
if (!claim.claimed) return // duplicate deliveryLe README du package contient un guide de démarrage rapide complet. mybotbox-platform lui-même est le consommateur de référence — apps/sat/lib/idempotency/ illustre comment chaque point d'appel utilise le port plutôt que d'accéder directement à la base de données.