react-native-enovawbrtc
Version:
Web Rtc
288 lines (244 loc) • 7.47 kB
JavaScript
const config = require('./Config')
const IS_BROWSER_ENV = typeof document !== 'undefined';
const IS_RN_ENV = typeof navigator !== 'undefined' &&
navigator.product == 'ReactNative';
const IS_NS_ENV = typeof global === 'object' &&
(typeof global.android !== 'undefined' ||
typeof global.NSObject !== 'undefined');
class InternalUtils {
static getEnv() {
return {
nativescript: IS_NS_ENV,
reactnative: IS_RN_ENV,
browser: IS_BROWSER_ENV,
node: !IS_BROWSER_ENV && !IS_NS_ENV && !IS_RN_ENV
}
}
static isWebRTCAvailble() {
return (
IS_RN_ENV ||
(IS_BROWSER_ENV &&
window.RTCPeerConnection &&
window.RTCIceCandidate &&
window.RTCSessionDescription)
)
}
static safeCallbackCall() {
const callback = arguments[0];
if (typeof callback !== 'function') {
return;
}
const callbackString = callback.toString()
const callbackName = callbackString.split('(')[0].split(' ')[1]
const argumentsCopy = []
let listenerCall
for (let i = 0; i < arguments.length; i++) {
argumentsCopy.push(arguments[i])
}
listenerCall = argumentsCopy.shift()
try {
listenerCall.apply(null, argumentsCopy)
} catch (err) {
if (callbackName === '') {
console.error('Error: ' + err)
} else {
console.error('Error in listener ' + callbackName + ': ' + err)
}
}
}
static randomNonce() {
return Math.floor(Math.random() * 10000)
}
static unixTime() {
return Math.floor(Date.now() / 1000)
}
static getUrl(base, id, extension) {
let resource = `${id ? '/' + id : ''}`
extension = `${extension ? '/' + extension : ''}`
return `https://${config.endpoints.api}/${base}${resource}${extension}${config.urls.type}`
}
static isArray(arr) {
return Object.prototype.toString.call(arr) === '[object Array]'
}
static isObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]'
}
static getBsonObjectId() {
const timestamp = this.unixTime().toString(16)
const increment = (ObjectId.increment++).toString(16)
if (increment > 0xffffff) ObjectId.increment = 0
return (
'00000000'.substr(0, 8 - timestamp.length) +
timestamp +
'000000'.substr(0, 6 - ObjectId.machine.length) +
ObjectId.machine +
'0000'.substr(0, 4 - ObjectId.pid.length) +
ObjectId.pid +
'000000'.substr(0, 6 - increment.length) +
increment
)
}
static DLog() {
if (this.loggers) {
for (let i = 0; i < this.loggers.length; ++i) {
this.loggers[i](arguments)
}
return
}
let logger
this.loggers = []
const consoleLoggerFunction = function () {
const logger = function (args) {
console.log.apply(console, Array.prototype.slice.call(args))
}
return logger
}
if (typeof config.debug === 'object') {
if (typeof config.debug.mode === 'number') {
if (config.debug.mode == 1) {
logger = consoleLoggerFunction()
this.loggers.push(logger)
}
} else if (typeof config.debug.mode === 'object') {
config.debug.mode.forEach(function (mode) {
if (mode === 1) {
logger = consoleLoggerFunction()
this.loggers.push(logger)
}
})
}
}
if (this.loggers) {
for (let j = 0; j < this.loggers.length; ++j) {
this.loggers[j](arguments)
}
}
}
static isExpiredSessionError(error) {
try {
return (
error &&
error.code === 401 &&
error.info.errors.base[0] === 'Required session does not exist'
)
} catch (ex) {
return false
}
}
static mergeArrays(arrayTo, arrayFrom) {
const merged = JSON.parse(JSON.stringify(arrayTo))
firstLevel: for (let i = 0; i < arrayFrom.length; i++) {
const newItem = arrayFrom[i]
for (let j = 0; j < merged.length; j++) {
if (newItem.user_id === merged[j].user_id) {
merged[j] = newItem
continue firstLevel
}
}
merged.push(newItem)
}
return merged
}
static toBase64(str) {
if (this.getEnv().browser) {
return btoa(
encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode('0x' + p1)
})
)
} else if (this.getEnv().reactnative) {
return global.encodeToBase64(str)
} else {
// Node.js & Native Script
return new Buffer(str).toString('base64')
}
}
static generateCreateSessionParams(params) {
const message = {
application_id: config.creds.appId,
auth_key: config.creds.authKey,
nonce: this.randomNonce(),
timestamp: this.unixTime()
}
if (params) {
if (params.login && params.password) {
message.user = { login: params.login, password: params.password }
} else if (params.email && params.password) {
message.user = { email: params.email, password: params.password }
} else if (params.provider) {
// Via social networking provider (e.g. facebook, twitter etc.)
message.provider = params.provider
if (params.scope) {
message.scope = params.scope
}
if (params.keys && params.keys.token) {
message.keys = { token: params.keys.token }
}
if (params.keys && params.keys.secret) {
message.keys.secret = params.keys.secret
}
} else if (params.hasOwnProperty('long')) {
message.long = params.long
}
}
return message;
}
static signParams(message, secret) {
const sessionMsg = Object.keys(message)
.map(function (val) {
if (typeof message[val] === 'object') {
return Object.keys(message[val])
.map(function (val1) {
return val + '[' + val1 + ']=' + message[val][val1]
})
.sort()
.join('&')
} else {
return val + '=' + message[val]
}
})
.sort()
.join('&')
let cryptoSessionMsg
if (config.hash === 'sha1') {
const sha1 = require('crypto-js/hmac-sha1')
cryptoSessionMsg = sha1(sessionMsg, secret).toString()
} else if (config.hash === 'sha256') {
const sha256 = require('crypto-js/hmac-sha256')
cryptoSessionMsg = sha256(sessionMsg, secret).toString()
} else {
throw new Error('Unknown crypto standards, available sha1 or sha256')
}
return cryptoSessionMsg
}
static getSizeOfString(str) {
return (new Blob([str])).size
}
static getDateSize(data) {
let size = 0;
if (data.body) {
let body = data.body
if (typeof body != 'string') {
body = JSON.stringify(body)
}
size += this.getSizeOfString(body)
}
if (data.headers) {
size += this.getSizeOfString(JSON.stringify(data.headers))
}
return size;
}
static callTrafficUsageCallback(callbackName, data) {
if (typeof config.on[callbackName] === 'function') {
config.on[callbackName](this.getDateSize(data))
}
}
}
// The object for type MongoDB.Bson.ObjectId
// http://docs.mongodb.org/manual/reference/object-id/
const ObjectId = {
machine: Math.floor(Math.random() * 16777216).toString(16),
pid: Math.floor(Math.random() * 32767).toString(16),
increment: 0
}
module.exports = InternalUtils;