Files
speckle-server/packages/server/observability/utils/logLevels.ts
T
Kristaps Fabians Geikins bde148f286 chore(server): migrating fully to ESM (#5042)
* wip

* some extra fixes

* stuff kinda works?

* need to figure out mocks

* need to figure out mocks

* fix db listener

* gqlgen fix

* minor gqlgen watch adjustment

* lint fixes

* delete old codegen file

* converting migrations to ESM

* getModuleDIrectory

* vitest sort of works

* added back ts-vitest

* resolve gql double load

* fixing test timeout configs

* TSC lint fix

* fix automate tests

* moar debugging

* debugging

* more debugging

* codegen update

* server works

* yargs migrated

* chore(server): getting rid of global mocks for Server ESM (#5046)

* got rid of email mock

* got rid of comment mocks

* got rid of multi region mocks

* got rid of stripe mock

* admin override mock updated

* removed final mock

* fixing import.meta.resolve calls

* another import.meta.resolve fix

* added requested test

* nyc ESM fix

* removed unneeded deps + linting

* yarn lock forgot to commit

* tryna fix flakyness

* email capture util fix

* sendEmail fix

* fix TSX check

* sender transporter fix + CR comments

* merge main fix

* test fixx

* circleci fix

* gqlgen bigint fix

* error formatter fix

* more error formatting improvements

* esmloader added to Dockerfile

* more dockerfile fixes

* bg jobs fix
2025-07-14 10:26:19 +03:00

68 lines
2.6 KiB
TypeScript

import { BaseError } from '@/modules/shared/errors'
import {
isGraphQLError,
isUserGraphqlError
} from '@/modules/shared/helpers/graphqlHelper'
import { ApolloError } from '@apollo/client/core'
import { ensureError } from '@speckle/shared'
import type { Logger } from 'pino'
interface LogFn {
(logger: Logger, e: unknown, obj?: unknown, msg?: string, ...args: unknown[]): void
}
/**
* Uses the provided error to determine which log level to use, and adds the error to the logger instance.
* @param logger The logger instance
* @param e The error which will be used to determine the log level. It will be added to the logger instance.
* @param obj The object providing additional context to the log message (see Pino documentation https://github.com/pinojs/pino/blob/main/docs/api.md#logging-method-parameters)
* @param msg The message to log (see Pino documentation https://github.com/pinojs/pino/blob/main/docs/api.md#logging-method-parameters)
* @param args Additional arguments to log (see Pino documentation https://github.com/pinojs/pino/blob/main/docs/api.md#logging-method-parameters)
*/
export const logWithErr: LogFn = (logger, e, obj, msg?, ...args) => {
const err = ensureError(e)
if (shouldLogAsInfoLevel(err)) return logger.child({ err }).info(obj, msg, ...args)
if (shouldLogAsWarnLevel(err)) return logger.child({ err }).warn(obj, msg, ...args)
return logger.child({ err }).error(obj, msg, ...args)
}
export const shouldLogAsInfoLevel = (err: unknown): boolean => {
if (isGraphQLError(err)) {
if (isUserGraphqlError(err)) return true
if (err.message === 'Connection is closed.') return true
if (!!err.cause && shouldLogAsInfoLevel(err.cause)) return true
if (!!err.originalError && shouldLogAsInfoLevel(err.originalError)) return true
}
if (
err instanceof BaseError &&
!!err.info().statusCode &&
typeof err.info().statusCode === 'number' &&
err.info().statusCode < 500
)
return true
return err instanceof ApolloError
}
const shouldLogAsWarnLevel = (err: unknown): boolean => {
if (!isGraphQLError(err)) return false
if (err.message.startsWith('Cannot return null for non-nullable field')) return true
if (
/Variable\s"(\$[^\s]+)"\sof non-null type\s"([^\s]+)"\smust not be null\./.test(
err.message
)
)
return true
if (
/Cannot query field\s"([^\s]+)"\son type\s"([^\s]+)"\. Did you mean\s"([^\s]+)"\?/.test(
err.message
)
)
return true
if (!!err.cause && shouldLogAsWarnLevel(err.cause)) return true
if (!!err.originalError && shouldLogAsWarnLevel(err.originalError)) return true
return false
}