Skip to content

เหตุการณ์ที่ส่งมาจากระบบ (Server Events)

เมื่อคุณรับฟัง (Listen) ข้อมูลที่ส่งกลับมาจาก WebSocket (ws.onmessage) ของ RawPush คุณจะพบว่าข้อมูลถูกส่งกลับมาในรูปแบบ JSON (Envelope) เสมอ

โดยเราจะประเมินชนิดของข้อความหลักๆ ผ่านฟิลด์ type ซึ่งแบ่งออกเป็น 3 หมวดหมู่ด้วยกัน:


🔧 1. Type: system (System Notifications)

Event ประเภทนี้ไม่ได้ถูกสร้างโดยฝั่ง Client แต่เป็นข้อความจาก Gateway Server ของ RawPush เพื่อดำเนินการแจ้งเตือนสถานะต่างๆ ของ Connection

ตัวอย่าง System Event พื้นฐานที่คุณจะได้รับเมื่อเชื่อมต่อสำเร็จและส่งคำสั่ง Auth ผ่าน:

json
{
  "v": 1,
  "type": "system",
  "event": "connection.established",
  "data": {
    "connection_id": "conn_01HGW...",
    "uptime": 0
  }
}

และอีกตัวอย่างที่ผู้ใช้มักจะพบในกรณีเกิดข้อขัดข้องทางเทคนิค เช่น Token หมดอายุ, Signature ไม่ผ่านเกณฑ์ Validation หรือไม่มีการส่งคำสั่ง auth มาภายในระยะเวลา 10 วินาทีตามที่กำหนด:

json
{
  "v": 1,
  "type": "system",
  "event": "error",
  "data": {
    "code": 4001,
    "message": "Authentication timeout"
  }
}

(หลังจาก System Error นี้ Server จะ close connection ทันที)


💬 2. Type: event (Real-time Broadcast Data)

นี่คือ Core Component ของระบบ Real-time Data ข้อมูลทุกชนิดที่ถูกดำเนินการ Publish ไม่ว่าจะผ่าน REST API หรือ WebSocket จะแสดงผลลัพธ์โครงสร้างเดียวกันดังนี้:

json
{
  "v": 1,
  "type": "event",
  "id": "evt_98fbn3k...",
  "channel": "updates:feed_1",
  "event": "new_item",
  "data": {
    "item_id": "itm_49921",
    "action": "created",
    "payload": { "title": "New order received" }
  },
  "sender": {
    "session_id": "conn_01HGW...",
    "user_id": "user_444"
  }
}

วิธีการวิเคราะห์ Payload ข้อมูล:

  • channel: ใช้ระบุ Target หน้าที่ของชุดข้อมูล (เช่น การอัปเดต UI Feed, ตาราง Dashboard หรือแผนที่องค์กร)
  • event: การตั้งชื่อ Event จะเป็นไปตามที่ Publisher กำหนด (Customizable Naming Convention)
  • data: Payload ของข้อมูลดิบที่คุณดำเนินการออกแบบโครงสร้างไว้ในระบบ (RawPush ทำหน้าที่เพียว Routing และต้องเป็นสถาปัตยกรรม JSON เท่านั้น)
  • sender: ออบเจกต์ที่ทำหน้าที่ระบุแหล่งที่มาและผู้ส่ง ประกอบด้วย session_id และ user_id — หากเป็นการใช้งานระบบผ่าน REST API ข้อมูล user_id จะมีค่าส่งกลับอัตโนมัติเป็น "system"

📩 3. Type: reply (Acknowledgment)

ทุกครั้งที่คุณส่งคำสั่ง (cmd) ใด ๆ จากฝั่ง Client สู่ RawPush (ตัวอย่างเช่น Subscribe ห้อง, ระบบ Ping หรือการ Publish Message) ระบบจะตอบสนองด้วยข้อความ Acknowledgment ทันที เพื่อประเมินผลและประทับตรายืนยันสถานะของการทำคำสั่งเหล่านั้น (Execution Context)

การตอบรับเหล่านี้ยังรวมรหัส ref (Reference Identifier) เพื่อให้คุณสามารถจับคู่เข้ากับเหตุการณ์หรือกระบวนการของคุณได้ตรงจุด

ตัวอย่าง Acknowledgment ว่าทำคำสั่ง Subscribe สำเร็จ:

json
{
  "v": 1,
  "type": "reply",
  "ref": "sub-01",
  "status": "ok"
}

ตัวอย่าง Acknowledgment ว่าคำสั่ง Publish ข้อความล้มเหลว (เช่น ขาดสิทธิ์ดำเนินการ):

json
{
  "v": 1,
  "type": "reply",
  "ref": "pub-01",
  "status": "error",
  "error": {
    "code": "CHANNEL_DENIED",
    "msg": "Permission denied for this channel"
  }
}

💡 State Management ขา Client

การมี Type reply ช่วยให้นักพัฒนาสามารถเขียนโค้ดเพื่อควบคุม Promise Flow หรือ Control Flow ได้โดยง่าย ตัวอย่างเช่น: สามารถพักสถานะเป็น "กำลังเชื่อมต่อ..." แบบ Blocking ข้อมูล และจะทำการ Update User Interface เป็น "เชื่อมต่อสำเร็จ" ทันทีที่ผลลัพธ์ปรากฏว่า status: "ok" จาก Gateway Server

Released under the MIT License.