Skip to content

Commit b085335

Browse files
committed
feat: add setItems to storage
1 parent 375a260 commit b085335

8 files changed

+70
-8
lines changed

lib/sessionManager/index.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,7 @@ export const storageSettings: StorageSettingsType = {
1616
export { MemoryStorage } from "./stores/memory.js";
1717
export { ChromeStore } from "./stores/chromeStore.js";
1818
export { ExpoSecureStore } from "./stores/expoSecureStore.js";
19-
export * from "./types.ts";
19+
export {
20+
type SessionManager,
21+
StorageKeys
22+
} from "./types.ts";

lib/sessionManager/stores/chromeStore.test.ts

+14
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@ describe.skip("GoogleStorage standard keys", () => {
4343
await sessionManager.getSessionItem(StorageKeys.accessToken),
4444
).toBeNull();
4545
});
46+
47+
48+
it("should set many items", async () => {
49+
await sessionManager.setItems({
50+
[StorageKeys.accessToken]: "accessTokenValue",
51+
[StorageKeys.idToken]: "idTokenValue",
52+
});
53+
expect(await sessionManager.getSessionItem(StorageKeys.accessToken)).toBe(
54+
"accessTokenValue",
55+
);
56+
expect(await sessionManager.getSessionItem(StorageKeys.idToken)).toBe(
57+
"idTokenValue",
58+
);
59+
});
4660
});
4761

4862
// TODO: Fix tests, need to mock chrome storage

lib/sessionManager/stores/chromeStore.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { storageSettings } from "../index.js";
2-
import { StorageKeys, type SessionManager } from "../types.js";
2+
import { SessionBase, StorageKeys, type SessionManager } from "../types.js";
33
import { splitString } from "../utils.js";
44

55
function getStorageValue(key: string): unknown | undefined {
@@ -18,7 +18,7 @@ function getStorageValue(key: string): unknown | undefined {
1818
* Provides a chrome.store.local based session manager implementation for the browser.
1919
* @class ChromeStore
2020
*/
21-
export class ChromeStore<V = StorageKeys> implements SessionManager<V> {
21+
export class ChromeStore<V extends string = StorageKeys> extends SessionBase<V> implements SessionManager<V> {
2222
/**
2323
* Clears all items from session store.
2424
* @returns {void}

lib/sessionManager/stores/expoSecureStore.test.ts

+13
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ describe.skip("ExpoSecureStore standard keys", () => {
4343
await sessionManager.getSessionItem(StorageKeys.accessToken),
4444
).toBeNull();
4545
});
46+
47+
it("should set many items", async () => {
48+
await sessionManager.setItems({
49+
[StorageKeys.accessToken]: "accessTokenValue",
50+
[StorageKeys.idToken]: "idTokenValue",
51+
});
52+
expect(await sessionManager.getSessionItem(StorageKeys.accessToken)).toBe(
53+
"accessTokenValue",
54+
);
55+
expect(await sessionManager.getSessionItem(StorageKeys.idToken)).toBe(
56+
"idTokenValue",
57+
);
58+
});
4659
});
4760

4861
describe.skip("ExpoSecureStore keys: storageKeys", () => {

lib/sessionManager/stores/expoSecureStore.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { storageSettings } from "../index.js";
2-
import { StorageKeys, type SessionManager } from "../types.js";
2+
import { SessionBase, StorageKeys } from "../types.js";
33
import { splitString } from "../utils.js";
44

55
let expoSecureStore: typeof import("expo-secure-store") | undefined = undefined;
@@ -16,8 +16,9 @@ async function waitForExpoSecureStore() {
1616
* Provides a expo local store based session manager implementation for the browser.
1717
* @class ExpoSecureStore
1818
*/
19-
export class ExpoSecureStore<V = StorageKeys> implements SessionManager<V> {
19+
export class ExpoSecureStore<V extends string = StorageKeys> extends SessionBase<V> {
2020
constructor() {
21+
super();
2122
this.loadExpoStore();
2223
}
2324

lib/sessionManager/stores/memory.test.ts

+13
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ describe("MemoryStorage standard keys", () => {
4343
await sessionManager.getSessionItem(StorageKeys.accessToken),
4444
).toBeNull();
4545
});
46+
47+
it("should set many items", async () => {
48+
await sessionManager.setItems({
49+
[StorageKeys.accessToken]: "accessTokenValue",
50+
[StorageKeys.idToken]: "idTokenValue",
51+
});
52+
expect(await sessionManager.getSessionItem(StorageKeys.accessToken)).toBe(
53+
"accessTokenValue",
54+
);
55+
expect(await sessionManager.getSessionItem(StorageKeys.idToken)).toBe(
56+
"idTokenValue",
57+
);
58+
});
4659
});
4760

4861
describe("MemoryStorage keys: storageKeys", () => {

lib/sessionManager/stores/memory.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { storageSettings } from "../index.js";
2-
import { StorageKeys, type SessionManager } from "../types.js";
2+
import { SessionBase, StorageKeys, type SessionManager } from "../types.js";
33
import { splitString } from "../utils.js";
44

55
/**
66
* Provides a memory based session manager implementation for the browser.
77
* @class MemoryStorage
88
*/
9-
export class MemoryStorage<V = StorageKeys> implements SessionManager<V> {
9+
export class MemoryStorage<V extends string = StorageKeys> extends SessionBase<V> implements SessionManager<V> {
1010
private memCache: Record<string, unknown> = {};
1111

1212
/**

lib/sessionManager/types.ts

+19-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,23 @@ export type StorageSettingsType = {
1818
maxLength: number;
1919
};
2020

21-
export interface SessionManager<V = StorageKeys> {
21+
22+
export abstract class SessionBase<V extends string = StorageKeys> implements SessionManager<V> {
23+
abstract getSessionItem<T = unknown>(itemKey: V | StorageKeys): Awaitable<T | unknown | null>;
24+
abstract setSessionItem<T = unknown>(itemKey: V | StorageKeys, itemValue: T): Awaitable<void>;
25+
abstract removeSessionItem(itemKey: V | StorageKeys): Awaitable<void>;
26+
abstract destroySession(): Awaitable<void>;
27+
28+
async setItems(items: Partial<Record<V, unknown>>): Promise<void> {
29+
await Promise.all(
30+
Object.entries(items).map(([key, value]) => {
31+
return this.setSessionItem(key as V | StorageKeys, value);
32+
})
33+
);
34+
}
35+
}
36+
37+
export interface SessionManager<V extends string = StorageKeys> {
2238
/**
2339
*
2440
* Gets the item for the provided key from the storage.
@@ -49,4 +65,6 @@ export interface SessionManager<V = StorageKeys> {
4965
* Destroys the session
5066
*/
5167
destroySession: () => Awaitable<void>;
68+
69+
setItems(items: Record<V, unknown>): void
5270
}

0 commit comments

Comments
 (0)