esspired
Version:
session storage with an expiration
119 lines (100 loc) • 3.33 kB
JavaScript
;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Esspired = function () {
function Esspired() {
_classCallCheck(this, Esspired);
}
_createClass(Esspired, [{
key: 'length',
value: function length() {
return window.sessionStorage.length;
}
}, {
key: 'key',
value: function key(n) {
return window.sessionStorage.key(n);
}
}, {
key: 'getItem',
value: function getItem(key) {
var item = window.sessionStorage.getItem(key);
try {
var entry = JSON.parse(item);
/* return entry as is if not an esspired entry. */
if (!entry.data && !entry.expire) {
return entry;
}
var data = entry.data;
var expire = entry.expire;
var now = new Date();
var expiration = new Date(expire);
if (expire !== -1 && now.getTime() > expiration.getTime()) {
window.sessionStorage.removeItem(key);
return null;
}
return data;
} catch (e) {
/* return item as is if not an object. */
return item;
}
}
}, {
key: 'setItem',
value: function setItem(key, data) {
var expire = arguments.length <= 2 || arguments[2] === undefined ? -1 : arguments[2];
var entry = { data: data, expire: expire };
return window.sessionStorage.setItem(key, JSON.stringify(entry));
}
}, {
key: 'removeItem',
value: function removeItem(key) {
return window.sessionStorage.removeItem(key);
}
}, {
key: 'clear',
value: function clear() {
return window.sessionStorage.clear();
}
}]);
return Esspired;
}();
/* polyfill sessionStorage but it wont be persistant. */
var StoragePolyfill = function () {
function StoragePolyfill() {
_classCallCheck(this, StoragePolyfill);
this._data = {};
}
_createClass(StoragePolyfill, [{
key: 'setItem',
value: function setItem(key, data) {
return this._data[key] = String(data);
}
}, {
key: 'getItem',
value: function getItem(key) {
return this._data.hasOwnProperty(key) ? this._data[key] : null;
}
}, {
key: 'removeItem',
value: function removeItem(key) {
return delete this._data[key];
}
}, {
key: 'clear',
value: function clear() {
return this._data = {};
}
}]);
return StoragePolyfill;
}();
function hasSessionStorage() {
try {
window.sessionStorage.setItem('test', 'test');
window.sessionStorage.removeItem('test');
return true;
} catch (e) {
return false;
}
}
module.exports = hasSessionStorage() ? new Esspired() : new StoragePolyfill();