Demo

WebSocket

@Websocket ဖြင့် IWebsocket handler သတ်မှတ်ရပါသည်၊ path အလိုက် WebsocketServer ကို inject လုပ်ပြီး client များသို့ text / binary ကို send သို့မဟုတ် brocast လုပ်နိုင်ပါသည်။

Define & register

@Websocket ဖြင့် decorate လုပ်ထားသော IWebsocket class ကို root module ၏ websocket တွင် မှတ်ပုံတင်ရပါသည်။ send / brocast အတွက် တူညီသော path ဖြင့် WebsocketServer ကို inject လုပ်ရပါသည်။

  • @Websocket({ path, ssl?, pingpongInterval? }) — URL path; pingpongInterval သည် keep-alive (ms)
  • @Module({ websocket: [ChatWebsocket] }) — handler ကို မှတ်ပုံတင်ပါသည်
  • @InjectWebsocketServer("/chat-websocket") — ထို path အတွက် server inject (handler / service / controller)
  • onAuthenticate — ClientInfo ({ id, … }) ပြန်လျှင် လက်ခံပါသည်; null ဆို ပယ်ချပါသည်
TSXhandler + module
1import { 2 InjectWebsocketServer, 3 Module, 4 Websocket, 5 WebsocketServer, 6} from "@quan-erp/shared-backend-core"; 7import type { 8 ClientInfo, 9 IWebsocket, 10 WebsocketClient, 11 WebsocketEvents, 12} from "@quan-erp/shared-backend-core"; 13import type { IncomingMessage } from "http"; 14import type WebSocket from "ws"; 15import metadata from "../../module.metadata.json" with { type: "json" }; 16 17@Websocket({ 18 ssl: false, 19 pingpongInterval: 1000, 20 path: "/chat-websocket", 21}) 22export class ChatWebsocket implements IWebsocket { 23 @InjectWebsocketServer("/chat-websocket") 24 websocket: WebsocketServer; 25 26 onAuthenticate(ws: WebSocket, req: IncomingMessage): ClientInfo | null { 27 return { id: "user-42" }; // null rejects the connection 28 } 29 30 on( 31 event: WebsocketEvents, 32 client: WebsocketClient, 33 data: any, 34 isBinary: boolean, 35 ) { 36 // see receive section 37 } 38 39 onUpgrade() {} 40 onDestoryed() {} 41} 42 43@Module({ 44 name: metadata.name, 45 providers: [], 46 controllers: [], 47 entities: [], 48 websocket: [ChatWebsocket], 49}) 50export class MyPluginModule {}

Message wrappers

Outbound payload သည် WebsocketMessage (getMessage()) ဖြစ်ရပါမည်။ Built-in wrapper များကို အသုံးပြုရပါသည် — sendText / brocast သို့ raw string မပို့ရပါ။

  • WebsocketTextEventMessage(event, payload) — JSON { event, payload }; app event အတွက် ဦးစားပေးရပါသည်
  • WebsocketTextMessage(data) — plain text / raw JSON string
  • WebsocketBinaryMessage(payload: Buffer) — binary Buffer
TSXwrappers
1import { 2 WebsocketBinaryMessage, 3 WebsocketTextEventMessage, 4 WebsocketTextMessage, 5} from "@quan-erp/shared-backend-core"; 6 7new WebsocketTextEventMessage("kitchen", { orderId: 12 }); 8// → send/brocast as JSON: {"event":"kitchen","payload":{"orderId":12}} 9 10new WebsocketTextMessage("Hello"); 11// → plain text frame 12 13new WebsocketBinaryMessage(Buffer.from([0x01, 0x02])); 14// → binary frame

Send text (client တစ်ဦး)

onAuthenticate မှ ClientInfo.id ဖြင့် ပစ်မှတ်ထားရပါသည်။ sendText သည် WebsocketTextEventMessage သို့မဟုတ် WebsocketTextMessage ကို လက်ခံပါသည်။

TSXsendText
1import { 2 InjectWebsocketServer, 3 Service, 4 WebsocketServer, 5 WebsocketTextEventMessage, 6 WebsocketTextMessage, 7} from "@quan-erp/shared-backend-core"; 8 9@Service() 10export class ChatPushService { 11 @InjectWebsocketServer("/chat-websocket") 12 private ws: WebsocketServer; 13 14 notifyUser(userId: string) { 15 this.ws.sendText( 16 userId, 17 new WebsocketTextEventMessage("inbox", { 18 title: "New message", 19 }), 20 ); 21 22 this.ws.sendText( 23 userId, 24 new WebsocketTextMessage("ping"), 25 ); 26 } 27}

Send binary (client တစ်ဦး)

Buffer payload အတွက် sendBinary နှင့် WebsocketBinaryMessage ကို အသုံးပြုရပါသည်။

TSXsendBinary
1import { 2 InjectWebsocketServer, 3 Service, 4 WebsocketBinaryMessage, 5 WebsocketServer, 6} from "@quan-erp/shared-backend-core"; 7 8@Service() 9export class FileStreamService { 10 @InjectWebsocketServer("/chat-websocket") 11 private ws: WebsocketServer; 12 13 pushChunk(clientId: string, chunk: Buffer) { 14 this.ws.sendBinary( 15 clientId, 16 new WebsocketBinaryMessage(chunk), 17 ); 18 } 19}

Brocast (client အားလုံး)

WebsocketServer.brocast (API စာလုံးပေါင်း brocast) သည် ထို path ပေါ်ရှိ client အားလုံးသို့ WebsocketMessage တစ်ခု ပို့ပါသည်။

  • Method name သည် brocast — broadcast မဟုတ်ပါ
  • Controller/service မှ domain write ပြီးနောက် အသုံးပြုနိုင်ပါသည်
  • Payload သည် WebsocketMessage wrapper ဖြစ်ရပါမည်
TSXbrocast from controller
1import { 2 Controller, 3 InjectWebsocketServer, 4 Post, 5 ResponseDto, 6 WebsocketServer, 7 WebsocketTextEventMessage, 8} from "@quan-erp/shared-backend-core"; 9 10@Controller("/order") 11export class OrderController { 12 @InjectWebsocketServer("/chat-websocket") 13 private wsServer: WebsocketServer; 14 15 @Post("/") 16 async create() { 17 // … persist order … 18 this.wsServer.brocast( 19 new WebsocketTextEventMessage("kitchen", "New Order"), 20 ); 21 return ResponseDto.ok({ ok: true }); 22 } 23}
TSXbrocast binary
1import { 2 WebsocketBinaryMessage, 3 WebsocketServer, 4} from "@quan-erp/shared-backend-core"; 5 6declare const ws: WebsocketServer; 7ws.brocast(new WebsocketBinaryMessage(Buffer.from("raw-bytes")));

လက်ရှိ client သို့ raw send

on() အတွင်း client.getWebsocket().send(...) ဖြင့်လည်း ပို့နိုင်ပါသည်။ client id / brocast အတွက် WebsocketServer helper များကို ဦးစားပေးရပါသည်။

TSXraw send
1import type { WebsocketClient } from "@quan-erp/shared-backend-core"; 2import { WebsocketTextEventMessage } from "@quan-erp/shared-backend-core"; 3 4function reply(client: WebsocketClient) { 5 client 6 .getWebsocket() 7 .send(new WebsocketTextEventMessage("ack", { ok: true }).getMessage()); 8}

Text & binary လက်ခံခြင်း

on(event, client, data, isBinary) ကို lifecycle နှင့် frame များအတွက် ခေါ်ပါသည်။ WebsocketMessageHandler ဖြင့် structured text event ({ event, payload }) နှင့် generic message/close ကို ခွဲရပါသည်။ Binary သည် JSON event parse မလုပ်ပါ။

  • isBinary === false — data သည် string; event field ရှိ JSON ကို onTextEvent ဖြင့် ကိုက်ညီနိုင်ပါသည်
  • isBinary === true — binary; .on("message", …) သုံးရပါသည်
  • onTextEvent callback တွင် arg မရှိပါ — လိုအပ်လျှင် on() မှ data / client ကို close over လုပ်ရပါသည်
  • Chain အဆုံးတွင် .execute() ကို အမြဲ ခေါ်ရပါသည်
TSXreceive
1import { 2 InjectWebsocketServer, 3 Websocket, 4 WebsocketMessageHandler, 5 WebsocketServer, 6 WebsocketTextEventMessage, 7} from "@quan-erp/shared-backend-core"; 8import type { 9 IWebsocket, 10 WebsocketClient, 11 WebsocketEvents, 12} from "@quan-erp/shared-backend-core"; 13 14@Websocket({ ssl: false, pingpongInterval: 1000, path: "/chat-websocket" }) 15export class ChatWebsocket implements IWebsocket { 16 @InjectWebsocketServer("/chat-websocket") 17 websocket: WebsocketServer; 18 19 onAuthenticate() { 20 return { id: "user-42" }; 21 } 22 23 on( 24 event: WebsocketEvents, 25 client: WebsocketClient, 26 data: any, 27 isBinary: boolean, 28 ) { 29 new WebsocketMessageHandler(event, data, isBinary) 30 .onTextEvent("chat-room", () => { 31 const parsed = JSON.parse(String(data)); 32 this.websocket.brocast( 33 new WebsocketTextEventMessage("chat-room", parsed.payload), 34 ); 35 }) 36 .on("message", () => { 37 if (isBinary) { 38 // Buffer / ArrayBuffer-like frame in data 39 return; 40 } 41 // plain text or non-event JSON 42 }) 43 .on("close", () => { 44 // client disconnected 45 }) 46 .execute(); 47 } 48 49 onUpgrade() {} 50 onDestoryed() {} 51}

Client များ စစ်ဆေးခြင်း

  • getAllClients() — ဤ path ပေါ်ရှိ WebsocketClient အားလုံး
  • getByClientId(id) — ထို id ၏ socket များ (array သို့မဟုတ် null)
  • client.getClientId() / getClientData() — onAuthenticate မှ identity

WebsocketServer API

  • sendText(clientId, WebsocketTextEventMessage | WebsocketTextMessage)
  • sendBinary(clientId, WebsocketBinaryMessage)
  • brocast(WebsocketMessage) — path ပေါ်ရှိ client အားလုံး
  • getByClientId(clientId) / getAllClients()