Files
speckle-server/packages/server/observability/components/express/requestContext.ts
T
Kristaps Fabians Geikins 954b1a9f11 feat: plan prices accurately read from Stripe (#4104)
* WIP prices + new caching utils

* cached workspace plan prices

* GQL API done

* integrated in frontend

* fixed missing FF

* CR fixes

* integration tests

* removed non-existant team yearly env var
2025-03-05 12:23:38 +02:00

53 lines
1.4 KiB
TypeScript

import { REQUEST_ID_HEADER } from '@/observability/components/express/expressLogging'
import { asyncRequestContextEnabled } from '@/modules/shared/helpers/envHelper'
import type express from 'express'
import { AsyncLocalStorage } from 'node:async_hooks'
import type { Logger } from 'pino'
type StorageType = {
requestId: string
dbMetrics: {
totalDuration: number
totalCount: number
}
logger: Logger
}
const storage = asyncRequestContextEnabled()
? new AsyncLocalStorage<StorageType>()
: undefined
export const initiateRequestContextMiddleware: express.RequestHandler = (
req,
_res,
next
) => {
const reqId = req.id || req.headers[REQUEST_ID_HEADER] || 'unknown'
enterNewRequestContext({ reqId: reqId as string, logger: req.log })
next()
}
export const enterNewRequestContext = (params: { reqId: string; logger: Logger }) => {
const { reqId, logger } = params
const store: StorageType = {
requestId: reqId,
dbMetrics: {
totalCount: 0,
totalDuration: 0
},
logger
}
storage?.enterWith(store)
}
export const getRequestContext = () => storage?.getStore()
export const getRequestLogger = () => getRequestContext()?.logger
export const loggerWithMaybeContext = ({ logger }: { logger: Logger }) => {
const reqCtx = getRequestContext()
if (!reqCtx) return logger
return logger.child({
req: { id: reqCtx.requestId }
})
}