diff --git a/client/peer.js b/client/peer.js index eeeab5a..f1bf166 100644 --- a/client/peer.js +++ b/client/peer.js @@ -2,6 +2,58 @@ function errorHandler(error) { console.log(error); } +export function createHost(peerExchange, peerConnectionConfig) { + const listeners = new Set(); + + function onConnection(callback) { + listeners.push(callback); + } + + function emitConnection(conn) { + listeners.forEach(callback => callback(conn)); + } + + function handleSDP(sdp) { + host.setRemoteDescription(new RTCSessionDescription(signal.sdp)); + } + + peerExchange.listen(async (signal, send) => { + if (signal.sdp && signal.sdp.type === "offer") { + const host = createConn(peerExchange, peerConnectionConfig); + + const remoteDesc = new RTCSessionDescription(signal.sdp); + await host.setRemoteDescription(remoteDesc); + + const localDesc = await conn.createAnswer(); + await host.setLocalDescription(localDesc); + + send({'sdp': desc}); + } + }); + + return { + onConnection, + }; +} + +export function createConn(peerExchange, peerConnectionConfig) { + const conn = new RTCPeerConnection(peerConnectionConfig); + + conn.addEventListener('icecandidate', event => { + if(event.candidate != null) { + peerExchange.send({ice: event.candidate}); + } + }); + + peerExchange.listen(signal => { + if(signal.ice) { + conn.addIceCandidate(new RTCIceCandidate(signal.ice)).catch(errorHandler); + } + }); + + return conn; +} + export function createPeer(peerExchange, peerConnectionConfig) { const conn = new RTCPeerConnection(peerConnectionConfig);