mirror of
https://github.com/bitwarden/browser.git
synced 2024-11-26 12:25:20 +01:00
Special Case 0
to mean no caching at all (#10221)
This commit is contained in:
parent
2ea2045686
commit
477294379b
@ -100,6 +100,24 @@ describe("DefaultSingleUserState", () => {
|
|||||||
);
|
);
|
||||||
expect(state).toBeTruthy();
|
expect(state).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should go to disk each subscription if a cleanupDelayMs of 0 is given", async () => {
|
||||||
|
const state = new DefaultSingleUserState(
|
||||||
|
userId,
|
||||||
|
new UserKeyDefinition(testStateDefinition, "test", {
|
||||||
|
cleanupDelayMs: 0,
|
||||||
|
deserializer: TestState.fromJSON,
|
||||||
|
clearOn: [],
|
||||||
|
}),
|
||||||
|
diskStorageService,
|
||||||
|
stateEventRegistrarService,
|
||||||
|
);
|
||||||
|
|
||||||
|
await firstValueFrom(state.state$);
|
||||||
|
await firstValueFrom(state.state$);
|
||||||
|
|
||||||
|
expect(diskStorageService.mock.get).toHaveBeenCalledTimes(2);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("combinedState$", () => {
|
describe("combinedState$", () => {
|
||||||
|
@ -48,15 +48,22 @@ export abstract class StateBase<T, KeyDef extends KeyDefinitionRequirements<T>>
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
this.state$ = merge(
|
let state$ = merge(
|
||||||
defer(() => getStoredValue(key, storageService, keyDefinition.deserializer)),
|
defer(() => getStoredValue(key, storageService, keyDefinition.deserializer)),
|
||||||
storageUpdate$,
|
storageUpdate$,
|
||||||
).pipe(
|
|
||||||
share({
|
|
||||||
connector: () => new ReplaySubject(1),
|
|
||||||
resetOnRefCountZero: () => timer(keyDefinition.cleanupDelayMs),
|
|
||||||
}),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// If 0 cleanup is chosen, treat this as absolutely no cache
|
||||||
|
if (keyDefinition.cleanupDelayMs !== 0) {
|
||||||
|
state$ = state$.pipe(
|
||||||
|
share({
|
||||||
|
connector: () => new ReplaySubject(1),
|
||||||
|
resetOnRefCountZero: () => timer(keyDefinition.cleanupDelayMs),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.state$ = state$;
|
||||||
}
|
}
|
||||||
|
|
||||||
async update<TCombine>(
|
async update<TCombine>(
|
||||||
|
@ -38,12 +38,12 @@ describe("KeyDefinition", () => {
|
|||||||
expect(keyDefinition.cleanupDelayMs).toBe(500);
|
expect(keyDefinition.cleanupDelayMs).toBe(500);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.each([0, -1])("throws on 0 or negative (%s)", (testValue: number) => {
|
it("throws on negative", () => {
|
||||||
expect(
|
expect(
|
||||||
() =>
|
() =>
|
||||||
new KeyDefinition<boolean>(fakeStateDefinition, "fake", {
|
new KeyDefinition<boolean>(fakeStateDefinition, "fake", {
|
||||||
deserializer: (value) => value,
|
deserializer: (value) => value,
|
||||||
cleanupDelayMs: testValue,
|
cleanupDelayMs: -1,
|
||||||
}),
|
}),
|
||||||
).toThrow();
|
).toThrow();
|
||||||
});
|
});
|
||||||
|
@ -50,9 +50,9 @@ export class KeyDefinition<T> {
|
|||||||
throw new Error(`'deserializer' is a required property on key ${this.errorKeyName}`);
|
throw new Error(`'deserializer' is a required property on key ${this.errorKeyName}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.cleanupDelayMs <= 0) {
|
if (options.cleanupDelayMs < 0) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`'cleanupDelayMs' must be greater than 0. Value of ${options.cleanupDelayMs} passed to key ${this.errorKeyName} `,
|
`'cleanupDelayMs' must be greater than or equal to 0. Value of ${options.cleanupDelayMs} passed to key ${this.errorKeyName} `,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,9 +30,9 @@ export class UserKeyDefinition<T> {
|
|||||||
throw new Error(`'deserializer' is a required property on key ${this.errorKeyName}`);
|
throw new Error(`'deserializer' is a required property on key ${this.errorKeyName}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.cleanupDelayMs <= 0) {
|
if (options.cleanupDelayMs < 0) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`'cleanupDelayMs' must be greater than 0. Value of ${options.cleanupDelayMs} passed to key ${this.errorKeyName} `,
|
`'cleanupDelayMs' must be greater than or equal to 0. Value of ${options.cleanupDelayMs} passed to key ${this.errorKeyName} `,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user