-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathnaf-firebase-adapter.min.js.map
1 lines (1 loc) · 34.7 KB
/
naf-firebase-adapter.min.js.map
1
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/index.js","webpack:///./node_modules/firebase-key-encode/firebase-key-encode.js","webpack:///./src/WebRtcPeer.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","firebaseKeyEncode","require","WebRtcPeer","FirebaseWebRtcAdapter","firebase","config","this","rootPath","localId","appId","roomId","peers","occupants","serverTimeRequests","timeOffsets","avgTimeOffset","window","firebaseConfig","undefined","Error","authType","apiKey","authDomain","databaseURL","url","options","datachannel","NAF","log","warn","audio","video","successListener","failureListener","connectSuccess","connectFailure","occupantListener","openListener","closedListener","messageListener","remoteId","dataType","data","decodedData","deepDecode","self","initFirebase","id","updateTimeOffset","firebaseApp","getTimestamp","timestamp","myRoomJoinTime","userRef","database","ref","getUserPath","set","signal","onDisconnect","remove","roomRef","getRoomPath","on","remoteTimestamp","val","peer","getSignalPath","setDatachannelListeners","handleSignal","getDataPath","to","type","offer","client","roomJoinTime","clientId","send","clonedData","JSON","parse","stringify","encodedData","deepEncode","sendData","sendDataGuaranteed","adapters","NOT_CONNECTED","getStatus","IS_CONNECTED","CONNECTING","Promise","reject","callback","initializeApp","auth","authNone","authAnonymous","requestAnimationFrame","randomString","signInAnonymously","error","onAuthStateChanged","user","uid","getRootPath","getAppPath","chars","string","randomNumber","Math","floor","random","length","substring","getTimestampGenerationPath","ServerValue","TIMESTAMP","once","then","timeOffset","push","reduce","acc","offset","setTimeout","Date","register","encode","decoded","encodeURIComponent","replace","decode","encoded","decodeURIComponent","deepKeyReplace","obj","fn","rebuiltTree","assign","traverse","x","func","Array","isArray","apply","parent","encodedTree","$this","decodedTree","sendSignalFunc","open","channelLabel","pc","createPeerConnection","channel","setupChannel","createDataChannel","reliable","createOffer","sdp","handleSessionDescription","console","from","handleOffer","handleAnswer","handleCandidate","readyState","RTCPeerConnection","webkitRTCPeerConnection","mozRTCPeerConnection","msRTCPeerConnection","iceServers","ICE_SERVERS","onicecandidate","event","candidate","sdpMLineIndex","oniceconnectionstatechange","iceConnectionState","onmessage","onopen","onclose","onerror","message","ondatachannel","setRemoteDescription","createAnswer","RTCIceCandidate","webkitRTCIceCandidate","mozRTCIceCandidate","addIceCandidate","setLocalDescription","RTCSessionDescription","webkitRTCSessionDescription","mozRTCSessionDescription","msRTCSessionDescription","urls"],"mappings":"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","file":"naf-firebase-adapter.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","const firebaseKeyEncode = require(\"firebase-key-encode\");\nconst WebRtcPeer = require(\"./WebRtcPeer\");\n\nclass FirebaseWebRtcAdapter {\n /**\n Config structure:\n config.authType: none;\n config.apiKey: your-api;\n config.authDomain: your-project.firebaseapp.com;\n config.databaseURL: https://your-project.firebaseio.com;\n */\n constructor(firebase, config) {\n this.rootPath = \"networked-aframe\";\n\n this.localId = null;\n this.appId = null;\n this.roomId = null;\n\n this.peers = {}; // id -> WebRtcPeer\n this.occupants = {}; // id -> joinTimestamp\n\n this.serverTimeRequests = 0;\n this.timeOffsets = [];\n this.avgTimeOffset = 0;\n\n config = config || window.firebaseConfig;\n this.firebase = firebase || window.firebase;\n\n if (this.firebase === undefined) {\n throw new Error(\n \"Import https://www.gstatic.com/firebasejs/x.x.x/firebase.js\"\n );\n }\n\n this.authType = config.authType;\n this.apiKey = config.apiKey;\n this.authDomain = config.authDomain;\n this.databaseURL = config.databaseURL;\n }\n\n /*\n * Call before `connect`\n */\n\n setServerUrl(url) {\n // handled in config\n }\n\n setApp(appId) {\n this.appId = appId;\n }\n\n setRoom(roomId) {\n this.roomId = roomId;\n }\n\n // options: { datachannel: bool, audio: bool }\n setWebRtcOptions(options) {\n // TODO: support audio and video\n if (options.datachannel === false)\n NAF.log.warn(\n \"FirebaseWebRtcAdapter.setWebRtcOptions: datachannel must be true.\"\n );\n if (options.audio === true)\n NAF.log.warn(\"FirebaseWebRtcAdapter does not support audio yet.\");\n if (options.video === true)\n NAF.log.warn(\"FirebaseWebRtcAdapter does not support video yet.\");\n }\n\n setServerConnectListeners(successListener, failureListener) {\n this.connectSuccess = successListener;\n this.connectFailure = failureListener;\n }\n\n setRoomOccupantListener(occupantListener) {\n this.occupantListener = occupantListener;\n }\n\n setDataChannelListeners(openListener, closedListener, messageListener) {\n this.openListener = openListener;\n this.closedListener = closedListener;\n this.messageListener = function(remoteId, dataType, data) {\n var decodedData = firebaseKeyEncode.deepDecode(data);\n messageListener(remoteId, dataType, decodedData);\n };\n }\n\n connect() {\n var self = this;\n\n this.initFirebase(function(id) {\n self.updateTimeOffset();\n\n self.localId = id;\n var firebaseApp = self.firebaseApp;\n\n // Note: assuming that data transfer via firebase realtime database\n // is reliable and in order\n // TODO: can race among peers? If so, fix\n\n self.getTimestamp(function(timestamp) {\n self.myRoomJoinTime = timestamp;\n\n var userRef = firebaseApp\n .database()\n .ref(self.getUserPath(self.localId));\n userRef.set({ timestamp: timestamp, signal: \"\", data: \"\" });\n userRef.onDisconnect().remove();\n\n var roomRef = firebaseApp.database().ref(self.getRoomPath());\n\n roomRef.on(\"child_added\", function(data) {\n var remoteId = data.key;\n\n if (\n remoteId === self.localId ||\n remoteId === \"timestamp\" ||\n self.peers[remoteId] !== undefined\n )\n return;\n\n var remoteTimestamp = data.val().timestamp;\n\n var peer = new WebRtcPeer(\n self.localId,\n remoteId,\n // send signal function\n function(data) {\n firebaseApp\n .database()\n .ref(self.getSignalPath(self.localId))\n .set(data);\n }\n );\n peer.setDatachannelListeners(\n self.openListener,\n self.closedListener,\n self.messageListener\n );\n\n self.peers[remoteId] = peer;\n self.occupants[remoteId] = remoteTimestamp;\n\n // received signal\n firebaseApp\n .database()\n .ref(self.getSignalPath(remoteId))\n .on(\"value\", function(data) {\n var value = data.val();\n if (value === null || value === \"\") return;\n peer.handleSignal(value);\n });\n\n // received data\n firebaseApp\n .database()\n .ref(self.getDataPath(remoteId))\n .on(\"value\", function(data) {\n var value = data.val();\n if (value === null || value === \"\" || value.to !== self.localId)\n return;\n self.messageListener(remoteId, value.type, value.data);\n });\n\n // send offer from a peer who\n // - later joined the room, or\n // - has larger id if two peers joined the room at same time\n if (\n timestamp > remoteTimestamp ||\n (timestamp === remoteTimestamp && self.localId > remoteId)\n )\n peer.offer();\n\n self.occupantListener(self.occupants);\n });\n\n roomRef.on(\"child_removed\", function(data) {\n var remoteId = data.key;\n\n if (\n remoteId === self.localId ||\n remoteId === \"timestamp\" ||\n self.peers[remoteId] === undefined\n )\n return;\n\n delete self.peers[remoteId];\n delete self.occupants[remoteId];\n\n self.occupantListener(self.occupants);\n });\n\n self.connectSuccess(self.localId);\n });\n });\n }\n\n shouldStartConnectionTo(client) {\n return (this.myRoomJoinTime || 0) <= (client ? client.roomJoinTime : 0);\n }\n\n startStreamConnection(clientId) {\n // Handled by WebRtcPeer\n }\n\n closeStreamConnection(clientId) {\n // Handled by WebRtcPeer\n }\n\n sendData(clientId, dataType, data) {\n this.peers[clientId].send(dataType, data);\n }\n\n sendDataGuaranteed(clientId, dataType, data) {\n var clonedData = JSON.parse(JSON.stringify(data));\n var encodedData = firebaseKeyEncode.deepEncode(clonedData);\n this.firebaseApp\n .database()\n .ref(this.getDataPath(this.localId))\n .set({\n to: clientId,\n type: dataType,\n data: encodedData\n });\n }\n\n broadcastData(dataType, data) {\n for (var clientId in this.peers) {\n if (this.peers.hasOwnProperty(clientId)) {\n this.sendData(clientId, dataType, data);\n }\n }\n }\n\n broadcastDataGuaranteed(dataType, data) {\n for (var clientId in this.peers) {\n if (this.peers.hasOwnProperty(clientId)) {\n this.sendDataGuaranteed(clientId, dataType, data);\n }\n }\n }\n\n getConnectStatus(clientId) {\n var peer = this.peers[clientId];\n\n if (peer === undefined) return NAF.adapters.NOT_CONNECTED;\n\n switch (peer.getStatus()) {\n case WebRtcPeer.IS_CONNECTED:\n return NAF.adapters.IS_CONNECTED;\n\n case WebRtcPeer.CONNECTING:\n return NAF.adapters.CONNECTING;\n\n case WebRtcPeer.NOT_CONNECTED:\n default:\n return NAF.adapters.NOT_CONNECTED;\n }\n }\n\n getMediaStream(clientId) { return Promise.reject(\"Interface method not implemented: getMediaStream\")}\n\n /*\n * Privates\n */\n\n initFirebase(callback) {\n this.firebaseApp = this.firebase.initializeApp(\n {\n apiKey: this.apiKey,\n authDomain: this.authDomain,\n databaseURL: this.databaseURL\n },\n this.appId\n );\n\n this.auth(this.authType, callback);\n }\n\n auth(type, callback) {\n switch (type) {\n case \"none\":\n this.authNone(callback);\n break;\n\n case \"anonymous\":\n this.authAnonymous(callback);\n break;\n\n // TODO: support other auth type\n default:\n NAF.log.log(\"FirebaseWebRtcInterface.auth: Unknown authType \" + type);\n break;\n }\n }\n\n authNone(callback) {\n var self = this;\n\n // asynchronously invokes open listeners for the compatibility with other auth types.\n // TODO: generate not just random but also unique id\n requestAnimationFrame(function() {\n callback(self.randomString());\n });\n }\n\n authAnonymous(callback) {\n var self = this;\n var firebaseApp = this.firebaseApp;\n\n firebaseApp\n .auth()\n .signInAnonymously()\n .catch(function(error) {\n NAF.log.error(\"FirebaseWebRtcInterface.authAnonymous: \" + error);\n self.connectFailure(null, error);\n });\n\n firebaseApp.auth().onAuthStateChanged(function(user) {\n if (user !== null) {\n callback(user.uid);\n }\n });\n }\n\n /*\n * realtime database layout\n *\n * /rootPath/appId/roomId/\n * - /userId/\n * - timestamp: joining the room timestamp\n * - signal: used to send signal\n * - data: used to send guaranteed data\n * - /timestamp/: working path to get timestamp\n * - userId:\n */\n\n getRootPath() {\n return this.rootPath;\n }\n\n getAppPath() {\n return this.getRootPath() + \"/\" + this.appId;\n }\n\n getRoomPath() {\n return this.getAppPath() + \"/\" + this.roomId;\n }\n\n getUserPath(id) {\n return this.getRoomPath() + \"/\" + id;\n }\n\n getSignalPath(id) {\n return this.getUserPath(id) + \"/signal\";\n }\n\n getDataPath(id) {\n return this.getUserPath(id) + \"/data\";\n }\n\n getTimestampGenerationPath(id) {\n return this.getRoomPath() + \"/timestamp/\" + id;\n }\n\n randomString() {\n var stringLength = 16;\n var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz0123456789\";\n var string = \"\";\n\n for (var i = 0; i < stringLength; i++) {\n var randomNumber = Math.floor(Math.random() * chars.length);\n string += chars.substring(randomNumber, randomNumber + 1);\n }\n\n return string;\n }\n\n getTimestamp(callback) {\n var firebaseApp = this.firebaseApp;\n var ref = firebaseApp\n .database()\n .ref(this.getTimestampGenerationPath(this.localId));\n ref.set(this.firebase.database.ServerValue.TIMESTAMP);\n ref.once(\"value\", function(data) {\n var timestamp = data.val();\n ref.remove();\n callback(timestamp);\n });\n ref.onDisconnect().remove();\n }\n\n updateTimeOffset() {\n return this.firebaseApp\n .database()\n .ref(\"/.info/serverTimeOffset\")\n .once(\"value\")\n .then(data => {\n var timeOffset = data.val();\n\n this.serverTimeRequests++;\n\n if (this.serverTimeRequests <= 10) {\n this.timeOffsets.push(timeOffset);\n } else {\n this.timeOffsets[this.serverTimeRequests % 10] = timeOffset;\n }\n\n this.avgTimeOffset =\n this.timeOffsets.reduce((acc, offset) => (acc += offset), 0) /\n this.timeOffsets.length;\n\n if (this.serverTimeRequests > 10) {\n setTimeout(() => this.updateTimeOffset(), 5 * 60 * 1000); // Sync clock every 5 minutes.\n } else {\n this.updateTimeOffset();\n }\n });\n }\n\n getServerTime() {\n return new Date() + this.avgTimeOffset;\n }\n}\n\nNAF.adapters.register(\"firebase\", FirebaseWebRtcAdapter);\n\nmodule.exports = FirebaseWebRtcAdapter;\n","module.exports = {\n encode: function (decoded) {\n return encodeURIComponent(decoded).replace(/\\./g, '%2E');\n },\n decode: function (encoded) {\n return decodeURIComponent(encoded.replace('%2E', '.'));\n },\n // Replaces the key with `fn(key)` on each key in an object tree.\n // i.e. making all keys uppercase.\n deepKeyReplace: function (obj, fn) {\n var rebuiltTree = Object.assign({}, obj);\n\n function traverse(o, x, func) {\n if (typeof(o) === \"object\") {\n for (var i in o) {\n if (o[i] !== null && (typeof(o[i])==\"object\" || Array.isArray(o[i]))) {\n //going on step down in the object tree!!\n traverse(o[i],x[i],func);\n }\n func.apply(this,[x, i, x[i]]);\n }\n } else if (Array.isArray(o)) {\n for (var i = 0; i < o.length; i++) {\n // func.apply(this,[o, i,o[i]]);\n if (o[i] !== null && (typeof(o[i])==\"object\" || Array.isArray(o[i]))) {\n //going on step down in the object tree!!\n traverse(o[i], x[i], func);\n }\n }\n }\n }\n\n traverse(obj, rebuiltTree, function (parent, key, val) {\n delete parent[key];\n parent[fn(key)] = val;\n });\n\n return rebuiltTree;\n },\n deepDecode: function (encodedTree) {\n var $this = this;\n\n var rebuiltTree = this.deepKeyReplace(encodedTree, function (key) {\n return $this.decode(key);\n });\n\n return rebuiltTree;\n },\n deepEncode: function (decodedTree) {\n var $this = this;\n\n var rebuiltTree = this.deepKeyReplace(decodedTree, function (key) {\n return $this.encode(key);\n });\n\n return rebuiltTree;\n }\n}\n","class WebRtcPeer {\n constructor(localId, remoteId, sendSignalFunc) {\n this.localId = localId;\n this.remoteId = remoteId;\n this.sendSignalFunc = sendSignalFunc;\n this.open = false;\n this.channelLabel = \"networked-aframe-channel\";\n\n this.pc = this.createPeerConnection();\n this.channel = null;\n }\n\n setDatachannelListeners(openListener, closedListener, messageListener) {\n this.openListener = openListener;\n this.closedListener = closedListener;\n this.messageListener = messageListener;\n }\n\n offer() {\n var self = this;\n // reliable: false - UDP\n this.setupChannel(\n this.pc.createDataChannel(this.channelLabel, { reliable: false })\n );\n this.pc.createOffer(\n function(sdp) {\n self.handleSessionDescription(sdp);\n },\n function(error) {\n console.error(\"WebRtcPeer.offer: \" + error);\n }\n );\n }\n\n handleSignal(signal) {\n // ignores signal if it isn't for me\n if (this.localId !== signal.to || this.remoteId !== signal.from) return;\n\n switch (signal.type) {\n case \"offer\":\n this.handleOffer(signal);\n break;\n\n case \"answer\":\n this.handleAnswer(signal);\n break;\n\n case \"candidate\":\n this.handleCandidate(signal);\n break;\n\n default:\n console.error(\n \"WebRtcPeer.handleSignal: Unknown signal type \" + signal.type\n );\n break;\n }\n }\n\n send(type, data) {\n // TODO: throw error?\n if (this.channel === null || this.channel.readyState !== \"open\") return;\n\n this.channel.send(JSON.stringify({ type: type, data: data }));\n }\n\n getStatus() {\n if (this.channel === null) return WebRtcPeer.NOT_CONNECTED;\n\n switch (this.channel.readyState) {\n case \"open\":\n return WebRtcPeer.IS_CONNECTED;\n\n case \"connecting\":\n return WebRtcPeer.CONNECTING;\n\n case \"closing\":\n case \"closed\":\n default:\n return WebRtcPeer.NOT_CONNECTED;\n }\n }\n\n /*\n * Privates\n */\n\n createPeerConnection() {\n var self = this;\n var RTCPeerConnection =\n window.RTCPeerConnection ||\n window.webkitRTCPeerConnection ||\n window.mozRTCPeerConnection ||\n window.msRTCPeerConnection;\n\n if (RTCPeerConnection === undefined) {\n throw new Error(\n \"WebRtcPeer.createPeerConnection: This browser does not seem to support WebRTC.\"\n );\n }\n\n var pc = new RTCPeerConnection({ iceServers: WebRtcPeer.ICE_SERVERS });\n\n pc.onicecandidate = function(event) {\n if (event.candidate) {\n self.sendSignalFunc({\n from: self.localId,\n to: self.remoteId,\n type: \"candidate\",\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n candidate: event.candidate.candidate\n });\n }\n };\n\n // Note: seems like channel.onclose hander is unreliable on some platforms,\n // so also tries to detect disconnection here.\n pc.oniceconnectionstatechange = function() {\n if (self.open && pc.iceConnectionState === \"disconnected\") {\n self.open = false;\n self.closedListener(self.remoteId);\n }\n };\n\n return pc;\n }\n\n setupChannel(channel) {\n var self = this;\n\n this.channel = channel;\n\n // received data from a remote peer\n this.channel.onmessage = function(event) {\n var data = JSON.parse(event.data);\n self.messageListener(self.remoteId, data.type, data.data);\n };\n\n // connected with a remote peer\n this.channel.onopen = function(event) {\n self.open = true;\n self.openListener(self.remoteId);\n };\n\n // disconnected with a remote peer\n this.channel.onclose = function(event) {\n if (!self.open) return;\n self.open = false;\n self.closedListener(self.remoteId);\n };\n\n // error occurred with a remote peer\n this.channel.onerror = function(error) {\n console.error(\"WebRtcPeer.channel.onerror: \" + error);\n };\n }\n\n handleOffer(message) {\n var self = this;\n\n this.pc.ondatachannel = function(event) {\n self.setupChannel(event.channel);\n };\n\n this.setRemoteDescription(message);\n\n this.pc.createAnswer(\n function(sdp) {\n self.handleSessionDescription(sdp);\n },\n function(error) {\n console.error(\"WebRtcPeer.handleOffer: \" + error);\n }\n );\n }\n\n handleAnswer(message) {\n this.setRemoteDescription(message);\n }\n\n handleCandidate(message) {\n var self = this;\n var RTCIceCandidate =\n window.RTCIceCandidate ||\n window.webkitRTCIceCandidate ||\n window.mozRTCIceCandidate;\n\n this.pc.addIceCandidate(\n new RTCIceCandidate(message),\n function() {},\n function(error) {\n console.error(\"WebRtcPeer.handleCandidate: \" + error);\n }\n );\n }\n\n handleSessionDescription(sdp) {\n var self = this;\n\n this.pc.setLocalDescription(\n sdp,\n function() {},\n function(error) {\n console.error(\"WebRtcPeer.handleSessionDescription: \" + error);\n }\n );\n\n this.sendSignalFunc({\n from: this.localId,\n to: this.remoteId,\n type: sdp.type,\n sdp: sdp.sdp\n });\n }\n\n setRemoteDescription(message) {\n var self = this;\n var RTCSessionDescription =\n window.RTCSessionDescription ||\n window.webkitRTCSessionDescription ||\n window.mozRTCSessionDescription ||\n window.msRTCSessionDescription;\n\n this.pc.setRemoteDescription(\n new RTCSessionDescription(message),\n function() {},\n function(error) {\n console.error(\"WebRtcPeer.setRemoteDescription: \" + error);\n }\n );\n }\n}\n\nWebRtcPeer.IS_CONNECTED = \"IS_CONNECTED\";\nWebRtcPeer.CONNECTING = \"CONNECTING\";\nWebRtcPeer.NOT_CONNECTED = \"NOT_CONNECTED\";\n\nWebRtcPeer.ICE_SERVERS = [\n { urls: \"stun:stun1.l.google.com:19302\" },\n { urls: \"stun:stun2.l.google.com:19302\" },\n { urls: \"stun:stun3.l.google.com:19302\" },\n { urls: \"stun:stun4.l.google.com:19302\" }\n];\n\nmodule.exports = WebRtcPeer;\n"],"sourceRoot":""}