Skip to content

Commit a86d03c

Browse files
feat: in memory preferences (#1490)
1 parent 00b913a commit a86d03c

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

projects/common/src/preference/preference.service.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ import { Injectable } from '@angular/core';
22
import { Observable, of, throwError } from 'rxjs';
33
import { map, switchMap } from 'rxjs/operators';
44
import { AbstractStorage } from '../utilities/browser/storage/abstract-storage';
5+
import { InMemoryStorage } from '../utilities/browser/storage/in-memory-storage';
56
import { LocalStorage } from '../utilities/browser/storage/local-storage';
67
import { SessionStorage } from '../utilities/browser/storage/session-storage';
78
import { BooleanCoercer } from '../utilities/coercers/boolean-coercer';
89
import { NumberCoercer } from '../utilities/coercers/number-coercer';
910

1011
export const enum StorageType {
1112
Local = 'local',
12-
Session = 'session'
13+
Session = 'session',
14+
InMemory = 'in-memory'
1315
}
1416

1517
@Injectable({
@@ -24,7 +26,11 @@ export class PreferenceService {
2426
private readonly numberCoercer: NumberCoercer = new NumberCoercer();
2527
private readonly booleanCoercer: BooleanCoercer = new BooleanCoercer();
2628

27-
public constructor(private readonly localStorage: LocalStorage, private readonly sessionStorage: SessionStorage) {}
29+
public constructor(
30+
private readonly localStorage: LocalStorage,
31+
private readonly sessionStorage: SessionStorage,
32+
private readonly inMemoryStorage: InMemoryStorage
33+
) {}
2834

2935
/**
3036
* Returns the current storage value if defined, else the default value. The observable
@@ -94,6 +100,8 @@ export class PreferenceService {
94100
switch (type) {
95101
case StorageType.Session:
96102
return this.sessionStorage;
103+
case StorageType.InMemory:
104+
return this.inMemoryStorage;
97105
case StorageType.Local:
98106
default:
99107
return this.localStorage;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Injectable } from '@angular/core';
2+
import { AbstractStorage } from './abstract-storage';
3+
4+
@Injectable({ providedIn: 'root' })
5+
export class InMemoryStorage extends AbstractStorage {
6+
public constructor() {
7+
super(
8+
new (class {
9+
private readonly data: Map<string, string> = new Map();
10+
11+
public get length(): number {
12+
return this.data.size;
13+
}
14+
15+
public clear(): void {
16+
this.data.clear();
17+
}
18+
19+
public getItem(key: string): string | null {
20+
// tslint:disable-next-line: no-null-keyword
21+
return this.data.get(key) ?? null;
22+
}
23+
24+
public key(index: number): string | null {
25+
// tslint:disable-next-line: no-null-keyword
26+
return Array.from(this.data.keys())[index] ?? null;
27+
}
28+
29+
public removeItem(key: string): void {
30+
this.data.delete(key);
31+
}
32+
33+
public setItem(key: string, value: string): void {
34+
this.data.set(key, value);
35+
}
36+
})()
37+
);
38+
}
39+
}

0 commit comments

Comments
 (0)