Skip to content

Commit bccd7eb

Browse files
committed
fix(browser-sdk): use noop storage fallback on server
1 parent e1149c8 commit bccd7eb

File tree

3 files changed

+25
-41
lines changed

3 files changed

+25
-41
lines changed

packages/browser-sdk/src/storage.ts

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

7-
export function createMemoryStorageAdapter(): StorageAdapter {
8-
const memoryStorage = new Map<string, string>();
9-
9+
export function createNoopStorageAdapter(): StorageAdapter {
1010
return {
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-
},
11+
getItem: async () => null,
12+
setItem: async () => undefined,
13+
removeItem: async () => undefined,
1814
};
1915
}
2016

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

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

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

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,6 @@ 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-
4530
describe("updateUser", () => {
4631
it("should update the user context", async () => {
4732
// and send new user data and trigger flag update
Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,45 @@
11
import { afterEach, describe, expect, it, vi } from "vitest";
22

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

98
describe("storage adapters", () => {
109
afterEach(() => {
1110
vi.unstubAllGlobals();
1211
});
1312

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

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

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

25-
it("localStorage adapter throws when localStorage is unavailable", () => {
25+
it("localStorage adapter throws when localStorage is unavailable", async () => {
26+
const { getLocalStorageAdapter } = await loadStorageModule();
2627
vi.stubGlobal("localStorage", undefined);
2728
expect(() => getLocalStorageAdapter()).toThrowError(
2829
"localStorage is not available. Provide a custom storage adapter.",
2930
);
3031
});
3132

32-
it("default adapter falls back when localStorage is unavailable", async () => {
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);
3337
vi.stubGlobal("localStorage", undefined);
38+
39+
const { getDefaultStorageAdapter } = await import("../src/storage");
3440
const adapter = getDefaultStorageAdapter();
3541

3642
await adapter.setItem("fallback", "ok");
37-
expect(await adapter.getItem("fallback")).toBe("ok");
43+
expect(await adapter.getItem("fallback")).toBeNull();
3844
});
3945
});

0 commit comments

Comments
 (0)