@featureflip/js
Server-side JavaScript/TypeScript SDK for Featureflip - evaluate feature flags locally with near-zero latency.
Installation
npm install @featureflip/js
Quick Start
import { FeatureflipClient, createNodePlatform } from '@featureflip/js';
const client = FeatureflipClient.get(
{ sdkKey: 'your-sdk-key', baseUrl: 'https://eval.featureflip.io' },
createNodePlatform(),
);
await client.waitForInitialization();
const enabled = client.boolVariation('my-feature', { user_id: '123' }, false);
if (enabled) {
console.log('Feature is enabled!');
}
await client.close();
Singleton by construction. FeatureflipClient.get() is the only way to obtain a client. Calling get() more than once with the same SDK key returns handles pointing at one shared underlying client — the factory is refcounted, so closing a handle only shuts down the shared core when the last handle is closed. This makes the SDK safe to call from per-request handlers and DI containers without leaking SSE connections.
Configuration
const client = FeatureflipClient.get(
{
sdkKey: 'your-sdk-key',
baseUrl: 'https://eval.featureflip.io',
streaming: true,
pollInterval: 30000,
flushInterval: 30000,
flushBatchSize: 100,
initTimeout: 10000,
maxStreamRetries: 5,
},
createNodePlatform(),
);
Evaluation
const context = { user_id: '123', email: 'user@example.com' };
const enabled = client.boolVariation('feature-key', context, false);
const tier = client.stringVariation('pricing-tier', context, 'free');
const limit = client.numberVariation('rate-limit', context, 100);
const config = client.jsonVariation('ui-config', context, { theme: 'light' });
Detailed Evaluation
const detail = client.variationDetail('feature-key', { user_id: '123' }, false);
console.log(detail.value);
console.log(detail.reason);
console.log(detail.ruleId);
Event Tracking
client.track('checkout-completed', { user_id: '123' }, { total: 99.99 });
client.identify({ user_id: '123', email: 'user@example.com', plan: 'pro' });
await client.flush();
Testing
Use forTesting() to create a client with predetermined flag values -- no network calls.
const client = FeatureflipClient.forTesting({
'my-feature': true,
'pricing-tier': 'pro',
});
client.boolVariation('my-feature', {}, false);
client.stringVariation('pricing-tier', {}, 'free');
client.boolVariation('unknown', {}, false);
Features
- Local evaluation - Near-zero latency after initialization
- Real-time updates - SSE streaming with automatic polling fallback
- Event tracking - Automatic batching and background flushing
- Test support -
forTesting() factory for deterministic unit tests
- TypeScript - Full type definitions included
Requirements
License
Apache-2.0