Fix ws.ts: use SocketStream from @fastify/websocket v8

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-17 18:16:12 +03:00
parent d3045194a6
commit 7b045b38a6

View File

@@ -1,36 +1,37 @@
import { FastifyPluginAsync } from 'fastify'
import fastifyWebsocket from '@fastify/websocket'
import type { WebSocket, RawData } from 'ws'
import type { SocketStream } from '@fastify/websocket'
import type { RawData } from 'ws'
// hotel slug → set of connected clients
const hotelRooms = new Map<string, Set<WebSocket>>()
// hotel slug → set of connected streams
const hotelRooms = new Map<string, Set<SocketStream>>()
const ws: FastifyPluginAsync = async (fastify) => {
await fastify.register(fastifyWebsocket)
fastify.get<{ Querystring: { hotel?: string; token?: string } }>(
fastify.get<{ Querystring: { hotel?: string } }>(
'/ws',
{ websocket: true },
(socket, request) => {
const hotel = request.query.hotel ?? ''
if (!hotel) { socket.close(4001, 'hotel required'); return }
(connection: SocketStream, request) => {
const hotel = (request.query as { hotel?: string }).hotel ?? ''
if (!hotel) { connection.socket.close(4001, 'hotel required'); return }
if (!hotelRooms.has(hotel)) hotelRooms.set(hotel, new Set())
hotelRooms.get(hotel)!.add(socket)
hotelRooms.get(hotel)!.add(connection)
socket.on('message', (raw: RawData) => {
connection.socket.on('message', (raw: RawData) => {
const data = raw.toString()
const peers = hotelRooms.get(hotel)
if (!peers) return
peers.forEach(client => {
if (client !== socket && client.readyState === 1) {
client.send(data)
peers.forEach(peer => {
if (peer !== connection && peer.socket.readyState === 1) {
peer.socket.send(data)
}
})
})
socket.on('close', () => {
hotelRooms.get(hotel)?.delete(socket)
connection.socket.on('close', () => {
hotelRooms.get(hotel)?.delete(connection)
if (hotelRooms.get(hotel)?.size === 0) hotelRooms.delete(hotel)
})
},