Skip to content
9 changes: 9 additions & 0 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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/",
Expand All @@ -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
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -396,6 +404,7 @@ export function createClientFromRequest(request: Request): Base44Client {
token: userToken,
serviceToken: serviceRoleToken,
functionsVersion: functionsVersion ?? undefined,
useStagingDb: useStagingDb ?? undefined,
headers: additionalHeaders,
});
}
5 changes: 5 additions & 0 deletions src/client.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ export interface CreateClientConfig {
* @internal
*/
headers?: Record<string, string>;
/**
* 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.
*/
Expand Down
41 changes: 40 additions & 1 deletion tests/unit/client.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down