mirror of
https://github.com/bitwarden/browser
synced 2025-12-19 01:33:33 +00:00
* Allow for update logic in state update callbacks * Prefer reading updates to sending in stream * Inform state providers when they must deserialize * Update DefaultGlobalState to act more like DefaultUserState * Fully Implement AbstractStorageService * Add KeyDefinitionOptions * Address PR feedback * Prefer testing interactions for ports * Synced memory storage for browser * Fix port handling * Do not stringify port message data * Use messaging storage * Initialize new foreground memory storage services This will need to be rethought for short-lived background pages, but for now the background is the source of truth for memory storage * Use global state for account service * Use BrowserApi listener to avoid safari memory leaks * Fix build errors: debugging and missed impls * Prefer bound arrow functions * JSON Stringify Messages * Prefer `useClass` * Use noop services * extract storage observable to new interface This also reverts changes for the existing services to use foreground/background services. Those are now used only in state providers * Fix web DI * Prefer initializing observable in constructor * Do not use jsonify as equality operator * Remove port listener to avoid memory leaks * Fix logic and type issues --------- Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com>
36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import { Observable } from "rxjs";
|
|
|
|
import { MemoryStorageOptions, StorageOptions } from "../models/domain/storage-options";
|
|
|
|
export type StorageUpdateType = "save" | "remove";
|
|
export type StorageUpdate = {
|
|
key: string;
|
|
updateType: StorageUpdateType;
|
|
};
|
|
|
|
export interface ObservableStorageService {
|
|
/**
|
|
* Provides an {@link Observable} that represents a stream of updates that
|
|
* have happened in this storage service or in the storage this service provides
|
|
* an interface to.
|
|
*/
|
|
get updates$(): Observable<StorageUpdate>;
|
|
}
|
|
|
|
export abstract class AbstractStorageService {
|
|
abstract get valuesRequireDeserialization(): boolean;
|
|
abstract get<T>(key: string, options?: StorageOptions): Promise<T>;
|
|
abstract has(key: string, options?: StorageOptions): Promise<boolean>;
|
|
abstract save<T>(key: string, obj: T, options?: StorageOptions): Promise<void>;
|
|
abstract remove(key: string, options?: StorageOptions): Promise<void>;
|
|
}
|
|
|
|
export abstract class AbstractMemoryStorageService extends AbstractStorageService {
|
|
// Used to identify the service in the session sync decorator framework
|
|
static readonly TYPE = "MemoryStorageService";
|
|
readonly type = AbstractMemoryStorageService.TYPE;
|
|
|
|
abstract get<T>(key: string, options?: MemoryStorageOptions<T>): Promise<T>;
|
|
abstract getBypassCache<T>(key: string, options?: MemoryStorageOptions<T>): Promise<T>;
|
|
}
|