1
0
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:
Justin Baur 2024-07-23 07:58:59 -04:00 committed by GitHub
parent 2ea2045686
commit 477294379b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 37 additions and 12 deletions

View File

@ -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$", () => {

View File

@ -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>(

View File

@ -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();
}); });

View File

@ -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} `,
); );
} }
} }

View File

@ -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} `,
); );
} }