UNPKG

dpg.broadcast-client

Version:
168 lines (167 loc) 6.29 kB
import Peer from "peerjs"; import io from "socket.io-client"; import { writable, get } from "svelte/store"; function InstanceOwner(config) { const data = writable({ onAir: false, isOwner: true, status: "disable", connection: { socket: io(config.socket.host, { ...config.socket.config, autoConnect: false }), media: { audio: { active: false, id: "", disable: false }, camera: { active: false, id: "", disable: false } }, peer: { calls: {}, connections: {}, streams: { self: new MediaStream, visitors: {} } } }, SetMediaConfig(_config) { updateData(_data => { _data.connection.media = _config; return _data; }); }, SetStream(_media) { updateData(_data => { _data.connection.peer.streams.self = _media; if (_data.onAir) { const { socket } = _data.connection; for (const socketID in _data.connection.peer.calls) { /** * Close Call */ // _data.connection.peer?.calls?.[socketID]?.close && _data.connection.peer.calls[socketID].close(); /** * Delete */ // delete _data.connection.peer.connections[socketID]; } for (const socketID in _data.connection.peer.connections) { /** * New Call */ socket.emit('conference/call', { socketID: socketID, sender: socket.id, pid: _data.connection.peer.connections[socketID].id }); } } return _data; }); }, StartBroadcast() { const _data = getData(); _data.connection.socket.open(); _data.connection.socket.emit('media/config', _data.connection.media); }, InitStore(name, val) { const store = writable(val); const socket = getData().connection.socket; const { set, update, subscribe } = store; const customSet = (value, doSend = true) => { if (doSend) { socket.emit(`store/change`, { name, data: value }); } set(value); }; socket.emit('store/init', { name, data: val }); return { set: customSet, update, subscribe }; } }); const getData = () => get(data); const updateData = (callback) => data.update(callback); function SettingsSocket() { const { socket } = getData().connection; socket.on('conference/join', (_config) => { const peer = new Peer(config.peer); peer.on('open', _id => { updateData(_data => { _data.connection.peer.connections[_config.socketID] = peer; return _data; }); socket.emit('conference/call', { socketID: _config.socketID, sender: socket.id, pid: _id }); peer.on('call', _call => { updateData(_data => { _data.connection.peer.calls[_config.socketID] = _call; return _data; }); if (config.debug) console.log(`[Peer | Owner] Call without recall`); _call.answer(getData().connection.peer.streams.self); _call.on('stream', _media => { if (config.debug) console.log(`[Peer | Owner] Get media without recall`, { _media }); updateData(_data => { _data.connection.peer.streams.visitors[_config.socketID] = _media; return _data; }); }); }); }); }); socket.on('conference/recall', (_config) => { const peer = getData().connection.peer.connections[_config.socketID]; if (config.debug) console.log(`[Peer | Owner] Is try recall`, { peer }); if (!peer) return; const _call = peer.call(_config.pid, getData().connection.peer.streams.self); _call.on('stream', _stream => { if (config.debug) console.log(`[Peer | Owner] Recall get stream`, { _stream }); updateData(_data => { _data.connection.peer.streams.visitors[_config.socketID] = _stream; return _data; }); }); updateData(_data => { _data.connection.peer.calls[_config.socketID] = _call; return _data; }); }); socket.on('conference/data', (_config) => { updateData(_data => { _data.conference = _config; return _data; }); }); socket.on('disconnect', () => { updateData(_data => { _data.onAir = false; _data.status = "disable"; return _data; }); }); } SettingsSocket(); return data; } export { InstanceOwner };