Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions lib/sessionManager/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ export const storageSettings: StorageSettingsType = {
maxLength: 2000,
};

export { MemoryStorage } from "./stores/memory.ts";
export { ChromeStore } from "./stores/chromeStore.ts";
export { ExpoSecureStore } from "./stores/expoSecureStore.ts";
export { MemoryStorage } from "./stores/memory.js";
export { ChromeStore } from "./stores/chromeStore.js";
export { ExpoSecureStore } from "./stores/expoSecureStore.js";
export { LocalStorage } from "./stores/localStorage.ts";
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
}
Loading