عند بناء خادم 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,
});
},
},
});