@ngx-pwa/local-storage
Version:
Efficient local storage module for Angular: simple API based on native localStorage API, but internally stored via the asynchronous IndexedDB API for performance, and wrapped in RxJS observables to be homogeneous with other Angular modules.
77 lines • 11.2 kB
JavaScript
import { Injectable, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { IDB_STORE_NAME, IDB_DB_NAME, LS_PREFIX, IDB_DB_VERSION, IDB_NO_WRAP } from '../tokens';
import { IndexedDBDatabase } from './indexeddb-database';
import { LocalStorageDatabase } from './localstorage-database';
import { MemoryDatabase } from './memory-database';
import * as i0 from "@angular/core";
import * as i1 from "../tokens";
/**
* Factory to create a storage according to browser support
* @param platformId Context about the platform (`browser`, `server`...)
* @param LSPrefix Prefix for `localStorage` keys to avoid collision for multiple apps on the same subdomain
* @param IDBDBName `indexedDB` database name
* @param IDBstoreName `indexedDB` storeName name
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/master/docs/BROWSERS_SUPPORT.md}
*/
export function localDatabaseFactory(platformId, LSPrefix, IDBDBName, IDBStoreName, IDBDBVersion, IDBNoWrap) {
/* When storage is fully disabled in browser (via the "Block all cookies" option),
* just trying to check `indexedDB` or `localStorage` variables causes a security exception.
* Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118
*/
try {
// Do not explicit `window` here, as the global object is not the same in web workers
if (isPlatformBrowser(platformId) && (indexedDB !== undefined) && (indexedDB !== null) && ('open' in indexedDB)) {
/* Check:
* - if we are in a browser context (issue: server-side rendering)
* - if `indexedDB` exists (issue: IE9)
* - it could exist but be `undefined` or `null` (issue: IE private mode)
* - it could exists but not having a working API
* Will be the case for:
* - IE10+ and all other browsers in normal mode
* - Chromium / Safari private mode, but in this case, data will be swiped when the user leaves the app */
return new IndexedDBDatabase(IDBDBName, IDBStoreName, IDBDBVersion, IDBNoWrap);
}
else if (isPlatformBrowser(platformId)
&& (localStorage !== undefined) && (localStorage !== null) && ('getItem' in localStorage)) {
/* Check:
* - if we are in a browser context (issue: server-side rendering)
* - if `localStorage` exists (to be sure)
* - it could exists but not having a working API
* Will be the case for:
* - IE9
* - Safari cross-origin iframes, detected later in `IndexedDBDatabase.connect()`
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/42}
* - IE / Firefox private mode, but in this case, data will be swiped when the user leaves the app
* For Firefox, can only be detected later in `IndexedDBDatabase.connect()`
* @see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=781982}
*/
return new LocalStorageDatabase(LSPrefix);
}
}
catch (_a) { }
/* Will be the case for:
* - In browsers if storage has been fully disabled (via the "Block all cookies" option)
* - Server-side rendering
* - All other non-browser context
*/
return new MemoryDatabase();
}
export class LocalDatabase {
}
LocalDatabase.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalDatabase_Factory() { return localDatabaseFactory(i0.ɵɵinject(i0.PLATFORM_ID), i0.ɵɵinject(i1.LS_PREFIX), i0.ɵɵinject(i1.IDB_DB_NAME), i0.ɵɵinject(i1.IDB_STORE_NAME), i0.ɵɵinject(i1.IDB_DB_VERSION), i0.ɵɵinject(i1.IDB_NO_WRAP)); }, token: LocalDatabase, providedIn: "root" });
LocalDatabase.decorators = [
{ type: Injectable, args: [{
providedIn: 'root',
useFactory: localDatabaseFactory,
deps: [
PLATFORM_ID,
LS_PREFIX,
IDB_DB_NAME,
IDB_STORE_NAME,
IDB_DB_VERSION,
IDB_NO_WRAP,
]
},] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdhL2xvY2FsLXN0b3JhZ2Uvc3JjL2xpYi9kYXRhYmFzZXMvbG9jYWwtZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFbkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsVUFBa0IsRUFBRSxRQUFnQixFQUFFLFNBQWlCLEVBQUUsWUFBb0IsRUFDN0UsWUFBb0IsRUFBRSxTQUFrQjtJQUV4Qzs7O09BR0c7SUFDSCxJQUFJO1FBRUYscUZBQXFGO1FBQ3JGLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLEVBQUU7WUFFL0c7Ozs7Ozs7cUhBT3lHO1lBQ3pHLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztTQUVoRjthQUFNLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDO2VBQ3JDLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxFQUFFO1lBRXpGOzs7Ozs7Ozs7OztjQVdFO1lBQ0YsT0FBTyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBRTNDO0tBRUY7SUFBQyxXQUFNLEdBQUU7SUFFVjs7OztPQUlHO0lBQ0gsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBRTlCLENBQUM7QUFjRCxNQUFNLE9BQWdCLGFBQWE7Ozs7WUFabEMsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2dCQUNsQixVQUFVLEVBQUUsb0JBQW9CO2dCQUNoQyxJQUFJLEVBQUU7b0JBQ0osV0FBVztvQkFDWCxTQUFTO29CQUNULFdBQVc7b0JBQ1gsY0FBYztvQkFDZCxjQUFjO29CQUNkLFdBQVc7aUJBQ1o7YUFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElEQl9TVE9SRV9OQU1FLCBJREJfREJfTkFNRSwgTFNfUFJFRklYLCBJREJfREJfVkVSU0lPTiwgSURCX05PX1dSQVAgfSBmcm9tICcuLi90b2tlbnMnO1xuaW1wb3J0IHsgSW5kZXhlZERCRGF0YWJhc2UgfSBmcm9tICcuL2luZGV4ZWRkYi1kYXRhYmFzZSc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VEYXRhYmFzZSB9IGZyb20gJy4vbG9jYWxzdG9yYWdlLWRhdGFiYXNlJztcbmltcG9ydCB7IE1lbW9yeURhdGFiYXNlIH0gZnJvbSAnLi9tZW1vcnktZGF0YWJhc2UnO1xuXG4vKipcbiAqIEZhY3RvcnkgdG8gY3JlYXRlIGEgc3RvcmFnZSBhY2NvcmRpbmcgdG8gYnJvd3NlciBzdXBwb3J0XG4gKiBAcGFyYW0gcGxhdGZvcm1JZCBDb250ZXh0IGFib3V0IHRoZSBwbGF0Zm9ybSAoYGJyb3dzZXJgLCBgc2VydmVyYC4uLilcbiAqIEBwYXJhbSBMU1ByZWZpeCBQcmVmaXggZm9yIGBsb2NhbFN0b3JhZ2VgIGtleXMgdG8gYXZvaWQgY29sbGlzaW9uIGZvciBtdWx0aXBsZSBhcHBzIG9uIHRoZSBzYW1lIHN1YmRvbWFpblxuICogQHBhcmFtIElEQkRCTmFtZSBgaW5kZXhlZERCYCBkYXRhYmFzZSBuYW1lXG4gKiBAcGFyYW0gSURCc3RvcmVOYW1lIGBpbmRleGVkREJgIHN0b3JlTmFtZSBuYW1lXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFzdGVyL2RvY3MvQlJPV1NFUlNfU1VQUE9SVC5tZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsRGF0YWJhc2VGYWN0b3J5KFxuICBwbGF0Zm9ybUlkOiBzdHJpbmcsIExTUHJlZml4OiBzdHJpbmcsIElEQkRCTmFtZTogc3RyaW5nLCBJREJTdG9yZU5hbWU6IHN0cmluZyxcbiAgSURCREJWZXJzaW9uOiBudW1iZXIsIElEQk5vV3JhcDogYm9vbGVhbik6IExvY2FsRGF0YWJhc2Uge1xuXG4gIC8qIFdoZW4gc3RvcmFnZSBpcyBmdWxseSBkaXNhYmxlZCBpbiBicm93c2VyICh2aWEgdGhlIFwiQmxvY2sgYWxsIGNvb2tpZXNcIiBvcHRpb24pLFxuICAgKiBqdXN0IHRyeWluZyB0byBjaGVjayBgaW5kZXhlZERCYCBvciBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZXMgY2F1c2VzIGEgc2VjdXJpdHkgZXhjZXB0aW9uLlxuICAgKiBQcmV2ZW50cyBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2lzc3Vlcy8xMThcbiAgICovXG4gIHRyeSB7XG5cbiAgICAvLyBEbyBub3QgZXhwbGljaXQgYHdpbmRvd2AgaGVyZSwgYXMgdGhlIGdsb2JhbCBvYmplY3QgaXMgbm90IHRoZSBzYW1lIGluIHdlYiB3b3JrZXJzXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpICYmIChpbmRleGVkREIgIT09IHVuZGVmaW5lZCkgJiYgKGluZGV4ZWREQiAhPT0gbnVsbCkgJiYgKCdvcGVuJyBpbiBpbmRleGVkREIpKSB7XG5cbiAgICAgIC8qIENoZWNrOlxuICAgICAgKiAtIGlmIHdlIGFyZSBpbiBhIGJyb3dzZXIgY29udGV4dCAoaXNzdWU6IHNlcnZlci1zaWRlIHJlbmRlcmluZylcbiAgICAgICogLSBpZiBgaW5kZXhlZERCYCBleGlzdHMgKGlzc3VlOiBJRTkpXG4gICAgICAqIC0gaXQgY291bGQgZXhpc3QgYnV0IGJlIGB1bmRlZmluZWRgIG9yIGBudWxsYCAoaXNzdWU6IElFIHByaXZhdGUgbW9kZSlcbiAgICAgICogLSBpdCBjb3VsZCBleGlzdHMgYnV0IG5vdCBoYXZpbmcgYSB3b3JraW5nIEFQSVxuICAgICAgKiBXaWxsIGJlIHRoZSBjYXNlIGZvcjpcbiAgICAgICogLSBJRTEwKyBhbmQgYWxsIG90aGVyIGJyb3dzZXJzIGluIG5vcm1hbCBtb2RlXG4gICAgICAqIC0gQ2hyb21pdW0gLyBTYWZhcmkgcHJpdmF0ZSBtb2RlLCBidXQgaW4gdGhpcyBjYXNlLCBkYXRhIHdpbGwgYmUgc3dpcGVkIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBhcHAgKi9cbiAgICAgIHJldHVybiBuZXcgSW5kZXhlZERCRGF0YWJhc2UoSURCREJOYW1lLCBJREJTdG9yZU5hbWUsIElEQkRCVmVyc2lvbiwgSURCTm9XcmFwKTtcblxuICAgIH0gZWxzZSBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZClcbiAgICAmJiAobG9jYWxTdG9yYWdlICE9PSB1bmRlZmluZWQpICYmIChsb2NhbFN0b3JhZ2UgIT09IG51bGwpICYmICgnZ2V0SXRlbScgaW4gbG9jYWxTdG9yYWdlKSkge1xuXG4gICAgICAvKiBDaGVjazpcbiAgICAgICogLSBpZiB3ZSBhcmUgaW4gYSBicm93c2VyIGNvbnRleHQgKGlzc3VlOiBzZXJ2ZXItc2lkZSByZW5kZXJpbmcpXG4gICAgICAqIC0gaWYgYGxvY2FsU3RvcmFnZWAgZXhpc3RzICh0byBiZSBzdXJlKVxuICAgICAgKiAtIGl0IGNvdWxkIGV4aXN0cyBidXQgbm90IGhhdmluZyBhIHdvcmtpbmcgQVBJXG4gICAgICAqIFdpbGwgYmUgdGhlIGNhc2UgZm9yOlxuICAgICAgKiAtIElFOVxuICAgICAgKiAtIFNhZmFyaSBjcm9zcy1vcmlnaW4gaWZyYW1lcywgZGV0ZWN0ZWQgbGF0ZXIgaW4gYEluZGV4ZWREQkRhdGFiYXNlLmNvbm5lY3QoKWBcbiAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9pc3N1ZXMvNDJ9XG4gICAgICAqIC0gSUUgLyBGaXJlZm94IHByaXZhdGUgbW9kZSwgYnV0IGluIHRoaXMgY2FzZSwgZGF0YSB3aWxsIGJlIHN3aXBlZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgYXBwXG4gICAgICAqIEZvciBGaXJlZm94LCBjYW4gb25seSBiZSBkZXRlY3RlZCBsYXRlciBpbiBgSW5kZXhlZERCRGF0YWJhc2UuY29ubmVjdCgpYFxuICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03ODE5ODJ9XG4gICAgICAqL1xuICAgICAgcmV0dXJuIG5ldyBMb2NhbFN0b3JhZ2VEYXRhYmFzZShMU1ByZWZpeCk7XG5cbiAgICB9XG5cbiAgfSBjYXRjaCB7fVxuXG4gIC8qIFdpbGwgYmUgdGhlIGNhc2UgZm9yOlxuICAgKiAtIEluIGJyb3dzZXJzIGlmIHN0b3JhZ2UgaGFzIGJlZW4gZnVsbHkgZGlzYWJsZWQgKHZpYSB0aGUgXCJCbG9jayBhbGwgY29va2llc1wiIG9wdGlvbilcbiAgICogLSBTZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICogLSBBbGwgb3RoZXIgbm9uLWJyb3dzZXIgY29udGV4dFxuICAgKi9cbiAgcmV0dXJuIG5ldyBNZW1vcnlEYXRhYmFzZSgpO1xuXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICB1c2VGYWN0b3J5OiBsb2NhbERhdGFiYXNlRmFjdG9yeSxcbiAgZGVwczogW1xuICAgIFBMQVRGT1JNX0lELFxuICAgIExTX1BSRUZJWCxcbiAgICBJREJfREJfTkFNRSxcbiAgICBJREJfU1RPUkVfTkFNRSxcbiAgICBJREJfREJfVkVSU0lPTixcbiAgICBJREJfTk9fV1JBUCxcbiAgXVxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2NhbERhdGFiYXNlIHtcblxuICBhYnN0cmFjdCByZWFkb25seSBzaXplOiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgYWJzdHJhY3QgZ2V0PFQgPSB1bmtub3duPihrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIGFic3RyYWN0IHNldChrZXk6IHN0cmluZywgZGF0YTogdW5rbm93bik6IE9ic2VydmFibGU8dW5kZWZpbmVkPjtcbiAgYWJzdHJhY3QgZGVsZXRlKGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmRlZmluZWQ+O1xuICBhYnN0cmFjdCBjbGVhcigpOiBPYnNlcnZhYmxlPHVuZGVmaW5lZD47XG4gIGFic3RyYWN0IGtleXMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBhYnN0cmFjdCBoYXMoa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG59XG4iXX0=