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",