diff --git a/src/client.ts b/src/client.ts index 6b9448f..acb5b01 100644 --- a/src/client.ts +++ b/src/client.ts @@ -66,8 +66,14 @@ export function createClient(config: CreateClientConfig): Base44Client { options, functionsVersion, headers: optionalHeaders, + useStagingDb: configUseStagingDb, } = config; + // Config takes precedence, fallback to URL query param in browser + const urlHasStagingDb = typeof window !== "undefined" + && new URLSearchParams(window.location.search).get("use_staging_db") === "true"; + const useStagingDb = configUseStagingDb ?? urlHasStagingDb; + const socketConfig: RoomsSocketConfig = { serverUrl, mountPath: "/ws-user-apps/socket.io/", @@ -90,6 +96,7 @@ export function createClient(config: CreateClientConfig): Base44Client { const headers = { ...optionalHeaders, "X-App-Id": String(appId), + "Base44-Use-Staging-DB": String(useStagingDb), }; const functionHeaders = functionsVersion @@ -346,6 +353,7 @@ export function createClientFromRequest(request: Request): Base44Client { const appId = request.headers.get("Base44-App-Id"); const serverUrlHeader = request.headers.get("Base44-Api-Url"); const functionsVersion = request.headers.get("Base44-Functions-Version"); + const useStagingDb = request.headers.get("Base44-Use-Staging-DB") === "true"; const stateHeader = request.headers.get("Base44-State"); if (!appId) { @@ -396,6 +404,7 @@ export function createClientFromRequest(request: Request): Base44Client { token: userToken, serviceToken: serviceRoleToken, functionsVersion: functionsVersion ?? undefined, + useStagingDb: useStagingDb ?? undefined, headers: additionalHeaders, }); } diff --git a/src/client.types.ts b/src/client.types.ts index a86af41..f787665 100644 --- a/src/client.types.ts +++ b/src/client.types.ts @@ -62,6 +62,11 @@ export interface CreateClientConfig { * @internal */ headers?: Record; + /** + * Whether to use the staging database. Defaults to false. + * When true, API requests will use the staging database instead of production. + */ + useStagingDb?: boolean; /** * Additional client options. */ diff --git a/tests/unit/client.test.js b/tests/unit/client.test.js index 74c97aa..09eee00 100644 --- a/tests/unit/client.test.js +++ b/tests/unit/client.test.js @@ -254,7 +254,46 @@ describe('createClientFromRequest', () => { }; const client = createClientFromRequest(mockRequest); - + + expect(client).toBeDefined(); + const config = client.getConfig(); + expect(config.appId).toBe('test-app-id'); + }); + + test('should propagate Base44-Use-Staging-DB header when present', () => { + const mockRequest = { + headers: { + get: (name) => { + const headers = { + 'Base44-App-Id': 'test-app-id', + 'Base44-Use-Staging-DB': 'true' + }; + return headers[name] || null; + } + } + }; + + const client = createClientFromRequest(mockRequest); + + expect(client).toBeDefined(); + const config = client.getConfig(); + expect(config.appId).toBe('test-app-id'); + }); + + test('should work without Base44-Use-Staging-DB header', () => { + const mockRequest = { + headers: { + get: (name) => { + const headers = { + 'Base44-App-Id': 'test-app-id' + }; + return headers[name] || null; + } + } + }; + + const client = createClientFromRequest(mockRequest); + expect(client).toBeDefined(); const config = client.getConfig(); expect(config.appId).toBe('test-app-id');