48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
import * as NotifyActions from '../actions/NotifyActions.js'
|
|
import _ from 'underscore'
|
|
import _debug from 'debug'
|
|
import peers from './peers.js'
|
|
import store from '../store.js'
|
|
|
|
const debug = _debug('peercalls')
|
|
const { dispatch } = store
|
|
|
|
export default function handshake ({ socket, roomName, stream }) {
|
|
function createPeer (user, initiator) {
|
|
return peers.create({ socket, user, initiator, stream })
|
|
}
|
|
|
|
socket.on('signal', payload => {
|
|
let peer = peers.get(payload.userId)
|
|
let signal = payload.signal
|
|
// debug('socket signal, userId: %s, signal: %o', payload.userId, signal);
|
|
|
|
if (!peer) return debug('user: %s, no peer found', payload.userId)
|
|
peer.signal(signal)
|
|
})
|
|
|
|
socket.on('users', payload => {
|
|
let { initiator, users } = payload
|
|
debug('socket users: %o', users)
|
|
dispatch(
|
|
NotifyActions.info('Connected users: {0}', users.length)
|
|
)
|
|
|
|
users
|
|
.filter(user => !peers.get(user.id) && user.id !== socket.id)
|
|
.forEach(user => createPeer(user, initiator))
|
|
|
|
let newUsersMap = _.indexBy(users, 'id')
|
|
peers.getIds()
|
|
.filter(id => !newUsersMap[id])
|
|
.forEach(peers.destroy)
|
|
})
|
|
|
|
debug('socket.id: %s', socket.id)
|
|
debug('emit ready for room: %s', roomName)
|
|
dispatch(
|
|
NotifyActions.info('Ready for connections')
|
|
)
|
|
socket.emit('ready', roomName)
|
|
}
|