interface IStateAdapter { getString: (key: string) => Promise; setString: (key: string, value: string) => Promise; } export interface IStorageKeyGetterAndSetter { get: () => Promise; set: (value: T) => Promise; } export class EnvironmentStateAdapter { private implementation: IStateAdapter; constructor(implementation: IStateAdapter) { this.implementation = implementation; } async setJson(key: string, value: any) { await this.implementation.setString(key, JSON.stringify(value)); } async getJson(key: string): Promise { const val = await this.implementation.getString(key); if (val == null || val === "undefined" || val === "null") { return undefined; } return JSON.parse(val); } async setString(key: string, value: string) { await this.implementation.setString(key, value); } async getString(key: string): Promise { const val = await this.implementation.getString(key); if (val == null) { return undefined; } return val; } createJsonGetterSetter(key: string): IStorageKeyGetterAndSetter { return { get: () => this.getJson(key), set: (value: T) => this.setJson(key, value), }; } createStringGetterSetter(key: string): IStorageKeyGetterAndSetter { return { get: () => this.getString(key), set: (value: string) => this.setString(key, value), }; } } interface IStateAdapter_Sync { getString: (key: string) => string | null | undefined; setString: (key: string, value: string) => void; clear: (key: string) => void; } export interface IStorageKeyGetterAndSetter_Sync { get: () => T | undefined; set: (value: T) => void; } export class EnvironmentStateAdapter_Sync { private implementation: IStateAdapter_Sync; constructor(implementation: IStateAdapter_Sync) { this.implementation = implementation; } setJson(key: string, value: any) { this.implementation.setString(key, JSON.stringify(value)); } getJson(key: string): T | undefined { const val = this.implementation.getString(key); if (val == null || val === "undefined" || val === "null") { return undefined; } return JSON.parse(val); } setString(key: string, value: string) { this.implementation.setString(key, value); } getString(key: string): string | undefined { const val = this.implementation.getString(key); if (val == null) { return undefined; } return val; } clear(key: string) { this.implementation.clear(key); } createJsonGetterSetter(key: string): IStorageKeyGetterAndSetter_Sync { return { get: () => this.getJson(key), set: (value: T) => this.setJson(key, value), }; } createStringGetterSetter(key: string): IStorageKeyGetterAndSetter_Sync { return { get: () => this.getString(key), set: (value: string) => this.setString(key, value), }; } }