Last active
October 31, 2018 00:24
-
-
Save ajb413/f0d2fc1aa9278105e9c8e815390f6789 to your computer and use it in GitHub Desktop.
A service that securely provides Xirsys app tokens to a WebRTC client via PubNub Functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const pubnub = require('pubnub'); | |
const kvstore = require('kvstore'); | |
const xhr = require('xhr'); | |
const vault = require('vault'); | |
const base64Codec = require('codec/base64'); | |
// If you are still developing, set the permittedOrigin to * and remove the check on line 15 | |
const permittedOrigin = 'https://your-website-origin.com'; | |
const xirsysChannel = 'your-xirsys-channel-name'; | |
export default (request, response) => { | |
response.headers['Access-Control-Allow-Origin'] = permittedOrigin; | |
response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'; | |
if (request.headers.origin !== permittedOrigin) { | |
response.status = 401; | |
return response.send(); | |
} | |
if (request.method.toUpperCase() === 'GET') { | |
const uuid = newUuid() + newUuid() + newUuid() + newUuid(); | |
const tok = base64Codec.encodeString(uuid); | |
return kvstore.set(tok, true, 60).then(() => { | |
response.status = 200; | |
return response.send(tok); | |
}); | |
} else if (request.method.toUpperCase() === 'PUT') { | |
if (!request.headers.tok) { | |
response.status = 401; | |
return response.send(); | |
} | |
return kvstore.get(request.headers.tok).then((validTok) => { | |
if (!validTok) { | |
console.error('invlaidtok', request.headers.tok); | |
response.status = 401; | |
return response.send(); | |
} | |
return vault.get('xirsys').then((xirsysCredential) => { | |
const xirsysEndpoint = `https://${xirsysCredential}@global.xirsys.net/_turn/${xirsysChannel}`; | |
return xhr.fetch(xirsysEndpoint, { 'method': 'PUT' }) | |
.then((res) => { | |
let rtcObj = flatten(JSON.parse(res.body).v); | |
response.status = 200; | |
return response.send(rtcObj); | |
}).catch((err) => { | |
console.error(err); | |
response.status = 400; | |
return response.send(); | |
}); | |
}); | |
}); | |
} else { | |
response.status = 401; | |
return response.send(); | |
} | |
}; | |
function newUuid() { | |
function s4() { | |
return Math.floor((1 + Math.random()) * 0x10000) | |
.toString(16) | |
.substring(1); | |
} | |
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); | |
} | |
function flatten(rtc) { | |
let newcred = { urls: [] }; | |
rtc.iceServers.forEach((obj) => { | |
newcred.urls.push(obj.url); | |
newcred.username = obj.username; | |
newcred.credential = obj.credential; | |
}); | |
return newcred; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment