yjs/src/Connectors/WebRTC.js

87 lines
2.5 KiB
JavaScript

class WebRTC extends AbstractConnector {
constructor (y, options) {
if(options === undefined){
throw new Error("Options must not be undefined!");
}
if(options.room == null) {
throw new Error("You must define a room name!");
}
options.role = "slave";
super(y, options);
var room = options.room;
var webrtcOptions = {
url: options.url || "https://yatta.ninja:8888",
room: options.room
};
var swr = new SimpleWebRTC(webrtcOptions); //eslint-disable-line no-undef
this.swr = swr;
var self = this;
swr.once("connectionReady", function(userId){
// SimpleWebRTC (swr) is initialized
swr.joinRoom(room);
swr.once("joinedRoom", function(){
self.setUserId(userId);
/*
var i;
// notify the connector class about all the users that already
// joined the session
for(i in self.swr.webrtc.peers){
self.userJoined(self.swr.webrtc.peers[i].id, "master");
}*/
swr.on("channelMessage", function(peer, room_, message){
// The client received a message
// Check if the connector is already initialized,
// only then forward the message to the connector class
if(message.type != null ){
self.receiveMessage(peer.id, message.payload);
}
});
});
swr.on("createdPeer", function(peer){
// a new peer/client joined the session.
// Notify the connector class, if the connector
// is already initialized
self.userJoined(peer.id, "master");
});
swr.on("peerStreamRemoved", function(peer){
// a client left the session.
// Notify the connector class, if the connector
// is already initialized
self.userLeft(peer.id);
});
});
}
send (uid, message) {
var self = this;
// we have to make sure that the message is sent under all circumstances
var send = function(){
// check if the clients still exists
var peer = self.swr.webrtc.getPeers(uid)[0];
var success;
if(peer){
// success is true, if the message is successfully sent
success = peer.sendDirectly("simplewebrtc", "yjs", message);
}
if(!success){
// resend the message if it didn't work
setTimeout(send, 500);
}
};
// try to send the message
send();
}
broadcast (message) {
this.swr.sendDirectlyToAll("simplewebrtc", "yjs", message);
}
}
Y.WebRTC = WebRTC;