Code coverage report for src/index.js

Statements: 100% (60 / 60)      Branches: 94.59% (35 / 37)      Functions: 100% (11 / 11)      Lines: 100% (59 / 59)      Ignored: 1 branch     

All files » src/ » index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126        5   1   1   1   1   1   1   1   1   1   1   1 1   1 18 18   18   18         18 26 26 26   1 1         18 8 8   1     10   18   18   6       8       3       19 19 19 19       5 5   5         18 8 1   7     8 8 3       18   18   18 1 1       18 7 7     18 13     18    
'use strict';
 
// istanbul ignore next
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 
var _xtend = require('xtend');
 
var _xtend2 = _interopRequireDefault(_xtend);
 
var _cookieMonster = require('cookie-monster');
 
var _cookieMonster2 = _interopRequireDefault(_cookieMonster);
 
var _jwtDecode = require('jwt-decode');
 
var _jwtDecode2 = _interopRequireDefault(_jwtDecode);
 
var _events = require('events');
 
var _events2 = _interopRequireDefault(_events);
 
var _localStorage = require('local-storage');
 
var _localStorage2 = _interopRequireDefault(_localStorage);
 
var EventEmitter = _events2['default'].EventEmitter;
var noop = function noop() {};
 
module.exports = function (options) {
  var user = undefined;
  var token = undefined;
 
  options = (0, _xtend2['default'])({ cookie: 'XSRF-TOKEN' }, options);
 
  var logger = options.logger || {
    info: noop,
    warn: noop
  };
 
  var decodeToken = function decodeToken(token) {
    Eif (token) {
      try {
        return (0, _jwtDecode2['default'])(token);
      } catch (e) {
        logger.warn('[JWT store] Invalid JWT: ' + token);
        return void 0;
      }
    }
  };
 
  if (options.localStorageKey) {
    try {
      token = _localStorage2['default'].get(options.localStorageKey);
    } catch (e) {
      logger.warn('[JWT store] Unable to get token', e);
    }
  } else {
    token = _cookieMonster2['default'].get && _cookieMonster2['default'].get(options.cookie);
  }
  logger.info('[JWT store] created store with token', token);
 
  var tokenStore = (0, _xtend2['default'])({
    getToken: function getToken() {
      return token;
    },
 
    getUser: function getUser() {
      return user;
    },
 
    getUserId: function getUserId() {
      return user ? user.id : void 0;
    },
 
    setToken: function setToken(newToken) {
      logger.info('[JWT store] setting new token', newToken);
      token = newToken;
      user = decodeToken(token);
      this.emit('Token received', token, user);
    },
 
    refreshToken: function refreshToken() {
      Eif (options.refresh) {
        logger.info('[JWT store] refreshing token', token);
 
        options.refresh(token).then(tokenStore.setToken.bind(tokenStore));
      }
    }
  }, EventEmitter.prototype);
 
  var refreshToken = function refreshToken() {
    if (!token && options.refresh) {
      tokenStore.refreshToken();
    } else {
      user = decodeToken(token);
    }
 
    var expDate = user ? new Date(user.exp * 1000 - expiryWindow) : null;
    if (expDate && expDate < new Date() && options.refresh) {
      tokenStore.refreshToken();
    }
  };
 
  var refreshInterval = options.refreshInterval ? options.refreshInterval : 60 * 1000; // default to checking every minute
 
  var expiryWindow = options.expiryWindow ? options.expiryWindow : 2 * refreshInterval; // default to refreshing if we're two refreshInterval's away from expiration
 
  if (options.listeners) {
    Object.keys(options.listeners).forEach(function (key) {
      tokenStore.on(key, options.listeners[key]);
    });
  }
 
  if (options.refresh) {
    refreshToken();
    setInterval(refreshToken, refreshInterval);
  }
 
  if (token) {
    tokenStore.setToken(token);
  }
 
  return tokenStore;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9zZXRoL2Vudi9kZXYvcmVhY3Qtand0LXN0b3JlL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUE7Ozs7OztxQkFFTyxPQUFPOzs7OzZCQUNQLGdCQUFnQjs7Ozt5QkFDaEIsWUFBWTs7OztzQkFDWixRQUFROzs7OzRCQUNaLGVBQWU7Ozs7QUFFOUIsSUFBTSxZQUFZLEdBQUcsb0JBQU8sWUFBWSxDQUFBO0FBQ3hDLElBQU0sSUFBSSxHQUFHLFNBQVAsSUFBSSxHQUFlLEVBQUcsQ0FBQTs7QUFFNUIsTUFBTSxDQUFDLE9BQU8sR0FBRyxVQUFDLE9BQU8sRUFBSztBQUM1QixNQUFJLElBQUksWUFBQSxDQUFBO0FBQ1IsTUFBSSxLQUFLLFlBQUEsQ0FBQTs7QUFFVCxTQUFPLEdBQUcsd0JBQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7O0FBRW5ELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUk7QUFDL0IsUUFBSSxFQUFFLElBQUk7QUFDVixRQUFJLEVBQUUsSUFBSTtHQUNYLENBQUE7O0FBRUQsTUFBTSxXQUFXLEdBQUcsU0FBZCxXQUFXLENBQUcsS0FBSyxFQUFJO0FBQzNCLFFBQUksS0FBSyxFQUFFO0FBQ1QsVUFBSTtBQUNGLGVBQU8sNEJBQU8sS0FBSyxDQUFDLENBQUE7T0FDckIsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNWLGNBQU0sQ0FBQyxJQUFJLCtCQUE2QixLQUFLLENBQUcsQ0FBQTtBQUNoRCxlQUFPLEtBQUssQ0FBQyxDQUFBO09BQ2Q7S0FDRjtHQUNGLENBQUE7O0FBRUQsTUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFO0FBQzNCLFFBQUk7QUFDRixXQUFLLEdBQUcsMEJBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtLQUN4QyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ1YsWUFBTSxDQUFDLElBQUksQ0FBQyxp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QUFBO0NBQ2xCLENBQUEiLCJmaWxlIjoiL1VzZXJzL3NldGgvZW52L2Rldi9yZWFjdC1qd3Qtc3RvcmUvc3JjL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBleHRlbmQgZnJvbSAneHRlbmQnXG5pbXBvcnQgY29va2llIGZyb20gJ2Nvb2tpZS1tb25zdGVyJ1xuaW1wb3J0IGRlY29kZSBmcm9tICdqd3QtZGVjb2RlJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnXG5pbXBvcnQgbHMgZnJvbSAnbG9jYWwtc3RvcmFnZSdcblxuY29uc3QgRXZlbnRFbWl0dGVyID0gZXZlbnRzLkV2ZW50RW1pdHRlclxuY29uc3Qgbm9vcCA9IGZ1bmN0aW9uICgpIHsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IChvcHRpb25zKSA9PiB7XG4gIGxldCB1c2VyXG4gIGxldCB0b2tlblxuXG4gIG9wdGlvbnMgPSBleHRlbmQoeyBjb29raWU6ICdYU1JGLVRPS0VOJyB9LCBvcHRpb25zKVxuXG4gIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IHtcbiAgICBpbmZvOiBub29wLFxuICAgIHdhcm46IG5vb3BcbiAgfVxuXG4gIGNvbnN0IGRlY29kZVRva2VuID0gdG9rZW4gPT4ge1xuICAgIGlmICh0b2tlbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZSh0b2tlbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtKV1Qgc3RvcmVdIEludmFsaWQgSldUOiAke3Rva2VufWApXG4gICAgICAgIHJldHVybiB2b2lkIDBcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5sb2NhbFN0b3JhZ2VLZXkpIHtcbiAgICB0cnkge1xuICAgICAgdG9rZW4gPSBscy5nZXQob3B0aW9ucy5sb2NhbFN0b3JhZ2VLZXkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tKV1Qgc3RvcmVdIFVuYWJsZSB0byBnZXQgdG9rZW4nLCBlKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b2tlbiA9IGNvb2tpZS5nZXQgJiYgY29va2llLmdldChvcHRpb25zLmNvb2tpZSlcbiAgfVxuICBsb2dnZXIuaW5mbygnW0pXVCBzdG9yZV0gY3JlYXRlZCBzdG9yZSB3aXRoIHRva2VuJywgdG9rZW4pXG5cbiAgY29uc3QgdG9rZW5TdG9yZSA9IGV4dGVuZCh7XG4gICAgZ2V0VG9rZW4gKCkge1xuICAgICAgcmV0dXJuIHRva2VuXG4gICAgfSxcblxuICAgIGdldFVzZXIgKCkge1xuICAgICAgcmV0dXJuIHVzZXJcbiAgICB9LFxuXG4gICAgZ2V0VXNlcklkICgpIHtcbiAgICAgIHJldHVybiB1c2VyID8gdXNlci5pZCA6IHZvaWQgMFxuICAgIH0sXG5cbiAgICBzZXRUb2tlbiAobmV3VG9rZW4pIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbSldUIHN0b3JlXSBzZXR0aW5nIG5ldyB0b2tlbicsIG5ld1Rva2VuKVxuICAgICAgdG9rZW4gPSBuZXdUb2tlblxuICAgICAgdXNlciA9IGRlY29kZVRva2VuKHRva2VuKVxuICAgICAgdGhpcy5lbWl0KCdUb2tlbiByZWNlaXZlZCcsIHRva2VuLCB1c2VyKVxuICAgIH0sXG5cbiAgICByZWZyZXNoVG9rZW4gKCkge1xuICAgICAgaWYgKG9wdGlvbnMucmVmcmVzaCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnW0pXVCBzdG9yZV0gcmVmcmVzaGluZyB0b2tlbicsIHRva2VuKVxuXG4gICAgICAgIG9wdGlvbnMucmVmcmVzaCh0b2tlbilcbiAgICAgICAgLnRoZW4odG9rZW5TdG9yZS5zZXRUb2tlbi5iaW5kKHRva2VuU3RvcmUpKVxuICAgICAgfVxuICAgIH1cbiAgfSwgRXZlbnRFbWl0dGVyLnByb3RvdHlwZSlcblxuICBjb25zdCByZWZyZXNoVG9rZW4gPSAoKSA9PiB7XG4gICAgaWYgKCF0b2tlbiAmJiBvcHRpb25zLnJlZnJlc2gpIHtcbiAgICAgIHRva2VuU3RvcmUucmVmcmVzaFRva2VuKClcbiAgICB9IGVsc2Uge1xuICAgICAgdXNlciA9IGRlY29kZVRva2VuKHRva2VuKVxuICAgIH1cblxuICAgIGxldCBleHBEYXRlID0gdXNlciA/IG5ldyBEYXRlKHVzZXIuZXhwICogMTAwMCAtIGV4cGlyeVdpbmRvdykgOiBudWxsXG4gICAgaWYgKGV4cERhdGUgJiYgZXhwRGF0ZSA8IG5ldyBEYXRlKCkgJiYgb3B0aW9ucy5yZWZyZXNoKSB7XG4gICAgICB0b2tlblN0b3JlLnJlZnJlc2hUb2tlbigpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gb3B0aW9ucy5yZWZyZXNoSW50ZXJ2YWxcbiAgICA/IG9wdGlvbnMucmVmcmVzaEludGVydmFsXG4gICAgOiA2MCAqIDEwMDAgLy8gZGVmYXVsdCB0byBjaGVja2luZyBldmVyeSBtaW51dGVcblxuICBjb25zdCBleHBpcnlXaW5kb3cgPSBvcHRpb25zLmV4cGlyeVdpbmRvd1xuICAgID8gb3B0aW9ucy5leHBpcnlXaW5kb3dcbiAgICA6IDIgKiByZWZyZXNoSW50ZXJ2YWwgLy8gZGVmYXVsdCB0byByZWZyZXNoaW5nIGlmIHdlJ3JlIHR3byByZWZyZXNoSW50ZXJ2YWwncyBhd2F5IGZyb20gZXhwaXJhdGlvblxuXG4gIGlmIChvcHRpb25zLmxpc3RlbmVycykge1xuICAgIE9iamVjdC5rZXlzKG9wdGlvbnMubGlzdGVuZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRva2VuU3RvcmUub24oa2V5LCBvcHRpb25zLmxpc3RlbmVyc1trZXldKVxuICAgIH0pXG4gIH1cblxuICBpZiAob3B0aW9ucy5yZWZyZXNoKSB7XG4gICAgcmVmcmVzaFRva2VuKClcbiAgICBzZXRJbnRlcnZhbChyZWZyZXNoVG9rZW4sIHJlZnJlc2hJbnRlcnZhbClcbiAgfVxuXG4gIGlmICh0b2tlbikge1xuICAgIHRva2VuU3RvcmUuc2V0VG9rZW4odG9rZW4pXG4gIH1cblxuICByZXR1cm4gdG9rZW5TdG9yZVxufVxuIl19