40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import type { SocketMessage } from "#shared/websocket.util";
|
|
|
|
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);
|
|
},
|
|
close(peer, details) {
|
|
const id = new URL(peer.request.url).pathname.split('/').slice(-1)[0];
|
|
if(!id) return peer.close();
|
|
|
|
peer.unsubscribe(`campaigns/${id}`);
|
|
}
|
|
}); |