MyBotBoxMyBotBox

@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/idempotency

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 propre db, sa référence à la table idempotency_key ainsi que les opérateurs and/eq/lt, de sorte que le package n'embarque jamais une seconde copie de drizzle-orm ou ioredis.
  • 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 delivery

Le 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.

Voir aussi