Skip to content

Instantly share code, notes, and snippets.

@ajb413
Last active October 31, 2018 00:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ajb413/f0d2fc1aa9278105e9c8e815390f6789 to your computer and use it in GitHub Desktop.
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
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