API Docs for:
Show:

File: /home/padewitte/projets/webcomponents/myscript-js/src/networking/networkInterface.js

'use strict';

(function (scope, Q) {
    /**
     * Network interface
     *
     * @class NetworkInterface
     * @constructor
     */
    function NetworkInterface() {
    }

    NetworkInterface.parseURL = function (url) {

        var parser = document.createElement('a'),
            searchObject = {},
            queries, split, i;
        // Let the browser do the work
        parser.href = url;
        // Convert query string to object
        queries = parser.search.replace(/^\?/, '').split('&');
        for (i = 0; i < queries.length; i++) {
            split = queries[i].split('=');
            searchObject[split[0]] = split[1];
        }
        return {
            protocol: parser.protocol,
            host: parser.host,
            hostname: parser.hostname,
            port: parser.port,
            pathname: parser.pathname,
            search: parser.search,
            searchObject: searchObject,
            hash: parser.hash
        };
    };

    /**
     * Parse JSON String to Object
     *
     * @method parse
     * @param {Object} req
     * @returns {Object}
     */
    NetworkInterface.parse = function (req) {
        var result;
        try {
            result = JSON.parse(req.responseText);
        } catch (e) {
            result = req.responseText;
        }
        return result;
    };

    /**
     * Transform object data request to a list of parameters
     *
     * @method transformRequest
     * @param {Object} [obj]
     * @returns {String}
     */
    NetworkInterface.transformRequest = function (obj) {
        var str = [];
        for (var p in obj) {
            if ((typeof obj[p] !== 'undefined') &&
                (typeof obj[p] !== 'function')) {
                str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));
            }
        }
        return str.join('&');
    };

    /**
     * Send request to the network and return a promise
     *
     * @method xhr
     * @param {String} type
     * @param {String} url
     * @param {Object} data
     * @returns {Promise}
     */
    NetworkInterface.xhr = function (type, url, data) {

        return Q.Promise(function (resolve, reject, notify) {

            function onStateChange() {
                if (request.readyState === 4) {
                    if (request.status >= 200 && request.status < 300) {
                        resolve(NetworkInterface.parse(request));
                    }
                }
            }

            function onLoad() {
                if (request.status >= 200 && request.status < 300) {
                    resolve(NetworkInterface.parse(request));
                } else {
                    reject(new Error(request.responseText));
                }
            }

            function onError() {
                reject(new Error('Can\'t XHR ' + url));
            }

            function onProgress(e) {
                notify(e.loaded / e.total);
            }

            var request = new XMLHttpRequest();
            request.open(type, url, true);
            request.withCredentials = true;
            request.setRequestHeader('Accept', 'application/json');
            request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
            request.onerror = onError;
            request.onprogress = onProgress;
            request.onload = onLoad;
            request.onreadystatechange = onStateChange;
            request.send(NetworkInterface.transformRequest(data));
        });
    };

    /**
     * Get request
     *
     * @method get
     * @param {String} src
     * @param {Object} params
     * @returns {Promise}
     */
    NetworkInterface.get = function (src, params) {
        if (params) {
            src += '?' + NetworkInterface.transformRequest(params);
        }
        return scope.NetworkInterface.xhr('GET', src, undefined);
    };

    /**
     * Put request
     *
     * @method put
     * @param {String} url
     * @param {Object} data
     * @returns {Promise}
     */
    NetworkInterface.put = function (url, data) {
        return scope.NetworkInterface.xhr('PUT', url, data);
    };

    /**
     * Post request
     *
     * @method post
     * @param {String} url
     * @param {Object} data
     * @returns {Promise}
     */
    NetworkInterface.post = function (url, data) {
        return scope.NetworkInterface.xhr('POST', url, data);
    };

    /**
     * Delete request
     *
     * @method delete
     * @param {String} url
     * @param {Object} data
     * @returns {Promise}
     */
    NetworkInterface.delete = function (url, data) {
        return scope.NetworkInterface.xhr('DELETE', url, data);
    };

    // Export
    scope.NetworkInterface = NetworkInterface;
})(MyScript, Q);