Rift.IO OSM R1 Initial Submission
[osm/UI.git] / skyquake / framework / utils / utils.js
diff --git a/skyquake/framework/utils/utils.js b/skyquake/framework/utils/utils.js
new file mode 100644 (file)
index 0000000..d08fe5f
--- /dev/null
@@ -0,0 +1,287 @@
+/*
+ * 
+ *   Copyright 2016 RIFT.IO Inc
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+//Login needs to be refactored. Too many cross dependencies
+var AuthActions = require('../widgets/login/loginAuthActions.js');
+var $ = require('jquery');
+var rw = require('utils/rw.js');
+var API_SERVER = rw.getSearchParams(window.location).api_server;
+var NODE_PORT = 3000;
+var SockJS = require('sockjs-client');
+
+var Utils = {};
+
+Utils.DescriptorModelMeta = null;
+
+var INACTIVITY_TIMEOUT = 600000;
+
+Utils.getInactivityTimeout = function() {
+    return new Promise(function(resolve, reject) {
+        $.ajax({
+            url: '/inactivity-timeout',
+            type: 'GET',
+            success: function(data) {
+                resolve(data);
+            },
+            error: function(error) {
+                console.log("There was an error getting the inactivity-timeout: ", error);
+                reject(error);
+            }
+        }).fail(function(xhr) {
+            console.log('There was an xhr error getting the inactivity-timeout', xhr);
+            reject(xhr);
+        });
+    });
+};
+
+Utils.isMultiplexerLoaded = function() {
+    if (window.multiplexer) {
+        return true;
+    }
+    return false;
+};
+
+Utils.setupMultiplexClient = function() {
+    var sockjs_url = '/multiplex';
+
+    var sockjs = new SockJS(sockjs_url);
+
+    var loadChecker = function() {
+        try {
+            window.multiplexer = new WebSocketMultiplex(sockjs);
+            console.log('WebSocketMultiplex loaded');
+        } catch (e) {
+            // caught an error, retry in someTime
+            console.log('WebSocketMultiplex not loaded yet. will try again in 1 second:', e);
+            setTimeout(function() {
+                loadChecker();
+            }, 1000);
+        }
+    }
+    loadChecker();
+};
+
+Utils.checkAndResolveSocketRequest = function(data, resolve, reject) {
+    const checker = () => {
+        if (!Utils.isMultiplexerLoaded()) {
+            setTimeout(() => {
+                checker();
+            }, 500);
+        } else {
+            resolve(data.id);
+        }
+    };
+
+    checker();
+};
+
+Utils.bootstrapApplication = function() {
+    var self = this;
+    return new Promise(function(resolve, reject) {
+        Promise.all([self.getInactivityTimeout()]).then(function(results) {
+            INACTIVITY_TIMEOUT = results[0]['inactivity-timeout'];
+            resolve();
+        }, function(error) {
+            console.log("Error bootstrapping application ", error);
+            reject();
+        });
+    });
+};
+
+Utils.getDescriptorModelMeta = function() {
+    return new Promise(function(resolve, reject) {
+        if (!Utils.DescriptorModelMeta) {
+            $.ajax({
+                url: '/descriptor-model-meta?api_server=' + API_SERVER,
+                type: 'GET',
+                beforeSend: Utils.addAuthorizationStub,
+                success: function(data) {
+                    Utils.DescriptorModelMeta = data;
+                    Utils.DescriptorModelMetaLoaded = true;
+                    resolve(data);
+                },
+                error: function(error) {
+                    console.log("There was an error getting the schema: ", error);
+                    reject(error);
+                }
+            }).fail(function(xhr) {
+                console.log("There was an error getting the schema: ", xhr);
+                Utils.checkAuthentication(xhr.status);
+            });
+        } else {
+            resolve(Utils.DescriptorModelMeta);
+        }
+    })
+}
+
+Utils.addAuthorizationStub = function(xhr) {
+    var Auth = window.sessionStorage.getItem("auth");
+    xhr.setRequestHeader('Authorization', 'Basic ' + Auth);
+};
+
+Utils.getByteDataWithUnitPrefix = function(number, precision) {
+    var toPrecision = precision || 3;
+    if (number < Math.pow(10, 3)) {
+        return [number, 'B'];
+    } else if (number < Math.pow(10, 6)) {
+        return [(number / Math.pow(10, 3)).toPrecision(toPrecision), 'KB'];
+    } else if (number < Math.pow(10, 9)) {
+        return [(number / Math.pow(10, 6)).toPrecision(toPrecision), 'MB'];
+    } else if (number < Math.pow(10, 12)) {
+        return [(number / Math.pow(10, 9)).toPrecision(toPrecision), 'GB'];
+    } else if (number < Math.pow(10, 15)) {
+        return [(number / Math.pow(10, 12)).toPrecision(toPrecision), 'TB'];
+    } else if (number < Math.pow(10, 18)) {
+        return [(number / Math.pow(10, 15)).toPrecision(toPrecision), 'PB'];
+    } else if (number < Math.pow(10, 21)) {
+        return [(number / Math.pow(10, 18)).toPrecision(toPrecision), 'EB'];
+    } else if (number < Math.pow(10, 24)) {
+        return [(number / Math.pow(10, 21)).toPrecision(toPrecision), 'ZB'];
+    } else if (number < Math.pow(10, 27)) {
+        return [(number / Math.pow(10, 24)).toPrecision(toPrecision), 'ZB'];
+    } else {
+        return [(number / Math.pow(10, 27)).toPrecision(toPrecision), 'YB'];
+    }
+}
+
+Utils.getPacketDataWithUnitPrefix = function(number, precision) {
+    var toPrecision = precision || 3;
+    if (number < Math.pow(10, 3)) {
+        return [number, 'P'];
+    } else if (number < Math.pow(10, 6)) {
+        return [(number / Math.pow(10, 3)).toPrecision(toPrecision), 'KP'];
+    } else if (number < Math.pow(10, 9)) {
+        return [(number / Math.pow(10, 6)).toPrecision(toPrecision), 'MP'];
+    } else if (number < Math.pow(10, 12)) {
+        return [(number / Math.pow(10, 9)).toPrecision(toPrecision), 'GP'];
+    } else if (number < Math.pow(10, 15)) {
+        return [(number / Math.pow(10, 12)).toPrecision(toPrecision), 'TP'];
+    } else if (number < Math.pow(10, 18)) {
+        return [(number / Math.pow(10, 15)).toPrecision(toPrecision), 'PP'];
+    } else if (number < Math.pow(10, 21)) {
+        return [(number / Math.pow(10, 18)).toPrecision(toPrecision), 'EP'];
+    } else if (number < Math.pow(10, 24)) {
+        return [(number / Math.pow(10, 21)).toPrecision(toPrecision), 'ZP'];
+    } else if (number < Math.pow(10, 27)) {
+        return [(number / Math.pow(10, 24)).toPrecision(toPrecision), 'ZP'];
+    } else {
+        return [(number / Math.pow(10, 27)).toPrecision(toPrecision), 'YP'];
+    }
+}
+Utils.loginHash = "#/login";
+Utils.setAuthentication = function(username, password, cb) {
+    var self = this;
+    var AuthBase64 = btoa(username + ":" + password);
+    window.sessionStorage.setItem("auth", AuthBase64);
+    self.detectInactivity();
+    if (cb) {
+        cb();
+    }
+}
+Utils.clearAuthentication = function(callback) {
+    var self = this;
+    window.sessionStorage.removeItem("auth");
+    AuthActions.notAuthenticated();
+    window.sessionStorage.setItem("locationRefHash", window.location.hash);
+    if (callback) {
+        callback();
+    } else {
+        window.location.hash = Utils.loginHash;
+    }
+}
+Utils.isNotAuthenticated = function(windowLocation, callback) {
+    var self = this;
+    self.detectInactivity();
+    if (!window.sessionStorage.getItem("auth")) {
+        Utils.clearAuthentication();
+    }
+}
+Utils.isDetecting = false;
+Utils.detectInactivity = function(callback, duration) {
+    var self = this;
+    if (!self.isDetecting) {
+        var cb = function() {
+            self.clearAuthentication();
+            if (callback) {
+                callback();
+            }
+        };
+        var isInactive;
+        var timeout = duration || INACTIVITY_TIMEOUT;
+        var setInactive = function() {
+            isInactive = setTimeout(cb, timeout);
+        };
+        var reset = function() {
+            clearTimeout(isInactive);
+            setInactive();
+        }
+        setInactive();
+        window.addEventListener('mousemove', reset);
+        window.addEventListener("keypress", reset);
+        self.isDetecting = true;
+    }
+}
+Utils.checkAuthentication = function(statusCode, cb) {
+    var self = this;
+    if (statusCode == 401) {
+        if (cb) {
+            cb();
+        }
+        window.sessionStorage.removeItem("auth")
+        self.isNotAuthenticated(window.location)
+        return true;
+    }
+    return false;
+}
+
+Utils.isAuthenticationCached = function() {
+    var self = this;
+    if (window.sessionStorage.getItem("auth")) {
+        return true;
+    }
+    return false;
+}
+
+Utils.getHostNameFromURL = function(url) {
+    var match = url.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)([^?#]*)(\?[^#]*|)(#.*|)$/);
+    return match && match[3];
+}
+
+Utils.webSocketProtocol = function() {
+    if (this.wsProto) {
+        return this.wsProto;
+    } else {
+        if (window.location.protocol == 'http:') {
+            this.wsProto = 'ws:'
+        } else {
+            this.wsProto = 'wss:'
+        }
+    }
+    return this.wsProto;
+}
+
+Utils.arrayIntersperse = (arr, sep) => {
+    if (arr.length === 0) {
+        return [];
+    }
+
+    return arr.slice(1).reduce((xs, x, i) => {
+        return xs.concat([sep, x]);
+    }, [arr[0]]);
+}
+
+module.exports = Utils;