Skip to content

Commit 0865e4b

Browse files
committed
Revert "fix(browser-sdk): use noop storage fallback on server"
This reverts commit bccd7eb.
1 parent bccd7eb commit 0865e4b

3 files changed

Lines changed: 41 additions & 25 deletions

File tree

packages/browser-sdk/src/storage.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
import { IS_SERVER } from "./config";
2-
31
export type StorageAdapter = {
42
getItem(key: string): Promise<string | null>;
53
setItem(key: string, value: string): Promise<void>;
64
removeItem?(key: string): Promise<void>;
75
};
86

9-
export function createNoopStorageAdapter(): StorageAdapter {
7+
export function createMemoryStorageAdapter(): StorageAdapter {
8+
const memoryStorage = new Map<string, string>();
9+
1010
return {
11-
getItem: async () => null,
12-
setItem: async () => undefined,
13-
removeItem: async () => undefined,
11+
getItem: async (key) => memoryStorage.get(key) ?? null,
12+
setItem: async (key, value) => {
13+
memoryStorage.set(key, value);
14+
},
15+
removeItem: async (key) => {
16+
memoryStorage.delete(key);
17+
},
1418
};
1519
}
1620

@@ -36,6 +40,9 @@ export function getLocalStorageAdapter(): StorageAdapter {
3640
}
3741

3842
export function getDefaultStorageAdapter(): StorageAdapter {
39-
if (IS_SERVER) return createNoopStorageAdapter();
40-
return getLocalStorageAdapter();
43+
try {
44+
return getLocalStorageAdapter();
45+
} catch {
46+
return createMemoryStorageAdapter();
47+
}
4148
}

packages/browser-sdk/test/client.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,21 @@ describe("ReflagClient", () => {
2727
vi.unstubAllGlobals();
2828
});
2929

30+
describe("storage runtime compatibility", () => {
31+
it("can be constructed without localStorage", () => {
32+
vi.stubGlobal("localStorage", undefined);
33+
34+
expect(
35+
() =>
36+
new ReflagClient({
37+
publishableKey: "test-key",
38+
user: { id: "user1" },
39+
company: { id: "company1" },
40+
}),
41+
).not.toThrow();
42+
});
43+
});
44+
3045
describe("updateUser", () => {
3146
it("should update the user context", async () => {
3247
// and send new user data and trigger flag update
Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,39 @@
11
import { afterEach, describe, expect, it, vi } from "vitest";
22

3-
async function loadStorageModule() {
4-
vi.resetModules();
5-
return import("../src/storage");
6-
}
3+
import {
4+
createMemoryStorageAdapter,
5+
getDefaultStorageAdapter,
6+
getLocalStorageAdapter,
7+
} from "../src/storage";
78

89
describe("storage adapters", () => {
910
afterEach(() => {
1011
vi.unstubAllGlobals();
1112
});
1213

13-
it("noop adapter ignores writes", async () => {
14-
const { createNoopStorageAdapter } = await loadStorageModule();
15-
const adapter = createNoopStorageAdapter();
14+
it("memory adapter stores and retrieves values", async () => {
15+
const adapter = createMemoryStorageAdapter();
1616

1717
expect(await adapter.getItem("key")).toBeNull();
1818
await adapter.setItem("key", "value");
19-
expect(await adapter.getItem("key")).toBeNull();
19+
expect(await adapter.getItem("key")).toBe("value");
2020

2121
await adapter.removeItem?.("key");
2222
expect(await adapter.getItem("key")).toBeNull();
2323
});
2424

25-
it("localStorage adapter throws when localStorage is unavailable", async () => {
26-
const { getLocalStorageAdapter } = await loadStorageModule();
25+
it("localStorage adapter throws when localStorage is unavailable", () => {
2726
vi.stubGlobal("localStorage", undefined);
2827
expect(() => getLocalStorageAdapter()).toThrowError(
2928
"localStorage is not available. Provide a custom storage adapter.",
3029
);
3130
});
3231

33-
it("default adapter falls back to noop on server runtimes", async () => {
34-
vi.resetModules();
35-
vi.stubGlobal("window", undefined);
36-
vi.stubGlobal("document", undefined);
32+
it("default adapter falls back when localStorage is unavailable", async () => {
3733
vi.stubGlobal("localStorage", undefined);
38-
39-
const { getDefaultStorageAdapter } = await import("../src/storage");
4034
const adapter = getDefaultStorageAdapter();
4135

4236
await adapter.setItem("fallback", "ok");
43-
expect(await adapter.getItem("fallback")).toBeNull();
37+
expect(await adapter.getItem("fallback")).toBe("ok");
4438
});
4539
});

0 commit comments

Comments
 (0)