import type { SocketMessage } from "#shared/websocket.util"; import type { User } from "~/types/auth"; export default defineWebSocketHandler({ message(peer, message) { const data = message.json(); switch(data.type) { case 'PING': peer.send(JSON.stringify({ type: 'PONG' })); return; default: return; } }, async open(peer) { const id = new URL(peer.request.url).pathname.split('/').slice(-1)[0]; if(!id) return peer.close(); const session = await getUserSession(peer); if(!session ||!session.user) return peer.close(); peer.context.user = session.user; const topic = `campaigns/${id}`; peer.subscribe(topic); peer.publish(topic, { type: 'user', data: [{ user: (peer.context.user as User).id, status: true }] }); peer.send({ type: 'user', data: peer.peers.values().filter(e => e.topics.has(topic)).map(e => ({ user: (e.context.user as User).id, status: true })).toArray() }) }, close(peer, details) { const id = new URL(peer.request.url).pathname.split('/').slice(-1)[0]; if(!id) return peer.close(); peer.publish(`campaigns/${id}`, { type: 'user', data: [{ user: (peer.context.user as User).id, status: false }] }); peer.unsubscribe(`campaigns/${id}`); } });