Webhook
hook = client.webhooks.create("https://example.com/hook", events=["artifact.updated", "job.completed"])secret = hook["secret"] # この応答でのみ取得可能
# 受信側from d2b.client import _Webhooksok = _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 루프보다 저렴하고, 에이전트의 타임아웃에도 강해집니다.