diff --git a/projects/common/src/preference/preference.service.ts b/projects/common/src/preference/preference.service.ts index 3e92c76e6..d498d341d 100644 --- a/projects/common/src/preference/preference.service.ts +++ b/projects/common/src/preference/preference.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { Observable, of, throwError } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { AbstractStorage } from '../utilities/browser/storage/abstract-storage'; +import { InMemoryStorage } from '../utilities/browser/storage/in-memory-storage'; import { LocalStorage } from '../utilities/browser/storage/local-storage'; import { SessionStorage } from '../utilities/browser/storage/session-storage'; import { BooleanCoercer } from '../utilities/coercers/boolean-coercer'; @@ -9,7 +10,8 @@ import { NumberCoercer } from '../utilities/coercers/number-coercer'; export const enum StorageType { Local = 'local', - Session = 'session' + Session = 'session', + InMemory = 'in-memory' } @Injectable({ @@ -24,7 +26,11 @@ export class PreferenceService { private readonly numberCoercer: NumberCoercer = new NumberCoercer(); private readonly booleanCoercer: BooleanCoercer = new BooleanCoercer(); - public constructor(private readonly localStorage: LocalStorage, private readonly sessionStorage: SessionStorage) {} + public constructor( + private readonly localStorage: LocalStorage, + private readonly sessionStorage: SessionStorage, + private readonly inMemoryStorage: InMemoryStorage + ) {} /** * Returns the current storage value if defined, else the default value. The observable @@ -94,6 +100,8 @@ export class PreferenceService { switch (type) { case StorageType.Session: return this.sessionStorage; + case StorageType.InMemory: + return this.inMemoryStorage; case StorageType.Local: default: return this.localStorage; diff --git a/projects/common/src/utilities/browser/storage/in-memory-storage.ts b/projects/common/src/utilities/browser/storage/in-memory-storage.ts new file mode 100644 index 000000000..0cc8e2350 --- /dev/null +++ b/projects/common/src/utilities/browser/storage/in-memory-storage.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { AbstractStorage } from './abstract-storage'; + +@Injectable({ providedIn: 'root' }) +export class InMemoryStorage extends AbstractStorage { + public constructor() { + super( + new (class { + private readonly data: Map = new Map(); + + public get length(): number { + return this.data.size; + } + + public clear(): void { + this.data.clear(); + } + + public getItem(key: string): string | null { + // tslint:disable-next-line: no-null-keyword + return this.data.get(key) ?? null; + } + + public key(index: number): string | null { + // tslint:disable-next-line: no-null-keyword + return Array.from(this.data.keys())[index] ?? null; + } + + public removeItem(key: string): void { + this.data.delete(key); + } + + public setItem(key: string, value: string): void { + this.data.set(key, value); + } + })() + ); + } +}