ช่องทาง (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 |
| Private | private: | ✅ ต้องแนบ auth.sig | ข้อมูลความปลอดภัยสูง เช่น การแจ้งเตือนผู้ใช้งานรายบุคคล, Private Dashboards, ระบบแชทองค์กร |
2. Public Channels (ช่องทางสาธารณะ)
ตั้งชื่ออิสระ (Free-form / Dynamic) — ไม่ต้องสร้างล่วงหน้า ไม่ต้อง auth เพิ่มเติม ตั้งชื่ออะไรก็ได้ขอแค่ไม่ขึ้นต้นด้วย private::
// 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 workspacegame:lobby_alpha— Game lobbyiot:sensor_temp_001— IoT data stream
3. Private Channels (ช่องทางส่วนตัว)
ชื่อต้องขึ้นต้นด้วย private: (เช่น `private:user_456`) ไม่ต้องลงทะเบียนล่วงหน้า ใช้แบบ Dynamic ได้เลย แต่เพื่อความปลอดภัย
เมื่อ Client จะ subscribe channel แบบ private ต้อง:
- เรียก API ของคุณ (Backend) เพื่อขอ Signature (HMAC) สำหรับ channel นั้น
- แนบ Signature ไปกับคำสั่ง subscribe
// 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 ยังไง?
// 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:
{
"v": 1,
"type": "reply",
"status": "error",
"error": {
"code": "CHANNEL_DENIED",
"msg": "must subscribe to channel before publishing"
}
}ตัวอย่าง Flow ที่ถูกต้อง:
// ✅ ถูกต้อง: 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พร้อมกัน
