From 435c6c6fad59366b104eb306240ef369288ddaf4 Mon Sep 17 00:00:00 2001 From: Tyler Myracle Date: Wed, 10 Jan 2024 17:47:43 -0600 Subject: [PATCH] remove ld deps and feature flags --- apps/client/components/APM.tsx | 15 ----------- apps/client/pages/_app.tsx | 18 +------------ .../app/__tests__/account.integration.spec.ts | 1 - .../__tests__/connection.integration.spec.ts | 1 - .../app/__tests__/stripe.integration.spec.ts | 2 -- apps/server/src/app/lib/endpoint.ts | 7 +----- apps/server/src/app/lib/ldClient.ts | 6 ----- apps/server/src/app/lib/logger.ts | 16 ------------ apps/server/src/app/middleware/maintenance.ts | 24 ++---------------- apps/server/src/main.ts | 2 -- .../app/__tests__/queue.integration.spec.ts | 1 - apps/workers/src/app/lib/di.ts | 5 +--- apps/workers/src/app/lib/ldClient.ts | 6 ----- apps/workers/src/app/lib/logger.ts | 16 ------------ aws/maybe-app/lib/stacks/server-stack.ts | 9 ------- aws/maybe-app/lib/stacks/workers-stack.ts | 9 ------- .../src/types/client-side-feature-flags.ts | 4 --- .../src/services/feature-flag.service.ts | 25 ------------------- libs/server/shared/src/services/index.ts | 1 - package.json | 2 -- 20 files changed, 5 insertions(+), 165 deletions(-) delete mode 100644 apps/server/src/app/lib/ldClient.ts delete mode 100644 apps/workers/src/app/lib/ldClient.ts delete mode 100644 libs/server/shared/src/services/feature-flag.service.ts diff --git a/apps/client/components/APM.tsx b/apps/client/components/APM.tsx index 96262fec..333bcd16 100644 --- a/apps/client/components/APM.tsx +++ b/apps/client/components/APM.tsx @@ -1,6 +1,5 @@ import { useAuth0 } from '@auth0/auth0-react' import { useIntercom } from '@maybe-finance/client/shared' -import { useLDClient } from 'launchdarkly-react-client-sdk' import { useRouter } from 'next/router' import { useEffect } from 'react' import * as Sentry from '@sentry/react' @@ -8,7 +7,6 @@ import * as Sentry from '@sentry/react' export default function APM() { const { user } = useAuth0() const router = useRouter() - const ld = useLDClient() const intercom = useIntercom() // Boot intercom @@ -36,18 +34,5 @@ export default function APM() { } }, [user]) - // Identify LaunchDarkly user - useEffect(() => { - if (ld && user) { - ld.waitUntilReady().then(() => { - ld.identify({ - key: user.sub, - email: user.email, - name: user.name, - }) - }) - } - }, [ld, user]) - return null } diff --git a/apps/client/pages/_app.tsx b/apps/client/pages/_app.tsx index d75821ca..4fde4633 100644 --- a/apps/client/pages/_app.tsx +++ b/apps/client/pages/_app.tsx @@ -10,17 +10,14 @@ import { UserAccountContextProvider, AuthProvider, } from '@maybe-finance/client/shared' -import type { ClientType } from '@maybe-finance/client/shared' import { AccountsManager } from '@maybe-finance/client/features' import { AccountContextProvider } from '@maybe-finance/client/shared' import * as Sentry from '@sentry/react' import { BrowserTracing } from '@sentry/tracing' -import { useFlags, withLDProvider } from 'launchdarkly-react-client-sdk' import env from '../env' import '../styles.css' import { withAuthenticationRequired } from '@auth0/auth0-react' import ModalManager from '../components/ModalManager' -import Maintenance from '../components/Maintenance' import Meta from '../components/Meta' import APM from '../components/APM' @@ -51,7 +48,7 @@ const WithAuth = withAuthenticationRequired(function ({ children }: PropsWithChi ) }) -function App({ +export default function App({ Component: Page, pageProps, }: AppProps & { @@ -60,15 +57,8 @@ function App({ isPublic?: boolean } }) { - const flags = useFlags() as ClientType.ClientSideFeatureFlag - const getLayout = Page.getLayout ?? ((page) => page) - // Maintenance Guard - if (flags.maintenance) { - return - } - return ( ) } - -export default withLDProvider<{ Component; pageProps }>({ - clientSideID: env.NEXT_PUBLIC_LD_CLIENT_SIDE_ID, - // Prevent a new LD user being registered on each page load by always initializing with the same key - user: { key: 'anonymous-client', anonymous: true }, -})(App) diff --git a/apps/server/src/app/__tests__/account.integration.spec.ts b/apps/server/src/app/__tests__/account.integration.spec.ts index cd528a20..23b068c7 100644 --- a/apps/server/src/app/__tests__/account.integration.spec.ts +++ b/apps/server/src/app/__tests__/account.integration.spec.ts @@ -18,7 +18,6 @@ import { resetUser } from './utils/user' import { createTestInvestmentAccount } from './utils/account' import { default as _plaid } from '../lib/plaid' -jest.mock('launchdarkly-node-server-sdk') jest.mock('../middleware/validate-plaid-jwt.ts') jest.mock('bull') jest.mock('plaid') diff --git a/apps/server/src/app/__tests__/connection.integration.spec.ts b/apps/server/src/app/__tests__/connection.integration.spec.ts index bd6824c5..747f9ee0 100644 --- a/apps/server/src/app/__tests__/connection.integration.spec.ts +++ b/apps/server/src/app/__tests__/connection.integration.spec.ts @@ -12,7 +12,6 @@ import { default as _plaid } from '../lib/plaid' import nock from 'nock' import { resetUser } from './utils/user' -jest.mock('launchdarkly-node-server-sdk') jest.mock('../middleware/validate-plaid-jwt.ts') jest.mock('plaid') diff --git a/apps/server/src/app/__tests__/stripe.integration.spec.ts b/apps/server/src/app/__tests__/stripe.integration.spec.ts index da3ba8ea..5fa5ecd2 100644 --- a/apps/server/src/app/__tests__/stripe.integration.spec.ts +++ b/apps/server/src/app/__tests__/stripe.integration.spec.ts @@ -8,8 +8,6 @@ import stripe from '../lib/stripe' import { PgService } from '@maybe-finance/server/shared' import { DateTime } from 'luxon' -jest.mock('launchdarkly-node-server-sdk') - const prisma = new PrismaClient() const logger = createLogger({ transports: new transports.Console() }) diff --git a/apps/server/src/app/lib/endpoint.ts b/apps/server/src/app/lib/endpoint.ts index fa540e18..ab766b9c 100644 --- a/apps/server/src/app/lib/endpoint.ts +++ b/apps/server/src/app/lib/endpoint.ts @@ -1,4 +1,4 @@ -import type { IFeatureFlagService, IMarketDataService } from '@maybe-finance/server/shared' +import type { IMarketDataService } from '@maybe-finance/server/shared' import type { IAccountQueryService, IInstitutionService, @@ -13,7 +13,6 @@ import { EndpointFactory, QueueService, PgService, - LaunchDarklyFeatureFlagService, PolygonMarketDataService, CacheService, ServerUtil, @@ -55,7 +54,6 @@ import { } from '@maybe-finance/server/features' import { SharedType } from '@maybe-finance/shared' import prisma from './prisma' -import ldClient from './ldClient' import plaid, { getPlaidWebhookUrl } from './plaid' import finicity, { getFinicityTxPushUrl, getFinicityWebhookUrl } from './finicity' import stripe from './stripe' @@ -74,8 +72,6 @@ const redis = new Redis(env.NX_REDIS_URL, { retryStrategy: ServerUtil.redisRetryStrategy({ maxAttempts: 5 }), }) -const featureFlagService: IFeatureFlagService = new LaunchDarklyFeatureFlagService(ldClient) - export const queueService = new QueueService( logger.child({ service: 'QueueService' }), process.env.NODE_ENV === 'test' @@ -352,7 +348,6 @@ export async function createContext(req: Request) { valuationService, institutionService, cryptoService, - featureFlagService, queueService, plaidService, plaidWebhooks, diff --git a/apps/server/src/app/lib/ldClient.ts b/apps/server/src/app/lib/ldClient.ts deleted file mode 100644 index 80d866c4..00000000 --- a/apps/server/src/app/lib/ldClient.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { init } from 'launchdarkly-node-server-sdk' -import env from '../../env' - -const ldClient = init(env.NX_LD_SDK_KEY, { offline: process.env.NODE_ENV === 'test' }) - -export default ldClient diff --git a/apps/server/src/app/lib/logger.ts b/apps/server/src/app/lib/logger.ts index fdd3af41..fe9dd594 100644 --- a/apps/server/src/app/lib/logger.ts +++ b/apps/server/src/app/lib/logger.ts @@ -1,23 +1,7 @@ import { createLogger } from '@maybe-finance/server/shared' -import ldClient from './ldClient' const logger = createLogger({ level: 'info', }) -function setLevel() { - ldClient - .variation('server-log-level', { key: 'anonymous-server', anonymous: true }, 'info') - .then((level) => { - logger.level = level - logger[level](`Server logger using level: ${level}`) - }) -} - -// Don't configure for Jest -if (process.env.NODE_ENV !== 'test') { - ldClient.waitForInitialization().then(setLevel) - ldClient.on('update:server-log-level', setLevel) -} - export default logger diff --git a/apps/server/src/app/middleware/maintenance.ts b/apps/server/src/app/middleware/maintenance.ts index 22c3d25b..b9adaa6c 100644 --- a/apps/server/src/app/middleware/maintenance.ts +++ b/apps/server/src/app/middleware/maintenance.ts @@ -1,5 +1,4 @@ import type { Express } from 'express' -import ldClient from '../lib/ldClient' type MaintenanceOptions = { statusCode?: number @@ -9,28 +8,9 @@ type MaintenanceOptions = { export default function maintenance( app: Express, - { statusCode = 503, path = '/maintenance', featureKey = 'maintenance' }: MaintenanceOptions = {} + { statusCode = 503, path = '/maintenance' }: MaintenanceOptions = {} ) { - let enabled = false - - function loadFeatureFlag() { - ldClient - .waitForInitialization() - .then((ld) => { - ld.variation(featureKey, { key: 'anonymous-server', anonymous: true }, false).then( - (flag) => (enabled = flag) - ) - }) - .catch((err) => { - console.error(`error loading feature flag`, err) - }) - } - - loadFeatureFlag() - - ldClient.on(`update:${featureKey}`, () => { - loadFeatureFlag() - }) + const enabled = false app.get(path, async (req, res) => { res.status(200).json({ enabled }) diff --git a/apps/server/src/main.ts b/apps/server/src/main.ts index f88e3287..26d9be59 100644 --- a/apps/server/src/main.ts +++ b/apps/server/src/main.ts @@ -2,7 +2,6 @@ import type { AddressInfo } from 'net' import env from './env' import app from './app/app' import logger from './app/lib/logger' -import ldClient from './app/lib/ldClient' import * as Sentry from '@sentry/node' process.on('uncaughtException', function (error) { @@ -22,5 +21,4 @@ const server = app.listen(env.NX_PORT, () => { // Handle SIGTERM coming from ECS Fargate process.on('SIGTERM', () => server.close()) -server.on('close', () => ldClient.close()) server.on('error', (err) => logger.error('Server failed to start from main.ts', err)) diff --git a/apps/workers/src/app/__tests__/queue.integration.spec.ts b/apps/workers/src/app/__tests__/queue.integration.spec.ts index a30bfa6a..07882ee2 100644 --- a/apps/workers/src/app/__tests__/queue.integration.spec.ts +++ b/apps/workers/src/app/__tests__/queue.integration.spec.ts @@ -18,7 +18,6 @@ import '../../main' import { queueService, securityPricingService } from '../lib/di' jest.mock('plaid') -jest.mock('launchdarkly-node-server-sdk') // For TypeScript support const plaid = jest.mocked(_plaid) diff --git a/apps/workers/src/app/lib/di.ts b/apps/workers/src/app/lib/di.ts index 2f0b5c32..4c4b027b 100644 --- a/apps/workers/src/app/lib/di.ts +++ b/apps/workers/src/app/lib/di.ts @@ -40,13 +40,12 @@ import { EmailProcessor, TransactionService, } from '@maybe-finance/server/features' -import type { IFeatureFlagService, IMarketDataService } from '@maybe-finance/server/shared' +import type { IMarketDataService } from '@maybe-finance/server/shared' import { BullQueueFactory, CacheService, CryptoService, InMemoryQueueFactory, - LaunchDarklyFeatureFlagService, PgService, PolygonMarketDataService, QueueService, @@ -58,7 +57,6 @@ import logger from './logger' import prisma from './prisma' import plaid from './plaid' import finicity from './finicity' -import ldClient from './ldClient' import postmark from './postmark' import { managementClient } from './auth0' import stripe from './stripe' @@ -71,7 +69,6 @@ const redis = new Redis(env.NX_REDIS_URL, { retryStrategy: ServerUtil.redisRetryStrategy({ maxAttempts: 5 }), }) -export const featureFlagService: IFeatureFlagService = new LaunchDarklyFeatureFlagService(ldClient) export const cryptoService = new CryptoService(env.NX_DATABASE_SECRET) export const pgService = new PgService(logger.child({ service: 'PgService' }), env.NX_DATABASE_URL) diff --git a/apps/workers/src/app/lib/ldClient.ts b/apps/workers/src/app/lib/ldClient.ts deleted file mode 100644 index 80d866c4..00000000 --- a/apps/workers/src/app/lib/ldClient.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { init } from 'launchdarkly-node-server-sdk' -import env from '../../env' - -const ldClient = init(env.NX_LD_SDK_KEY, { offline: process.env.NODE_ENV === 'test' }) - -export default ldClient diff --git a/apps/workers/src/app/lib/logger.ts b/apps/workers/src/app/lib/logger.ts index 3cc38f7c..fe9dd594 100644 --- a/apps/workers/src/app/lib/logger.ts +++ b/apps/workers/src/app/lib/logger.ts @@ -1,23 +1,7 @@ import { createLogger } from '@maybe-finance/server/shared' -import ldClient from './ldClient' const logger = createLogger({ level: 'info', }) -function setLevel() { - ldClient - .variation('workers-log-level', { key: 'anonymous-server', anonymous: true }, 'info') - .then((level) => { - logger.level = level - logger[level](`Workers logger using level: ${level}`) - }) -} - -// Don't configure for Jest -if (process.env.NODE_ENV !== 'test') { - ldClient.waitForInitialization().then(setLevel) - ldClient.on('update:workers-log-level', setLevel) -} - export default logger diff --git a/aws/maybe-app/lib/stacks/server-stack.ts b/aws/maybe-app/lib/stacks/server-stack.ts index 8a8a1bc6..61668d67 100644 --- a/aws/maybe-app/lib/stacks/server-stack.ts +++ b/aws/maybe-app/lib/stacks/server-stack.ts @@ -170,15 +170,6 @@ export class ServerStack extends Stack { } ) ), - NX_LD_SDK_KEY: ECSSecret.fromSsmParameter( - StringParameter.fromSecureStringParameterAttributes( - this, - 'LaunchDarklySDKKeyParam', - { - parameterName: '/providers/NX_LD_SDK_KEY', - } - ) - ), NX_POLYGON_API_KEY: ECSSecret.fromSsmParameter( StringParameter.fromSecureStringParameterAttributes( this, diff --git a/aws/maybe-app/lib/stacks/workers-stack.ts b/aws/maybe-app/lib/stacks/workers-stack.ts index 7d467990..f334faf1 100644 --- a/aws/maybe-app/lib/stacks/workers-stack.ts +++ b/aws/maybe-app/lib/stacks/workers-stack.ts @@ -124,15 +124,6 @@ export class WorkersStack extends Stack { } ) ), - NX_LD_SDK_KEY: ECSSecret.fromSsmParameter( - StringParameter.fromSecureStringParameterAttributes( - this, - 'LaunchDarklySDKKeyParam', - { - parameterName: '/providers/NX_LD_SDK_KEY', - } - ) - ), NX_POLYGON_API_KEY: ECSSecret.fromSsmParameter( StringParameter.fromSecureStringParameterAttributes( this, diff --git a/libs/client/shared/src/types/client-side-feature-flags.ts b/libs/client/shared/src/types/client-side-feature-flags.ts index 7d704965..54306d8e 100644 --- a/libs/client/shared/src/types/client-side-feature-flags.ts +++ b/libs/client/shared/src/types/client-side-feature-flags.ts @@ -1,5 +1 @@ export type MetricStatus = 'coming-soon' | 'under-construction' | 'active' - -export type ClientSideFeatureFlag = Partial<{ - maintenance: boolean -}> diff --git a/libs/server/shared/src/services/feature-flag.service.ts b/libs/server/shared/src/services/feature-flag.service.ts deleted file mode 100644 index 1d5b976a..00000000 --- a/libs/server/shared/src/services/feature-flag.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { LDClient, LDUser } from 'launchdarkly-node-server-sdk' - -export interface IFeatureFlagService { - getFlag(flagKey: string, defaultValue: TValue, user?: LDUser): Promise -} - -export class LaunchDarklyFeatureFlagService implements IFeatureFlagService { - constructor(private readonly ldClient: LDClient) {} - - async getFlag( - flagKey: string, - defaultValue: TValue, - user?: LDUser - ): Promise { - if (!this.ldClient) return defaultValue - - await this.ldClient.waitForInitialization() - - return await this.ldClient.variation( - flagKey, - user ?? { key: 'anonymous-server', anonymous: true }, - defaultValue - ) - } -} diff --git a/libs/server/shared/src/services/index.ts b/libs/server/shared/src/services/index.ts index dda9ffa3..dac04911 100644 --- a/libs/server/shared/src/services/index.ts +++ b/libs/server/shared/src/services/index.ts @@ -1,5 +1,4 @@ export * from './crypto.service' -export * from './feature-flag.service' export * from './queue.service' export * from './queue' export * from './cache.service' diff --git a/package.json b/package.json index 6a91e433..d44d3268 100644 --- a/package.json +++ b/package.json @@ -121,8 +121,6 @@ "jwk-to-pem": "^2.0.5", "jwks-rsa": "^3.0.0", "jwt-decode": "^3.1.2", - "launchdarkly-node-server-sdk": "^6.4.3", - "launchdarkly-react-client-sdk": "^2.25.1", "lodash": "^4.17.21", "luxon": "^3.1.0", "mime-types": "^2.1.35",