Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Class(function GameCenterRTC(_id, _socket, _initiator) {
- Inherit(this, Component);
- var _this = this;
- var _peer, _data;
- //*** Constructor
- (function () {
- initPeerConnection();
- if (_initiator) initConnection();
- })();
- function initPeerConnection() {
- _peer = new RTCPeerConnection({"iceServers":[{"urls":"stun:stun.l.google.com:19302"}]});
- _peer.onicecandidate = e => {
- if (!_peer || !e || !e.candidate || !e.candidate.candidate) return console.warn('failed ice candidate');
- sendNegotiation('candidate', e.candidate);
- };
- _data = _peer.createDataChannel('gamecenter', {ordered: false, negotiated: true, id: 7});
- _data.onmessage = dataMessage;
- _data.onopen = dataOpen;
- _data.onclose = dataClose;
- _data.onerror = dataError;
- if (DEBUG) console.log('GC::init peer connection', _peer)
- _peer.ondatachannel = e => {
- e.channel.onmessage = dataMessage;
- e.channel.onclose = dataClose;
- e.channel.onerror = dataError;
- }
- }
- async function initConnection() {
- let sdp;
- try {
- sdp = await _peer.createOffer();
- } catch(e) {
- console.error(e);
- }
- if (DEBUG) console.log('GC::after create offer');
- _peer.setLocalDescription(sdp);
- sendNegotiation('offer', sdp);
- }
- function sendNegotiation(type, sdp) {
- let data = {to: _id, type, sdp};
- _socket.send('establish_rtc', data);
- }
- //*** Event handlers
- async function processOffer(offer) {
- try {
- await _peer.setRemoteDescription(new RTCSessionDescription(offer));
- let sdp = await _peer.createAnswer();
- _peer.setLocalDescription(sdp);
- sendNegotiation('answer', sdp);
- } catch(e) {
- //handle error
- }
- }
- async function processAnswer(answer) {
- try {
- await _peer.setRemoteDescription(new RTCSessionDescription(answer));
- } catch(e) {
- //handle error
- }
- }
- function processIce(iceCandidate) {
- try {
- _peer.addIceCandidate(new RTCIceCandidate(iceCandidate));
- } catch(e) {
- //handle error
- }
- }
- function dataMessage(e) {
- //handle message
- }
- function dataOpen(e) {
- //handle open
- }
- function dataClose(e) {
- //handle close
- }
- function dataError(e) {
- //handle error
- }
- //*** Public methods
- this.establish = function(data) {
- if (!_peer) return;
- switch (data.type) {
- case 'candidate':
- processIce(data.sdp);
- break;
- case 'offer':
- processOffer(data.sdp);
- break;
- case 'answer':
- processAnswer(data.sdp);
- break;
- }
- }
- this.emit = function(data = {}) {
- if (_data.readyState != 'open') return;
- data.from = GameCenter.GCID;
- _data.send(JSON.stringify(data));
- }
- this.close = function() {
- _peer && _peer.close();
- _peer = null;
- }
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement