Skip to content

Commit

Permalink
feat: add setItems to storage
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielRivers committed Oct 25, 2024
1 parent 375a260 commit b085335
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 8 deletions.
5 changes: 4 additions & 1 deletion lib/sessionManager/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
14 changes: 14 additions & 0 deletions lib/sessionManager/stores/chromeStore.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions lib/sessionManager/stores/chromeStore.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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<V = StorageKeys> implements SessionManager<V> {
export class ChromeStore<V extends string = StorageKeys> extends SessionBase<V> implements SessionManager<V> {
/**
* Clears all items from session store.
* @returns {void}
Expand Down
13 changes: 13 additions & 0 deletions lib/sessionManager/stores/expoSecureStore.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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", () => {
Expand Down
5 changes: 3 additions & 2 deletions lib/sessionManager/stores/expoSecureStore.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -16,8 +16,9 @@ async function waitForExpoSecureStore() {
* Provides a expo local store based session manager implementation for the browser.
* @class ExpoSecureStore
*/
export class ExpoSecureStore<V = StorageKeys> implements SessionManager<V> {
export class ExpoSecureStore<V extends string = StorageKeys> extends SessionBase<V> {
constructor() {
super();
this.loadExpoStore();
}

Expand Down
13 changes: 13 additions & 0 deletions lib/sessionManager/stores/memory.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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", () => {
Expand Down
4 changes: 2 additions & 2 deletions lib/sessionManager/stores/memory.ts
Original file line number Diff line number Diff line change
@@ -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<V = StorageKeys> implements SessionManager<V> {
export class MemoryStorage<V extends string = StorageKeys> extends SessionBase<V> implements SessionManager<V> {
private memCache: Record<string, unknown> = {};

/**
Expand Down
20 changes: 19 additions & 1 deletion lib/sessionManager/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,23 @@ export type StorageSettingsType = {
maxLength: number;
};

export interface SessionManager<V = StorageKeys> {

export abstract class SessionBase<V extends string = StorageKeys> implements SessionManager<V> {
abstract getSessionItem<T = unknown>(itemKey: V | StorageKeys): Awaitable<T | unknown | null>;
abstract setSessionItem<T = unknown>(itemKey: V | StorageKeys, itemValue: T): Awaitable<void>;
abstract removeSessionItem(itemKey: V | StorageKeys): Awaitable<void>;
abstract destroySession(): Awaitable<void>;

async setItems(items: Partial<Record<V, unknown>>): Promise<void> {
await Promise.all(
Object.entries(items).map(([key, value]) => {
return this.setSessionItem(key as V | StorageKeys, value);
})
);
}
}

export interface SessionManager<V extends string = StorageKeys> {
/**
*
* Gets the item for the provided key from the storage.
Expand Down Expand Up @@ -49,4 +65,6 @@ export interface SessionManager<V = StorageKeys> {
* Destroys the session
*/
destroySession: () => Awaitable<void>;

setItems(items: Record<V, unknown>): void
}

0 comments on commit b085335

Please sign in to comment.