diff --git a/packages/sdk/src/core/client.ts b/packages/sdk/src/core/client.ts index 7e7b961..5c86946 100644 --- a/packages/sdk/src/core/client.ts +++ b/packages/sdk/src/core/client.ts @@ -22,8 +22,21 @@ const defaultClock = { }, }; +function assertServerEnvironment(): void { + const isBrowser = + typeof window !== "undefined" || + typeof document !== "undefined"; + + if (isBrowser) { + throw new Error( + "Domain SDK is server-side only. Initialize it in a server route, server action, or backend service.", + ); + } +} + /** Create a stateless custom-domain client backed by one provider adapter. */ export function createDomainClient(options: DomainClientOptions): DomainClient { + assertServerEnvironment(); if (!options?.provider) throw new DomainSdkError("INVALID_CONFIGURATION", "A domain provider is required."); const { provider } = options; diff --git a/packages/sdk/test/core/client.test.ts b/packages/sdk/test/core/client.test.ts index 31f5215..5a7df1f 100644 --- a/packages/sdk/test/core/client.test.ts +++ b/packages/sdk/test/core/client.test.ts @@ -3,6 +3,20 @@ import { createDomainClient, DomainSdkError } from "../../src"; import { createMockDnsRecord, memoryProvider } from "../../src/testing"; describe("domain client and memory provider", () => { + test("rejects initialization in a browser environment", () => { + const windowDescriptor = Object.getOwnPropertyDescriptor(globalThis, "window"); + Object.defineProperty(globalThis, "window", { value: {}, configurable: true }); + + try { + expect(() => createDomainClient({ provider: memoryProvider() })).toThrow( + "Domain SDK is server-side only", + ); + } finally { + if (windowDescriptor) Object.defineProperty(globalThis, "window", windowDescriptor); + else Reflect.deleteProperty(globalThis, "window"); + } + }); + test("supports the lifecycle and duplicate add", async () => { const memory = memoryProvider({ records: [createMockDnsRecord(), createMockDnsRecord()] }); const domains = createDomainClient({ provider: memory });