Skip to content

Commit

Permalink
Create LaunchDarkly adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
AndyBitz committed Dec 12, 2024
1 parent 2ec534a commit 26dc121
Show file tree
Hide file tree
Showing 4 changed files with 6,061 additions and 7,359 deletions.
6 changes: 4 additions & 2 deletions packages/adapter-launchdarkly/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@
"test:watch": "vitest",
"type-check": "tsc --noEmit"
},
"dependencies": {},
"dependencies": {
"@launchdarkly/vercel-server-sdk": "1.3.21",
"@vercel/edge-config": "1.2.0"
},
"devDependencies": {
"@types/node": "20.11.17",
"@vercel/flags": "workspace:*",
Expand All @@ -56,7 +59,6 @@
"vite": "5.1.1",
"vitest": "1.4.0"
},
"peerDependencies": {},
"publishConfig": {
"access": "public"
}
Expand Down
60 changes: 60 additions & 0 deletions packages/adapter-launchdarkly/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import type { Adapter } from '@vercel/flags';
import { createClient } from '@vercel/edge-config';
import { init, type LDContext } from '@launchdarkly/vercel-server-sdk';

let defaultLaunchDarklyClient:
| ReturnType<typeof createLaunchDarklyAdapter>
| undefined;

function assertEnv(name: string): string {
const value = process.env[name];
if (!value) {
throw new Error(
`LaunchDarkly Adapter: Missing ${name} environment variable`,
);
}
return value;
}

export function createLaunchDarklyAdapter({
ldProject,
ldClientSideKey,
edgeConfigConnectionString,
}: {
ldProject: string;
ldClientSideKey: string;
edgeConfigConnectionString: string;
}) {
const edgeConfigClient = createClient(edgeConfigConnectionString);
const ldClient = init(ldClientSideKey, edgeConfigClient);

return function launchDarklyAdapter<ValueType>(): Adapter<
ValueType,
LDContext
> {
return {
origin(key) {
return `https://app.launchdarkly.com/projects/${ldProject}/flags/${key}/`;
},
async decide({ key, entities }): Promise<ValueType> {
await ldClient.waitForInitialization();
return ldClient.variation(key, entities!, undefined) as ValueType;
},
};
};
}

export function launchDarkly<ValueType>(): Adapter<ValueType, LDContext> {
if (!defaultLaunchDarklyClient) {
const edgeConfigConnectionString = assertEnv('EDGE_CONFIG');
const ldClientSideKey = assertEnv('LD_CLIENT_SIDE_KEY');
const ldProject = assertEnv('LD_PROJECT');
defaultLaunchDarklyClient = createLaunchDarklyAdapter({
ldProject,
ldClientSideKey,
edgeConfigConnectionString,
});
}

return defaultLaunchDarklyClient();
}
Loading

0 comments on commit 26dc121

Please sign in to comment.