콘텐츠로 이동

Webhook

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) # 서명 + 전송 시각(기본 5분 이내)
  • 서명: X-D2B-Signature-V2: sha256=<hex> = HMAC-SHA256(secret, "{X-D2B-Delivery}.{X-D2B-Timestamp}." + raw_body). X-D2B-Timestamp은 해당 시도의 전송 시각(UNIX 초, 재시도마다 갱신)이므로 현재 시각과의 차이가 허용 범위(예: 5분)를 넘는 요청은 거부해 주십시오(리플레이 방지). X-D2B-Delivery는 전달 ID입니다(재시도해도 같은 값). 원시 바디로 검증해 주십시오(재직렬화하지 않음)
  • 기존 서명 X-D2B-Signature: sha256=<hex> = HMAC-SHA256(secret, raw_body)도 계속 전송합니다. 전송 시각을 포함하지 않으므로 리플레이는 막지 못합니다
  • 이벤트: artifact.updated / artifact.deleted / artifact.stale / snapshot.committed / source.analyzed / source.materialized / conflict.created / version.branched / version.merged / job.completed
  • 전송 이력: GET /api/v1/me/webhooks/{id}/deliveries
  • 재시도: 2xx가 아닌 응답과 연결 실패는 30초에서 1시간까지 지수적으로 간격을 늘리며 최대 14회(총 약 8시간) 재시도합니다. 그래도 실패한 전달은 deliveries에 남지만 다시 재시도되지 않습니다. 이벤트 하나에 전달은 하나이지만, 응답이 도착하지 않은 시도는 재시도되므로 같은 전달(같은 X-D2B-Delivery)이 두 번 이상 도착할 수 있습니다. 수신 측은 X-D2B-Delivery를 키로 멱등하게 처리해 주십시오. 페이로드의 timestamp는 이벤트 발생 시각이며 재시도해도 바뀌지 않습니다

긴 처리(큰 파일의 수집 등)는 async=true로 job으로 만들고 job.completed를 기다리는 것을 권장합니다 — poll 루프보다 저렴하고, 에이전트의 타임아웃에도 강해집니다.