Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Class(function GameCenterRTC(_id, _socket, _initiator) {
  2.     Inherit(this, Component);
  3.     var _this = this;
  4.     var _peer, _data;
  5.  
  6.     //*** Constructor
  7.     (function () {
  8.         initPeerConnection();
  9.         if (_initiator) initConnection();
  10.     })();
  11.  
  12.     function initPeerConnection() {
  13.         _peer = new RTCPeerConnection({"iceServers":[{"urls":"stun:stun.l.google.com:19302"}]});
  14.  
  15.         _peer.onicecandidate = e => {
  16.             if (!_peer || !e || !e.candidate || !e.candidate.candidate) return console.warn('failed ice candidate');
  17.             sendNegotiation('candidate', e.candidate);
  18.         };
  19.  
  20.         _data = _peer.createDataChannel('gamecenter', {ordered: false, negotiated: true, id: 7});
  21.         _data.onmessage = dataMessage;
  22.         _data.onopen = dataOpen;
  23.         _data.onclose = dataClose;
  24.         _data.onerror = dataError;
  25.  
  26.         if (DEBUG) console.log('GC::init peer connection', _peer)
  27.         _peer.ondatachannel = e => {
  28.             e.channel.onmessage = dataMessage;
  29.             e.channel.onclose = dataClose;
  30.             e.channel.onerror = dataError;
  31.         }
  32.     }
  33.  
  34.     async function initConnection() {
  35.         let sdp;
  36.         try {
  37.             sdp = await _peer.createOffer();
  38.         } catch(e) {
  39.             console.error(e);
  40.         }
  41.         if (DEBUG) console.log('GC::after create offer');
  42.  
  43.         _peer.setLocalDescription(sdp);
  44.         sendNegotiation('offer', sdp);
  45.     }
  46.  
  47.     function sendNegotiation(type, sdp) {
  48.         let data = {to: _id, type, sdp};
  49.         _socket.send('establish_rtc', data);
  50.     }
  51.  
  52.     //*** Event handlers
  53.     async function processOffer(offer) {
  54.         try {
  55.             await _peer.setRemoteDescription(new RTCSessionDescription(offer));
  56.  
  57.             let sdp = await _peer.createAnswer();
  58.             _peer.setLocalDescription(sdp);
  59.             sendNegotiation('answer', sdp);
  60.         } catch(e) {
  61.             //handle error
  62.         }
  63.     }
  64.  
  65.     async function processAnswer(answer) {
  66.         try {
  67.             await _peer.setRemoteDescription(new RTCSessionDescription(answer));
  68.         } catch(e) {
  69.             //handle error
  70.         }
  71.     }
  72.  
  73.     function processIce(iceCandidate) {
  74.         try {
  75.             _peer.addIceCandidate(new RTCIceCandidate(iceCandidate));
  76.         } catch(e) {
  77.             //handle error
  78.         }
  79.     }
  80.  
  81.     function dataMessage(e) {
  82.         //handle message
  83.     }
  84.  
  85.     function dataOpen(e) {
  86.         //handle open
  87.     }
  88.  
  89.     function dataClose(e) {
  90.         //handle close
  91.     }
  92.  
  93.     function dataError(e) {
  94.         //handle error
  95.     }
  96.  
  97.     //*** Public methods
  98.     this.establish = function(data) {
  99.         if (!_peer) return;
  100.  
  101.         switch (data.type) {
  102.             case 'candidate':
  103.                 processIce(data.sdp);
  104.                 break;
  105.  
  106.             case 'offer':
  107.                 processOffer(data.sdp);
  108.                 break;
  109.  
  110.             case 'answer':
  111.                 processAnswer(data.sdp);
  112.                 break;
  113.         }
  114.     }
  115.  
  116.     this.emit = function(data = {}) {
  117.         if (_data.readyState != 'open') return;
  118.         data.from = GameCenter.GCID;
  119.         _data.send(JSON.stringify(data));
  120.     }
  121.  
  122.     this.close = function() {
  123.         _peer && _peer.close();
  124.         _peer = null;
  125.     }
  126. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement