From b085335e4c82be7d5594d4ead1d9ca455f2ec695 Mon Sep 17 00:00:00 2001 From: Daniel Rivers Date: Fri, 25 Oct 2024 13:42:14 +0100 Subject: [PATCH] feat: add setItems to storage --- lib/sessionManager/index.ts | 5 ++++- lib/sessionManager/stores/chromeStore.test.ts | 14 +++++++++++++ lib/sessionManager/stores/chromeStore.ts | 4 ++-- .../stores/expoSecureStore.test.ts | 13 ++++++++++++ lib/sessionManager/stores/expoSecureStore.ts | 5 +++-- lib/sessionManager/stores/memory.test.ts | 13 ++++++++++++ lib/sessionManager/stores/memory.ts | 4 ++-- lib/sessionManager/types.ts | 20 ++++++++++++++++++- 8 files changed, 70 insertions(+), 8 deletions(-) diff --git a/lib/sessionManager/index.ts b/lib/sessionManager/index.ts index 4af815b..aee3d68 100644 --- a/lib/sessionManager/index.ts +++ b/lib/sessionManager/index.ts @@ -16,4 +16,7 @@ export const storageSettings: StorageSettingsType = { export { MemoryStorage } from "./stores/memory.js"; export { ChromeStore } from "./stores/chromeStore.js"; export { ExpoSecureStore } from "./stores/expoSecureStore.js"; -export * from "./types.ts"; +export { + type SessionManager, + StorageKeys +} from "./types.ts"; diff --git a/lib/sessionManager/stores/chromeStore.test.ts b/lib/sessionManager/stores/chromeStore.test.ts index 0fbeb98..32916be 100644 --- a/lib/sessionManager/stores/chromeStore.test.ts +++ b/lib/sessionManager/stores/chromeStore.test.ts @@ -43,6 +43,20 @@ describe.skip("GoogleStorage standard keys", () => { await sessionManager.getSessionItem(StorageKeys.accessToken), ).toBeNull(); }); + + + it("should set many items", async () => { + await sessionManager.setItems({ + [StorageKeys.accessToken]: "accessTokenValue", + [StorageKeys.idToken]: "idTokenValue", + }); + expect(await sessionManager.getSessionItem(StorageKeys.accessToken)).toBe( + "accessTokenValue", + ); + expect(await sessionManager.getSessionItem(StorageKeys.idToken)).toBe( + "idTokenValue", + ); + }); }); // TODO: Fix tests, need to mock chrome storage diff --git a/lib/sessionManager/stores/chromeStore.ts b/lib/sessionManager/stores/chromeStore.ts index 62f3b44..8244f46 100644 --- a/lib/sessionManager/stores/chromeStore.ts +++ b/lib/sessionManager/stores/chromeStore.ts @@ -1,5 +1,5 @@ import { storageSettings } from "../index.js"; -import { StorageKeys, type SessionManager } from "../types.js"; +import { SessionBase, StorageKeys, type SessionManager } from "../types.js"; import { splitString } from "../utils.js"; function getStorageValue(key: string): unknown | undefined { @@ -18,7 +18,7 @@ function getStorageValue(key: string): unknown | undefined { * Provides a chrome.store.local based session manager implementation for the browser. * @class ChromeStore */ -export class ChromeStore implements SessionManager { +export class ChromeStore extends SessionBase implements SessionManager { /** * Clears all items from session store. * @returns {void} diff --git a/lib/sessionManager/stores/expoSecureStore.test.ts b/lib/sessionManager/stores/expoSecureStore.test.ts index 07a08e3..50a6ceb 100644 --- a/lib/sessionManager/stores/expoSecureStore.test.ts +++ b/lib/sessionManager/stores/expoSecureStore.test.ts @@ -43,6 +43,19 @@ describe.skip("ExpoSecureStore standard keys", () => { await sessionManager.getSessionItem(StorageKeys.accessToken), ).toBeNull(); }); + + it("should set many items", async () => { + await sessionManager.setItems({ + [StorageKeys.accessToken]: "accessTokenValue", + [StorageKeys.idToken]: "idTokenValue", + }); + expect(await sessionManager.getSessionItem(StorageKeys.accessToken)).toBe( + "accessTokenValue", + ); + expect(await sessionManager.getSessionItem(StorageKeys.idToken)).toBe( + "idTokenValue", + ); + }); }); describe.skip("ExpoSecureStore keys: storageKeys", () => { diff --git a/lib/sessionManager/stores/expoSecureStore.ts b/lib/sessionManager/stores/expoSecureStore.ts index 958b0e2..36816ab 100644 --- a/lib/sessionManager/stores/expoSecureStore.ts +++ b/lib/sessionManager/stores/expoSecureStore.ts @@ -1,5 +1,5 @@ import { storageSettings } from "../index.js"; -import { StorageKeys, type SessionManager } from "../types.js"; +import { SessionBase, StorageKeys } from "../types.js"; import { splitString } from "../utils.js"; let expoSecureStore: typeof import("expo-secure-store") | undefined = undefined; @@ -16,8 +16,9 @@ async function waitForExpoSecureStore() { * Provides a expo local store based session manager implementation for the browser. * @class ExpoSecureStore */ -export class ExpoSecureStore implements SessionManager { +export class ExpoSecureStore extends SessionBase { constructor() { + super(); this.loadExpoStore(); } diff --git a/lib/sessionManager/stores/memory.test.ts b/lib/sessionManager/stores/memory.test.ts index 010c74e..9edadbd 100644 --- a/lib/sessionManager/stores/memory.test.ts +++ b/lib/sessionManager/stores/memory.test.ts @@ -43,6 +43,19 @@ describe("MemoryStorage standard keys", () => { await sessionManager.getSessionItem(StorageKeys.accessToken), ).toBeNull(); }); + + it("should set many items", async () => { + await sessionManager.setItems({ + [StorageKeys.accessToken]: "accessTokenValue", + [StorageKeys.idToken]: "idTokenValue", + }); + expect(await sessionManager.getSessionItem(StorageKeys.accessToken)).toBe( + "accessTokenValue", + ); + expect(await sessionManager.getSessionItem(StorageKeys.idToken)).toBe( + "idTokenValue", + ); + }); }); describe("MemoryStorage keys: storageKeys", () => { diff --git a/lib/sessionManager/stores/memory.ts b/lib/sessionManager/stores/memory.ts index eb78377..5196604 100644 --- a/lib/sessionManager/stores/memory.ts +++ b/lib/sessionManager/stores/memory.ts @@ -1,12 +1,12 @@ import { storageSettings } from "../index.js"; -import { StorageKeys, type SessionManager } from "../types.js"; +import { SessionBase, StorageKeys, type SessionManager } from "../types.js"; import { splitString } from "../utils.js"; /** * Provides a memory based session manager implementation for the browser. * @class MemoryStorage */ -export class MemoryStorage implements SessionManager { +export class MemoryStorage extends SessionBase implements SessionManager { private memCache: Record = {}; /** diff --git a/lib/sessionManager/types.ts b/lib/sessionManager/types.ts index e028df6..b46e236 100644 --- a/lib/sessionManager/types.ts +++ b/lib/sessionManager/types.ts @@ -18,7 +18,23 @@ export type StorageSettingsType = { maxLength: number; }; -export interface SessionManager { + +export abstract class SessionBase implements SessionManager { + abstract getSessionItem(itemKey: V | StorageKeys): Awaitable; + abstract setSessionItem(itemKey: V | StorageKeys, itemValue: T): Awaitable; + abstract removeSessionItem(itemKey: V | StorageKeys): Awaitable; + abstract destroySession(): Awaitable; + + async setItems(items: Partial>): Promise { + await Promise.all( + Object.entries(items).map(([key, value]) => { + return this.setSessionItem(key as V | StorageKeys, value); + }) + ); + } +} + +export interface SessionManager { /** * * Gets the item for the provided key from the storage. @@ -49,4 +65,6 @@ export interface SessionManager { * Destroys the session */ destroySession: () => Awaitable; + + setItems(items: Record): void }