UNPKG

relution-sdk

Version:

Relution Software Development Kit for TypeScript and JavaScript

117 lines 13.1 kB
/* * @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 */ /** */ "use strict"; 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=