angular-webstorage-service
Version:
Angular4+ service wrappers for the webstorage API
173 lines (166 loc) • 7.59 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) :
typeof define === 'function' && define.amd ? define(['exports', '@angular/core'], factory) :
(factory((global.angularWebstorageService = global.angularWebstorageService || {}),global.ng.core));
}(this, (function (exports,_angular_core) { 'use strict';
/**
* An implementation of `StorageService` interface that uses an underlying (web) `Storage` object, such as `localStorage` and
* `sessionStorage`, as backing data store. This class basically wraps the `Storage` object so it can be accessed through the
* `StorageService` interface.
*/
var WebStorageService = (function () {
/**
* Creates a new `WebStorageService` instance that uses the specified (web) storage object as underlying backing storage.
*
* @param storage Storage object which is to be wrapped in a class that implements the `StorageService` interface.
*/
function WebStorageService(storage) {
this.storage = storage;
}
/**
* Retrieves the value stored for the entry that is associated with the specified key. If no such entry exists or if the service for
* some reason is unable to fetch the value of the entry then `null` will be returned.
*
* @param key Identifier of the entry whose value is to be retrieved.
* @returns Value of the entry that is identified by the specified key or `null` if the entry does not exist or cannot be loaded.
*/
WebStorageService.prototype.get = function (key) {
try {
return JSON.parse(this.storage.getItem(key));
}
catch (error) {
return null;
}
};
/**
* Creates or updates the entry identified by the specified key with the given value. Storing a value into the storage service will
* ensure that an equivalent of the value can be read back, i.e. the data and structure of the value will be the same. It, however, does
* not necessarily return the same value, i.e. the same reference.
*
* @param key Identifier of the entry which is to be created or updated.
* @param value Value which is to be stored.
*/
WebStorageService.prototype.set = function (key, value) {
this.storage.setItem(key, JSON.stringify(value));
};
/**
* Removes the entry that is identified by the specified key. Attempting to remove an entry for an unknown key will have no effect.
* Attempting to retrieve an entry via the `get` method after it has been removed will result in `null`.
*
* @param key Identifier of the entry which is to be removed.
*/
WebStorageService.prototype.remove = function (key) {
this.storage.removeItem(key);
};
return WebStorageService;
}());
/**
* Checks whether the specified (web) storage is available and functional. This might not be the case for older browsers. However even
* certain browsers that do support the web storage API can, under some circumstances, have non functional storage objects. For example,
* Safari is known to have `localStorage` and `sessionStorage` throw exceptions in private mode.
*
* @param storage Storage object which is to be tested for availability.
*/
function isStorageAvailable(storage) {
// Check if storage is available.
if (!storage) {
return false;
}
// Check if the storage can actually be accessed.
try {
var now = Date.now();
var testItemKey = "storage-test-entry-" + now;
var testItemValue = "storage-test-value-" + now;
storage.setItem(testItemKey, testItemValue);
var retrievedItemValue = storage.getItem(testItemKey);
storage.removeItem(testItemKey);
return retrievedItemValue === testItemValue;
}
catch (error) {
return false;
}
}
/**
* A volatile `StorageService` implementation. This service guarantees that data stored will remain available as long as the application
* instance is active. After the application is terminated all data will be lost.
*/
var InMemoryStorageService = (function () {
function InMemoryStorageService() {
this.storage = new Map();
}
/**
* Retrieves the value stored for the entry that is associated with the specified key. If no such entry exists or if the service for
* some reason is unable to fetch the value of the entry then `null` will be returned.
*
* @param key Identifier of the entry whose value is to be retrieved.
* @returns Value of the entry that is identified by the specified key or `null` if the entry does not exist or cannot be loaded.
*/
InMemoryStorageService.prototype.get = function (key) {
if (!this.storage.has(key)) {
return null;
}
return this.storage.get(key);
};
/**
* Creates or updates the entry identified by the specified key with the given value. Storing a value into the storage service will
* ensure that an equivalent of the value can be read back, i.e. the data and structure of the value will be the same. It, however, does
* not necessarily return the same value, i.e. the same reference.
*
* @param key Identifier of the entry which is to be created or updated.
* @param value Value which is to be stored.
*/
InMemoryStorageService.prototype.set = function (key, value) {
this.storage.set(key, value);
};
/**
* Removes the entry that is identified by the specified key. Attempting to remove an entry for an unknown key will have no effect.
* Attempting to retrieve an entry via the `get` method after it has been removed will result in `null`.
*
* @param key Identifier of the entry which is to be removed.
*/
InMemoryStorageService.prototype.remove = function (key) {
this.storage.delete(key);
};
return InMemoryStorageService;
}());
/** Injection token for the session storage service. */
var SESSION_STORAGE = new _angular_core.InjectionToken('SESSION_STORAGE');
/** Injection token for the local storage service. */
var LOCAL_STORAGE = new _angular_core.InjectionToken('LOCAL_STORAGE');
function sessionStorageFactory() {
if (!isStorageAvailable(sessionStorage)) {
return new InMemoryStorageService();
}
return new WebStorageService(sessionStorage);
}
function localStorageFactory() {
if (!isStorageAvailable(localStorage)) {
return new InMemoryStorageService();
}
return new WebStorageService(localStorage);
}
var StorageServiceModule = (function () {
function StorageServiceModule() {
}
return StorageServiceModule;
}());
StorageServiceModule.decorators = [
{ type: _angular_core.NgModule, args: [{
providers: [
{ provide: SESSION_STORAGE, useFactory: sessionStorageFactory },
{ provide: LOCAL_STORAGE, useFactory: localStorageFactory }
]
},] },
];
/** @nocollapse */
StorageServiceModule.ctorParameters = function () { return []; };
exports.WebStorageService = WebStorageService;
exports.isStorageAvailable = isStorageAvailable;
exports.InMemoryStorageService = InMemoryStorageService;
exports.SESSION_STORAGE = SESSION_STORAGE;
exports.LOCAL_STORAGE = LOCAL_STORAGE;
exports.sessionStorageFactory = sessionStorageFactory;
exports.localStorageFactory = localStorageFactory;
exports.StorageServiceModule = StorageServiceModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));