Skip to content

ช่องทาง (Channels)

เมื่อคุณเชื่อมต่อและผ่านการ Authentication แล้ว ข้อมูลทั้งหมดใน RawPush จะถูกจัดกลุ่มแยกด้วยแนวคิดที่เรียกว่า Channel

Channel คือเส้นทางข้อมูลที่ Client สามารถ Subscribe (รับข้อมูล) หรือ Publish (ส่งข้อมูล) ได้ รองรับทุก Use case ที่ต้องการส่งข้อมูลแบบ Real-time

1. ประเภทของ Channel

RawPush รองรับ 2 ประเภท:

ประเภทPrefixต้อง Auth ตอน Subscribe?ใช้งาน
Publicเลือกตั้งชื่อได้อย่างอิสระ❌ ไม่ต้องข้อมูลเปิดเผยสาธารณะ เช่น Ticker ราคา, Game State, IoT Sensor Data
Privateprivate:✅ ต้องแนบ auth.sigข้อมูลความปลอดภัยสูง เช่น การแจ้งเตือนผู้ใช้งานรายบุคคล, Private Dashboards, ระบบแชทองค์กร

2. Public Channels (ช่องทางสาธารณะ)

ตั้งชื่ออิสระ (Free-form / Dynamic) — ไม่ต้องสร้างล่วงหน้า ไม่ต้อง auth เพิ่มเติม ตั้งชื่ออะไรก็ได้ขอแค่ไม่ขึ้นต้นด้วย private::

javascript
// Subscribe ได้ทันทีหลัง auth สำเร็จ
ws.send(JSON.stringify({
  cmd: "subscribe",
  channel: "ticker:btc_usd",
  ref: "sub-1"
}));

ตัวอย่างชื่อยอดนิยม:

  • updates:feed_123 — กระจายข่าวสาร/อัปเดต
  • notifications:user_456 — การแจ้งเตือน
  • ticker:btc_usd — ราคาสินค้า
  • system:alerts — ข้อมูลภาพรวมระบบ
  • collab:room — Collaborative workspace
  • game:lobby_alpha — Game lobby
  • iot:sensor_temp_001 — IoT data stream

3. Private Channels (ช่องทางส่วนตัว)

ชื่อต้องขึ้นต้นด้วย private: (เช่น `private:user_456`) ไม่ต้องลงทะเบียนล่วงหน้า ใช้แบบ Dynamic ได้เลย แต่เพื่อความปลอดภัย

เมื่อ Client จะ subscribe channel แบบ private ต้อง:

  1. เรียก API ของคุณ (Backend) เพื่อขอ Signature (HMAC) สำหรับ channel นั้น
  2. แนบ Signature ไปกับคำสั่ง subscribe
javascript
// 1. ขอลายเซ็นจาก Backend ของคุณ
const { sig } = await fetch('/api/channel-auth', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ channel: 'private:orders_user123', user_id: myUserId })
}).then(r => r.json());

// 2. Subscribe พร้อมลายเซ็น
ws.send(JSON.stringify({
  cmd: "subscribe",
  channel: "private:orders_user123",
  auth: { sig },
  ref: "sub-private"
}));

Backend sign ยังไง?

javascript
// HMAC-SHA256(secret_key, "channel_name:user_id")
const sig = crypto
  .createHmac('sha256', SECRET_KEY)
  .update(`private:orders_user123:user_abc`, 'utf8')
  .digest('hex');

4. กฎสำคัญ: Subscribe ก่อน Publish

⚠️ ต้อง Subscribe ก่อนถึงจะ Publish ได้

ไม่ว่า Channel จะเป็น Public หรือ Private — คุณต้อง Subscribe เข้า Channel นั้นก่อนเสมอ ถึงจะสามารถ Publish ข้อมูลเข้าไปได้

หากพยายาม Publish ไปยัง Channel ที่ยังไม่ได้ Subscribe จะได้รับ Error:

json
{
  "v": 1,
  "type": "reply",
  "status": "error",
  "error": {
    "code": "CHANNEL_DENIED",
    "msg": "must subscribe to channel before publishing"
  }
}

ตัวอย่าง Flow ที่ถูกต้อง:

javascript
// ✅ ถูกต้อง: Subscribe ก่อน → แล้วค่อย Publish
ws.send(JSON.stringify({ cmd: "subscribe", channel: "collab:room", ref: "sub-1" }));

// ... รอ Reply status: "ok" จาก subscribe ...

ws.send(JSON.stringify({
  cmd: "publish",
  channel: "collab:room",
  event: "mouse_move",
  data: { x: 0.5, y: 0.3 }
}));

// ❌ ผิด: Publish โดยไม่เคย Subscribe → ได้ CHANNEL_DENIED
ws.send(JSON.stringify({
  cmd: "publish",
  channel: "some:room",
  event: "test",
  data: {}
}));

5. การตั้งชื่อ Channel (Channel Naming)

  • ตัวอักษรภาษาอังกฤษ, ตัวเลข, ขีดกลาง (-), ขีดล่าง (_), จุด (.)
  • ใช้เครื่องหมายโคลอน (:) เพื่อแบ่ง namespace เช่น updates:feed_123
  • ความยาวไม่เกิน 128 ตัวอักษร

6. Subscription Limits

  • Client 1 Connection สามารถ Subscribe ได้สูงสุดตาม Plan (ค่าเริ่มต้น 50 channels)
  • ตัวอย่าง: หน้าจอเทรดดิ้ง 1 หน้า อาจ Subscribe ticker:thb, ticker:jpy, ticker:usd พร้อมกัน

Released under the MIT License.