OpenFeature
Standards-based OpenFeature provider (server + web) backed by @foredeck/sdk-js local evaluation
Prefer the standards-based API? Use @foredeck/openfeature-provider-js — an OpenFeature provider (server + web) for the Foredeck feature-flag platform, backed by @foredeck/sdk-js local evaluation. Evaluations never make a network call; exposure events are batched and flushed by the underlying SDK client.
Install
npm install @foredeck/openfeature-provider-js @foredeck/sdk-js
# plus ONE of:
npm install @openfeature/server-sdk # Node / server
npm install @openfeature/web-sdk # browserServer (Node) usage
import { OpenFeature } from '@openfeature/server-sdk';
import { ForedeckServerProvider } from '@foredeck/openfeature-provider-js/server';
await OpenFeature.setProviderAndWait(
new ForedeckServerProvider({
clientOptions: {
sdkKey: 'fd_server_<account>',
baseUrl: 'https://exp.example.com',
eventsUrl: 'https://events.example.com',
},
}),
);
const client = OpenFeature.getClient();
const variant = await client.getStringValue('checkout-button', 'control', {
targetingKey: userId,
});Web (browser) usage
import { OpenFeature } from '@openfeature/web-sdk';
import { ForedeckWebProvider } from '@foredeck/openfeature-provider-js/web';
OpenFeature.setContext({ targetingKey: userId });
await OpenFeature.setProviderAndWait(new ForedeckWebProvider({ clientOptions: { /* ... */ } }));
const value = OpenFeature.getClient().getStringValue('checkout-button', 'control');Ruleset updates surface as PROVIDER_CONFIGURATION_CHANGED events (with flagsChanged) on both providers.
Type-mapping contract
Foredeck variations are named strings with an optional JSON config payload. OpenFeature's typed evaluation maps onto that as follows:
| OpenFeature type | Resolution |
|---|---|
| string | the variation config's value when it is a string, else the variation name |
| boolean | the variation config's value (must be boolean, else TYPE_MISMATCH) |
| number | the variation config's value (must be a number, else TYPE_MISMATCH) |
| object | the variation config's value when it is an object, else the whole config object |
Abnormal outcomes throw typed OpenFeature errors (FLAG_NOT_FOUND, TARGETING_KEY_MISSING, TYPE_MISMATCH, GENERAL), so the OpenFeature client returns your default value. Successful resolutions report variant (the variation name), reason SPLIT (deterministic weighted bucketing), and the bucket number in flagMetadata.bucket.
Exposure logging
No hooks are required: @foredeck/sdk-js enqueues an exposure event on every evaluation (deduped, batched, flushed on an interval and on page hide).