65 lines
1.5 KiB
JavaScript
65 lines
1.5 KiB
JavaScript
/**
|
|
* 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)
|
|
}
|
|
}
|
|
}
|