Skip to content

Commit b9011e6

Browse files
Refactor InLocalStorage to use the storage from options
1 parent e660afe commit b9011e6

File tree

11 files changed

+180
-97
lines changed

11 files changed

+180
-97
lines changed

src/storages/__tests__/RBSegmentsCacheSync.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import { IRBSegmentsCacheSync } from '../types';
66
import { fullSettings } from '../../utils/settingsValidation/__tests__/settings.mocks';
77

88
const cacheInMemory = new RBSegmentsCacheInMemory();
9-
const cacheInLocal = new RBSegmentsCacheInLocal(fullSettings, new KeyBuilderCS('SPLITIO', 'user'));
9+
// eslint-disable-next-line no-undef
10+
const cacheInLocal = new RBSegmentsCacheInLocal(fullSettings, new KeyBuilderCS('SPLITIO', 'user'), localStorage);
1011

1112
describe.each([cacheInMemory, cacheInLocal])('Rule-based segments cache sync (Memory & LocalStorage)', (cache: IRBSegmentsCacheSync) => {
1213

src/storages/inLocalStorage/MySegmentsCacheInLocal.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,28 @@ import { isNaNNumber } from '../../utils/lang';
33
import { AbstractMySegmentsCacheSync } from '../AbstractMySegmentsCacheSync';
44
import type { MySegmentsKeyBuilder } from '../KeyBuilderCS';
55
import { LOG_PREFIX, DEFINED } from './constants';
6+
import SplitIO from '../../../types/splitio';
67

78
export class MySegmentsCacheInLocal extends AbstractMySegmentsCacheSync {
89

910
private readonly keys: MySegmentsKeyBuilder;
1011
private readonly log: ILogger;
12+
private readonly localStorage: SplitIO.Storage;
1113

12-
constructor(log: ILogger, keys: MySegmentsKeyBuilder) {
14+
constructor(log: ILogger, keys: MySegmentsKeyBuilder, localStorage: SplitIO.Storage) {
1315
super();
1416
this.log = log;
1517
this.keys = keys;
18+
this.localStorage = localStorage;
1619
// There is not need to flush segments cache like splits cache, since resetSegments receives the up-to-date list of active segments
1720
}
1821

1922
protected addSegment(name: string): boolean {
2023
const segmentKey = this.keys.buildSegmentNameKey(name);
2124

2225
try {
23-
if (localStorage.getItem(segmentKey) === DEFINED) return false;
24-
localStorage.setItem(segmentKey, DEFINED);
26+
if (this.localStorage.getItem(segmentKey) === DEFINED) return false;
27+
this.localStorage.setItem(segmentKey, DEFINED);
2528
return true;
2629
} catch (e) {
2730
this.log.error(LOG_PREFIX + e);
@@ -33,8 +36,8 @@ export class MySegmentsCacheInLocal extends AbstractMySegmentsCacheSync {
3336
const segmentKey = this.keys.buildSegmentNameKey(name);
3437

3538
try {
36-
if (localStorage.getItem(segmentKey) !== DEFINED) return false;
37-
localStorage.removeItem(segmentKey);
39+
if (this.localStorage.getItem(segmentKey) !== DEFINED) return false;
40+
this.localStorage.removeItem(segmentKey);
3841
return true;
3942
} catch (e) {
4043
this.log.error(LOG_PREFIX + e);
@@ -43,12 +46,12 @@ export class MySegmentsCacheInLocal extends AbstractMySegmentsCacheSync {
4346
}
4447

4548
isInSegment(name: string): boolean {
46-
return localStorage.getItem(this.keys.buildSegmentNameKey(name)) === DEFINED;
49+
return this.localStorage.getItem(this.keys.buildSegmentNameKey(name)) === DEFINED;
4750
}
4851

4952
getRegisteredSegments(): string[] {
5053
// Scan current values from localStorage
51-
return Object.keys(localStorage).reduce((accum, key) => {
54+
return Object.keys(this.localStorage).reduce((accum, key) => {
5255
let segmentName = this.keys.extractSegmentName(key);
5356

5457
if (segmentName) accum.push(segmentName);
@@ -63,16 +66,16 @@ export class MySegmentsCacheInLocal extends AbstractMySegmentsCacheSync {
6366

6467
protected setChangeNumber(changeNumber?: number) {
6568
try {
66-
if (changeNumber) localStorage.setItem(this.keys.buildTillKey(), changeNumber + '');
67-
else localStorage.removeItem(this.keys.buildTillKey());
69+
if (changeNumber) this.localStorage.setItem(this.keys.buildTillKey(), changeNumber + '');
70+
else this.localStorage.removeItem(this.keys.buildTillKey());
6871
} catch (e) {
6972
this.log.error(e);
7073
}
7174
}
7275

7376
getChangeNumber() {
7477
const n = -1;
75-
let value: string | number | null = localStorage.getItem(this.keys.buildTillKey());
78+
let value: string | number | null = this.localStorage.getItem(this.keys.buildTillKey());
7679

7780
if (value !== null) {
7881
value = parseInt(value, 10);

src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,23 @@ import { usesSegments } from '../AbstractSplitsCacheSync';
77
import { KeyBuilderCS } from '../KeyBuilderCS';
88
import { IRBSegmentsCacheSync } from '../types';
99
import { LOG_PREFIX } from './constants';
10+
import SplitIO from '../../../types/splitio';
1011

1112
export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
1213

1314
private readonly keys: KeyBuilderCS;
1415
private readonly log: ILogger;
16+
private readonly localStorage: SplitIO.Storage;
1517

16-
constructor(settings: ISettings, keys: KeyBuilderCS) {
18+
constructor(settings: ISettings, keys: KeyBuilderCS, localStorage: SplitIO.Storage) {
1719
this.keys = keys;
1820
this.log = settings.log;
21+
this.localStorage = localStorage;
1922
}
2023

2124
clear() {
2225
this.getNames().forEach(name => this.remove(name));
23-
localStorage.removeItem(this.keys.buildRBSegmentsTillKey());
26+
this.localStorage.removeItem(this.keys.buildRBSegmentsTillKey());
2427
}
2528

2629
update(toAdd: IRBSegment[], toRemove: IRBSegment[], changeNumber: number): boolean {
@@ -31,29 +34,29 @@ export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
3134

3235
private setChangeNumber(changeNumber: number) {
3336
try {
34-
localStorage.setItem(this.keys.buildRBSegmentsTillKey(), changeNumber + '');
35-
localStorage.setItem(this.keys.buildLastUpdatedKey(), Date.now() + '');
37+
this.localStorage.setItem(this.keys.buildRBSegmentsTillKey(), changeNumber + '');
38+
this.localStorage.setItem(this.keys.buildLastUpdatedKey(), Date.now() + '');
3639
} catch (e) {
3740
this.log.error(LOG_PREFIX + e);
3841
}
3942
}
4043

4144
private updateSegmentCount(diff: number) {
4245
const segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
43-
const count = toNumber(localStorage.getItem(segmentsCountKey)) + diff;
46+
const count = toNumber(this.localStorage.getItem(segmentsCountKey)) + diff;
4447
// @ts-expect-error
45-
if (count > 0) localStorage.setItem(segmentsCountKey, count);
46-
else localStorage.removeItem(segmentsCountKey);
48+
if (count > 0) this.localStorage.setItem(segmentsCountKey, count);
49+
else this.localStorage.removeItem(segmentsCountKey);
4750
}
4851

4952
private add(rbSegment: IRBSegment): boolean {
5053
try {
5154
const name = rbSegment.name;
5255
const rbSegmentKey = this.keys.buildRBSegmentKey(name);
53-
const rbSegmentFromLocalStorage = localStorage.getItem(rbSegmentKey);
56+
const rbSegmentFromLocalStorage = this.localStorage.getItem(rbSegmentKey);
5457
const previous = rbSegmentFromLocalStorage ? JSON.parse(rbSegmentFromLocalStorage) : null;
5558

56-
localStorage.setItem(rbSegmentKey, JSON.stringify(rbSegment));
59+
this.localStorage.setItem(rbSegmentKey, JSON.stringify(rbSegment));
5760

5861
let usesSegmentsDiff = 0;
5962
if (previous && usesSegments(previous)) usesSegmentsDiff--;
@@ -72,7 +75,7 @@ export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
7275
const rbSegment = this.get(name);
7376
if (!rbSegment) return false;
7477

75-
localStorage.removeItem(this.keys.buildRBSegmentKey(name));
78+
this.localStorage.removeItem(this.keys.buildRBSegmentKey(name));
7679

7780
if (usesSegments(rbSegment)) this.updateSegmentCount(-1);
7881

@@ -84,13 +87,13 @@ export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
8487
}
8588

8689
private getNames(): string[] {
87-
const len = localStorage.length;
90+
const len = this.localStorage.length;
8891
const accum = [];
8992

9093
let cur = 0;
9194

9295
while (cur < len) {
93-
const key = localStorage.key(cur);
96+
const key = this.localStorage.key(cur);
9497

9598
if (key != null && this.keys.isRBSegmentKey(key)) accum.push(this.keys.extractKey(key));
9699

@@ -101,7 +104,7 @@ export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
101104
}
102105

103106
get(name: string): IRBSegment | null {
104-
const item = localStorage.getItem(this.keys.buildRBSegmentKey(name));
107+
const item = this.localStorage.getItem(this.keys.buildRBSegmentKey(name));
105108
return item && JSON.parse(item);
106109
}
107110

@@ -113,7 +116,7 @@ export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
113116

114117
getChangeNumber(): number {
115118
const n = -1;
116-
let value: string | number | null = localStorage.getItem(this.keys.buildRBSegmentsTillKey());
119+
let value: string | number | null = this.localStorage.getItem(this.keys.buildRBSegmentsTillKey());
117120

118121
if (value !== null) {
119122
value = parseInt(value, 10);
@@ -125,7 +128,7 @@ export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
125128
}
126129

127130
usesSegments(): boolean {
128-
const storedCount = localStorage.getItem(this.keys.buildSplitsWithSegmentCountKey());
131+
const storedCount = this.localStorage.getItem(this.keys.buildSplitsWithSegmentCountKey());
129132
const splitsWithSegmentsCount = storedCount === null ? 0 : toNumber(storedCount);
130133

131134
return isFiniteNumber(splitsWithSegmentsCount) ?

0 commit comments

Comments
 (0)