Skip to content

عند بناء خادم WebSocket، يكون من الضروري عادةً تخزين بعض معلومات التعريف أو السياق المرتبطة بكل عميل متصل.

مع Bun.serve()، يتم تعيين هذه "البيانات السياقية" عند ترقية الاتصال مبدئيًا عن طريق تمرير معامل data في استدعاء server.upgrade().

ts
Bun.serve({
  fetch(req, server) {
    const success = server.upgrade(req, {
      data: {
        socketId: Math.random(),
      },
    });
    if (success) return undefined;

    // معالجة طلب HTTP بشكل طبيعي
    // ...
  },
  websocket: {
    // TypeScript: تحديد نوع ws.data مثل هذا
    data: {} as { socketId: number },

    // تعريف معالجات websocket
    async message(ws, message) {
      // البيانات السياقية متاحة كخاصية `data`
      // على مثيل WebSocket
      console.log(`تم استلام ${message} من ${ws.data.socketId}`);
    },
  },
});

من الشائع قراءة ملفات تعريف الارتباط/الترويسات من الطلب الوارد لتحديد هوية العميل المتصل.

ts
type WebSocketData = {
  createdAt: number;
  token: string;
  userId: string;
};

Bun.serve({
  async fetch(req, server) {
    // استخدام مكتبة لتحليل ملفات تعريف الارتباط
    const cookies = parseCookies(req.headers.get("Cookie"));
    const token = cookies["X-Token"];
    const user = await getUserFromToken(token);

    const upgraded = server.upgrade(req, {
      data: {
        createdAt: Date.now(),
        token: cookies["X-Token"],
        userId: user.id,
      },
    });

    if (upgraded) return undefined;
  },
  websocket: {
    // TypeScript: تحديد نوع ws.data مثل هذا
    data: {} as WebSocketData,

    async message(ws, message) {
      // حفظ الرسالة في قاعدة بيانات
      await saveMessageToDatabase({
        message: String(message),
        userId: ws.data.userId,
      });
    },
  },
});

Bun بواسطة www.bunjs.com.cn تحرير