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 ဆို ပယ်ချပါသည်
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
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 frameSend text (client တစ်ဦး)
onAuthenticate မှ ClientInfo.id ဖြင့် ပစ်မှတ်ထားရပါသည်။ sendText သည် WebsocketTextEventMessage သို့မဟုတ် WebsocketTextMessage ကို လက်ခံပါသည်။
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 ကို အသုံးပြုရပါသည်။
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 ဖြစ်ရပါမည်
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}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 များကို ဦးစားပေးရပါသည်။
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() ကို အမြဲ ခေါ်ရပါသည်
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()