UNPKG

@elemental-concept/rx-persist

Version:
1 lines 10.1 kB
{"version":3,"file":"elemental-concept-rx-persist.mjs","sources":["../../../projects/lib/src/lib/storage/dom-storage-driver.ts","../../../projects/lib/src/lib/internal/storage-access.ts","../../../projects/lib/src/lib/internal/storage-access.mock.ts","../../../projects/lib/src/lib/operators/persistent.ts","../../../projects/lib/src/lib/operators/persistent-and-versioned.ts","../../../projects/lib/src/elemental-concept-rx-persist.ts"],"sourcesContent":["import { StorageDriver, StorageResult } from '../types';\r\n\r\nexport class DOMStorageDriver implements StorageDriver {\r\n constructor(private readonly storage: Storage) {\r\n }\r\n\r\n get<T>(key: string): StorageResult<T | null> | T | null {\r\n try {\r\n const value = this.storage.getItem(key);\r\n\r\n if (typeof value === 'string') {\r\n return JSON.parse(value);\r\n }\r\n\r\n } catch (e) {\r\n }\r\n\r\n return null;\r\n }\r\n\r\n set<T, R>(key: string, value: T): void | StorageResult<R> {\r\n this.storage.setItem(key, JSON.stringify(value));\r\n return;\r\n }\r\n\r\n remove<R>(key: string): void | StorageResult<R> {\r\n this.storage.removeItem(key);\r\n return;\r\n }\r\n}\r\n\r\nexport const sessionStorageDriver = new DOMStorageDriver(sessionStorage);\r\n\r\nexport const localStorageDriver = new DOMStorageDriver(localStorage);\r\n","import { from, Observable, of } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { StorageDriver } from '../types';\r\n\r\nexport function load<T>(key: string, next: (value: T) => void, storage: StorageDriver) {\r\n const result = storage.get(key);\r\n\r\n if (result instanceof Observable) {\r\n result.pipe(take(1)).subscribe(v => next(v));\r\n return;\r\n }\r\n\r\n if (typeof (result as Promise<T>)?.then === 'function') {\r\n (result as Promise<T>).then(v => next(v));\r\n return;\r\n }\r\n\r\n if (result !== null && result !== undefined) {\r\n next(result as T);\r\n }\r\n}\r\n\r\nexport function loadAsObservable<T>(key: string, storage: StorageDriver): Observable<T | null> {\r\n const result = storage.get<T>(key);\r\n\r\n if (result instanceof Observable) {\r\n return result.pipe(take(1));\r\n }\r\n\r\n if (typeof (result as Promise<T>)?.then === 'function') {\r\n return from(result as Promise<T>);\r\n }\r\n\r\n return of(result as T);\r\n}\r\n\r\nexport function save<T>(key: string, storage: StorageDriver, value: T): Observable<any> {\r\n const result = storage.set(key, value);\r\n\r\n if (result instanceof Observable) {\r\n return result.pipe(take(1));\r\n }\r\n\r\n if (typeof (result as Promise<T>)?.then === 'function') {\r\n return from(result as Promise<T>);\r\n }\r\n\r\n return of(true);\r\n}\r\n\r\nexport function getStorageKey(key: string | string[]) {\r\n return typeof key === 'string' ? key : key.join('.');\r\n}\r\n","export class StorageAccessMock implements Storage {\r\n readonly storage: any = {};\r\n\r\n readonly length = 0;\r\n\r\n clear(): void {\r\n }\r\n\r\n getItem(key: string): string | null {\r\n return this.storage[ key ] === undefined ? null : this.storage[ key ];\r\n }\r\n\r\n key(index: number): string | null {\r\n return null;\r\n }\r\n\r\n removeItem(key: string): void {\r\n delete this.storage[ key ];\r\n }\r\n\r\n setItem(key: string, value: string): void {\r\n this.storage[ key ] = value;\r\n }\r\n}\r\n","import { Subject } from 'rxjs';\r\n\r\nimport { StorageDriver } from '../types';\r\n\r\nimport { localStorageDriver } from '../storage';\r\n\r\nimport { getStorageKey, load, save } from '../internal';\r\n\r\nexport function persistent<T, S extends Subject<T>>(subject: S,\r\n key: string | string[],\r\n storage: StorageDriver = localStorageDriver): S {\r\n\r\n const next = subject.next.bind(subject);\r\n\r\n const storageKey = getStorageKey(key);\r\n\r\n load(storageKey, next, storage);\r\n\r\n subject.next = (value: T) => save(storageKey, storage, value).subscribe(() => next(value));\r\n\r\n return subject;\r\n}\r\n","import { from, Subject } from 'rxjs';\r\nimport { concatMap, filter, map, switchMap, takeLast } from 'rxjs/operators';\r\n\r\nimport { getStorageKey, load, loadAsObservable, save } from '../internal';\r\n\r\nimport { VersionedOptions } from '../types';\r\n\r\nimport { localStorageDriver } from '../storage';\r\n\r\nexport function persistentAndVersioned<T, S extends Subject<T>>(subject: S,\r\n key: string | string[],\r\n options: VersionedOptions): S {\r\n const next = subject.next.bind(subject);\r\n\r\n const storage = options.storage !== undefined ? options.storage : localStorageDriver;\r\n\r\n const storageKey = getStorageKey(key);\r\n const versionKey = getStorageKey(options.versionKey);\r\n\r\n loadAsObservable<number>(versionKey, storage)\r\n .pipe(\r\n map(version => typeof version === 'number' ? version : 0),\r\n\r\n switchMap(version => from([ ...Array(options.currentVersion).keys() ])\r\n .pipe(filter(v => v >= version))),\r\n\r\n concatMap(version => loadAsObservable<any>(storageKey, storage)\r\n .pipe(\r\n map(value => options.migrate(version, value)),\r\n concatMap(value => save(storageKey, storage, value)),\r\n concatMap(() => save(versionKey, storage, version + 1)))),\r\n\r\n takeLast(1))\r\n\r\n .subscribe({ complete: () => load(storageKey, next, storage) });\r\n\r\n subject.next = (value: T) => save(storageKey, storage, value).subscribe(() => next(value));\r\n\r\n return subject;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAEa,gBAAgB,CAAA;AAC3B,IAAA,WAAA,CAA6B,OAAgB,EAAA;QAAhB,IAAO,CAAA,OAAA,GAAP,OAAO,CAAS;KAC5C;AAED,IAAA,GAAG,CAAI,GAAW,EAAA;QAChB,IAAI;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAExC,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1B,aAAA;AAEF,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE;AACX,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACb;IAED,GAAG,CAAO,GAAW,EAAE,KAAQ,EAAA;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,OAAO;KACR;AAED,IAAA,MAAM,CAAI,GAAW,EAAA;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO;KACR;AACF,CAAA;MAEY,oBAAoB,GAAG,IAAI,gBAAgB,CAAC,cAAc,EAAE;MAE5D,kBAAkB,GAAG,IAAI,gBAAgB,CAAC,YAAY;;SC5BnD,IAAI,CAAI,GAAW,EAAE,IAAwB,EAAE,OAAsB,EAAA;IACnF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,MAAM,YAAY,UAAU,EAAE;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;AACR,KAAA;AAED,IAAA,IAAI,OAAQ,MAAqB,EAAE,IAAI,KAAK,UAAU,EAAE;AACrD,QAAA,MAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,OAAO;AACR,KAAA;AAED,IAAA,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE;QAC3C,IAAI,CAAC,MAAW,CAAC,CAAC;AACnB,KAAA;AACH,CAAC;AAEe,SAAA,gBAAgB,CAAI,GAAW,EAAE,OAAsB,EAAA;IACrE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;IAEnC,IAAI,MAAM,YAAY,UAAU,EAAE;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,KAAA;AAED,IAAA,IAAI,OAAQ,MAAqB,EAAE,IAAI,KAAK,UAAU,EAAE;AACtD,QAAA,OAAO,IAAI,CAAC,MAAoB,CAAC,CAAC;AACnC,KAAA;AAED,IAAA,OAAO,EAAE,CAAC,MAAW,CAAC,CAAC;AACzB,CAAC;SAEe,IAAI,CAAI,GAAW,EAAE,OAAsB,EAAE,KAAQ,EAAA;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAEvC,IAAI,MAAM,YAAY,UAAU,EAAE;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,KAAA;AAED,IAAA,IAAI,OAAQ,MAAqB,EAAE,IAAI,KAAK,UAAU,EAAE;AACtD,QAAA,OAAO,IAAI,CAAC,MAAoB,CAAC,CAAC;AACnC,KAAA;AAED,IAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAEK,SAAU,aAAa,CAAC,GAAsB,EAAA;AAClD,IAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvD;;MCrDa,iBAAiB,CAAA;AAA9B,IAAA,WAAA,GAAA;QACW,IAAO,CAAA,OAAA,GAAQ,EAAE,CAAC;QAElB,IAAM,CAAA,MAAA,GAAG,CAAC,CAAC;KAoBrB;IAlBC,KAAK,GAAA;KACJ;AAED,IAAA,OAAO,CAAC,GAAW,EAAA;QACjB,OAAO,IAAI,CAAC,OAAO,CAAE,GAAG,CAAE,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAE,GAAG,CAAE,CAAC;KACvE;AAED,IAAA,GAAG,CAAC,KAAa,EAAA;AACf,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAE,GAAG,CAAE,CAAC;KAC5B;IAED,OAAO,CAAC,GAAW,EAAE,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,CAAE,GAAG,CAAE,GAAG,KAAK,CAAC;KAC7B;AACF;;ACfK,SAAU,UAAU,CAA0B,OAAU,EACV,GAAsB,EACtB,UAAyB,kBAAkB,EAAA;IAE7F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAExC,IAAA,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;AAEtC,IAAA,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEhC,OAAO,CAAC,IAAI,GAAG,CAAC,KAAQ,KAAK,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAE3F,IAAA,OAAO,OAAO,CAAC;AACjB;;SCZgB,sBAAsB,CAA0B,OAAU,EACV,GAAsB,EACtB,OAAyB,EAAA;IACvF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAExC,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,kBAAkB,CAAC;AAErF,IAAA,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAErD,IAAA,gBAAgB,CAAS,UAAU,EAAE,OAAO,CAAC;AAC1C,SAAA,IAAI,CACH,GAAG,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC,EAEzD,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,CAAE,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAE,CAAC;SACnE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAEnC,SAAS,CAAC,OAAO,IAAI,gBAAgB,CAAM,UAAU,EAAE,OAAO,CAAC;SAC5D,IAAI,CACH,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC7C,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EACpD,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAE7D,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEb,SAAA,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAElE,OAAO,CAAC,IAAI,GAAG,CAAC,KAAQ,KAAK,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAE3F,IAAA,OAAO,OAAO,CAAC;AACjB;;ACvCA;;AAEG;;;;"}