44 lines
1.6 KiB
TypeScript
44 lines
1.6 KiB
TypeScript
import type { SocketMessage } from "#shared/websocket.util";
|
|
import type { User } from "~/types/auth";
|
|
|
|
export default defineWebSocketHandler({
|
|
message(peer, message) {
|
|
const id = new URL(peer.request.url).pathname.split('/').slice(-1)[0];
|
|
if(!id) return peer.close();
|
|
|
|
const topic = `campaigns/${id}`;
|
|
const data = message.json<SocketMessage>();
|
|
switch(data.type)
|
|
{
|
|
case 'PING':
|
|
peer.send(JSON.stringify({ type: 'PONG' }));
|
|
return;
|
|
|
|
case 'character':
|
|
peer.publish(topic, data);
|
|
peer.send(data);
|
|
|
|
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: 'status', data: [{ user: (peer.context.user as User).id, status: true }] });
|
|
peer.send({ type: 'status', 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: 'status', data: [{ user: (peer.context.user as User).id, status: false }] });
|
|
peer.unsubscribe(`campaigns/${id}`);
|
|
}
|
|
}); |