/** * Eingehende Konto-Webhooks der Lager-API: Signatur pruefen, Ereignis lesen. * * Dasselbe Verfahren wie bei Partner-Webhooks (Backend * `gemeinsam/webhook-core.js`, `signaturKopf`/`pruefeSignatur`): Kopf * `X-Kasseneck-Signature: t=,v1=` mit * `v1 = HMAC-SHA256(secret, ".")`, Zeitfenster 300 Sekunden in * beide Richtungen, zeitkonstanter Vergleich, mehrere `v1=`-Anteile erlaubt. * Die Pruefung selbst liegt in `partner/webhook-signatur.ts` und wird hier nur * mit der Form `(secret, kopf, rumpf, optionen)` angeboten. * * Reihenfolge im Empfaenger: **erst pruefen, dann lesen**, und dabei den * **rohen** Rumpf nehmen (in Express `express.raw({ type: '*\/*' })` vor jedem * JSON-Parser). */ import type { InventoryWebhookEvent } from './typen.js'; export { WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, } from '../partner/webhook-signatur.js'; export interface VerifyInventoryWebhookOptions { /** Erlaubte Abweichung des Zeitstempels in Sekunden, in beide Richtungen; Vorgabe 300. */ toleranceSec?: number; /** Jetzt: ein `Date` oder Millisekunden seit 1970 (wie `Date.now()`). Vorgabe: die Systemuhr. */ now?: Date | number; } /** * Prueft die Signatur einer Zustellung. `true` nur, wenn Kopf, Zeitfenster * und HMAC stimmen; jede schlechte Eingabe und jede Ausnahme ist `false`, * nie ein Wurf. * * **Asynchron**, weil die Pruefung WebCrypto (`crypto.subtle`) benutzt: das * Paket hat keine Laufzeitabhaengigkeit und laeuft auch im Browser. * * @param secret das Secret aus `createWebhook`/`rotateWebhookSecret`; eine * Liste erlaubt den Wechsel (es reicht, wenn eines passt) * @param header der Wert von `X-Kasseneck-Signature`, unveraendert * @param rawBody der **rohe** Rumpf (Text oder Bytes), nicht `JSON.parse` + `stringify` */ export declare function verifyInventoryWebhookSignature(secret: string | readonly string[], header: string | null | undefined, rawBody: string | Uint8Array, options?: VerifyInventoryWebhookOptions): Promise; /** * Liest eine Zustellung als typisiertes Ereignis. Vorher die Signatur pruefen * ([verifyInventoryWebhookSignature]). * * - Ein Ereignis, das diese Paketversion nicht kennt (eines einer spaeteren * Stufe), ergibt `null`: mit 2xx antworten und uebergehen. * - `reservation.expired|released|redeemed` tragen die Reservierung wie * `getReservation`, mit dem Status nach dem Vorgang (seit 1.5.0). * - `variant_group.created|updated` tragen die Gruppe wie `getVariantGroup` * (seit 1.6.0). Zwei Zustellungen koennen sich ueberholen: den Stand nur * uebernehmen, wenn `data.updatedAt` neuer ist als der gespeicherte. * - Ein Rumpf, der keine Huelle ist, oder eine Bruchzahl in einer Menge wirft * `KasseneckValidationError` (`scope: 'response'`). * * **Entdoppeln** auf `event.id`; **Stand statt Aenderung**: einen gespeicherten * Bestand nur ueberschreiben, wenn `data.sequence` groesser ist. */ export declare function parseInventoryWebhookEvent(rawBody: string | Uint8Array): InventoryWebhookEvent | null;