/** * Create WebSocket handler for Bun server * @param {Object} dropApis - Map of dropName -> { websocket } * @returns {Object} WebSocket handler */ export function createWebSocketHandler(dropApis) { return { /** * Called when a new WebSocket connection is opened */ open(ws) { const { dropName } = ws.data const dropWs = dropApis[dropName]?.websocket if (dropWs && dropWs.open) { dropWs.open(ws) } // Subscribe to drop-specific channel ws.subscribe(dropName) console.log(`🔌 WebSocket connected: ${dropName}`) }, /** * Called when a message is received */ message(ws, message) { const { dropName } = ws.data const dropWs = dropApis[dropName]?.websocket if (dropWs && dropWs.message) { dropWs.message(ws, message) } }, /** * Called when connection is closed */ close(ws, code, reason) { const { dropName } = ws.data const dropWs = dropApis[dropName]?.websocket if (dropWs && dropWs.close) { dropWs.close(ws, code, reason) } console.log(`🔌 WebSocket disconnected: ${dropName}`) }, /** * Called when there's an error */ error(ws, error) { const { dropName } = ws.data const dropWs = dropApis[dropName]?.websocket if (dropWs && dropWs.error) { dropWs.error(ws, error) } console.error(`🔌 WebSocket error (${dropName}):`, error) } } }