relution-sdk
Version:
Relution Software Development Kit for TypeScript and JavaScript
117 lines • 13.1 kB
JavaScript
/*
* @file web/offline.ts
* Relution SDK
*
* Created by Thomas Beckmann on 30.06.2016
* Copyright 2016 M-Way Solutions GmbH
*
* 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.
*/
/**
* @module web
*/
/** */
;
var Q = require('q');
var cipher = require('../core/cipher');
/**
* localStorage of browser or via require node-localstorage.
*
* @internal Not public API, exported for testing purposes only!
*/
function localStorage() {
return global['localStorage'] ||
process && !process['browser'] && (global['localStorage'] =
new (require('node-localstorage').LocalStorage)('localStorage')); // required version
}
exports.localStorage = localStorage;
/**
* computes key of login response data for some server.
*
* @param serverOptions providing server URL so that keys do not collide.
* @return {string} key suitable for local storage.
*/
function computeLocalStorageKey(serverOptions) {
var uniqueModuleName = module.filename || __filename;
return uniqueModuleName + '-' + serverOptions.serverUrl;
}
/**
* deletes stored login response of some server.
*
* @param credentials allowing to differentiate when multiple logins are used simultaneously, may
* be null to forget just anything.
* @param serverOptions identifying the server.
* @return {Promise<void>} indicating success or failure.
*
* @internal Not part of public API, for library use only.
*/
function clearOfflineLogin(credentials, serverOptions) {
// simultaneous logins using different credentials is not realized so far,
// so that the credentials parameter is irrelevant, but provided for the
// sake of completeness...
try {
localStorage().removeItem(computeLocalStorageKey(serverOptions));
return Q.resolve(undefined);
}
catch (error) {
return Q.reject(error);
}
}
exports.clearOfflineLogin = clearOfflineLogin;
/**
* writes response data to persistent storage for offline login purposes.
*
* @param credentials required for encryption.
* @param serverOptions identifying the server.
* @param loginResponse permitted to durable storage.
* @return {Promise<http.LoginResponse>} indicating success or failure.
*
* @internal Not part of public API, for library use only.
*/
function storeOfflineLogin(credentials, serverOptions, loginResponse) {
return cipher.encryptJson(credentials['password'], loginResponse).then(function (value) {
localStorage().setItem(computeLocalStorageKey(serverOptions), JSON.stringify(value));
return loginResponse;
});
}
exports.storeOfflineLogin = storeOfflineLogin;
/**
* reads response data from persistent storage.
*
* When there is no data in persitent store, the operation does NOT fail. In this case the
* resulting promise resolves to nil instead.
*
* @param credentials required for decryption.
* @param serverOptions identifying the server.
* @return {Promise<http.LoginResponse>} read from store, resolves to nil when there is no data,
* gets rejected when decryption fails.
*
* @internal Not part of public API, for library use only.
*/
function fetchOfflineLogin(credentials, serverOptions) {
try {
var value = localStorage().getItem(computeLocalStorageKey(serverOptions));
if (!value) {
return Q.resolve(undefined);
}
return cipher.decryptJson(credentials['password'], JSON.parse(value));
}
catch (error) {
return Q.reject(error);
}
}
exports.fetchOfflineLogin = fetchOfflineLogin;
exports.emptyInternal = function () {
return 'hello';
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWIvb2ZmbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0g7O0dBRUc7QUFDSCxNQUFNOztBQUVOLElBQVksQ0FBQyxXQUFNLEdBQUcsQ0FBQyxDQUFBO0FBRXZCLElBQVksTUFBTSxXQUFNLGdCQUFnQixDQUFDLENBQUE7QUFJekM7Ozs7R0FJRztBQUNIO0lBQ0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztZQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtBQUMzRixDQUFDO0FBSmUsb0JBQVksZUFJM0IsQ0FBQTtBQUVEOzs7OztHQUtHO0FBQ0gsZ0NBQWdDLGFBQW9DO0lBQ2xFLElBQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUM7SUFDdkQsTUFBTSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDO0FBQzFELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCwyQkFBa0MsV0FBNkIsRUFDN0IsYUFBb0M7SUFDcEUsMEVBQTBFO0lBQzFFLHdFQUF3RTtJQUN4RSwwQkFBMEI7SUFDMUIsSUFBSSxDQUFDO1FBQ0gsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQU8sU0FBUyxDQUFDLENBQUM7SUFDcEMsQ0FBRTtJQUFBLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBTyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0FBQ0gsQ0FBQztBQVhlLHlCQUFpQixvQkFXaEMsQ0FBQTtBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILDJCQUFrQyxXQUE2QixFQUM3QixhQUFvQyxFQUNwQyxhQUFpQztJQUVqRSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsS0FBSztRQUMzRSxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBUmUseUJBQWlCLG9CQVFoQyxDQUFBO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsMkJBQWtDLFdBQTZCLEVBQzdCLGFBQW9DO0lBRXBFLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxHQUFHLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNYLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFxQixTQUFTLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQXFCLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBRTtJQUFBLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBcUIsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztBQUNILENBQUM7QUFaZSx5QkFBaUIsb0JBWWhDLENBQUE7QUFFWSxxQkFBYSxHQUFHO0lBQzNCLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQGZpbGUgd2ViL29mZmxpbmUudHNcclxuICogUmVsdXRpb24gU0RLXHJcbiAqXHJcbiAqIENyZWF0ZWQgYnkgVGhvbWFzIEJlY2ttYW5uIG9uIDMwLjA2LjIwMTZcclxuICogQ29weXJpZ2h0IDIwMTYgTS1XYXkgU29sdXRpb25zIEdtYkhcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHdlYlxyXG4gKi9cclxuLyoqICovXHJcblxyXG5pbXBvcnQgKiBhcyBRIGZyb20gJ3EnO1xyXG5pbXBvcnQgKiBhcyBhdXRoIGZyb20gJy4uL3NlY3VyaXR5L2F1dGgnO1xyXG5pbXBvcnQgKiBhcyBjaXBoZXIgZnJvbSAnLi4vY29yZS9jaXBoZXInO1xyXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJy4vaHR0cCc7XHJcbmltcG9ydCAqIGFzIGluaXQgZnJvbSAnLi4vY29yZS9pbml0JztcclxuXHJcbi8qKlxyXG4gKiBsb2NhbFN0b3JhZ2Ugb2YgYnJvd3NlciBvciB2aWEgcmVxdWlyZSBub2RlLWxvY2Fsc3RvcmFnZS5cclxuICpcclxuICogQGludGVybmFsIE5vdCBwdWJsaWMgQVBJLCBleHBvcnRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5IVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsU3RvcmFnZSgpIHtcclxuICByZXR1cm4gZ2xvYmFsWydsb2NhbFN0b3JhZ2UnXSB8fFxyXG4gICAgcHJvY2VzcyAmJiAhcHJvY2Vzc1snYnJvd3NlciddICYmIChnbG9iYWxbJ2xvY2FsU3RvcmFnZSddID1cclxuICAgICAgbmV3IChyZXF1aXJlKCdub2RlLWxvY2Fsc3RvcmFnZScpLkxvY2FsU3RvcmFnZSkoJ2xvY2FsU3RvcmFnZScpKTsgLy8gcmVxdWlyZWQgdmVyc2lvblxyXG59XHJcblxyXG4vKipcclxuICogY29tcHV0ZXMga2V5IG9mIGxvZ2luIHJlc3BvbnNlIGRhdGEgZm9yIHNvbWUgc2VydmVyLlxyXG4gKlxyXG4gKiBAcGFyYW0gc2VydmVyT3B0aW9ucyBwcm92aWRpbmcgc2VydmVyIFVSTCBzbyB0aGF0IGtleXMgZG8gbm90IGNvbGxpZGUuXHJcbiAqIEByZXR1cm4ge3N0cmluZ30ga2V5IHN1aXRhYmxlIGZvciBsb2NhbCBzdG9yYWdlLlxyXG4gKi9cclxuZnVuY3Rpb24gY29tcHV0ZUxvY2FsU3RvcmFnZUtleShzZXJ2ZXJPcHRpb25zOiBpbml0LlNlcnZlclVybE9wdGlvbnMpIHtcclxuICBjb25zdCB1bmlxdWVNb2R1bGVOYW1lID0gbW9kdWxlLmZpbGVuYW1lIHx8IF9fZmlsZW5hbWU7XHJcbiAgcmV0dXJuIHVuaXF1ZU1vZHVsZU5hbWUgKyAnLScgKyBzZXJ2ZXJPcHRpb25zLnNlcnZlclVybDtcclxufVxyXG5cclxuLyoqXHJcbiAqIGRlbGV0ZXMgc3RvcmVkIGxvZ2luIHJlc3BvbnNlIG9mIHNvbWUgc2VydmVyLlxyXG4gKlxyXG4gKiBAcGFyYW0gY3JlZGVudGlhbHMgYWxsb3dpbmcgdG8gZGlmZmVyZW50aWF0ZSB3aGVuIG11bHRpcGxlIGxvZ2lucyBhcmUgdXNlZCBzaW11bHRhbmVvdXNseSwgbWF5XHJcbiAqICBiZSBudWxsIHRvIGZvcmdldCBqdXN0IGFueXRoaW5nLlxyXG4gKiBAcGFyYW0gc2VydmVyT3B0aW9ucyBpZGVudGlmeWluZyB0aGUgc2VydmVyLlxyXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZS5cclxuICpcclxuICogQGludGVybmFsIE5vdCBwYXJ0IG9mIHB1YmxpYyBBUEksIGZvciBsaWJyYXJ5IHVzZSBvbmx5LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT2ZmbGluZUxvZ2luKGNyZWRlbnRpYWxzOiBhdXRoLkNyZWRlbnRpYWxzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyT3B0aW9uczogaW5pdC5TZXJ2ZXJVcmxPcHRpb25zKTogUS5Qcm9taXNlPHZvaWQ+IHtcclxuICAvLyBzaW11bHRhbmVvdXMgbG9naW5zIHVzaW5nIGRpZmZlcmVudCBjcmVkZW50aWFscyBpcyBub3QgcmVhbGl6ZWQgc28gZmFyLFxyXG4gIC8vIHNvIHRoYXQgdGhlIGNyZWRlbnRpYWxzIHBhcmFtZXRlciBpcyBpcnJlbGV2YW50LCBidXQgcHJvdmlkZWQgZm9yIHRoZVxyXG4gIC8vIHNha2Ugb2YgY29tcGxldGVuZXNzLi4uXHJcbiAgdHJ5IHtcclxuICAgIGxvY2FsU3RvcmFnZSgpLnJlbW92ZUl0ZW0oY29tcHV0ZUxvY2FsU3RvcmFnZUtleShzZXJ2ZXJPcHRpb25zKSk7XHJcbiAgICByZXR1cm4gUS5yZXNvbHZlPHZvaWQ+KHVuZGVmaW5lZCk7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIHJldHVybiBRLnJlamVjdDx2b2lkPihlcnJvcik7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogd3JpdGVzIHJlc3BvbnNlIGRhdGEgdG8gcGVyc2lzdGVudCBzdG9yYWdlIGZvciBvZmZsaW5lIGxvZ2luIHB1cnBvc2VzLlxyXG4gKlxyXG4gKiBAcGFyYW0gY3JlZGVudGlhbHMgcmVxdWlyZWQgZm9yIGVuY3J5cHRpb24uXHJcbiAqIEBwYXJhbSBzZXJ2ZXJPcHRpb25zIGlkZW50aWZ5aW5nIHRoZSBzZXJ2ZXIuXHJcbiAqIEBwYXJhbSBsb2dpblJlc3BvbnNlIHBlcm1pdHRlZCB0byBkdXJhYmxlIHN0b3JhZ2UuXHJcbiAqIEByZXR1cm4ge1Byb21pc2U8aHR0cC5Mb2dpblJlc3BvbnNlPn0gaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuXHJcbiAqXHJcbiAqIEBpbnRlcm5hbCBOb3QgcGFydCBvZiBwdWJsaWMgQVBJLCBmb3IgbGlicmFyeSB1c2Ugb25seS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzdG9yZU9mZmxpbmVMb2dpbihjcmVkZW50aWFsczogYXV0aC5DcmVkZW50aWFscyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlck9wdGlvbnM6IGluaXQuU2VydmVyVXJsT3B0aW9ucyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luUmVzcG9uc2U6IGh0dHAuTG9naW5SZXNwb25zZSk6XHJcblEuUHJvbWlzZTxodHRwLkxvZ2luUmVzcG9uc2U+IHtcclxuICByZXR1cm4gY2lwaGVyLmVuY3J5cHRKc29uKGNyZWRlbnRpYWxzWydwYXNzd29yZCddLCBsb2dpblJlc3BvbnNlKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgbG9jYWxTdG9yYWdlKCkuc2V0SXRlbShjb21wdXRlTG9jYWxTdG9yYWdlS2V5KHNlcnZlck9wdGlvbnMpLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG4gICAgcmV0dXJuIGxvZ2luUmVzcG9uc2U7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiByZWFkcyByZXNwb25zZSBkYXRhIGZyb20gcGVyc2lzdGVudCBzdG9yYWdlLlxyXG4gKlxyXG4gKiBXaGVuIHRoZXJlIGlzIG5vIGRhdGEgaW4gcGVyc2l0ZW50IHN0b3JlLCB0aGUgb3BlcmF0aW9uIGRvZXMgTk9UIGZhaWwuIEluIHRoaXMgY2FzZSB0aGVcclxuICogcmVzdWx0aW5nIHByb21pc2UgcmVzb2x2ZXMgdG8gbmlsIGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBjcmVkZW50aWFscyByZXF1aXJlZCBmb3IgZGVjcnlwdGlvbi5cclxuICogQHBhcmFtIHNlcnZlck9wdGlvbnMgaWRlbnRpZnlpbmcgdGhlIHNlcnZlci5cclxuICogQHJldHVybiB7UHJvbWlzZTxodHRwLkxvZ2luUmVzcG9uc2U+fSByZWFkIGZyb20gc3RvcmUsIHJlc29sdmVzIHRvIG5pbCB3aGVuIHRoZXJlIGlzIG5vIGRhdGEsXHJcbiAqICBnZXRzIHJlamVjdGVkIHdoZW4gZGVjcnlwdGlvbiBmYWlscy5cclxuICpcclxuICogQGludGVybmFsIE5vdCBwYXJ0IG9mIHB1YmxpYyBBUEksIGZvciBsaWJyYXJ5IHVzZSBvbmx5LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoT2ZmbGluZUxvZ2luKGNyZWRlbnRpYWxzOiBhdXRoLkNyZWRlbnRpYWxzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyT3B0aW9uczogaW5pdC5TZXJ2ZXJVcmxPcHRpb25zKTpcclxuUS5Qcm9taXNlPGh0dHAuTG9naW5SZXNwb25zZT4ge1xyXG4gIHRyeSB7XHJcbiAgICBsZXQgdmFsdWUgPSBsb2NhbFN0b3JhZ2UoKS5nZXRJdGVtKGNvbXB1dGVMb2NhbFN0b3JhZ2VLZXkoc2VydmVyT3B0aW9ucykpO1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gUS5yZXNvbHZlPGh0dHAuTG9naW5SZXNwb25zZT4odW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEpzb248aHR0cC5Mb2dpblJlc3BvbnNlPihjcmVkZW50aWFsc1sncGFzc3dvcmQnXSwgSlNPTi5wYXJzZSh2YWx1ZSkpO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICByZXR1cm4gUS5yZWplY3Q8aHR0cC5Mb2dpblJlc3BvbnNlPihlcnJvcik7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZW1wdHlJbnRlcm5hbCA9ICgpID0+IHtcclxuICByZXR1cm4gJ2hlbGxvJztcclxufVxyXG4iXX0=