43 lines
1.0 KiB
TypeScript
43 lines
1.0 KiB
TypeScript
'use strict'
|
|
import _debug from 'debug'
|
|
import map from 'lodash/map'
|
|
import { Socket, Server } from 'socket.io'
|
|
|
|
const debug = _debug('peercalls:socket')
|
|
|
|
type SocketWithRoom = Socket & { room?: string }
|
|
|
|
export default function handleSocket(socket: SocketWithRoom, io: Server) {
|
|
socket.on('signal', payload => {
|
|
// debug('signal: %s, payload: %o', socket.id, payload)
|
|
io.to(payload.userId).emit('signal', {
|
|
userId: socket.id,
|
|
signal: payload.signal,
|
|
})
|
|
})
|
|
|
|
socket.on('ready', roomName => {
|
|
debug('ready: %s, room: %s', socket.id, roomName)
|
|
if (socket.room) socket.leave(socket.room)
|
|
socket.room = roomName
|
|
socket.join(roomName)
|
|
socket.room = roomName
|
|
|
|
const users = getUsers(roomName)
|
|
|
|
debug('ready: %s, room: %s, users: %o', socket.id, roomName, users)
|
|
|
|
io.to(roomName).emit('users', {
|
|
initiator: socket.id,
|
|
users,
|
|
})
|
|
})
|
|
|
|
function getUsers (roomName: string) {
|
|
return map(io.sockets.adapter.rooms[roomName].sockets, (_, id) => {
|
|
return { id }
|
|
})
|
|
}
|
|
|
|
}
|