Zum Inhalt springen

Webhooks

hook = client.webhooks.create("https://example.com/hook",
events=["artifact.updated", "job.completed"])
secret = hook["secret"] # この応答でのみ取得可能
# 受信側
from d2b.client import _Webhooks
ok = _Webhooks.verify_delivery(secret, request.headers, raw_body) # Signatur + Sendezeit (Standard: innerhalb von 5 min)
  • Signatur: X-D2B-Signature-V2: sha256=<hex> = HMAC-SHA256(secret, "{X-D2B-Delivery}.{X-D2B-Timestamp}." + raw_body). X-D2B-Timestamp ist die Sendezeit dieses Versuchs (UNIX-Sekunden, bei jeder Wiederholung neu): Anfragen, deren Alter Ihre Toleranz (z. B. 5 Minuten) überschreitet, ablehnen — das wehrt Replays ab. X-D2B-Delivery ist die Zustellungs-ID (bei jeder Wiederholung gleich). Gegen den rohen Body verifizieren (nicht re-serialisieren)
  • Die bisherige Signatur X-D2B-Signature: sha256=<hex> = HMAC-SHA256(secret, raw_body) wird weiterhin gesendet. Sie enthält keine Sendezeit und kann Replays daher nicht verhindern
  • Events: artifact.updated / artifact.deleted / artifact.stale / snapshot.committed / source.analyzed / source.materialized / conflict.created / version.branched / version.merged / job.completed
  • Zustellhistorie: GET /api/v1/me/webhooks/{id}/deliveries
  • Wiederholungen: Nicht-2xx-Antworten und Verbindungsfehler werden bis zu 14-mal mit exponentiell wachsendem Abstand von 30 s bis 1 h erneut zugestellt (insgesamt etwa 8 Stunden). Eine weiterhin fehlschlagende Zustellung bleibt unter deliveries sichtbar, wird aber nicht mehr wiederholt. Jedes Ereignis erzeugt eine Zustellung; ein Versuch, dessen Antwort nie ankam, wird jedoch wiederholt, sodass dieselbe Zustellung (dieselbe X-D2B-Delivery) mehr als einmal eintreffen kann: verarbeiten Sie Zustellungen idempotent, mit X-D2B-Delivery als Schlüssel. Der timestamp im Payload ist die Ereigniszeit und ändert sich bei Wiederholungen nicht

Lang laufende Verarbeitung (etwa der Ingest großer Dateien) läuft am besten mit async=true als Job, auf dessen job.completed gewartet wird — das ist günstiger als eine Poll-Schleife und robuster gegenüber Agenten-Timeouts.