Skip to main content

JavaScript / TypeScript

No npm package required. Copy the client below into your project. It's a thin wrapper around fetch with authentication, error handling, and TypeScript types.

The client

lib/flags.ts
export type FlagResult = {
enabled: boolean;
reason: string;
};

export type FlagMap = Record<string, FlagResult>;

export type UserContext = {
user_id?: string;
user_email?: string;
};

const FFS_URL = process.env.FFS_API_URL ?? 'https://api.ffs.adarshrust.com';
const SDK_KEY = process.env.FFS_SDK_KEY ?? '';
const ENVIRONMENT = process.env.FFS_ENVIRONMENT ?? 'production';

export async function evaluateFlags(context: UserContext): Promise<FlagMap> {
try {
const res = await fetch(`${FFS_URL}/sdk/v1/evaluate`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-SDK-Key': SDK_KEY,
},
body: JSON.stringify({ environment: ENVIRONMENT, context }),
});

if (!res.ok) return {};

const data = await res.json();
return data.flags ?? {};
} catch {
// service unreachable — all flag checks default to false
return {};
}
}

export function isEnabled(flags: FlagMap, key: string): boolean {
return flags[key]?.enabled === true;
}

Usage in a Next.js API route

app/api/dashboard/route.ts
import { evaluateFlags, isEnabled } from '@/lib/flags';

export async function GET(request: Request) {
const user = await getUser(request);

const flags = await evaluateFlags({
user_id: user.id,
user_email: user.email,
});

return Response.json({
showNewDashboard: isEnabled(flags, 'new_dashboard'),
showBetaReports: isEnabled(flags, 'beta_reports'),
});
}

Usage in an Express route

routes/dashboard.ts
import { evaluateFlags, isEnabled } from '../lib/flags';

router.get('/dashboard', async (req, res) => {
const flags = await evaluateFlags({
user_id: req.user.id,
user_email: req.user.email,
});

res.render('dashboard', {
showNewLayout: isEnabled(flags, 'new_layout'),
});
});

Environment variables

VariableDescription
FFS_API_URLBase URL of the service. Default: https://api.ffs.adarshrust.com
FFS_SDK_KEYYour project's SDK key (sdk_...)
FFS_ENVIRONMENTproduction, staging, or a custom environment key

Browser usage

Server-side only

Keep the SDK key server-side. Do not include it in client-side JavaScript bundles. The key would be visible to anyone who inspects network requests.

If you need flags in the browser, evaluate server-side and pass the results to the client as part of your initial page data (Next.js getServerSideProps, HTML data attributes, or an authenticated API endpoint your frontend calls).

Caching

Evaluate once per request and pass the FlagMap down through your handler. Do not call evaluateFlags per individual feature check.

// Good
const flags = await evaluateFlags(userContext);
const ui = buildUI(flags);

// 3 separate network calls
const darkMode = await evaluateFlags(userContext);
const checkout = await evaluateFlags(userContext);
const beta = await evaluateFlags(userContext);