From c40e6ac89ccf2e569df1e2c1348730698b4dc853 Mon Sep 17 00:00:00 2001 From: Andrew Jiang Date: Tue, 28 Jan 2025 15:28:19 -0600 Subject: [PATCH 1/4] enable falling back to orgid --- packages/fern-docs/bundle/src/middleware.ts | 6 +++++- packages/fern-docs/bundle/src/server/ld-adapter.ts | 6 +++++- .../fern-docs/edge-config/src/getLaunchDarklySettings.ts | 8 ++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/fern-docs/bundle/src/middleware.ts b/packages/fern-docs/bundle/src/middleware.ts index 9a1b7dd740..a8b9d52c70 100644 --- a/packages/fern-docs/bundle/src/middleware.ts +++ b/packages/fern-docs/bundle/src/middleware.ts @@ -8,6 +8,7 @@ import { withMiddlewareAuth } from "./server/withMiddlewareAuth"; import { withMiddlewareRewrite } from "./server/withMiddlewareRewrite"; import { withPathname } from "./server/withPathname"; import { getDocsDomainEdge } from "./server/xfernhost/edge"; +import { getOrgMetadataForDomain } from "./server/auth/metadata-for-url"; const API_FERN_DOCS_PATTERN = /^(?!\/api\/fern-docs\/).*(\/api\/fern-docs\/)/; @@ -132,7 +133,10 @@ export const middleware: NextMiddleware = async (request) => { // TODO: this adds additional latency to the page load. can we batch this somehow? const launchDarkly = await getLaunchDarklySettings( - getDocsDomainEdge(request) + getDocsDomainEdge(request), + getOrgMetadataForDomain(getDocsDomainEdge(request)).then((metadata) => + metadata?.orgId + ) ); return withMiddlewareAuth( diff --git a/packages/fern-docs/bundle/src/server/ld-adapter.ts b/packages/fern-docs/bundle/src/server/ld-adapter.ts index 8c36802c7d..b0be911f5f 100644 --- a/packages/fern-docs/bundle/src/server/ld-adapter.ts +++ b/packages/fern-docs/bundle/src/server/ld-adapter.ts @@ -4,6 +4,7 @@ import * as ld from "@launchdarkly/node-server-sdk"; import { isEqual } from "es-toolkit/predicate"; import { camelCase } from "es-toolkit/string"; import { AuthState } from "./auth/getAuthState"; +import { getOrgMetadataForDomain } from "./auth/metadata-for-url"; async function withLaunchDarklyContext( endpoint: string, @@ -69,7 +70,10 @@ export async function withLaunchDarkly( (node: FernNavigation.WithFeatureFlags) => boolean, ] > { - const launchDarklyConfig = await getLaunchDarklySettings(domain); + const launchDarklyConfig = await getLaunchDarklySettings( + domain, + getOrgMetadataForDomain(domain).then((metadata) => metadata?.orgId) + ); if (launchDarklyConfig) { const context = await withLaunchDarklyContext( launchDarklyConfig["context-endpoint"], diff --git a/packages/fern-docs/edge-config/src/getLaunchDarklySettings.ts b/packages/fern-docs/edge-config/src/getLaunchDarklySettings.ts index 30e34bb168..acc354ed76 100644 --- a/packages/fern-docs/edge-config/src/getLaunchDarklySettings.ts +++ b/packages/fern-docs/edge-config/src/getLaunchDarklySettings.ts @@ -26,11 +26,15 @@ export type LaunchDarklyEdgeConfig = z.infer< >; export async function getLaunchDarklySettings( - domain: string + domain: string, + orgId?: Promise ): Promise { const allConfigs = await get>("launchdarkly"); - const config = allConfigs?.[domain] ?? allConfigs?.[withoutStaging(domain)]; + const config = + allConfigs?.[domain] ?? + allConfigs?.[withoutStaging(domain)] ?? + allConfigs?.[(await orgId) ?? ""]; if (config) { const result = LaunchDarklyEdgeConfigSchema.safeParse(config); if (result.success) { From ddc4049d206ded6ec297686c1bd2e83676baa941 Mon Sep 17 00:00:00 2001 From: Andrew Jiang Date: Tue, 28 Jan 2025 15:33:35 -0600 Subject: [PATCH 2/4] prettier fix --- packages/fern-docs/bundle/src/middleware.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fern-docs/bundle/src/middleware.ts b/packages/fern-docs/bundle/src/middleware.ts index a8b9d52c70..0be11db993 100644 --- a/packages/fern-docs/bundle/src/middleware.ts +++ b/packages/fern-docs/bundle/src/middleware.ts @@ -3,12 +3,12 @@ import { extractNextDataPathname } from "@/server/extractNextDataPathname"; import { getLaunchDarklySettings } from "@fern-docs/edge-config"; import { removeTrailingSlash } from "@fern-docs/utils"; import { NextResponse, type NextMiddleware } from "next/server"; +import { getOrgMetadataForDomain } from "./server/auth/metadata-for-url"; import { MARKDOWN_PATTERN, RSS_PATTERN } from "./server/patterns"; import { withMiddlewareAuth } from "./server/withMiddlewareAuth"; import { withMiddlewareRewrite } from "./server/withMiddlewareRewrite"; import { withPathname } from "./server/withPathname"; import { getDocsDomainEdge } from "./server/xfernhost/edge"; -import { getOrgMetadataForDomain } from "./server/auth/metadata-for-url"; const API_FERN_DOCS_PATTERN = /^(?!\/api\/fern-docs\/).*(\/api\/fern-docs\/)/; @@ -134,8 +134,8 @@ export const middleware: NextMiddleware = async (request) => { // TODO: this adds additional latency to the page load. can we batch this somehow? const launchDarkly = await getLaunchDarklySettings( getDocsDomainEdge(request), - getOrgMetadataForDomain(getDocsDomainEdge(request)).then((metadata) => - metadata?.orgId + getOrgMetadataForDomain(getDocsDomainEdge(request)).then( + (metadata) => metadata?.orgId ) ); From 8d1ded622e1bfebb40d85477f60687be01767be7 Mon Sep 17 00:00:00 2001 From: Andrew Jiang Date: Tue, 28 Jan 2025 16:50:36 -0600 Subject: [PATCH 3/4] add anonymous context --- .../fern-docs/bundle/src/server/ld-adapter.ts | 7 +++-- .../src/getLaunchDarklySettings.ts | 2 +- .../feature-flags/LDFeatureFlagProvider.tsx | 26 +++++++++++++------ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/packages/fern-docs/bundle/src/server/ld-adapter.ts b/packages/fern-docs/bundle/src/server/ld-adapter.ts index b0be911f5f..c6117aa6be 100644 --- a/packages/fern-docs/bundle/src/server/ld-adapter.ts +++ b/packages/fern-docs/bundle/src/server/ld-adapter.ts @@ -7,11 +7,14 @@ import { AuthState } from "./auth/getAuthState"; import { getOrgMetadataForDomain } from "./auth/metadata-for-url"; async function withLaunchDarklyContext( - endpoint: string, + endpoint: string | undefined, authState: AuthState, node: FernNavigation.utils.Node, rawCookie: string | undefined ): Promise { + if (endpoint == null) { + return { kind: "user", key: "anonymous", anonymous: true }; + } try { const url = new URL(endpoint); url.searchParams.set("anonymous", String(!authState.authed)); @@ -46,7 +49,7 @@ async function withLaunchDarklyContext( interface LaunchDarklyInfo { clientSideId: string; - contextEndpoint: string; + contextEndpoint: string | undefined; context: ld.LDContext | undefined; defaultFlags: object | undefined; options: diff --git a/packages/fern-docs/edge-config/src/getLaunchDarklySettings.ts b/packages/fern-docs/edge-config/src/getLaunchDarklySettings.ts index acc354ed76..cad27b42e9 100644 --- a/packages/fern-docs/edge-config/src/getLaunchDarklySettings.ts +++ b/packages/fern-docs/edge-config/src/getLaunchDarklySettings.ts @@ -10,7 +10,7 @@ const LaunchDarklyEdgeConfigSchema = z.object({ // IMPORTANT: we will pass cookies to this endpoint, so if we move this to docs.yml, // we should add a check to make sure the target domain is trusted. Trust should always be granted manually by a fern engineer, // so it should be managed in edge config, or FGA. - "context-endpoint": z.string(), + "context-endpoint": z.string().optional(), options: z .object({ diff --git a/packages/fern-docs/ui/src/feature-flags/LDFeatureFlagProvider.tsx b/packages/fern-docs/ui/src/feature-flags/LDFeatureFlagProvider.tsx index 9cc5954f84..6b509b0567 100644 --- a/packages/fern-docs/ui/src/feature-flags/LDFeatureFlagProvider.tsx +++ b/packages/fern-docs/ui/src/feature-flags/LDFeatureFlagProvider.tsx @@ -14,7 +14,7 @@ interface Props extends PropsWithChildren { /** * The endpoint to fetch the user context from. */ - contextEndpoint: string; + contextEndpoint: string | undefined; /** * Default anonymous user context. @@ -32,6 +32,12 @@ interface Props extends PropsWithChildren { }; } +const ANONYMOUS_CONTEXT: LDContext = { + kind: "user", + key: "anonymous", + anonymous: true, +}; + export const LDFeatureFlagProvider: FC = ({ clientSideId, contextEndpoint, @@ -43,16 +49,20 @@ export const LDFeatureFlagProvider: FC = ({ return ( - - {children} - + {contextEndpoint ? ( + + {children} + + ) : ( + children + )} ); }; From c60cb228a450e28e694f3e4bef4838e6c44ac171 Mon Sep 17 00:00:00 2001 From: Andrew Jiang Date: Tue, 28 Jan 2025 17:23:56 -0600 Subject: [PATCH 4/4] fix types --- packages/fern-docs/ui/src/atoms/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fern-docs/ui/src/atoms/types.ts b/packages/fern-docs/ui/src/atoms/types.ts index 9c835410e7..3d845ed641 100644 --- a/packages/fern-docs/ui/src/atoms/types.ts +++ b/packages/fern-docs/ui/src/atoms/types.ts @@ -54,7 +54,7 @@ export type NavbarLink = DefaultNavbarLink | GithubNavbarLink; export interface LaunchDarklyInfo { clientSideId: string; - contextEndpoint: string; + contextEndpoint: string | undefined; context: LDContext | undefined; defaultFlags: object | undefined; options: