File: source/template/header.js
(function() {
'use strict';
/**
* Polyfill for Object.keys() from Mozilla
* From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
*/
if (!Object.keys) {
Object.keys = (function() {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !({
toString: null
}).propertyIsEnumerable('toString'),
dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
],
dontEnumsLength = dontEnums.length;
return function(obj) {
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
var result = [];
for (var prop in obj) {
if (hasOwnProperty.call(obj, prop)) result.push(prop);
}
if (hasDontEnumBug) {
for (var i = 0; i < dontEnumsLength; i++) {
if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
}
}
return result;
}
})()
}
/**
* Polyfill for Date.getISOString() from Mozilla
* From https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
*/
(function() {
function pad(number) {
if (number < 10) {
return '0' + number;
}
return number;
}
Date.prototype.toISOString = function() {
return this.getUTCFullYear() +
'-' + pad(this.getUTCMonth() + 1) +
'-' + pad(this.getUTCDate()) +
'T' + pad(this.getUTCHours()) +
':' + pad(this.getUTCMinutes()) +
':' + pad(this.getUTCSeconds()) +
'.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
'Z';
};
})();
/**
* Polyfill for addEventListener() from Eirik Backer @eirikbacker (github.com).
* From https://gist.github.com/eirikbacker/2864711
* MIT Licensed
*/
(function(win, doc){
if(win.addEventListener) return; //No need to polyfill
function docHijack(p){var old = doc[p];doc[p] = function(v){ return addListen(old(v)) }}
function addEvent(on, fn, self){
return (self = this).attachEvent('on' + on, function(e){
var e = e || win.event;
e.preventDefault = e.preventDefault || function(){e.returnValue = false}
e.stopPropagation = e.stopPropagation || function(){e.cancelBubble = true}
fn.call(self, e);
});
}
function addListen(obj, i){
if(i = obj.length)while(i--)obj[i].addEventListener = addEvent;
else obj.addEventListener = addEvent;
return obj;
}
addListen([doc, win]);
if('Element' in win)win.Element.prototype.addEventListener = addEvent; //IE8
else{ //IE < 8
doc.attachEvent('onreadystatechange', function(){addListen(doc.all)}); //Make sure we also init at domReady
docHijack('getElementsByTagName');
docHijack('getElementById');
docHijack('createElement');
addListen(doc.all);
}
})(window, document);
/**
* Global function that clones an object.
*/
var clone = function (obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
var copy = function (data) {
var copy = data.constructor();
for (var attr in data) {
if (data.hasOwnProperty(attr)) {
copy[attr] = data[attr];
}
}
return copy;
};
if (typeof obj === 'object' && !Array.isArray(obj)) {
try {
return JSON.parse( JSON.stringify(obj) );
} catch (err) {
return copy(obj);
}
}
return copy(obj);
};
/**
* <h2>Prerequisites on using Skylink</h2>
* Before using any Skylink functionalities, you will need to authenticate your App Key using
* the <a href="#method_init">`init()` method</a>.
*
* To manage or create App Keys, you may access the [Skylink Developer Portal here](https://console.temasys.io).
*
* To view the list of supported browsers, visit [the list here](
* https://github.com/Temasys/SkylinkJS#supported-browsers).
*
* Here are some articles to help you get started:
* - [How to setup a simple video call](https://temasys.com.sg/getting-started-with-webrtc-and-skylinkjs/)
* - [How to setup screensharing](https://temasys.com.sg/screensharing-with-skylinkjs/)
* - [How to create a chatroom like feature](https://temasys.com.sg/building-a-simple-peer-to-peer-webrtc-chat/)
*
* Here are some demos you may use to aid your development:
* - Getaroom.io [[Demo](https://getaroom.io) / [Source code](https://github.com/Temasys/getaroom)]
* - Creating a component [[Link](https://github.com/Temasys/skylink-call-button)]
*
* You may see the example below in the <a href="#">Constructor tab</a> to have a general idea how event subscription
* and the ordering of <a href="#method_init"><code>init()</code></a> and
* <a href="#method_joinRoom"><code>joinRoom()</code></a> methods should be called.
*
* If you have any issues, you may find answers to your questions in the FAQ section on [our support portal](
* http://support.temasys.com.sg), asks questions, request features or raise bug tickets as well.
*
* If you would like to contribute to our SkylinkJS codebase, see [the contributing README](
* https://github.com/Temasys/SkylinkJS/blob/master/CONTRIBUTING.md).
*
* [See License (Apache 2.0)](https://github.com/Temasys/SkylinkJS/blob/master/LICENSE)
*
* @class Skylink
* @constructor
* @example
* // Here's a simple example on how you can start using Skylink.
* var skylinkDemo = new Skylink();
*
* // Subscribe all events first as a general guideline
* skylinkDemo.on("incomingStream", function (peerId, stream, peerInfo, isSelf) {
* if (isSelf) {
* attachMediaStream(document.getElementById("selfVideo"), stream);
* } else {
* var peerVideo = document.createElement("video");
* peerVideo.id = peerId;
* peerVideo.autoplay = "autoplay";
* document.getElementById("peersVideo").appendChild(peerVideo);
* attachMediaStream(peerVideo, stream);
* }
* });
*
* skylinkDemo.on("peerLeft", function (peerId, peerInfo, isSelf) {
* if (!isSelf) {
* var peerVideo = document.getElementById(peerId);
* // do a check if peerVideo exists first
* if (peerVideo) {
* document.getElementById("peersVideo").removeChild(peerVideo);
* } else {
* console.error("Peer video for " + peerId + " is not found.");
* }
* }
* });
*
* // init() should always be called first before other methods other than event methods like on() or off().
* skylinkDemo.init("YOUR_APP_KEY_HERE", function (error, success) {
* if (success) {
* skylinkDemo.joinRoom("my_room", {
* userData: "My Username",
* audio: true,
* video: true
* });
* }
* });
* @for Skylink
* @since 0.5.0
*/
function Skylink() {
if (!(this instanceof Skylink)) {
return new Skylink();
}
}
/**
* Contains the current version of Skylink Web SDK.
* @attribute VERSION
* @type String
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.VERSION = '@@version';
/**
* Function that generates an <a href="https://en.wikipedia.org/wiki/Universally_unique_identifier">UUID</a> (Unique ID).
* @method generateUUID
* @return {String} Returns a generated UUID (Unique ID).
* @for Skylink
* @since 0.5.9
*/
Skylink.prototype.generateUUID = function() {
var d = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);
});
return uuid;
};