dpg.broadcast-client
Version:
Library for broadcast DPG
168 lines (167 loc) • 6.29 kB
JavaScript
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 };