สัญญาเว็บฮุกขาออก
เว็บฮุกขาออกแจ้งระบบภายนอกเมื่อเนื้อหาเปลี่ยน ไม่ใช่คำสั่งปลั๊กอินหรือกลไกสำหรับเรียกใช้กฎธุรกิจของ CMS ตั้งค่าผู้รับใน การตั้งค่า → การเชื่อมต่อ → webhook ขาออก ด้วยสิทธิ์เว็บไซต์ที่เหมาะสม การแจ้งล้มเหลวไม่ย้อนการเผยแพร่ การส่งเป็นแบบพยายามให้สำเร็จภายในจำนวนครั้งที่กำหนด ไม่รับประกันว่าผู้รับทุกคนจะได้รับทุกเหตุการณ์ในที่สุด
ระหว่าง บันทึกผู้รับ จะยังแก้ไขไม่ได้ หากมีผู้อื่นบันทึกก่อน การแก้ไขของคุณจะยังอยู่ในฟอร์ม กด โหลดใหม่และทิ้งการแก้ไข เพื่อแทนที่ด้วยรายการล่าสุด หากโหลดรายการผู้รับหรือประวัติการส่งไม่สำเร็จ ให้กด ลองอีกครั้ง การโหลดประวัติซ้ำไม่เปลี่ยนการแก้ไขผู้รับที่ยังไม่ได้บันทึก
เหตุการณ์และรูปแบบข้อมูล
หัวข้อที่มีชื่อว่า “เหตุการณ์และรูปแบบข้อมูล”เมื่อแก้ไขเนื้อหา workflow รีลีส สื่อ หรือโมเดลสำเร็จ ระบบจะเข้าคิวเหตุการณ์ต่อไปนี้: content.created, content.updated, content.trashed, content.restored, content.deleted, content.published, content.unpublished, workflow.transitioned, release.applied, media.created, media.updated, media.deleted, model.applied การเขียนที่ถูกปฏิเสธ ธุรกรรมที่ย้อนกลับ และการเรียกซ้ำแบบ idempotent ไม่สร้างเหตุการณ์ใหม่ รีลีสที่ประสานกันส่งเหตุการณ์หลัง commit ทั้งชุดในฐานข้อมูลเว็บไซต์แล้วเท่านั้น
JSON มี id, event, site_id, occurred_at (ISO-8601) และ data ข้อมูลระบุรายการ โมเดล สื่อ หรือรีลีสที่เปลี่ยน พร้อมเวอร์ชัน รีวิชัน และภาษาที่เกี่ยวข้อง เหตุการณ์เผยแพร่ระบุ instance_id หลัก โมเดล และสถานะเผยแพร่ โดยไม่ส่งสำเนาฟิลด์ส่วนตัวหรือข้อมูลรับรอง ให้อ่านข้อมูลปัจจุบันจาก API ที่เกี่ยวข้อง รายการที่เลิกเผยแพร่หรือลบแล้วอาจไม่ปรากฏในคำตอบสาธารณะ
การแก้ไขที่สำเร็จเข้าคิวการส่งในสถานะ pending โดยไม่รอคำตอบเครือข่ายจากผู้รับ ตัวประมวลผลตามเวลาที่มีอยู่ส่งครั้งแรกและลองใหม่ การส่งทั้งหมดของเหตุการณ์เดียวกันคง ID และ body เดิม รวมถึงการสั่งส่งซ้ำด้วยตนเอง
HTTP และลายเซ็น
หัวข้อที่มีชื่อว่า “HTTP และลายเซ็น”ระบบส่ง POST ด้วย Content-Type: application/json ส่วน X-Deewan-Event ระบุเหตุการณ์ X-Deewan-Delivery เป็น ID การตั้งค่าผู้รับ ไม่ใช่ ID เหตุการณ์ X-Deewan-Signature เป็น sha256= ตามด้วย HMAC-SHA256 แบบเลขฐานสิบหกตัวพิมพ์เล็ก คำนวณจากไบต์ UTF-8 ของ body ที่ส่งจริงด้วย secret ของผู้รับ
ตรวจไบต์ดิบก่อนแปลง JSON เปรียบเทียบลายเซ็นอย่างปลอดภัย ตรวจเว็บไซต์และเหตุการณ์ที่รองรับ แล้วป้องกันซ้ำด้วย id ใน body ภายในขอบเขตผู้รับและเว็บไซต์ การแปลง JSON กลับเป็นข้อความก่อนตรวจเปลี่ยนไบต์ที่ลงลายเซ็น occurred_at รวมอยู่ในลายเซ็น นโยบายป้องกัน replay ต้องยอมให้ช่วงส่งซ้ำที่ถูกต้อง ไม่มี header ลายเซ็นเวลาแยกต่างหาก
เหตุการณ์ใช้ ID เดิมทั้งการส่งหลายผู้รับและการส่งซ้ำ การส่งซ้ำอัตโนมัติและการสั่งส่งซ้ำด้วยตนเองคง body เดิมและลงนามด้วย secret ปัจจุบันของผู้รับ ดังนั้น เมื่อเปลี่ยน secret ต้องอัปเดตฝั่งรับให้สอดคล้องกัน แต่ละการส่งบันทึก id และ URL ของผู้รับที่ส่งไป การส่งซ้ำอัตโนมัติหรือการสั่งส่งซ้ำด้วยตนเองจะส่งเฉพาะเมื่อผู้รับที่มี id นั้นยังใช้ URL เดิม และถูกปฏิเสธเมื่อ URL เปลี่ยน ผู้รับถูกลบ หรือการส่งเกิดก่อนมีการบันทึกปลายทาง ผู้รับใหม่ได้ id แบบสุ่มและใช้ id ที่มีประวัติการส่งแล้วไม่ได้ อย่าป้องกันซ้ำด้วย X-Deewan-Delivery อย่างเดียว เพราะค่านี้ใช้ซ้ำกับเหตุการณ์อื่น
การตอบรับและส่งซ้ำ
หัวข้อที่มีชื่อว่า “การตอบรับและส่งซ้ำ”สถานะ 2xx ใด ๆ ยืนยันการรับ กำหนดเวลาคำขอเริ่มต้นคือ 5 วินาที เครือข่ายเข้าถึงไม่ได้ HTTP 408, 429 และ 5xx ส่งซ้ำได้ HTTP ที่ปฏิเสธแบบอื่นสิ้นสุดทันที ส่งรวมไม่เกินห้าครั้งด้วยเวลารอแบบเพิ่มทวีคูณจากหนึ่งนาที สูงสุดหนึ่งชั่วโมง และ jitter 50–100% Retry-After ที่ถูกต้องแบบวินาทีหรือวันที่เพิ่มเวลารอได้ แต่ไม่เกินหนึ่งชั่วโมง เมื่อครบขีดจำกัดจะหยุดส่งซ้ำอัตโนมัติ
ตัวประมวลผลตามเวลาจองรายการที่ถึงกำหนดและตรวจผู้รับปัจจุบันอีกครั้ง ผู้รับที่ลบหรือปิดแล้วไม่รับการส่งซ้ำ อย่าสมมติว่ามีลำดับตายตัวหรือส่งเพียงครั้งเดียว การตอบรับที่สูญหายหรือการกู้ lease อาจส่งเหตุการณ์ที่เกิดผลแล้วซ้ำ ฝั่งรับควรบันทึกเหตุการณ์ที่รับไว้อย่างถาวรและดำเนินการที่เป็นผลจากเหตุการณ์นั้นในธุรกรรมเดียวกันก่อนตอบรับ ใช้รายละเอียดการส่งที่มีอยู่ในส่วน การตั้งค่า เพื่อตรวจข้อผิดพลาดหรือสั่งส่งซ้ำด้วยตนเอง อย่าถือว่าคำตอบล้มเหลวพิสูจน์ว่าไม่มีผลเกิดขึ้น
การตรวจรับฝั่งผู้รับ
หัวข้อที่มีชื่อว่า “การตรวจรับฝั่งผู้รับ”ตรวจว่าปฏิเสธลายเซ็นผิด ไบต์ที่เปลี่ยน เว็บไซต์ผิด และเหตุการณ์ที่ไม่รองรับ ยืนยันว่า ID ซ้ำไม่ทำให้เกิดผลซ้ำ ID ต่างกันในผู้รับเดียวกันยังทำงาน และส่งซ้ำได้อย่างปลอดภัยหลังตอบรับสูญหาย ผู้รับสำหรับค้นหาต้องทำตาม สัญญาสร้างดัชนีครบชุดและถอนข้อมูล ไม่ใช่ upsert ไปเรื่อย ๆ
ซอร์สอ้างอิง: backend/src/lib/outbound-webhook.ts, backend/src/lib/outbound-retry.ts และ backend/src/lib/lifecycle/publication-effects.ts กฎส่งซ้ำขาออกนี้แยกจาก โปรโตคอลปลั๊กอิน
ขั้นตอนถัดไป
หัวข้อที่มีชื่อว่า “ขั้นตอนถัดไป”จัดการเนื้อหาจากสคริปต์และเอเจนต์ AI ผ่าน API จัดการ CMS
ยังไม่เปิดตัว (pre-MVP) และยังไม่มีเวอร์ชันเสถียร
คอมมิตซอร์สโค้ด: fe23db481c422b40e317b92fc98116b4c0c26a87 (มีการแก้ไขที่ยังไม่คอมมิต)
วันที่สร้างเอกสาร (UTC): 2026-10-18T09:22:34.630Z
คอมมิตสำหรับอัปเกรด: ระบุไม่ได้: มีการแก้ไขที่ยังไม่คอมมิต. บันทึกการเปลี่ยนแปลง