plutin 1.7.10 → 1.7.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/readme.md +36 -8
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/dotenv/package.json","../node_modules/dotenv/lib/main.js","../node_modules/dotenv/lib/env-options.js","../node_modules/dotenv/lib/cli-options.js","../src/core/decorators/dependency-container.ts","../src/core/configs/global-listener.ts","../src/core/errors/api-common-error.ts","../src/core/errors/application-error.ts","../src/core/errors/conflict-error.ts","../src/core/errors/domain-error.ts","../src/core/errors/infra-error.ts","../src/core/errors/validation-error.ts","../src/core/http/base-controller.ts","../src/core/decorators/controller-http-decorator.ts","../src/core/entities/unique-object-id.ts","../src/core/entities/entity-object.ts","../src/core/entities/aggregate-object-root.ts","../src/core/entities/unique-entity-id.ts","../src/core/entities/entity.ts","../src/core/entities/aggregate-root.ts","../src/core/entities/value-object.ts","../src/core/entities/watched-list.ts","../src/core/http/get-take-and-skip.ts","../src/infra/adapters/http/fastify-adapter.ts","../src/infra/adapters/observability/otel/span-manager.ts","../src/infra/adapters/http/validate-controller-metadata.ts","../src/infra/adapters/validators/zod/zod-map-error.ts","../src/infra/adapters/validators/zod/index.ts","../src/infra/adapters/validators/zod/zod-validator.ts","../src/infra/adapters/logger/discord-logger.ts","../src/infra/adapters/observability/node-context/context.ts","../src/infra/adapters/logger/pino-logger.ts","../src/infra/adapters/logger/otel-logger.ts","../src/infra/adapters/logger/logger.ts","../src/infra/adapters/observability/otel/metric.ts","../src/infra/adapters/observability/otel/otel.ts","../src/infra/decorators/base-instrumentation-strategy.ts","../src/infra/decorators/processing-instrumentation.ts","../src/infra/decorators/repository-instrumentation.ts","../src/infra/env/index.ts","../node_modules/dotenv/config.js"],"sourcesContent":["{\n \"name\": \"dotenv\",\n \"version\": \"16.5.0\",\n \"description\": \"Loads environment variables from .env file\",\n \"main\": \"lib/main.js\",\n \"types\": \"lib/main.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/main.d.ts\",\n \"require\": \"./lib/main.js\",\n \"default\": \"./lib/main.js\"\n },\n \"./config\": \"./config.js\",\n \"./config.js\": \"./config.js\",\n \"./lib/env-options\": \"./lib/env-options.js\",\n \"./lib/env-options.js\": \"./lib/env-options.js\",\n \"./lib/cli-options\": \"./lib/cli-options.js\",\n \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n \"lint\": \"standard\",\n \"pretest\": \"npm run lint && npm run dts-check\",\n \"test\": \"tap run --allow-empty-coverage --disable-coverage --timeout=60000\",\n \"test:coverage\": \"tap run --show-full-coverage --timeout=60000 --coverage-report=lcov\",\n \"prerelease\": \"npm test\",\n \"release\": \"standard-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/motdotla/dotenv.git\"\n },\n \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n \"funding\": \"https://dotenvx.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \".env\",\n \"environment\",\n \"variables\",\n \"config\",\n \"settings\"\n ],\n \"readmeFilename\": \"README.md\",\n \"license\": \"BSD-2-Clause\",\n \"devDependencies\": {\n \"@types/node\": \"^18.11.3\",\n \"decache\": \"^4.6.2\",\n \"sinon\": \"^14.0.1\",\n \"standard\": \"^17.0.0\",\n \"standard-version\": \"^9.5.0\",\n \"tap\": \"^19.2.0\",\n \"typescript\": \"^4.8.4\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"browser\": {\n \"fs\": false\n }\n}\n","const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n const vaultPath = _vaultPath(options)\n\n // Parse .env.vault\n const result = DotenvModule.configDotenv({ path: vaultPath })\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _warn (message) {\n console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n const debug = Boolean(options && options.debug)\n if (debug) {\n _debug('Loading env from encrypted .env.vault')\n }\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n const debug = Boolean(options && options.debug)\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsedAll, options)\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n }\n }\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n","// ../config.js accepts options via environment variables\nconst options = {}\n\nif (process.env.DOTENV_CONFIG_ENCODING != null) {\n options.encoding = process.env.DOTENV_CONFIG_ENCODING\n}\n\nif (process.env.DOTENV_CONFIG_PATH != null) {\n options.path = process.env.DOTENV_CONFIG_PATH\n}\n\nif (process.env.DOTENV_CONFIG_DEBUG != null) {\n options.debug = process.env.DOTENV_CONFIG_DEBUG\n}\n\nif (process.env.DOTENV_CONFIG_OVERRIDE != null) {\n options.override = process.env.DOTENV_CONFIG_OVERRIDE\n}\n\nif (process.env.DOTENV_CONFIG_DOTENV_KEY != null) {\n options.DOTENV_KEY = process.env.DOTENV_CONFIG_DOTENV_KEY\n}\n\nmodule.exports = options\n","const re = /^dotenv_config_(encoding|path|debug|override|DOTENV_KEY)=(.+)$/\n\nmodule.exports = function optionMatcher (args) {\n return args.reduce(function (acc, cur) {\n const matches = cur.match(re)\n if (matches) {\n acc[matches[1]] = matches[2]\n }\n return acc\n }, {})\n}\n","import 'reflect-metadata'\n\ntype Class<T = any> = new (...args: any[]) => T\n\ntype Registration =\n | { type: 'class'; myClass: Class; singleton: boolean }\n | { type: 'value'; value: any }\n\nexport class DependencyContainer {\n static registry = new Map<string, Registration>()\n static singletons = new Map<string, any>()\n\n static register<T>(\n token: string,\n myClass: Class<T>,\n options: { singleton: boolean }\n ) {\n this.registry.set(token, {\n type: 'class',\n myClass,\n singleton: options.singleton,\n })\n }\n\n static registerValue<T>(token: string, value: T) {\n this.registry.set(token, { type: 'value', value })\n }\n\n static resolve<T>(target: Class<T>): T {\n const injectMetadata: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', target) || {}\n\n const paramCount = Object.keys(injectMetadata).length\n\n const params = Array.from({ length: paramCount }, (_, index) => {\n const token = injectMetadata[index]\n if (!token) {\n throw new Error(\n `Missing @Inject token for parameter index ${index} in ${target.name}`\n )\n }\n return this.resolveToken(token)\n })\n\n return new target(...params)\n }\n\n static resolveToken(token: string): any {\n const registration = this.registry.get(token)\n\n if (!registration) {\n throw new Error(\n `\"${token}\" not registered. Please register it in the container.`\n )\n }\n\n if (registration.type === 'value') {\n return registration.value\n }\n\n const { myClass, singleton } = registration\n\n if (singleton) {\n if (!this.singletons.has(token)) {\n const instance = this.resolve(myClass)\n this.singletons.set(token, instance)\n }\n return this.singletons.get(token)\n }\n\n return this.resolve(myClass)\n }\n}\n\nexport function Inject(token: string): ParameterDecorator {\n return (\n target: object,\n _propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void => {\n const constructor =\n typeof target === 'function' ? target : target.constructor\n\n const existingInjectedParams: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', constructor) || {}\n\n existingInjectedParams[parameterIndex] = token\n\n Reflect.defineMetadata('inject:params', existingInjectedParams, constructor)\n }\n}\n","import type { ILogger } from 'infra/adapters/logger/logger'\n\nimport { DependencyContainer } from '../../core/decorators/dependency-container'\n\nexport class GlobalListener {\n protected readonly logger: ILogger\n\n constructor(private readonly callback: () => Promise<void>) {\n this.logger = DependencyContainer.resolveToken('ILogger')\n }\n\n register() {\n process.on('uncaughtException', (err) => {\n this.logger.fatal({\n msg: 'Uncaught exception',\n data: {\n env: process.env.ENVIRONMENT,\n },\n error: new Error(err.message),\n })\n\n process.exit(1)\n })\n\n process.on('unhandledRejection', (reason) => {\n if (reason instanceof Error) {\n this.logger.fatal({\n msg: 'Unhandled rejection',\n data: {\n env: process.env.ENVIRONMENT,\n },\n error: reason,\n })\n } else {\n this.logger.fatal({\n msg: 'Unhandled rejection',\n data: {\n env: process.env.ENVIRONMENT,\n },\n error: new Error(String(reason)),\n })\n }\n\n process.exit(1)\n })\n\n process.on('SIGTERM', async () => {\n await this.callback()\n process.exit(0)\n })\n\n process.on('SIGINT', async () => {\n await this.callback()\n process.exit(0)\n })\n }\n}\n","export type PropertiesError = {\n receivedValue?: any\n type: string\n message: string\n property: string | number | undefined\n propertyType?: string\n path?: string\n}\n\nexport type CommonError = {\n location: string\n propertyErrors?: PropertiesError[]\n}\n\nexport type ApiCommonError = {\n code: number\n occurredAt: Date\n message: string\n errorCode: string\n errors?: CommonError[]\n}\n\nexport enum ApiErrorEnum {\n DOMAIN = 'ERR001',\n APPLICATION = 'ERR002',\n INFRA = 'ERR003',\n HTTP_CLIENT = 'ERR004',\n VALIDATOR = 'ERR005',\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class ApplicationError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.APPLICATION,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\ntype ConflictProps = { id: string; [key: string]: unknown }\n\nexport default class ConflictError<T extends ConflictProps> extends Error {\n props: ApiCommonError\n conflictProps: T | T[]\n\n constructor(conflictProps: T | T[]) {\n super('Resource already exists.')\n this.conflictProps = conflictProps\n this.props = {\n code: 409,\n errorCode: ApiErrorEnum.APPLICATION,\n message: this.message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class DomainError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.DOMAIN,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class InfraError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.INFRA,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import {\n type ApiCommonError,\n ApiErrorEnum,\n type CommonError,\n} from './api-common-error'\n\nexport default class ValidationError extends Error {\n props: ApiCommonError\n\n constructor(errors: CommonError[]) {\n super('Validation Error')\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.VALIDATOR,\n message: 'Validation Error',\n occurredAt: new Date(),\n errors,\n }\n }\n}\n","import type { ILogger } from 'infra/adapters/logger/logger'\n\nimport { DependencyContainer } from '../../core/decorators/dependency-container'\nimport ApplicationError from '../../core/errors/application-error'\nimport ConflictError from '../../core/errors/conflict-error'\nimport DomainError from '../../core/errors/domain-error'\nimport InfraError from '../../core/errors/infra-error'\nimport ValidationError from '../../core/errors/validation-error'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\n\nimport 'reflect-metadata'\n\ntype AnyObject = Record<string, any>\n\nexport type Request = {\n body: AnyObject\n params: AnyObject\n headers: AnyObject\n query: AnyObject\n}\n\nexport type Response = {\n code: number\n data: any\n}\n\nexport type ContextError = {\n env: string\n user?: {\n id?: string\n name?: string\n email?: string\n }\n request?: {\n method?: string\n requestId?: string\n url?: string\n headers?: any\n query?: any\n body?: any\n params?: any\n }\n}\n\nexport abstract class BaseController {\n protected readonly logger: ILogger\n\n abstract handle<T>(request: T | Request): Promise<Response>\n\n constructor() {\n this.logger = DependencyContainer.resolveToken('ILogger')\n }\n\n protected success<T>(dto?: T): Response {\n return {\n code: 200,\n data: { data: dto },\n }\n }\n\n protected noContent(): Response {\n return {\n code: 204,\n data: undefined,\n }\n }\n\n protected created<T>(dto?: T): Response {\n return {\n code: 201,\n data: dto ? { data: dto } : undefined,\n }\n }\n\n protected paginated<T>(dto?: T): Response {\n return {\n code: 200,\n data: dto,\n }\n }\n\n protected buildContextError(request: Request): ContextError {\n return {\n env: process.env.ENVIRONMENT as string,\n request: {\n body: request.body,\n headers: request.headers,\n params: request.params,\n query: request.query,\n },\n }\n }\n\n public async failure(error: Error, context: ContextError): Promise<Response> {\n if (error instanceof ConflictError) {\n return {\n code: error.props.code,\n data: {\n message: error.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n items: Array.isArray(error.conflictProps)\n ? error.conflictProps\n : [error.conflictProps],\n },\n }\n }\n\n if (\n error instanceof DomainError ||\n error instanceof ApplicationError ||\n error instanceof InfraError\n ) {\n return {\n code: error.props.code,\n data: {\n message: error.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n },\n }\n }\n\n if (error instanceof ValidationError) {\n return {\n code: error.props.code,\n data: {\n message: error.props.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n errors: error.props.errors,\n },\n }\n }\n\n this.logger.fatal({\n msg: 'Server failed. Contact the administrator!',\n data: context,\n error,\n })\n\n return {\n code: 500,\n data: {\n code: 500,\n message: 'Server failed. Contact the administrator!',\n },\n }\n }\n\n public async execute(request: Request): Promise<Response> {\n const routeMetadata = Reflect.getMetadata('route', this.constructor)\n\n if (!routeMetadata) {\n throw new InfraError('Route metadata not found.')\n }\n\n const middlewares: MiddlewareFunction[] = routeMetadata.middlewares || []\n\n let processedRequest = request\n\n if (middlewares.length) {\n for (const middleware of middlewares) {\n processedRequest = await middleware(processedRequest)\n }\n }\n\n return await this.handle(processedRequest)\n }\n}\n","import { BaseController } from '../../core/http/base-controller'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\nimport type { MethodType } from '../http/http'\n\ntype Props = {\n method: MethodType\n path: string\n middlewares?: MiddlewareFunction[]\n}\n\nexport function Controller({\n method,\n path,\n middlewares = [],\n}: Props): ClassDecorator {\n return (target: any) => {\n if (!(target.prototype instanceof BaseController)) {\n throw new Error(\n `The class ${target.name} should extends abstract class BaseController`\n )\n }\n\n Reflect.defineMetadata(\n 'route',\n { method, path: `/api/${path}`, middlewares },\n target\n )\n }\n}\n","import { ObjectId } from 'bson'\n\nexport class UniqueObjectId {\n private value: ObjectId\n\n constructor(value?: string) {\n this.value = new ObjectId(value)\n }\n\n toString() {\n return this.value.toString()\n }\n\n toValue() {\n return this.value.toString()\n }\n\n public equals(id: UniqueObjectId) {\n return id.toValue() === this.toValue()\n }\n}\n","import type { CommonDTO } from './common-dto'\nimport { UniqueObjectId } from './unique-object-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class EntityObject<Props> {\n private _id: UniqueObjectId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: UniqueObjectId) {\n this._id = id\n }\n\n get createdAt() {\n return this.props.createdAt\n }\n\n set createdAt(date: Date) {\n this.props.createdAt = date\n }\n\n get updatedAt(): Date | undefined | null {\n return this.props.updatedAt\n }\n\n public touch() {\n this.props.updatedAt = new Date()\n }\n\n protected constructor(props: PropsWithCommonDTO<Props>, id?: UniqueObjectId) {\n this._id = id ?? new UniqueObjectId(id)\n this.props = props\n }\n\n public equals(entity: EntityObject<Props>) {\n if (entity === this) {\n return true\n }\n\n if (entity.id === this._id) {\n return true\n }\n\n return false\n }\n}\n","import { EntityObject } from './entity-object'\n\nexport abstract class AggregateObjectRoot<Props> extends EntityObject<Props> {}\n","import { randomUUID } from 'node:crypto'\n\nexport class UniqueEntityId {\n private value: string\n\n constructor(value?: string) {\n this.value = value ?? randomUUID()\n }\n\n toString() {\n return this.value\n }\n\n toValue() {\n return this.value\n }\n\n public equals(id: UniqueEntityId) {\n return id.toValue() === this.toValue()\n }\n}\n","import { CommonDTO } from './common-dto'\nimport { UniqueEntityId } from './unique-entity-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class Entity<Props> {\n private _id: UniqueEntityId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: UniqueEntityId) {\n this._id = id\n }\n\n get createdAt() {\n return this.props.createdAt\n }\n\n set createdAt(date: Date) {\n this.props.createdAt = date\n }\n\n get updatedAt(): Date | undefined | null {\n return this.props.updatedAt\n }\n\n public touch() {\n this.props.updatedAt = new Date()\n }\n\n protected constructor(props: PropsWithCommonDTO<Props>, id?: UniqueEntityId) {\n this._id = id ?? new UniqueEntityId(id)\n this.props = props\n }\n\n public equals(entity: Entity<any>) {\n if (entity === this) {\n return true\n }\n\n if (entity.id === this._id) {\n return true\n }\n\n return false\n }\n}\n","import { Entity } from './entity'\n\nexport abstract class AggregateRoot<Props> extends Entity<Props> {}\n","export abstract class ValueObject<Props> {\n protected props: Props\n\n protected constructor(props: Props) {\n this.props = props\n }\n}\n","export abstract class WatchedList<T> {\n public currentItems: T[]\n private initial: T[]\n private new: T[]\n private removed: T[]\n private updated: T[]\n\n constructor(initialItems?: T[]) {\n this.currentItems = initialItems || []\n this.initial = initialItems || []\n this.new = []\n this.removed = []\n this.updated = []\n }\n\n abstract compareItems(a: T, b: T): boolean\n\n public getItems(): T[] {\n return this.currentItems\n }\n\n public getNewItems(): T[] {\n return this.new\n }\n\n public getRemovedItems(): T[] {\n return this.removed\n }\n\n public getUpdatedItems(): T[] {\n return this.updated\n }\n\n public addUpdatedItem(item: T) {\n return this.updated.push(item)\n }\n\n private isCurrentItem(item: T): boolean {\n return (\n this.currentItems.filter((v: T) => this.compareItems(item, v)).length !==\n 0\n )\n }\n\n private isNewItem(item: T): boolean {\n return this.new.filter((v: T) => this.compareItems(item, v)).length !== 0\n }\n\n private isRemovedItem(item: T): boolean {\n return (\n this.removed.filter((v: T) => this.compareItems(item, v)).length !== 0\n )\n }\n\n private removeFromNew(item: T): void {\n this.new = this.new.filter((v) => !this.compareItems(v, item))\n }\n\n private removeFromCurrent(item: T): void {\n this.currentItems = this.currentItems.filter(\n (v) => !this.compareItems(item, v)\n )\n }\n\n private removeFromRemoved(item: T): void {\n this.removed = this.removed.filter((v) => !this.compareItems(item, v))\n }\n\n private wasAddedInitially(item: T): boolean {\n return (\n this.initial.filter((v: T) => this.compareItems(item, v)).length !== 0\n )\n }\n\n public exists(item: T): boolean {\n return this.isCurrentItem(item)\n }\n\n public add(item: T): void {\n if (this.isRemovedItem(item)) {\n this.removeFromRemoved(item)\n }\n\n if (!this.isNewItem(item) && !this.wasAddedInitially(item)) {\n this.new.push(item)\n }\n\n if (!this.isCurrentItem(item)) {\n this.currentItems.push(item)\n }\n }\n\n public remove(item: T): void {\n this.removeFromCurrent(item)\n\n if (this.isNewItem(item)) {\n this.removeFromNew(item)\n\n return\n }\n\n if (!this.isRemovedItem(item)) {\n this.removed.push(item)\n }\n }\n\n public update(items: T[]): void {\n const newItems = items.filter((a) => {\n return !this.getItems().some((b) => this.compareItems(a, b))\n })\n\n const removedItems = this.getItems().filter((a) => {\n return !items.some((b) => this.compareItems(a, b))\n })\n\n const updatedItems = items.filter(\n (item) =>\n !newItems.some(\n (a) =>\n this.compareItems(item, a) &&\n !removedItems.some((b) => this.compareItems(item, b))\n )\n )\n\n this.currentItems = items\n this.new = newItems\n this.removed = removedItems\n this.updated = updatedItems\n }\n}\n","export function getTakeAndSkip(size: string, page: string) {\n const take = size ? Number(size) : 20\n const skip = page ? Number(page) : 1\n\n return { take, skip }\n}\n","import cors from '@fastify/cors'\nimport { Inject } from 'core/decorators/dependency-container'\nimport type { BaseController } from 'core/http/base-controller'\nimport type { IHttp } from 'core/http/http'\nimport fastify, { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'\nimport { randomUUID } from 'node:crypto'\nimport qs from 'qs'\n\nimport type { ILogger } from '../logger/logger'\nimport type { IMetricsManager } from '../observability/otel/metric'\nimport { SpanManager } from '../observability/otel/span-manager'\n\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\ntype AnyObject = Record<string, any>\n\ntype Request = {\n body: AnyObject\n params: AnyObject\n headers: AnyObject\n query: AnyObject\n}\n\nexport class FastifyAdapter implements IHttp {\n readonly instance: FastifyInstance\n\n constructor(\n @Inject('Logger') private logger: ILogger,\n @Inject('Metrics') private metrics?: IMetricsManager\n ) {\n this.instance = fastify({\n bodyLimit: 10 * 1024 * 1024,\n querystringParser: (str) => qs.parse(str),\n requestIdHeader: 'x-request-id',\n requestIdLogLabel: 'request-id',\n genReqId: (req) =>\n (req.headers['x-request-id'] as string) || randomUUID(),\n })\n\n this.instance.register(cors)\n\n this.instance.addHook('onRequest', async (request) => {\n const span = SpanManager.getActiveSpan()\n\n span.setAttributes({\n httpMethod: request.method,\n httpUrl: request.url,\n httpRoute: request.routeOptions.url || request.url,\n httpHost: request.hostname,\n httpScheme: request.protocol,\n httpUserAgent: request.headers['user-agent'] || 'unknown',\n httpRequestId: request.id,\n httpClientIp: request.ip,\n })\n\n this.logger.info({\n msg: 'http-in',\n data: {\n requestId: request.id,\n httpUrl: request.url,\n httpMethod: request.method,\n httpHeaders: request?.headers,\n httpParams: request?.params,\n httpQuery: request?.query,\n },\n })\n })\n\n this.instance.addHook('onResponse', async (request, reply) => {\n const route = this.getNormalizedRoute(request)\n const span = SpanManager.getActiveSpan()\n const responseTime = reply.elapsedTime || 0\n\n span.setAttributes({\n httpStatusCode: reply.statusCode,\n })\n\n this.logger.info({\n msg: 'http-out',\n data: {\n requestId: request.id,\n httpRoute: route,\n httpMethod: request.method,\n responseTimeMs: Math.round(responseTime),\n statusCode: reply.statusCode,\n },\n })\n\n if (this.metrics) {\n const responseSizeBytes = reply.getHeader('content-length')\n ? parseInt(reply.getHeader('content-length') as string, 10)\n : undefined\n\n this.metrics.recordHttpRequest({\n method: request.method,\n route,\n statusCode: reply.statusCode,\n durationSeconds: responseTime / 1000,\n responseSizeBytes,\n })\n\n if (responseSizeBytes) {\n this.metrics.recordHttpRequestBytes(responseSizeBytes, {\n method: request.method,\n route,\n statusCode: reply.statusCode,\n })\n }\n }\n })\n }\n\n registerRoute(controllerClass: BaseController): void {\n const { metadata } = validateControllerMetadata(controllerClass)\n\n this.instance[metadata.method](\n metadata.path,\n async (request: FastifyRequest, reply: FastifyReply) => {\n const requestData = {\n body: request.body,\n params: request.params,\n headers: request.headers,\n query: request.query,\n } as Request\n\n const activeSpan = SpanManager.getActiveSpan()\n\n try {\n activeSpan.setAttributes({\n controllerName: controllerClass.constructor.name,\n controllerMethod: metadata.method,\n controllerPath: metadata.path,\n })\n\n const output = await controllerClass.execute(requestData)\n\n activeSpan.setStatus({ code: 1 })\n activeSpan.setAttribute('httpStatusCode', output.code || 200)\n activeSpan.setAttribute(\n 'responseCode',\n output.data?.code || 'no-code'\n )\n\n return reply.status(output.code || 200).send(\n output.data || {\n code: 'B001',\n }\n )\n } catch (err: any) {\n activeSpan.setStatus({\n code: 2,\n message: err.message,\n })\n\n activeSpan.recordException(err)\n\n activeSpan.setAttributes({\n error: true,\n errorType: err.name,\n errorMessage: err.message,\n })\n\n const error = await controllerClass.failure(err, {\n env: process.env.ENVIRONMENT as string,\n request: {\n body: requestData.body,\n headers: requestData.headers,\n params: request.params,\n query: requestData.query,\n url: metadata.path,\n method: metadata.method,\n },\n })\n\n activeSpan.setAttribute('httpStatusCode', error.code || 500)\n activeSpan.setAttribute('responseCode', error.data?.code || 'B002')\n\n return reply.status(error.code || 500).send(\n error.data || {\n code: 'B002',\n }\n )\n }\n }\n )\n }\n\n async startServer(port: number): Promise<void> {\n await this.instance.listen({ port })\n this.logger.info({\n msg: `Server listening on port ${port}`,\n })\n }\n\n async closeServer() {\n this.logger.info({\n msg: 'Server closing...',\n })\n await this.instance.close()\n }\n\n private getNormalizedRoute(request: FastifyRequest): string {\n return (\n (request as any).routerPath ||\n request.routeOptions?.url ||\n request.url.split('?')[0]\n )\n }\n}\n","import { Span, trace } from '@opentelemetry/api'\n\nconst OTEL_ENABLED = process.env.OTEL_ENABLE === 'true'\n\nclass NullSpan {\n setAttributes(): void {\n return\n }\n\n setAttribute(): void {\n return\n }\n\n setStatus(): void {\n return\n }\n\n recordException(): void {\n return\n }\n}\n\nclass SpanManager {\n static getActiveSpan(): Span | NullSpan {\n if (!OTEL_ENABLED) {\n return new NullSpan()\n }\n\n const span = trace.getActiveSpan()\n return span || new NullSpan()\n }\n\n static isEnabled(): boolean {\n return OTEL_ENABLED\n }\n}\n\nexport { NullSpan, SpanManager }\n","import { BaseController } from '../../../core/http/base-controller'\nimport type { MethodType } from '../../../core/http/http'\n\nimport 'reflect-metadata'\n\nexport function validateControllerMetadata(controller: BaseController) {\n const metadata = Reflect.getMetadata('route', controller.constructor) as {\n method: MethodType\n path: string\n }\n\n if (!metadata) {\n throw new Error(\n `Controller ${controller.constructor.name} not have metadata. Need to add decorator.`\n )\n }\n\n return {\n metadata,\n }\n}\n","import type { ZodIssue } from 'zod'\n\nimport type {\n CommonError,\n PropertiesError,\n} from '../../../../core/errors/api-common-error'\n\ntype ZodError = ZodIssue & {\n expected: string\n received: string\n}\n\ntype ZodInvalidUnion = ZodError & {\n code: 'invalid_union'\n}\n\nexport default class ZodMapError {\n private static mapCommon(error: ZodError): PropertiesError {\n return {\n type: error.code,\n path: error.path.join('.'),\n property: error.path.pop(),\n propertyType: error.expected,\n receivedValue: error.received,\n message: error.message,\n }\n }\n\n private static mapInvalidUnion(error: ZodInvalidUnion): PropertiesError[] {\n const [errors] = error.unionErrors\n .flat()\n .map((err) => err.issues.map((item: any) => this.mapCommon(item)))\n\n return errors\n }\n\n private static mapInvalidType(error: ZodError): PropertiesError[] {\n return [this.mapCommon(error)]\n }\n\n private static mapErrorsFactory(error: ZodError): PropertiesError[] {\n if (error.code === 'invalid_union') {\n return this.mapInvalidUnion(error)\n }\n\n return this.mapInvalidType(error)\n }\n\n static mapErrors(errors: ZodIssue[][]) {\n const standardizedErrors = new Map<string | number, CommonError>()\n\n errors.flat().forEach((error) => {\n const keyError = standardizedErrors.get(error.path[0])\n\n if (keyError) {\n if (!keyError.propertyErrors) {\n keyError.propertyErrors = []\n }\n\n keyError.propertyErrors.push(\n ...this.mapErrorsFactory(error as ZodError)\n )\n\n return\n }\n\n standardizedErrors.set(error.path[0], {\n location: error.path[0],\n propertyErrors: Array.from([\n ...this.mapErrorsFactory(error as ZodError),\n ]),\n } as CommonError)\n })\n\n return Array.from(standardizedErrors, ([, arr]) => ({\n ...arr,\n })).flat()\n }\n}\n","import { ZodEffects, type ZodError, ZodObject } from 'zod'\n\nimport ValidationError from '../../../../core/errors/validation-error'\nimport IValidationHTTP, { RequestHttp } from '../../../../core/http/validator'\n\nimport ZodMapError from './zod-map-error'\nimport { zodValidator } from './zod-validator'\n\ntype SchemaDefinition = {\n headers: ZodObject<Record<string, any>>\n params: ZodObject<Record<string, any>>\n query: ZodObject<Record<string, any>>\n body:\n | ZodObject<Record<string, any>>\n | ZodEffects<ZodObject<Record<string, any>>>\n}\n\ntype ZodSchemaObject = ZodObject<SchemaDefinition>\n\nexport default class ZodValidator implements IValidationHTTP {\n constructor(private zodSchema: ZodSchemaObject) {}\n\n async validate<T>(requestHttp: RequestHttp): Promise<T> {\n const errors = []\n\n const {\n data: headersData = {},\n error: headersErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.headers\n ? await this.zodSchema.shape.headers.safeParseAsync(requestHttp.headers, {\n path: ['headers'],\n })\n : {}\n\n if (headersErrors?.errors) {\n errors.push(headersErrors?.errors)\n }\n\n const {\n data: paramsData = {},\n error: paramsErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.params\n ? await this.zodSchema.shape.params.safeParseAsync(requestHttp.params, {\n path: ['params'],\n })\n : {}\n\n if (paramsErrors?.errors) {\n errors.push(paramsErrors?.errors)\n }\n\n const {\n data: queryData = {},\n error: queryErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.query\n ? await this.zodSchema.shape.query.safeParseAsync(requestHttp.query, {\n path: ['query'],\n })\n : {}\n\n if (queryErrors?.errors) {\n errors.push(queryErrors?.errors)\n }\n\n const {\n data: bodyData = {},\n error: bodyErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.body\n ? await this.zodSchema.shape.body.safeParseAsync(requestHttp.body, {\n path: ['body'],\n })\n : {}\n\n if (bodyErrors?.errors) {\n errors.push(bodyErrors?.errors)\n }\n\n if (errors.length) {\n throw new ValidationError(ZodMapError.mapErrors(errors))\n }\n\n return {\n body: bodyData,\n headers: headersData,\n params: paramsData,\n query: queryData,\n } as T\n }\n}\n\nexport { zodValidator }\n","import { z } from 'zod'\n\nimport { Request } from '../../../../core/http/base-controller'\n\nimport ZodValidator from './index'\n\nexport type ZodSchema = z.ZodObject<{\n headers: z.ZodObject<Record<string, any>>\n params: z.ZodObject<Record<string, any>>\n query: z.ZodObject<Record<string, any>>\n body:\n | z.ZodObject<Record<string, any>>\n | z.ZodEffects<z.ZodObject<Record<string, any>>>\n}>\n\nexport type MiddlewareFunction = (request: Request) => Promise<Request>\n\nexport function zodValidator(schema: ZodSchema): MiddlewareFunction {\n return async (request: Request): Promise<Request> => {\n const validator = new ZodValidator(schema)\n const validatedRequest = await validator.validate<Request>(request)\n return validatedRequest\n }\n}\n","import { MessageBuilder, Webhook } from 'discord-webhook-node'\n\nimport { Inject } from '../../../core/decorators/dependency-container'\nimport { getContext } from '../observability/node-context/context'\n\nimport type { ILogger, LogParams } from './logger'\nimport { PinoLogger } from './pino-logger'\n\ntype DiscordOptions = {\n url: string\n env: string\n}\n\nexport class DiscordLogger implements ILogger {\n private webhook: Webhook\n private pinoLogger: PinoLogger\n\n constructor(\n @Inject('DiscordConfig') private readonly options: DiscordOptions\n ) {\n this.webhook = new Webhook(this.options.url)\n this.pinoLogger = new PinoLogger()\n }\n\n private async buildStructuredLog(\n embed: MessageBuilder,\n { msg, data, error }: LogParams\n ) {\n const traceId = getContext().traceId\n\n embed\n .addField('timestamp:', `\\`\\`\\`${new Date().toISOString()}\\`\\`\\``)\n .addField('traceId:', `\\`\\`\\`${traceId}\\`\\`\\``)\n .addField('Message:', `\\`\\`\\`${msg}\\`\\`\\``)\n .addField('Data:', '```json\\n' + JSON.stringify(data, null, 2) + '\\n```')\n\n if (error) {\n const structed = {\n type: error.name,\n message: error.message,\n code: (error as any).code,\n stack: error.stack,\n }\n\n embed.addField(\n 'error:',\n '```json\\n' + JSON.stringify(structed, null, 2) + '\\n```'\n )\n }\n\n await this.webhook.send(embed)\n }\n\n info(params: LogParams): void {\n this.pinoLogger.info(params)\n\n const embed = new MessageBuilder()\n .setTitle(`ℹ️ Info - ${process.env.ENVIRONMENT}`)\n .setColor(0x3498db)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n\n error(params: LogParams): void {\n this.pinoLogger.error(params)\n\n const embed = new MessageBuilder()\n .setTitle(`⛔ Error - ${process.env.ENVIRONMENT}`)\n .setColor(0xe74c3c)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n\n debug(params: LogParams): void {\n this.pinoLogger.debug(params)\n\n const embed = new MessageBuilder()\n .setTitle(`🐛 Degub - ${process.env.ENVIRONMENT}`)\n .setColor(0x9b59b6)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n\n fatal(params: LogParams): void {\n this.pinoLogger.fatal(params)\n\n const embed = new MessageBuilder()\n .setTitle(`💀 Fatal - ${process.env.ENVIRONMENT}`)\n .setColor(0xc0392b)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n\n warn(params: LogParams): void {\n this.pinoLogger.warn(params)\n\n const embed = new MessageBuilder()\n .setTitle(`⚠️ Warn - ${process.env.ENVIRONMENT}`)\n .setColor(0xf1c40f)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nexport const context = new AsyncLocalStorage()\n\ntype Context = {\n traceId: string\n}\n\nexport function getContext(): Context {\n return (context.getStore() as Context) || { traceId: 'no-trace' }\n}\n","import pino from 'pino'\n\nimport type { ILogger, LogParams } from './logger'\n\nexport class PinoLogger implements ILogger {\n private pinoLogger: pino.Logger\n\n constructor() {\n const pinoConfig: pino.LoggerOptions = {\n level: 'debug',\n formatters: {\n level: (label) => {\n return { level: label.toUpperCase() }\n },\n },\n timestamp: pino.stdTimeFunctions.isoTime,\n }\n\n if (process.env.ENVIRONMENT === 'development') {\n this.pinoLogger = pino(\n pinoConfig,\n pino.transport({ target: 'pino-pretty', options: { sync: false } })\n )\n } else {\n this.pinoLogger = pino(pinoConfig, pino.destination({ sync: false }))\n }\n }\n\n private formatLogParams(params: LogParams): Record<string, any> {\n const logData: Record<string, any> = {\n msg: params.msg,\n }\n\n if (params.data) {\n logData.data = params.data\n }\n\n if (params.error) {\n const error = params.error as Error\n\n logData.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: (error as any).code,\n }\n }\n\n return logData\n }\n\n info(params: LogParams): void {\n this.pinoLogger.info(this.formatLogParams(params))\n }\n\n error(params: LogParams): void {\n this.pinoLogger.error(this.formatLogParams(params))\n }\n\n debug(params: LogParams): void {\n this.pinoLogger.debug(this.formatLogParams(params))\n }\n\n fatal(params: LogParams): void {\n this.pinoLogger.fatal(this.formatLogParams(params))\n }\n\n warn(params: LogParams): void {\n this.pinoLogger.warn(this.formatLogParams(params))\n }\n}\n","import { logs, SeverityNumber } from '@opentelemetry/api-logs'\n\nimport type { ILogger, LogParams } from './logger'\nimport { PinoLogger } from './pino-logger'\n\nexport class OtelLogger implements ILogger {\n private otelLogger: ReturnType<typeof logs.getLogger>\n private pinoLogger: PinoLogger\n\n constructor() {\n this.otelLogger = logs.getLogger(\n process.env.OTEL_SERVICE_NAME || 'plutin-boilerplate-common',\n process.env.OTEL_SERVICE_VERSION || '1.0.0'\n )\n this.pinoLogger = new PinoLogger()\n }\n\n private emitOtelLog(\n severityNumber: SeverityNumber,\n severityText: string,\n params: LogParams\n ) {\n const { msg, data, error } = params\n\n const attributes: Record<string, any> = {}\n\n if (data) {\n attributes['data'] = { ...data }\n }\n\n if (error) {\n attributes['error'] = {\n errorType: error.name,\n errorMessage: error.message,\n errorStack: error.stack,\n errorCode: (error as any).code,\n }\n }\n\n this.otelLogger.emit({\n severityNumber,\n severityText,\n body: msg,\n timestamp: new Date(),\n attributes,\n })\n }\n\n info(params: LogParams): void {\n this.pinoLogger.info(params)\n this.emitOtelLog(SeverityNumber.INFO, 'INFO', params)\n }\n\n error(params: LogParams): void {\n this.pinoLogger.error(params)\n this.emitOtelLog(SeverityNumber.ERROR, 'ERROR', params)\n }\n\n debug(params: LogParams): void {\n this.pinoLogger.debug(params)\n this.emitOtelLog(SeverityNumber.DEBUG, 'DEBUG', params)\n }\n\n fatal(params: LogParams): void {\n this.pinoLogger.fatal(params)\n this.emitOtelLog(SeverityNumber.FATAL, 'FATAL', params)\n }\n\n warn(params: LogParams): void {\n this.pinoLogger.warn(params)\n this.emitOtelLog(SeverityNumber.WARN, 'WARN', params)\n }\n}\n","import type { baseEnvSchema } from 'infra/env'\nimport type { z } from 'zod'\n\nimport { DiscordLogger } from './discord-logger'\nimport { OtelLogger } from './otel-logger'\nimport { PinoLogger } from './pino-logger'\n\nexport type LogParams = {\n msg: string\n data?: {\n correlationId?: string\n [key: string]: any\n }\n error?: Error\n}\n\nexport interface ILogger {\n info(data: LogParams): void\n error(data: LogParams): void\n debug(data: LogParams): void\n fatal(data: LogParams): void\n warn(data: LogParams): void\n}\n\ntype OptionsNotifications = 'console' | 'discord' | 'otel'\n\ntype Props = {\n development?: OptionsNotifications\n staging?: OptionsNotifications\n production?: OptionsNotifications\n}\n\nexport class Logger {\n static define(env: z.infer<typeof baseEnvSchema>, definitions?: Props): any {\n const definition = {\n test: 'console',\n development: this.defineProvider(\n env,\n definitions?.development || 'console'\n ),\n staging: this.defineProvider(env, definitions?.staging || 'discord'),\n production: this.defineProvider(env, definitions?.production || 'otel'),\n }\n\n return definition[env.ENVIRONMENT]\n }\n\n private static defineProvider(\n env: z.infer<typeof baseEnvSchema>,\n provider: OptionsNotifications\n ) {\n switch (provider) {\n case 'console':\n return PinoLogger\n case 'discord':\n return DiscordLogger\n case 'otel':\n return env.OTEL_ENABLE === false ? DiscordLogger : OtelLogger\n default:\n return PinoLogger\n }\n }\n}\n","import { metrics } from '@opentelemetry/api'\nimport { cpus } from 'node:os'\nimport { monitorEventLoopDelay, PerformanceObserver } from 'node:perf_hooks'\nimport v8 from 'node:v8'\n\nconst OTEL_ENABLED = process.env.OTEL_ENABLE === 'true'\n\nexport interface IMetricsManager {\n recordHttpRequest(params: {\n method: string\n route: string\n statusCode: number\n durationSeconds: number\n responseSizeBytes?: number\n }): void\n\n recordDbQueryError(params: {\n operation: string\n repository: string\n errorMessage: string\n }): void\n\n recordDbQuery(params: {\n operation: string\n repository: string\n durationSeconds: number\n }): void\n\n recordDbTransaction(params: {\n operation: string\n repository: string\n durationSeconds: number\n }): void\n\n recordDbDeadlock(params: {\n operation: string\n repository: string\n errorMessage: string\n }): void\n\n recordHttpRequestBytes(\n bytes: number,\n attributes: {\n method: string\n route: string\n statusCode: number\n }\n ): void\n\n recordProcessingDuration(params: {\n operation: string\n durationSeconds: number\n }): void\n\n recordProcessingError(params: { operation: string; errorType: string }): void\n\n recordHttpClientRequest(params: {\n method: string\n url: string\n statusCode?: number\n durationSeconds: number\n error?: boolean\n timeout?: boolean\n }): void\n\n recordValidationError(params: { field?: string; errorType: string }): void\n\n startSystemMetricsCollection(intervalMs?: number): void\n\n stopSystemMetricsCollection(): void\n}\n\nexport class MetricsManager implements IMetricsManager {\n private meter = OTEL_ENABLED\n ? metrics.getMeter(\n process.env.OTEL_SERVICE_NAME || 'plutin-boilerplate-common',\n process.env.OTEL_SERVICE_VERSION || '1.0.0'\n )\n : null\n\n private httpRequestsTotal = this.meter?.createCounter('http_requests_total', {\n description: 'Total de requisições HTTP',\n unit: '1',\n })\n\n private httpRequestDuration = this.meter?.createHistogram(\n 'http_request_duration_seconds',\n {\n description: 'Duração das requisições HTTP em segundos',\n unit: 's',\n }\n )\n\n private httpRequestsErrors = this.meter?.createCounter(\n 'http_requests_errors_total',\n {\n description: 'Total de erros HTTP (4xx, 5xx)',\n unit: '1',\n }\n )\n\n private httpResponseSize = this.meter?.createHistogram(\n 'http_response_size_bytes',\n {\n description: 'Tamanho das respostas HTTP em bytes',\n unit: 'By',\n }\n )\n\n private dbQueryDuration = this.meter?.createHistogram(\n 'db_query_duration_seconds',\n {\n description: 'Duração das queries no banco de dados',\n unit: 's',\n }\n )\n\n private dbQueryErrors = this.meter?.createCounter('db_query_errors_total', {\n description: 'Total de erros em queries do banco de dados',\n unit: '1',\n })\n\n private dbTransactionsTotal = this.meter?.createCounter(\n 'db_transactions_total',\n {\n description: 'Total de transações no banco de dados',\n unit: '1',\n }\n )\n\n private dbTransactionDuration = this.meter?.createHistogram(\n 'db_transaction_duration_seconds',\n {\n description: 'Duração das transações no banco de dados',\n unit: 's',\n }\n )\n\n private dbDeadlocksTotal = this.meter?.createCounter('db_deadlocks_total', {\n description: 'Total de deadlocks detectados no banco de dados',\n unit: '1',\n })\n\n private httpRequestBytesTotal = this.meter?.createCounter(\n 'http_request_bytes_total',\n {\n description: 'Total de bytes transferidos em requisições HTTP',\n unit: 'By',\n }\n )\n\n private processingDuration = this.meter?.createHistogram(\n 'processing_duration_seconds',\n {\n description: 'Duração de operações de processamento interno',\n unit: 's',\n }\n )\n\n private processingErrors = this.meter?.createCounter(\n 'processing_errors_total',\n {\n description: 'Total de erros em operações de processamento',\n unit: '1',\n }\n )\n\n private httpClientRequestsTotal = this.meter?.createCounter(\n 'http_client_requests_total',\n {\n description: 'Total de requisições HTTP client realizadas',\n unit: '1',\n }\n )\n\n private httpClientRequestDuration = this.meter?.createHistogram(\n 'http_client_request_duration_seconds',\n {\n description: 'Duração de requisições HTTP client em segundos',\n unit: 's',\n }\n )\n\n private httpClientErrors = this.meter?.createCounter(\n 'http_client_errors_total',\n {\n description: 'Total de erros em requisições HTTP client',\n unit: '1',\n }\n )\n\n private httpClientTimeouts = this.meter?.createCounter(\n 'http_client_timeouts_total',\n {\n description: 'Total de timeouts em requisições HTTP client',\n unit: '1',\n }\n )\n\n private validationErrors = this.meter?.createCounter(\n 'validation_errors_total',\n {\n description: 'Total de erros de validação',\n unit: '1',\n }\n )\n\n private processCpuSecondsTotal = this.meter?.createCounter(\n 'process_cpu_seconds_total',\n {\n description: 'Total CPU time spent in seconds',\n unit: 's',\n }\n )\n\n private processMemoryBytes = this.meter?.createObservableGauge(\n 'process_memory_bytes',\n {\n description: 'Memory usage in bytes',\n unit: 'By',\n }\n )\n\n private nodejsHeapSizeTotalBytes = this.meter?.createObservableGauge(\n 'nodejs_heap_size_total_bytes',\n {\n description: 'Total size of the allocated heap in bytes',\n unit: 'By',\n }\n )\n\n private nodejsHeapSizeUsedBytes = this.meter?.createObservableGauge(\n 'nodejs_heap_size_used_bytes',\n {\n description: 'Used heap size in bytes',\n unit: 'By',\n }\n )\n\n private nodejsEventloopLagSeconds = this.meter?.createObservableGauge(\n 'nodejs_eventloop_lag_seconds',\n {\n description: 'Event loop lag in seconds',\n unit: 's',\n }\n )\n\n private nodejsEventloopDurationSeconds = this.meter?.createHistogram(\n 'nodejs_eventloop_duration_seconds',\n {\n description: 'Event loop duration in seconds',\n unit: 's',\n }\n )\n\n private nodejsGcDurationSeconds = this.meter?.createHistogram(\n 'nodejs_gc_duration_seconds',\n {\n description: 'Garbage collection duration in seconds',\n unit: 's',\n }\n )\n\n private processOpenFds = this.meter?.createObservableGauge(\n 'process_open_fds',\n {\n description: 'Number of open file descriptors',\n unit: '1',\n }\n )\n\n private processUptimeSeconds = this.meter?.createObservableGauge(\n 'process_uptime_seconds',\n {\n description: 'Process uptime in seconds',\n unit: 's',\n }\n )\n\n private eventLoopMonitor = monitorEventLoopDelay({ resolution: 10 })\n private previousCpuUsage = process.cpuUsage()\n private collectionInterval?: NodeJS.Timeout\n private gcObserver?: PerformanceObserver\n\n recordHttpRequest(params: {\n method: string\n route: string\n statusCode: number\n durationSeconds: number\n responseSizeBytes?: number\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { method, route, statusCode, durationSeconds, responseSizeBytes } =\n params\n\n const attributes = {\n method,\n route,\n status_code: statusCode.toString(),\n status_class: this.getStatusClass(statusCode),\n environment: process.env.ENVIRONMENT,\n }\n\n this.httpRequestsTotal?.add(1, attributes)\n\n this.httpRequestDuration?.record(durationSeconds, attributes)\n\n if (statusCode >= 400) {\n this.httpRequestsErrors?.add(1, {\n ...attributes,\n error_type: statusCode >= 500 ? 'server_error' : 'client_error',\n })\n }\n\n if (responseSizeBytes) {\n this.httpResponseSize?.record(responseSizeBytes, attributes)\n }\n }\n\n recordDbQueryError(params: {\n operation: string\n repository: string\n errorMessage: string\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n if (!this.isValidDbQueryErrorParams(params)) {\n return\n }\n\n const { operation, repository, errorMessage } = params\n\n this.dbQueryErrors?.add(1, {\n operation,\n repository,\n errorMessage,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordDbQuery(params: {\n operation: string\n repository: string\n durationSeconds: number\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n if (!this.isValidDbQueryParams(params)) {\n return\n }\n\n const { operation, repository, durationSeconds } = params\n\n this.dbQueryDuration?.record(durationSeconds, {\n operation,\n repository,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n private isValidDbQueryErrorParams(params: {\n operation: string\n repository: string\n errorMessage: string\n }): boolean {\n const { operation, repository, errorMessage } = params\n\n if (!operation || !repository || !errorMessage) {\n console.warn('[MetricsManager] Invalid db query error params:', params)\n return false\n }\n\n return true\n }\n\n private isValidDbQueryParams(params: {\n operation: string\n repository: string\n durationSeconds: number\n }): boolean {\n const { operation, repository, durationSeconds } = params\n\n if (!operation || !repository) {\n console.warn('[MetricsManager] Invalid db query params:', params)\n return false\n }\n\n if (isNaN(durationSeconds) || durationSeconds < 0) {\n console.warn('[MetricsManager] Invalid duration:', durationSeconds)\n return false\n }\n\n return true\n }\n\n recordDbTransaction(params: {\n operation: string\n repository: string\n durationSeconds: number\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { operation, repository, durationSeconds } = params\n\n this.dbTransactionsTotal?.add(1, {\n operation,\n repository,\n environment: process.env.ENVIRONMENT,\n })\n\n this.dbTransactionDuration?.record(durationSeconds, {\n operation,\n repository,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordDbDeadlock(params: {\n operation: string\n repository: string\n errorMessage: string\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { operation, repository, errorMessage } = params\n\n this.dbDeadlocksTotal?.add(1, {\n operation,\n repository,\n errorMessage,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordHttpRequestBytes(\n bytes: number,\n attributes: {\n method: string\n route: string\n statusCode: number\n }\n ) {\n if (!OTEL_ENABLED) {\n return\n }\n\n this.httpRequestBytesTotal?.add(bytes, {\n ...attributes,\n status_code: attributes.statusCode.toString(),\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordProcessingDuration(params: {\n operation: string\n durationSeconds: number\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { operation, durationSeconds } = params\n\n this.processingDuration?.record(durationSeconds, {\n operation,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordProcessingError(params: { operation: string; errorType: string }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { operation, errorType } = params\n\n this.processingErrors?.add(1, {\n operation,\n error_type: errorType,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordHttpClientRequest(params: {\n method: string\n url: string\n statusCode?: number\n durationSeconds: number\n error?: boolean\n timeout?: boolean\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { method, url, statusCode, durationSeconds, error, timeout } = params\n\n const normalizedUrl = this.normalizeUrl(url)\n const attributes = {\n method,\n url: normalizedUrl,\n environment: process.env.ENVIRONMENT,\n status_code: statusCode?.toString() || 'unknown',\n }\n\n this.httpClientRequestsTotal?.add(1, attributes)\n\n this.httpClientRequestDuration?.record(durationSeconds, attributes)\n\n if (error) {\n this.httpClientErrors?.add(1, {\n ...attributes,\n error_type: timeout ? 'timeout' : 'connection_error',\n })\n }\n\n if (timeout) {\n this.httpClientTimeouts?.add(1, attributes)\n }\n }\n\n recordValidationError(params: { field?: string; errorType: string }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { field, errorType } = params\n\n this.validationErrors?.add(1, {\n field: field || 'unknown',\n error_type: errorType,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n startSystemMetricsCollection(intervalMs: number = 5000) {\n if (!OTEL_ENABLED || !this.meter) {\n return\n }\n\n this.eventLoopMonitor.enable()\n\n const observables = [\n this.processMemoryBytes,\n this.nodejsHeapSizeTotalBytes,\n this.nodejsHeapSizeUsedBytes,\n this.nodejsEventloopLagSeconds,\n this.processOpenFds,\n this.processUptimeSeconds,\n ].filter((obs): obs is NonNullable<typeof obs> => obs !== undefined)\n\n this.meter.addBatchObservableCallback((observableResult) => {\n this.collectSystemMetrics(observableResult)\n }, observables)\n\n this.setupGCObserver()\n\n this.collectionInterval = setInterval(() => {\n this.collectPeriodicMetrics()\n }, intervalMs)\n\n this.collectPeriodicMetrics()\n }\n\n stopSystemMetricsCollection() {\n if (!OTEL_ENABLED || !this.meter) {\n return\n }\n\n if (this.collectionInterval) {\n clearInterval(this.collectionInterval)\n this.collectionInterval = undefined\n }\n\n this.eventLoopMonitor.disable()\n\n if (this.gcObserver) {\n this.gcObserver.disconnect()\n this.gcObserver = undefined\n }\n }\n\n private collectSystemMetrics(observableResult: any) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const attributes = {\n environment: process.env.ENVIRONMENT,\n }\n\n const memUsage = process.memoryUsage()\n observableResult.observe(this.processMemoryBytes!, memUsage.rss, {\n ...attributes,\n type: 'rss',\n })\n\n observableResult.observe(this.processMemoryBytes!, memUsage.heapTotal, {\n ...attributes,\n type: 'heap_total',\n })\n\n observableResult.observe(this.processMemoryBytes!, memUsage.heapUsed, {\n ...attributes,\n type: 'heap_used',\n })\n observableResult.observe(this.processMemoryBytes!, memUsage.external, {\n ...attributes,\n type: 'external',\n })\n\n const heapStats = v8.getHeapStatistics()\n\n observableResult.observe(\n this.nodejsHeapSizeTotalBytes!,\n heapStats.total_heap_size,\n attributes\n )\n\n observableResult.observe(\n this.nodejsHeapSizeUsedBytes!,\n heapStats.used_heap_size,\n attributes\n )\n\n const lagMs = this.eventLoopMonitor.mean / 1_000_000\n observableResult.observe(\n this.nodejsEventloopLagSeconds!,\n lagMs / 1000,\n attributes\n )\n\n try {\n const resourceUsage = (process as any).resourceUsage?.()\n\n if (resourceUsage) {\n observableResult.observe(\n this.processOpenFds!,\n resourceUsage.maxRSS || 0,\n {\n ...attributes,\n type: 'max_rss',\n }\n )\n }\n } catch {\n // noop\n }\n\n observableResult.observe(\n this.processUptimeSeconds!,\n process.uptime(),\n attributes\n )\n }\n\n private collectPeriodicMetrics() {\n if (!OTEL_ENABLED) {\n return\n }\n\n const attributes = {\n environment: process.env.ENVIRONMENT,\n }\n\n const currentCpuUsage = process.cpuUsage(this.previousCpuUsage)\n\n const userCpuSeconds = (currentCpuUsage.user / 1_000_000) * cpus().length\n\n const systemCpuSeconds =\n (currentCpuUsage.system / 1_000_000) * cpus().length\n\n this.processCpuSecondsTotal?.add(userCpuSeconds, {\n ...attributes,\n mode: 'user',\n })\n\n this.processCpuSecondsTotal?.add(systemCpuSeconds, {\n ...attributes,\n mode: 'system',\n })\n\n this.previousCpuUsage = process.cpuUsage()\n\n const eventLoopDuration = this.eventLoopMonitor.mean / 1_000_000_000\n\n if (eventLoopDuration > 0) {\n this.nodejsEventloopDurationSeconds?.record(eventLoopDuration, attributes)\n }\n }\n\n private setupGCObserver() {\n if (!OTEL_ENABLED) {\n return\n }\n\n try {\n this.gcObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const gcType = (entry as any).kind || 'unknown'\n const duration = entry.duration / 1000\n\n this.nodejsGcDurationSeconds?.record(duration, {\n environment: process.env.ENVIRONMENT,\n kind: this.getGCKindName(gcType),\n })\n }\n })\n\n this.gcObserver.observe({ entryTypes: ['measure', 'gc'] })\n } catch {\n // noop\n }\n }\n\n private getGCKindName(kind: number): string {\n const gcTypes: Record<number, string> = {\n 1: 'scavenge',\n 2: 'mark_sweep_compact',\n 4: 'incremental_marking',\n 8: 'process_weak_callbacks',\n 15: 'all',\n }\n return gcTypes[kind] || `unknown_${kind}`\n }\n\n private normalizeUrl(url: string): string {\n try {\n const urlObj = new URL(url)\n return `${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`\n } catch {\n return url.split('?')[0].split('#')[0]\n }\n }\n\n private getStatusClass(statusCode: number): string {\n if (statusCode >= 200 && statusCode < 300) return '2xx'\n if (statusCode >= 300 && statusCode < 400) return '3xx'\n if (statusCode >= 400 && statusCode < 500) return '4xx'\n if (statusCode >= 500) return '5xx'\n return '1xx'\n }\n}\n","import FastifyOtelInstrumentation from '@fastify/otel'\nimport { logs } from '@opentelemetry/api-logs'\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\nimport { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base'\nimport { Resource } from '@opentelemetry/resources'\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from '@opentelemetry/sdk-logs'\nimport { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'\nimport { NodeSDK } from '@opentelemetry/sdk-node'\nimport { TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-node'\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n SEMRESATTRS_DEPLOYMENT_ENVIRONMENT,\n} from '@opentelemetry/semantic-conventions'\n\nexport class OtelManager {\n private readonly resource: Resource\n private readonly loggerProvider: LoggerProvider\n private readonly sdk: NodeSDK\n private readonly otlpLogExporter: OTLPLogExporter\n private readonly traceExporter: OTLPTraceExporter\n private readonly metricExporter: OTLPMetricExporter\n private readonly metricReader: PeriodicExportingMetricReader\n private readonly sampler: TraceIdRatioBasedSampler\n\n constructor(private readonly env: Record<string, any>) {\n this.resource = this.createResource()\n this.otlpLogExporter = this.createOtlpLogExporter()\n this.loggerProvider = this.createLoggerProvider()\n this.traceExporter = this.createTraceExporter()\n this.sampler = this.createSampler()\n this.metricExporter = this.createMetricExporter()\n this.metricReader = this.createMetricReader()\n this.sdk = this.createSdk()\n }\n\n private createResource(): Resource {\n return new Resource({\n [ATTR_SERVICE_NAME]:\n this.env.OTEL_SERVICE_NAME || 'plutin-boilerplate-common',\n [ATTR_SERVICE_VERSION]: this.env.OTEL_SERVICE_VERSION || '1.0.0',\n [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: this.env.ENVIRONMENT,\n })\n }\n\n private createOtlpLogExporter(): OTLPLogExporter {\n return new OTLPLogExporter({\n url: `${this.env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/logs`,\n compression: CompressionAlgorithm.GZIP,\n })\n }\n\n private createLoggerProvider(): LoggerProvider {\n const provider = new LoggerProvider({\n resource: this.resource,\n })\n\n this.configureLogProcessors(provider)\n logs.setGlobalLoggerProvider(provider)\n\n return provider\n }\n\n private configureLogProcessors(provider: LoggerProvider): void {\n provider.addLogRecordProcessor(\n new BatchLogRecordProcessor(this.otlpLogExporter)\n )\n }\n\n private createTraceExporter(): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: `${this.env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/traces`,\n compression: CompressionAlgorithm.GZIP,\n })\n }\n\n private createSampler(): TraceIdRatioBasedSampler {\n const DEVELOPMENT_SAMPLE_RATE = 1.0\n const PRODUCTION_SAMPLE_RATE = 0.01\n\n const sampleRate =\n this.env.ENVIRONMENT === 'development'\n ? DEVELOPMENT_SAMPLE_RATE\n : PRODUCTION_SAMPLE_RATE\n\n return new TraceIdRatioBasedSampler(sampleRate)\n }\n\n private createMetricExporter(): OTLPMetricExporter {\n return new OTLPMetricExporter({\n url: `${this.env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/metrics`,\n compression: CompressionAlgorithm.GZIP,\n })\n }\n\n private createMetricReader(): PeriodicExportingMetricReader {\n return new PeriodicExportingMetricReader({\n exporter: this.metricExporter,\n exportIntervalMillis: 5000,\n exportTimeoutMillis: 5000,\n })\n }\n\n private createSdk(): NodeSDK {\n return new NodeSDK({\n resource: this.resource,\n metricReader: this.metricReader,\n traceExporter: this.traceExporter,\n instrumentations: [\n getNodeAutoInstrumentations({\n '@opentelemetry/instrumentation-fs': {\n enabled: false,\n },\n }),\n new HttpInstrumentation(),\n new FastifyOtelInstrumentation({\n registerOnInitialization: true,\n }),\n ],\n sampler: this.sampler,\n })\n }\n\n initialize(): void {\n try {\n this.sdk.start()\n } catch (error) {\n console.error('❌ Erro ao inicializar OpenTelemetry SDK:', error)\n throw error\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.loggerProvider.forceFlush()\n await this.loggerProvider.shutdown()\n await this.sdk.shutdown()\n } catch (error) {\n console.error('❌ Erro ao desligar OpenTelemetry SDK:', error)\n }\n }\n\n getLoggerProvider(): LoggerProvider {\n return this.loggerProvider\n }\n\n getSdk(): NodeSDK {\n return this.sdk\n }\n}\n","import { Span, trace } from '@opentelemetry/api'\n\nimport { DependencyContainer } from '../../core/decorators/dependency-container'\nimport { PinoLogger } from '../../infra/adapters/logger/pino-logger'\nimport type { IMetricsManager } from '../../infra/adapters/observability/otel/metric'\n\nconst MILLISECONDS_TO_SECONDS = 1000\nconst ROUNDING_PRECISION = 100\nconst MAX_SANITIZED_KEYS = 10\n\nconst EXCLUDED_METHODS = new Set([\n 'constructor',\n 'toString',\n 'valueOf',\n 'toJSON',\n])\n\nconst TRACER_NAME = process.env.OTEL_SERVICE_NAME || 'plutin-boilerplate-common'\nconst TRACER_VERSION = process.env.OTEL_SERVICE_VERSION || '1.0.0'\n\nconst OTEL_ENABLED = process.env.OTEL_ENABLE === 'true'\n\nexport type Timer = {\n getDurationSeconds(): number\n}\n\nexport type BaseExecutionContext = {\n operation: string\n logger?: any\n}\n\nexport interface IMetricsRecorder {\n recordSuccess(context: BaseExecutionContext, durationSeconds: number): void\n\n recordError(context: BaseExecutionContext, error: Error): void\n}\n\nexport interface ISpanBuilder {\n createSpan(\n tracer: ReturnType<typeof trace.getTracer>,\n context: BaseExecutionContext\n ): Span | undefined\n\n buildSpanName(context: BaseExecutionContext): string\n\n finalizeSpanSuccess(span: Span, durationSeconds: number): void\n\n finalizeSpanError(span: Span, durationSeconds: number, error: Error): void\n}\n\nexport interface ILogBuilder {\n buildStartMessage(context: BaseExecutionContext): string\n\n buildStartLogData(\n context: BaseExecutionContext,\n args: any[]\n ): Record<string, any>\n\n buildSuccessMessage(context: BaseExecutionContext): string\n\n buildSuccessLogData(\n context: BaseExecutionContext,\n durationMs: number\n ): Record<string, any>\n\n buildErrorMessage(context: BaseExecutionContext): string\n\n buildErrorLogData(\n context: BaseExecutionContext,\n durationMs: number,\n error: Error\n ): Record<string, any>\n}\n\nexport interface IInstrumentationStrategy {\n instrumentMethod(\n originalMethod: (...args: any[]) => any,\n instance: any,\n context: BaseExecutionContext\n ): (...args: any[]) => any\n}\n\nclass Tracer {\n private static instance: ReturnType<typeof trace.getTracer> | null = null\n\n static getTracer(): ReturnType<typeof trace.getTracer> {\n if (!this.instance) {\n this.instance = trace.getTracer(TRACER_NAME, TRACER_VERSION)\n }\n return this.instance\n }\n}\n\nclass Metrics {\n private static instance: IMetricsManager\n\n static getMetrics(): IMetricsManager {\n if (!this.instance) {\n this.instance = DependencyContainer.resolveToken('Metrics')\n }\n return this.instance\n }\n}\n\nabstract class BaseFullInstrumentationStrategy\n implements IInstrumentationStrategy\n{\n constructor(\n protected readonly tracer: ReturnType<typeof trace.getTracer>,\n protected readonly metrics: IMetricsManager,\n protected readonly metricsRecorder: IMetricsRecorder,\n protected readonly spanBuilder: ISpanBuilder,\n protected readonly logBuilder: ILogBuilder\n ) {}\n\n instrumentMethod(\n originalMethod: (...args: any[]) => any,\n instance: any,\n context: BaseExecutionContext\n ): (...args: any[]) => any {\n return async (...args: any[]) => {\n const timer = createTimer()\n const span = this.spanBuilder.createSpan(this.tracer, context)\n\n this.logOperationStart(context, args)\n\n try {\n const result = await originalMethod.call(instance, ...args)\n this.recordSuccess(timer, span, context)\n return result\n } catch (error) {\n this.recordFailure(error, timer, span, context)\n throw error\n }\n }\n }\n\n private recordSuccess(\n timer: Timer,\n span: Span | undefined,\n context: BaseExecutionContext\n ): void {\n const durationSeconds = timer.getDurationSeconds()\n const durationMs = roundDuration(durationSeconds * MILLISECONDS_TO_SECONDS)\n\n this.metricsRecorder.recordSuccess(context, durationSeconds)\n this.logSuccess(context, durationMs)\n\n if (span) {\n this.spanBuilder.finalizeSpanSuccess(span, durationSeconds)\n }\n }\n\n private logSuccess(context: BaseExecutionContext, durationMs: number): void {\n if (!context.logger) {\n return\n }\n\n context.logger.info({\n msg: this.logBuilder.buildSuccessMessage(context),\n data: this.logBuilder.buildSuccessLogData(context, durationMs),\n })\n }\n\n private recordFailure(\n error: unknown,\n timer: Timer,\n span: Span | undefined,\n context: BaseExecutionContext\n ): void {\n const durationSeconds = timer.getDurationSeconds()\n const durationMs = roundDuration(durationSeconds * MILLISECONDS_TO_SECONDS)\n const normalizedError = normalizeError(error)\n\n this.metricsRecorder.recordError(context, normalizedError)\n this.logError(context, durationMs, normalizedError)\n\n if (span) {\n this.spanBuilder.finalizeSpanError(span, durationSeconds, normalizedError)\n }\n }\n\n private logError(\n context: BaseExecutionContext,\n durationMs: number,\n error: Error\n ): void {\n if (!context.logger) {\n return\n }\n\n context.logger.error({\n msg: this.logBuilder.buildErrorMessage(context),\n data: this.logBuilder.buildErrorLogData(context, durationMs, error),\n error,\n })\n }\n\n private logOperationStart(context: BaseExecutionContext, args: any[]): void {\n if (!context.logger) {\n return\n }\n\n context.logger.info({\n msg: this.logBuilder.buildStartMessage(context),\n data: this.logBuilder.buildStartLogData(context, args),\n })\n }\n}\n\nabstract class BaseLogsOnlyInstrumentationStrategy\n implements IInstrumentationStrategy\n{\n constructor(protected readonly logBuilder: ILogBuilder) {}\n\n instrumentMethod(\n originalMethod: (...args: any[]) => any,\n instance: any,\n context: BaseExecutionContext\n ): (...args: any[]) => any {\n return async (...args: any[]) => {\n const timer = createTimer()\n\n this.logOperationStart(context, args)\n\n try {\n const result = await originalMethod.call(instance, ...args)\n this.logSuccess(timer, context)\n return result\n } catch (error) {\n this.logError(error, timer, context)\n throw error\n }\n }\n }\n\n private logOperationStart(context: BaseExecutionContext, args: any[]): void {\n if (!context.logger) {\n return\n }\n\n context.logger.info({\n msg: this.logBuilder.buildStartMessage(context),\n data: this.logBuilder.buildStartLogData(context, args),\n })\n }\n\n private logSuccess(timer: Timer, context: BaseExecutionContext): void {\n if (!context.logger) {\n return\n }\n\n const durationMs = roundDuration(\n timer.getDurationSeconds() * MILLISECONDS_TO_SECONDS\n )\n\n context.logger.info({\n msg: this.logBuilder.buildSuccessMessage(context),\n data: this.logBuilder.buildSuccessLogData(context, durationMs),\n })\n }\n\n private logError(\n error: unknown,\n timer: Timer,\n context: BaseExecutionContext\n ): void {\n if (!context.logger) {\n return\n }\n\n const durationMs = roundDuration(\n timer.getDurationSeconds() * MILLISECONDS_TO_SECONDS\n )\n const normalizedError = normalizeError(error)\n\n context.logger.error({\n msg: this.logBuilder.buildErrorMessage(context),\n data: this.logBuilder.buildErrorLogData(\n context,\n durationMs,\n normalizedError\n ),\n error: normalizedError,\n })\n }\n}\n\nexport function createTimer(): Timer {\n const startTime = Date.now()\n\n return {\n getDurationSeconds(): number {\n return (Date.now() - startTime) / MILLISECONDS_TO_SECONDS\n },\n }\n}\n\nexport function normalizeError(error: unknown): Error {\n if (error instanceof Error) {\n return error\n }\n\n if (typeof error === 'string') {\n return new Error(error)\n }\n\n return new Error(String(error))\n}\n\nexport function roundDuration(durationMs: number): number {\n return Math.round(durationMs * ROUNDING_PRECISION) / ROUNDING_PRECISION\n}\n\nexport function sanitizeArgs(args: any[]): any[] {\n if (args.length === 0) {\n return args\n }\n\n return args.map(sanitizeArg)\n}\n\nfunction sanitizeArg(arg: any): any {\n if (arg === null || arg === undefined) {\n return arg\n }\n\n if (typeof arg !== 'object') {\n return arg\n }\n\n return sanitizeObject(arg)\n}\n\nfunction sanitizeObject(obj: any): any {\n try {\n const keys = Object.keys(obj)\n\n if (keys.length > MAX_SANITIZED_KEYS) {\n return {\n _truncated: true,\n _keyCount: keys.length,\n _keys: keys.slice(0, MAX_SANITIZED_KEYS),\n }\n }\n\n return obj\n } catch {\n return { _error: 'Could not serialize argument' }\n }\n}\n\nexport function resolveLogger(): any {\n try {\n return DependencyContainer.resolveToken('Logger')\n } catch {\n return new PinoLogger()\n }\n}\n\nexport function copyReflectMetadata(source: any, target: any): void {\n const injectMetadata = Reflect.getOwnMetadata('inject:params', source)\n if (injectMetadata) {\n Reflect.defineMetadata('inject:params', injectMetadata, target)\n }\n}\n\nexport function preserveClassName(target: any, className: string): void {\n Object.defineProperty(target, 'name', {\n value: className,\n writable: false,\n configurable: true,\n })\n}\n\nexport function getInstrumentableMethods(instance: object): string[] {\n const methods: string[] = []\n const prototype = Object.getPrototypeOf(instance)\n let current: any = prototype\n\n while (current && current !== Object.prototype) {\n const propertyNames = Object.getOwnPropertyNames(current)\n\n for (const name of propertyNames) {\n if (shouldExcludeMethod(name)) {\n continue\n }\n\n if (isMethod(current, name) && !methods.includes(name)) {\n methods.push(name)\n }\n }\n\n current = Object.getPrototypeOf(current)\n }\n\n return methods\n}\n\nfunction shouldExcludeMethod(name: string): boolean {\n return EXCLUDED_METHODS.has(name) || name.startsWith('_')\n}\n\nfunction isMethod(obj: any, name: string): boolean {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(obj, name)\n return descriptor !== undefined && typeof descriptor.value === 'function'\n } catch {\n return false\n }\n}\n\nexport function instrumentInstanceMethods(\n instance: object,\n contextName: string,\n logger: any,\n strategy: IInstrumentationStrategy,\n createContext: (operation: string, logger?: any) => BaseExecutionContext\n): void {\n const methodsToInstrument = getInstrumentableMethods(instance)\n\n if (methodsToInstrument.length === 0) {\n console.warn(\n `[Instrumentation] No methods found to instrument for ${contextName}. This may indicate a problem with method discovery.`\n )\n return\n }\n\n for (const methodName of methodsToInstrument) {\n instrumentMethod(instance, methodName, logger, strategy, createContext)\n }\n}\n\nfunction instrumentMethod(\n instance: any,\n methodName: string,\n logger: any,\n strategy: IInstrumentationStrategy,\n createContext: (operation: string, logger?: any) => BaseExecutionContext\n): void {\n const originalMethod = instance[methodName]\n\n if (typeof originalMethod !== 'function') {\n return\n }\n\n const context = createContext(methodName, logger)\n\n const wrappedMethod = strategy.instrumentMethod(\n originalMethod,\n instance,\n context\n )\n\n Object.defineProperty(instance, methodName, {\n value: wrappedMethod,\n writable: true,\n configurable: true,\n enumerable: true,\n })\n}\n\nexport {\n BaseFullInstrumentationStrategy,\n BaseLogsOnlyInstrumentationStrategy,\n Metrics,\n OTEL_ENABLED,\n Tracer,\n TRACER_NAME,\n TRACER_VERSION,\n}\n","import { Span, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api'\n\nimport type { IMetricsManager } from '../../infra/adapters/observability/otel/metric'\n\nimport {\n BaseExecutionContext,\n BaseFullInstrumentationStrategy,\n BaseLogsOnlyInstrumentationStrategy,\n copyReflectMetadata,\n ILogBuilder,\n IMetricsRecorder,\n instrumentInstanceMethods,\n ISpanBuilder,\n Metrics,\n OTEL_ENABLED,\n preserveClassName,\n resolveLogger,\n sanitizeArgs,\n Tracer,\n TRACER_NAME,\n} from './base-instrumentation-strategy'\n\ntype ProcessingExecutionContext = BaseExecutionContext & {\n className: string\n}\n\ntype InstrumentationOptions = {\n serviceName?: string\n}\n\nclass ProcessingMetricsRecorder implements IMetricsRecorder {\n constructor(private readonly metrics: IMetricsManager | undefined) {}\n\n recordSuccess(context: BaseExecutionContext, durationSeconds: number): void {\n if (!this.metrics) {\n return\n }\n\n this.metrics.recordProcessingDuration({\n operation: context.operation,\n durationSeconds,\n })\n }\n\n recordError(context: BaseExecutionContext, error: Error): void {\n if (!this.metrics) {\n return\n }\n\n this.metrics.recordProcessingError({\n operation: context.operation,\n errorType: error.name,\n })\n }\n}\n\nclass ProcessingSpanBuilder implements ISpanBuilder {\n constructor(private readonly serviceName: string) {}\n\n createSpan(\n tracer: ReturnType<typeof trace.getTracer>,\n context: BaseExecutionContext\n ): Span | undefined {\n const procContext = context as ProcessingExecutionContext\n const spanName = this.buildSpanName(procContext)\n\n return tracer.startSpan(spanName, {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'service.name': this.serviceName,\n 'class.name': procContext.className,\n 'operation.name': procContext.operation,\n },\n })\n }\n\n buildSpanName(context: BaseExecutionContext): string {\n const procContext = context as ProcessingExecutionContext\n return `process.${procContext.className.toLowerCase()}.${procContext.operation}`\n }\n\n finalizeSpanSuccess(span: Span, durationSeconds: number): void {\n span.setStatus({ code: SpanStatusCode.OK })\n span.setAttribute('processing.duration', durationSeconds)\n span.setAttribute('processing.status', 'success')\n span.end()\n }\n\n finalizeSpanError(span: Span, durationSeconds: number, error: Error): void {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n })\n span.setAttribute('processing.duration', durationSeconds)\n span.setAttribute('processing.status', 'error')\n span.setAttribute('error', true)\n span.setAttribute('error.message', error.message)\n span.setAttribute('error.type', error.name)\n span.recordException(error)\n span.end()\n }\n}\n\nclass ProcessingLogBuilder implements ILogBuilder {\n buildStartMessage(context: BaseExecutionContext): string {\n const procContext = context as ProcessingExecutionContext\n return `[${procContext.className}.${procContext.operation}] started`\n }\n\n buildStartLogData(\n context: BaseExecutionContext,\n args: any[]\n ): Record<string, any> {\n const procContext = context as ProcessingExecutionContext\n return {\n className: procContext.className,\n operation: procContext.operation,\n args: sanitizeArgs(args),\n }\n }\n\n buildSuccessMessage(context: BaseExecutionContext): string {\n const procContext = context as ProcessingExecutionContext\n return `[${procContext.className}.${procContext.operation}] finished successfully`\n }\n\n buildSuccessLogData(\n context: BaseExecutionContext,\n durationMs: number\n ): Record<string, any> {\n const procContext = context as ProcessingExecutionContext\n return {\n className: procContext.className,\n operation: procContext.operation,\n durationMs,\n status: 'success',\n }\n }\n\n buildErrorMessage(context: BaseExecutionContext): string {\n const procContext = context as ProcessingExecutionContext\n return `[${procContext.className}.${procContext.operation}] finished failed`\n }\n\n buildErrorLogData(\n context: BaseExecutionContext,\n durationMs: number,\n error: Error\n ): Record<string, any> {\n const procContext = context as ProcessingExecutionContext\n return {\n className: procContext.className,\n operation: procContext.operation,\n durationMs,\n status: 'error',\n errorMessage: error.message,\n errorName: error.name,\n }\n }\n}\n\nclass ProcessingFullInstrumentationStrategy extends BaseFullInstrumentationStrategy {\n constructor(\n tracer: ReturnType<typeof trace.getTracer>,\n metrics: IMetricsManager,\n serviceName: string\n ) {\n super(\n tracer,\n metrics,\n new ProcessingMetricsRecorder(metrics),\n new ProcessingSpanBuilder(serviceName),\n new ProcessingLogBuilder()\n )\n }\n}\n\nclass ProcessingLogsOnlyInstrumentationStrategy extends BaseLogsOnlyInstrumentationStrategy {\n constructor() {\n super(new ProcessingLogBuilder())\n }\n}\n\nclass ProcessingInstrumentationStrategyFactory {\n static create(serviceName: string) {\n if (!OTEL_ENABLED) {\n return new ProcessingLogsOnlyInstrumentationStrategy()\n }\n\n const tracer = Tracer.getTracer()\n const metrics = Metrics.getMetrics()\n\n return new ProcessingFullInstrumentationStrategy(\n tracer,\n metrics,\n serviceName\n )\n }\n}\n\nexport function Instrumentation(options?: InstrumentationOptions) {\n return function <T extends { new (...args: any[]): object }>(constructor: T) {\n const className = constructor.name\n const serviceName = options?.serviceName || TRACER_NAME\n\n class InstrumentedClass extends constructor {\n constructor(...args: any[]) {\n super(...args)\n\n const logger = resolveLogger()\n const strategy =\n ProcessingInstrumentationStrategyFactory.create(serviceName)\n\n instrumentInstanceMethods(\n this,\n className,\n logger,\n strategy,\n (operation: string, logger?: any): ProcessingExecutionContext => ({\n className,\n operation,\n logger,\n })\n )\n }\n }\n\n copyReflectMetadata(constructor, InstrumentedClass)\n preserveClassName(InstrumentedClass, className)\n\n return InstrumentedClass as T\n }\n}\n","import { Span, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api'\n\nimport type { IMetricsManager } from '../../infra/adapters/observability/otel/metric'\n\nimport {\n BaseExecutionContext,\n BaseFullInstrumentationStrategy,\n BaseLogsOnlyInstrumentationStrategy,\n copyReflectMetadata,\n ILogBuilder,\n IMetricsRecorder,\n instrumentInstanceMethods,\n ISpanBuilder,\n Metrics,\n OTEL_ENABLED,\n preserveClassName,\n resolveLogger,\n sanitizeArgs,\n Tracer,\n} from './base-instrumentation-strategy'\n\nconst DEFAULT_DB_SYSTEM = 'postgresql'\n\ntype RepositoryExecutionContext = BaseExecutionContext & {\n repositoryName: string\n}\n\ntype RepositoryOtelOptions = {\n dbSystem?: string\n}\n\nclass RepositoryMetricsRecorder implements IMetricsRecorder {\n constructor(private readonly metrics: IMetricsManager) {}\n\n recordSuccess(context: BaseExecutionContext, durationSeconds: number): void {\n if (!this.metrics) {\n return\n }\n\n const repoContext = context as RepositoryExecutionContext\n\n this.metrics.recordDbQuery({\n operation: repoContext.operation,\n repository: repoContext.repositoryName,\n durationSeconds,\n })\n }\n\n recordError(context: BaseExecutionContext, error: Error): void {\n if (!this.metrics) {\n return\n }\n\n const repoContext = context as RepositoryExecutionContext\n\n this.metrics.recordDbQueryError({\n operation: repoContext.operation,\n repository: repoContext.repositoryName,\n errorMessage: error.message,\n })\n }\n}\n\nclass RepositorySpanBuilder implements ISpanBuilder {\n constructor(private readonly dbSystem: string) {}\n\n createSpan(\n tracer: ReturnType<typeof trace.getTracer>,\n context: BaseExecutionContext\n ): Span | undefined {\n const repoContext = context as RepositoryExecutionContext\n const spanName = this.buildSpanName(repoContext)\n\n return tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': this.dbSystem,\n 'db.operation': repoContext.operation,\n },\n })\n }\n\n buildSpanName(context: BaseExecutionContext): string {\n const repoContext = context as RepositoryExecutionContext\n return `db.${repoContext.repositoryName.toLowerCase()}.${repoContext.operation}`\n }\n\n finalizeSpanSuccess(span: Span, durationSeconds: number): void {\n span.setStatus({ code: SpanStatusCode.OK })\n span.setAttribute('db.query.duration', durationSeconds)\n span.setAttribute('db.query.status', 'success')\n span.end()\n }\n\n finalizeSpanError(span: Span, durationSeconds: number, error: Error): void {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n })\n span.setAttribute('db.query.duration', durationSeconds)\n span.setAttribute('db.query.status', 'error')\n span.setAttribute('error', true)\n span.setAttribute('error.message', error.message)\n span.recordException(error)\n span.end()\n }\n}\n\nclass RepositoryLogBuilder implements ILogBuilder {\n buildStartMessage(context: BaseExecutionContext): string {\n const repoContext = context as RepositoryExecutionContext\n return `[${repoContext.repositoryName}.${repoContext.operation}] started`\n }\n\n buildStartLogData(\n context: BaseExecutionContext,\n args: any[]\n ): Record<string, any> {\n return {\n repository: (context as RepositoryExecutionContext).repositoryName,\n operation: context.operation,\n args: sanitizeArgs(args),\n }\n }\n\n buildSuccessMessage(context: BaseExecutionContext): string {\n const repoContext = context as RepositoryExecutionContext\n return `[${repoContext.repositoryName}.${repoContext.operation}] finished successfully`\n }\n\n buildSuccessLogData(\n context: BaseExecutionContext,\n durationMs: number\n ): Record<string, any> {\n return {\n repository: (context as RepositoryExecutionContext).repositoryName,\n operation: context.operation,\n durationMs,\n status: 'success',\n }\n }\n\n buildErrorMessage(context: BaseExecutionContext): string {\n const repoContext = context as RepositoryExecutionContext\n return `[${repoContext.repositoryName}.${repoContext.operation}] finished failed`\n }\n\n buildErrorLogData(\n context: BaseExecutionContext,\n durationMs: number,\n error: Error\n ): Record<string, any> {\n return {\n repository: (context as RepositoryExecutionContext).repositoryName,\n operation: context.operation,\n durationMs,\n status: 'error',\n errorMessage: error.message,\n errorName: error.name,\n }\n }\n}\n\nclass RepositoryFullInstrumentationStrategy extends BaseFullInstrumentationStrategy {\n constructor(\n tracer: ReturnType<typeof trace.getTracer>,\n metrics: IMetricsManager,\n dbSystem: string\n ) {\n super(\n tracer,\n metrics,\n new RepositoryMetricsRecorder(metrics),\n new RepositorySpanBuilder(dbSystem),\n new RepositoryLogBuilder()\n )\n }\n}\n\nclass RepositoryLogsOnlyInstrumentationStrategy extends BaseLogsOnlyInstrumentationStrategy {\n constructor() {\n super(new RepositoryLogBuilder())\n }\n}\n\nclass RepositoryInstrumentationStrategyFactory {\n static create(dbSystem: string) {\n if (!OTEL_ENABLED) {\n return new RepositoryLogsOnlyInstrumentationStrategy()\n }\n\n const tracer = Tracer.getTracer()\n const metrics = Metrics.getMetrics()\n\n return new RepositoryFullInstrumentationStrategy(tracer, metrics, dbSystem)\n }\n}\n\nexport function RepositoryInstrumentation(options?: RepositoryOtelOptions) {\n return function <T extends { new (...args: any[]): object }>(constructor: T) {\n const repositoryName = constructor.name\n const dbSystem = options?.dbSystem || DEFAULT_DB_SYSTEM\n\n class InstrumentedRepository extends constructor {\n constructor(...args: any[]) {\n super(...args)\n\n const logger = resolveLogger()\n const strategy =\n RepositoryInstrumentationStrategyFactory.create(dbSystem)\n\n instrumentInstanceMethods(\n this,\n repositoryName,\n logger,\n strategy,\n (operation: string, logger?: any): RepositoryExecutionContext => ({\n repositoryName,\n operation,\n logger,\n })\n )\n }\n }\n\n copyReflectMetadata(constructor, InstrumentedRepository)\n preserveClassName(InstrumentedRepository, repositoryName)\n\n return InstrumentedRepository as T\n }\n}\n","import { z } from 'zod'\n\nimport 'dotenv/config'\n\nexport const baseEnvSchema = z.object({\n NODE_ENV: z.enum(['test', 'development', 'production']).default('production'),\n ENVIRONMENT: z\n .enum(['test', 'development', 'staging', 'production'])\n .default('development'),\n PORT: z.coerce.number().default(3333),\n DISCORD_WEBHOOK_URL: z.string().optional(),\n OTEL_ENABLE: z\n .string()\n .transform((val) => val === 'true')\n .default('false'),\n OTEL_EXPORTER_OTLP_ENDPOINT: z.string().url().optional(),\n OTEL_SERVICE_NAME: z.string().optional(),\n OTEL_SERVICE_VERSION: z.string().optional(),\n})\n","(function () {\n require('./lib/main').config(\n Object.assign(\n {},\n require('./lib/env-options'),\n require('./lib/cli-options')(process.argv)\n )\n )\n})()\n"],"mappings":"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","names":["fs","require","path","os","crypto","packageJson","version","LINE","parse","src","obj","lines","toString","replace","match","exec","key","value","trim","maybeQuote","_parseVault","options","vaultPath","_vaultPath","result","DotenvModule","configDotenv","parsed","err","Error","code","keys","_dotenvKey","split","length","decrypted","i","attrs","_instructions","decrypt","ciphertext","error","_warn","message","console","log","_debug","DOTENV_KEY","process","env","dotenvKey","uri","URL","password","environment","searchParams","get","environmentKey","toUpperCase","possibleVaultPath","Array","isArray","filepath","existsSync","endsWith","resolve","cwd","_resolveHome","envPath","join","homedir","slice","_configVault","debug","Boolean","processEnv","populate","dotenvPath","encoding","optionPaths","push","lastError","parsedAll","readFileSync","e","config","encrypted","keyStr","Buffer","from","nonce","subarray","authTag","aesgcm","createDecipheriv","setAuthTag","update","final","isRange","RangeError","invalidKeyLength","decryptionFailed","override","Object","prototype","hasOwnProperty","call","module","exports","options","process","env","DOTENV_CONFIG_ENCODING","encoding","DOTENV_CONFIG_PATH","path","DOTENV_CONFIG_DEBUG","debug","DOTENV_CONFIG_OVERRIDE","override","DOTENV_CONFIG_DOTENV_KEY","DOTENV_KEY","module","exports","re","module","exports","optionMatcher","args","reduce","acc","cur","matches","match","DependencyContainer","registry","Map","singletons","register","token","myClass","options","set","type","singleton","registerValue","value","resolve","target","injectMetadata","Reflect","getOwnMetadata","paramCount","Object","keys","length","params","Array","from","_","index","Error","name","resolveToken","registration","get","has","instance","Inject","_propertyKey","parameterIndex","constructor","existingInjectedParams","defineMetadata","GlobalListener","logger","callback","DependencyContainer","resolveToken","register","process","on","err","fatal","msg","data","env","ENVIRONMENT","error","Error","message","exit","reason","String","ApiErrorEnum","ApplicationError","Error","props","message","code","errorCode","ApiErrorEnum","APPLICATION","occurredAt","Date","ConflictError","Error","props","conflictProps","code","errorCode","ApiErrorEnum","APPLICATION","message","occurredAt","Date","DomainError","Error","props","message","code","errorCode","ApiErrorEnum","DOMAIN","occurredAt","Date","InfraError","Error","props","message","code","errorCode","ApiErrorEnum","INFRA","occurredAt","Date","ValidationError","Error","props","errors","code","errorCode","ApiErrorEnum","VALIDATOR","message","occurredAt","Date","BaseController","logger","DependencyContainer","resolveToken","success","dto","code","data","noContent","undefined","created","paginated","buildContextError","request","env","process","ENVIRONMENT","body","headers","params","query","failure","error","context","ConflictError","props","message","errorCode","occurredAt","items","Array","isArray","conflictProps","DomainError","ApplicationError","InfraError","ValidationError","errors","fatal","msg","execute","routeMetadata","Reflect","getMetadata","middlewares","processedRequest","length","middleware","handle","Controller","method","path","middlewares","target","prototype","BaseController","Error","name","Reflect","defineMetadata","ObjectId","UniqueObjectId","value","ObjectId","toString","toValue","equals","id","EntityObject","_id","props","id","createdAt","date","updatedAt","touch","Date","UniqueObjectId","equals","entity","AggregateObjectRoot","EntityObject","randomUUID","UniqueEntityId","value","randomUUID","toString","toValue","equals","id","Entity","_id","props","id","createdAt","date","updatedAt","touch","Date","UniqueEntityId","equals","entity","AggregateRoot","Entity","ValueObject","props","WatchedList","currentItems","initial","new","removed","updated","initialItems","getItems","getNewItems","getRemovedItems","getUpdatedItems","addUpdatedItem","item","push","isCurrentItem","filter","v","compareItems","length","isNewItem","isRemovedItem","removeFromNew","removeFromCurrent","removeFromRemoved","wasAddedInitially","exists","add","remove","update","items","newItems","a","some","b","removedItems","updatedItems","getTakeAndSkip","size","page","take","Number","skip","cors","fastify","randomUUID","qs","trace","OTEL_ENABLED","process","env","OTEL_ENABLE","NullSpan","setAttributes","setAttribute","setStatus","recordException","SpanManager","getActiveSpan","span","trace","isEnabled","validateControllerMetadata","controller","metadata","Reflect","getMetadata","Error","name","FastifyAdapter","instance","logger","metrics","fastify","bodyLimit","querystringParser","str","qs","parse","requestIdHeader","requestIdLogLabel","genReqId","req","headers","randomUUID","register","cors","addHook","request","span","SpanManager","getActiveSpan","setAttributes","httpMethod","method","httpUrl","url","httpRoute","routeOptions","httpHost","hostname","httpScheme","protocol","httpUserAgent","httpRequestId","id","httpClientIp","ip","info","msg","data","requestId","httpHeaders","httpParams","params","httpQuery","query","reply","route","getNormalizedRoute","responseTime","elapsedTime","httpStatusCode","statusCode","responseTimeMs","Math","round","responseSizeBytes","getHeader","parseInt","undefined","recordHttpRequest","durationSeconds","recordHttpRequestBytes","registerRoute","controllerClass","metadata","validateControllerMetadata","path","requestData","body","activeSpan","controllerName","name","controllerMethod","controllerPath","output","execute","setStatus","code","setAttribute","status","send","err","message","recordException","error","errorType","errorMessage","failure","env","process","ENVIRONMENT","startServer","port","listen","closeServer","close","routerPath","split","ZodMapError","mapCommon","error","type","code","path","join","property","pop","propertyType","expected","receivedValue","received","message","mapInvalidUnion","errors","unionErrors","flat","map","err","issues","item","mapInvalidType","mapErrorsFactory","mapErrors","standardizedErrors","Map","forEach","keyError","get","propertyErrors","push","set","location","Array","from","arr","ZodValidator","zodSchema","validate","requestHttp","errors","data","headersData","error","headersErrors","headers","shape","safeParseAsync","path","push","paramsData","paramsErrors","params","queryData","queryErrors","query","bodyData","bodyErrors","body","length","ValidationError","ZodMapError","mapErrors","zodValidator","schema","request","validator","ZodValidator","validatedRequest","validate","MessageBuilder","Webhook","AsyncLocalStorage","context","AsyncLocalStorage","getContext","getStore","traceId","pino","PinoLogger","pinoLogger","pinoConfig","level","formatters","label","toUpperCase","timestamp","pino","stdTimeFunctions","isoTime","process","env","ENVIRONMENT","transport","target","options","sync","destination","formatLogParams","params","logData","msg","data","error","name","message","stack","code","info","debug","fatal","warn","DiscordLogger","webhook","pinoLogger","options","Webhook","url","PinoLogger","buildStructuredLog","embed","msg","data","error","traceId","getContext","addField","Date","toISOString","JSON","stringify","structed","type","name","message","code","stack","send","info","params","MessageBuilder","setTitle","process","env","ENVIRONMENT","setColor","catch","debug","fatal","warn","logs","SeverityNumber","OtelLogger","otelLogger","pinoLogger","logs","getLogger","process","env","OTEL_SERVICE_NAME","OTEL_SERVICE_VERSION","PinoLogger","emitOtelLog","severityNumber","severityText","params","msg","data","error","attributes","errorType","name","errorMessage","message","errorStack","stack","errorCode","code","emit","body","timestamp","Date","info","SeverityNumber","INFO","ERROR","debug","DEBUG","fatal","FATAL","warn","WARN","Logger","define","env","definitions","definition","test","development","defineProvider","staging","production","ENVIRONMENT","provider","PinoLogger","DiscordLogger","OTEL_ENABLE","OtelLogger","metrics","cpus","monitorEventLoopDelay","PerformanceObserver","v8","OTEL_ENABLED","process","env","OTEL_ENABLE","MetricsManager","meter","metrics","getMeter","OTEL_SERVICE_NAME","OTEL_SERVICE_VERSION","httpRequestsTotal","createCounter","description","unit","httpRequestDuration","createHistogram","httpRequestsErrors","httpResponseSize","dbQueryDuration","dbQueryErrors","dbTransactionsTotal","dbTransactionDuration","dbDeadlocksTotal","httpRequestBytesTotal","processingDuration","processingErrors","httpClientRequestsTotal","httpClientRequestDuration","httpClientErrors","httpClientTimeouts","validationErrors","processCpuSecondsTotal","processMemoryBytes","createObservableGauge","nodejsHeapSizeTotalBytes","nodejsHeapSizeUsedBytes","nodejsEventloopLagSeconds","nodejsEventloopDurationSeconds","nodejsGcDurationSeconds","processOpenFds","processUptimeSeconds","eventLoopMonitor","monitorEventLoopDelay","resolution","previousCpuUsage","cpuUsage","collectionInterval","gcObserver","recordHttpRequest","params","method","route","statusCode","durationSeconds","responseSizeBytes","attributes","status_code","toString","status_class","getStatusClass","environment","ENVIRONMENT","add","record","error_type","recordDbQueryError","isValidDbQueryErrorParams","operation","repository","errorMessage","recordDbQuery","isValidDbQueryParams","console","warn","isNaN","recordDbTransaction","recordDbDeadlock","recordHttpRequestBytes","bytes","recordProcessingDuration","recordProcessingError","errorType","recordHttpClientRequest","url","error","timeout","normalizedUrl","normalizeUrl","recordValidationError","field","startSystemMetricsCollection","intervalMs","enable","observables","filter","obs","undefined","addBatchObservableCallback","observableResult","collectSystemMetrics","setupGCObserver","setInterval","collectPeriodicMetrics","stopSystemMetricsCollection","clearInterval","disable","disconnect","memUsage","memoryUsage","observe","rss","type","heapTotal","heapUsed","external","heapStats","v8","getHeapStatistics","total_heap_size","used_heap_size","lagMs","mean","resourceUsage","maxRSS","uptime","currentCpuUsage","userCpuSeconds","user","cpus","length","systemCpuSeconds","system","mode","eventLoopDuration","PerformanceObserver","list","entry","getEntries","gcType","kind","duration","getGCKindName","entryTypes","gcTypes","urlObj","URL","protocol","host","pathname","split","FastifyOtelInstrumentation","logs","getNodeAutoInstrumentations","OTLPLogExporter","OTLPMetricExporter","OTLPTraceExporter","HttpInstrumentation","CompressionAlgorithm","Resource","BatchLogRecordProcessor","LoggerProvider","PeriodicExportingMetricReader","NodeSDK","TraceIdRatioBasedSampler","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","SEMRESATTRS_DEPLOYMENT_ENVIRONMENT","OtelManager","resource","loggerProvider","sdk","otlpLogExporter","traceExporter","metricExporter","metricReader","sampler","env","createResource","createOtlpLogExporter","createLoggerProvider","createTraceExporter","createSampler","createMetricExporter","createMetricReader","createSdk","Resource","ATTR_SERVICE_NAME","OTEL_SERVICE_NAME","ATTR_SERVICE_VERSION","OTEL_SERVICE_VERSION","SEMRESATTRS_DEPLOYMENT_ENVIRONMENT","ENVIRONMENT","OTLPLogExporter","url","OTEL_EXPORTER_OTLP_ENDPOINT","compression","CompressionAlgorithm","GZIP","provider","LoggerProvider","configureLogProcessors","logs","setGlobalLoggerProvider","addLogRecordProcessor","BatchLogRecordProcessor","OTLPTraceExporter","DEVELOPMENT_SAMPLE_RATE","PRODUCTION_SAMPLE_RATE","sampleRate","TraceIdRatioBasedSampler","OTLPMetricExporter","PeriodicExportingMetricReader","exporter","exportIntervalMillis","exportTimeoutMillis","NodeSDK","instrumentations","getNodeAutoInstrumentations","enabled","HttpInstrumentation","FastifyOtelInstrumentation","registerOnInitialization","initialize","start","error","console","shutdown","forceFlush","getLoggerProvider","getSdk","trace","MILLISECONDS_TO_SECONDS","ROUNDING_PRECISION","MAX_SANITIZED_KEYS","EXCLUDED_METHODS","Set","TRACER_NAME","process","env","OTEL_SERVICE_NAME","TRACER_VERSION","OTEL_SERVICE_VERSION","OTEL_ENABLED","OTEL_ENABLE","Tracer","instance","getTracer","trace","Metrics","getMetrics","DependencyContainer","resolveToken","BaseFullInstrumentationStrategy","tracer","metrics","metricsRecorder","spanBuilder","logBuilder","instrumentMethod","originalMethod","context","args","timer","createTimer","span","createSpan","logOperationStart","result","call","recordSuccess","error","recordFailure","durationSeconds","getDurationSeconds","durationMs","roundDuration","logSuccess","finalizeSpanSuccess","logger","info","msg","buildSuccessMessage","data","buildSuccessLogData","normalizedError","normalizeError","recordError","logError","finalizeSpanError","buildErrorMessage","buildErrorLogData","buildStartMessage","buildStartLogData","BaseLogsOnlyInstrumentationStrategy","startTime","Date","now","Error","String","Math","round","sanitizeArgs","length","map","sanitizeArg","arg","undefined","sanitizeObject","obj","keys","Object","_truncated","_keyCount","_keys","slice","_error","resolveLogger","PinoLogger","copyReflectMetadata","source","target","injectMetadata","Reflect","getOwnMetadata","defineMetadata","preserveClassName","className","defineProperty","value","writable","configurable","getInstrumentableMethods","methods","prototype","getPrototypeOf","current","propertyNames","getOwnPropertyNames","name","shouldExcludeMethod","isMethod","includes","push","has","startsWith","descriptor","getOwnPropertyDescriptor","instrumentInstanceMethods","contextName","strategy","createContext","methodsToInstrument","console","warn","methodName","wrappedMethod","enumerable","SpanKind","SpanStatusCode","ProcessingMetricsRecorder","metrics","recordSuccess","context","durationSeconds","recordProcessingDuration","operation","recordError","error","recordProcessingError","errorType","name","ProcessingSpanBuilder","serviceName","createSpan","tracer","procContext","spanName","buildSpanName","startSpan","kind","SpanKind","INTERNAL","attributes","className","toLowerCase","finalizeSpanSuccess","span","setStatus","code","SpanStatusCode","OK","setAttribute","end","finalizeSpanError","ERROR","message","recordException","ProcessingLogBuilder","buildStartMessage","buildStartLogData","args","sanitizeArgs","buildSuccessMessage","buildSuccessLogData","durationMs","status","buildErrorMessage","buildErrorLogData","errorMessage","errorName","ProcessingFullInstrumentationStrategy","BaseFullInstrumentationStrategy","ProcessingLogsOnlyInstrumentationStrategy","BaseLogsOnlyInstrumentationStrategy","ProcessingInstrumentationStrategyFactory","create","OTEL_ENABLED","Tracer","getTracer","Metrics","getMetrics","Instrumentation","options","constructor","TRACER_NAME","InstrumentedClass","logger","resolveLogger","strategy","instrumentInstanceMethods","copyReflectMetadata","preserveClassName","SpanKind","SpanStatusCode","DEFAULT_DB_SYSTEM","RepositoryMetricsRecorder","metrics","recordSuccess","context","durationSeconds","repoContext","recordDbQuery","operation","repository","repositoryName","recordError","error","recordDbQueryError","errorMessage","message","RepositorySpanBuilder","dbSystem","createSpan","tracer","spanName","buildSpanName","startSpan","kind","SpanKind","CLIENT","attributes","toLowerCase","finalizeSpanSuccess","span","setStatus","code","SpanStatusCode","OK","setAttribute","end","finalizeSpanError","ERROR","recordException","RepositoryLogBuilder","buildStartMessage","buildStartLogData","args","sanitizeArgs","buildSuccessMessage","buildSuccessLogData","durationMs","status","buildErrorMessage","buildErrorLogData","errorName","name","RepositoryFullInstrumentationStrategy","BaseFullInstrumentationStrategy","RepositoryLogsOnlyInstrumentationStrategy","BaseLogsOnlyInstrumentationStrategy","RepositoryInstrumentationStrategyFactory","create","OTEL_ENABLED","Tracer","getTracer","Metrics","getMetrics","RepositoryInstrumentation","options","constructor","InstrumentedRepository","logger","resolveLogger","strategy","instrumentInstanceMethods","copyReflectMetadata","preserveClassName","z","require","config","Object","assign","process","argv","baseEnvSchema","z","object","NODE_ENV","enum","default","ENVIRONMENT","PORT","coerce","number","DISCORD_WEBHOOK_URL","string","optional","OTEL_ENABLE","transform","val","OTEL_EXPORTER_OTLP_ENDPOINT","url","OTEL_SERVICE_NAME","OTEL_SERVICE_VERSION"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/dotenv/package.json","../node_modules/dotenv/lib/main.js","../node_modules/dotenv/lib/env-options.js","../node_modules/dotenv/lib/cli-options.js","../src/core/decorators/dependency-container.ts","../src/core/configs/global-listener.ts","../src/core/errors/api-common-error.ts","../src/core/errors/application-error.ts","../src/core/errors/conflict-error.ts","../src/core/errors/domain-error.ts","../src/core/errors/infra-error.ts","../src/core/errors/validation-error.ts","../src/core/http/base-controller.ts","../src/core/decorators/controller-http-decorator.ts","../src/core/entities/unique-object-id.ts","../src/core/entities/entity-object.ts","../src/core/entities/aggregate-object-root.ts","../src/core/entities/unique-entity-id.ts","../src/core/entities/entity.ts","../src/core/entities/aggregate-root.ts","../src/core/entities/value-object.ts","../src/core/entities/watched-list.ts","../src/core/http/get-take-and-skip.ts","../src/infra/adapters/http/fastify-adapter.ts","../src/infra/adapters/observability/otel/span-manager.ts","../src/infra/adapters/http/validate-controller-metadata.ts","../src/infra/adapters/validators/zod/zod-map-error.ts","../src/infra/adapters/validators/zod/index.ts","../src/infra/adapters/validators/zod/zod-validator.ts","../src/infra/adapters/logger/discord-logger.ts","../src/infra/adapters/observability/node-context/context.ts","../src/infra/adapters/logger/pino-logger.ts","../src/infra/adapters/logger/otel-logger.ts","../src/infra/adapters/logger/logger.ts","../src/infra/adapters/observability/otel/metric.ts","../src/infra/adapters/observability/otel/otel.ts","../src/infra/decorators/base-instrumentation-strategy.ts","../src/infra/decorators/processing-instrumentation.ts","../src/infra/decorators/repository-instrumentation.ts","../src/infra/env/index.ts","../node_modules/dotenv/config.js"],"sourcesContent":["{\n \"name\": \"dotenv\",\n \"version\": \"16.5.0\",\n \"description\": \"Loads environment variables from .env file\",\n \"main\": \"lib/main.js\",\n \"types\": \"lib/main.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/main.d.ts\",\n \"require\": \"./lib/main.js\",\n \"default\": \"./lib/main.js\"\n },\n \"./config\": \"./config.js\",\n \"./config.js\": \"./config.js\",\n \"./lib/env-options\": \"./lib/env-options.js\",\n \"./lib/env-options.js\": \"./lib/env-options.js\",\n \"./lib/cli-options\": \"./lib/cli-options.js\",\n \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n \"lint\": \"standard\",\n \"pretest\": \"npm run lint && npm run dts-check\",\n \"test\": \"tap run --allow-empty-coverage --disable-coverage --timeout=60000\",\n \"test:coverage\": \"tap run --show-full-coverage --timeout=60000 --coverage-report=lcov\",\n \"prerelease\": \"npm test\",\n \"release\": \"standard-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/motdotla/dotenv.git\"\n },\n \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n \"funding\": \"https://dotenvx.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \".env\",\n \"environment\",\n \"variables\",\n \"config\",\n \"settings\"\n ],\n \"readmeFilename\": \"README.md\",\n \"license\": \"BSD-2-Clause\",\n \"devDependencies\": {\n \"@types/node\": \"^18.11.3\",\n \"decache\": \"^4.6.2\",\n \"sinon\": \"^14.0.1\",\n \"standard\": \"^17.0.0\",\n \"standard-version\": \"^9.5.0\",\n \"tap\": \"^19.2.0\",\n \"typescript\": \"^4.8.4\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"browser\": {\n \"fs\": false\n }\n}\n","const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n const vaultPath = _vaultPath(options)\n\n // Parse .env.vault\n const result = DotenvModule.configDotenv({ path: vaultPath })\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _warn (message) {\n console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n const debug = Boolean(options && options.debug)\n if (debug) {\n _debug('Loading env from encrypted .env.vault')\n }\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n const debug = Boolean(options && options.debug)\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsedAll, options)\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n }\n }\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n","// ../config.js accepts options via environment variables\nconst options = {}\n\nif (process.env.DOTENV_CONFIG_ENCODING != null) {\n options.encoding = process.env.DOTENV_CONFIG_ENCODING\n}\n\nif (process.env.DOTENV_CONFIG_PATH != null) {\n options.path = process.env.DOTENV_CONFIG_PATH\n}\n\nif (process.env.DOTENV_CONFIG_DEBUG != null) {\n options.debug = process.env.DOTENV_CONFIG_DEBUG\n}\n\nif (process.env.DOTENV_CONFIG_OVERRIDE != null) {\n options.override = process.env.DOTENV_CONFIG_OVERRIDE\n}\n\nif (process.env.DOTENV_CONFIG_DOTENV_KEY != null) {\n options.DOTENV_KEY = process.env.DOTENV_CONFIG_DOTENV_KEY\n}\n\nmodule.exports = options\n","const re = /^dotenv_config_(encoding|path|debug|override|DOTENV_KEY)=(.+)$/\n\nmodule.exports = function optionMatcher (args) {\n return args.reduce(function (acc, cur) {\n const matches = cur.match(re)\n if (matches) {\n acc[matches[1]] = matches[2]\n }\n return acc\n }, {})\n}\n","import 'reflect-metadata'\n\ntype Class<T = any> = new (...args: any[]) => T\n\ntype Registration =\n | { type: 'class'; myClass: Class; singleton: boolean }\n | { type: 'value'; value: any }\n\nexport class DependencyContainer {\n static registry = new Map<string, Registration>()\n static singletons = new Map<string, any>()\n\n static register<T>(\n token: string,\n myClass: Class<T>,\n options: { singleton: boolean }\n ) {\n this.registry.set(token, {\n type: 'class',\n myClass,\n singleton: options.singleton,\n })\n }\n\n static registerValue<T>(token: string, value: T) {\n this.registry.set(token, { type: 'value', value })\n }\n\n static resolve<T>(target: Class<T>): T {\n const injectMetadata: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', target) || {}\n\n const paramCount = Object.keys(injectMetadata).length\n\n const params = Array.from({ length: paramCount }, (_, index) => {\n const token = injectMetadata[index]\n if (!token) {\n throw new Error(\n `Missing @Inject token for parameter index ${index} in ${target.name}`\n )\n }\n return this.resolveToken(token)\n })\n\n return new target(...params)\n }\n\n static resolveToken(token: string): any {\n const registration = this.registry.get(token)\n\n if (!registration) {\n throw new Error(\n `\"${token}\" not registered. Please register it in the container.`\n )\n }\n\n if (registration.type === 'value') {\n return registration.value\n }\n\n const { myClass, singleton } = registration\n\n if (singleton) {\n if (!this.singletons.has(token)) {\n const instance = this.resolve(myClass)\n this.singletons.set(token, instance)\n }\n return this.singletons.get(token)\n }\n\n return this.resolve(myClass)\n }\n}\n\nexport function Inject(token: string): ParameterDecorator {\n return (\n target: object,\n _propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void => {\n const constructor =\n typeof target === 'function' ? target : target.constructor\n\n const existingInjectedParams: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', constructor) || {}\n\n existingInjectedParams[parameterIndex] = token\n\n Reflect.defineMetadata('inject:params', existingInjectedParams, constructor)\n }\n}\n","import type { ILogger } from 'infra/adapters/logger/logger'\n\nimport { DependencyContainer } from '../../core/decorators/dependency-container'\n\nexport class GlobalListener {\n protected readonly logger: ILogger\n\n constructor(private readonly callback: () => Promise<void>) {\n this.logger = DependencyContainer.resolveToken('Logger')\n }\n\n register() {\n process.on('uncaughtException', (err) => {\n this.logger.fatal({\n msg: 'Uncaught exception',\n data: {\n env: process.env.ENVIRONMENT,\n },\n error: new Error(err.message),\n })\n\n process.exit(1)\n })\n\n process.on('unhandledRejection', (reason) => {\n if (reason instanceof Error) {\n this.logger.fatal({\n msg: 'Unhandled rejection',\n data: {\n env: process.env.ENVIRONMENT,\n },\n error: reason,\n })\n } else {\n this.logger.fatal({\n msg: 'Unhandled rejection',\n data: {\n env: process.env.ENVIRONMENT,\n },\n error: new Error(String(reason)),\n })\n }\n\n process.exit(1)\n })\n\n process.on('SIGTERM', async () => {\n await this.callback()\n process.exit(0)\n })\n\n process.on('SIGINT', async () => {\n await this.callback()\n process.exit(0)\n })\n }\n}\n","export type PropertiesError = {\n receivedValue?: any\n type: string\n message: string\n property: string | number | undefined\n propertyType?: string\n path?: string\n}\n\nexport type CommonError = {\n location: string\n propertyErrors?: PropertiesError[]\n}\n\nexport type ApiCommonError = {\n code: number\n occurredAt: Date\n message: string\n errorCode: string\n errors?: CommonError[]\n}\n\nexport enum ApiErrorEnum {\n DOMAIN = 'ERR001',\n APPLICATION = 'ERR002',\n INFRA = 'ERR003',\n HTTP_CLIENT = 'ERR004',\n VALIDATOR = 'ERR005',\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class ApplicationError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.APPLICATION,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\ntype ConflictProps = { id: string; [key: string]: unknown }\n\nexport default class ConflictError<T extends ConflictProps> extends Error {\n props: ApiCommonError\n conflictProps: T | T[]\n\n constructor(conflictProps: T | T[]) {\n super('Resource already exists.')\n this.conflictProps = conflictProps\n this.props = {\n code: 409,\n errorCode: ApiErrorEnum.APPLICATION,\n message: this.message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class DomainError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.DOMAIN,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class InfraError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.INFRA,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import {\n type ApiCommonError,\n ApiErrorEnum,\n type CommonError,\n} from './api-common-error'\n\nexport default class ValidationError extends Error {\n props: ApiCommonError\n\n constructor(errors: CommonError[]) {\n super('Validation Error')\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.VALIDATOR,\n message: 'Validation Error',\n occurredAt: new Date(),\n errors,\n }\n }\n}\n","import type { ILogger } from 'infra/adapters/logger/logger'\n\nimport { DependencyContainer } from '../../core/decorators/dependency-container'\nimport ApplicationError from '../../core/errors/application-error'\nimport ConflictError from '../../core/errors/conflict-error'\nimport DomainError from '../../core/errors/domain-error'\nimport InfraError from '../../core/errors/infra-error'\nimport ValidationError from '../../core/errors/validation-error'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\n\nimport 'reflect-metadata'\n\ntype AnyObject = Record<string, any>\n\nexport type Request = {\n body: AnyObject\n params: AnyObject\n headers: AnyObject\n query: AnyObject\n}\n\nexport type Response = {\n code: number\n data: any\n}\n\nexport type ContextError = {\n env: string\n user?: {\n id?: string\n name?: string\n email?: string\n }\n request?: {\n method?: string\n requestId?: string\n url?: string\n headers?: any\n query?: any\n body?: any\n params?: any\n }\n}\n\nexport abstract class BaseController {\n protected readonly logger: ILogger\n\n abstract handle<T>(request: T | Request): Promise<Response>\n\n constructor() {\n this.logger = DependencyContainer.resolveToken('Logger')\n }\n\n protected success<T>(dto?: T): Response {\n return {\n code: 200,\n data: { data: dto },\n }\n }\n\n protected noContent(): Response {\n return {\n code: 204,\n data: undefined,\n }\n }\n\n protected created<T>(dto?: T): Response {\n return {\n code: 201,\n data: dto ? { data: dto } : undefined,\n }\n }\n\n protected paginated<T>(dto?: T): Response {\n return {\n code: 200,\n data: dto,\n }\n }\n\n protected buildContextError(request: Request): ContextError {\n return {\n env: process.env.ENVIRONMENT as string,\n request: {\n body: request.body,\n headers: request.headers,\n params: request.params,\n query: request.query,\n },\n }\n }\n\n public async failure(error: Error, context: ContextError): Promise<Response> {\n if (error instanceof ConflictError) {\n return {\n code: error.props.code,\n data: {\n message: error.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n items: Array.isArray(error.conflictProps)\n ? error.conflictProps\n : [error.conflictProps],\n },\n }\n }\n\n if (\n error instanceof DomainError ||\n error instanceof ApplicationError ||\n error instanceof InfraError\n ) {\n return {\n code: error.props.code,\n data: {\n message: error.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n },\n }\n }\n\n if (error instanceof ValidationError) {\n return {\n code: error.props.code,\n data: {\n message: error.props.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n errors: error.props.errors,\n },\n }\n }\n\n this.logger.fatal({\n msg: 'Server failed. Contact the administrator!',\n data: context,\n error,\n })\n\n return {\n code: 500,\n data: {\n code: 500,\n message: 'Server failed. Contact the administrator!',\n },\n }\n }\n\n public async execute(request: Request): Promise<Response> {\n const routeMetadata = Reflect.getMetadata('route', this.constructor)\n\n if (!routeMetadata) {\n throw new InfraError('Route metadata not found.')\n }\n\n const middlewares: MiddlewareFunction[] = routeMetadata.middlewares || []\n\n let processedRequest = request\n\n if (middlewares.length) {\n for (const middleware of middlewares) {\n processedRequest = await middleware(processedRequest)\n }\n }\n\n return await this.handle(processedRequest)\n }\n}\n","import { BaseController } from '../../core/http/base-controller'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\nimport type { MethodType } from '../http/http'\n\ntype Props = {\n method: MethodType\n path: string\n middlewares?: MiddlewareFunction[]\n}\n\nexport function Controller({\n method,\n path,\n middlewares = [],\n}: Props): ClassDecorator {\n return (target: any) => {\n if (!(target.prototype instanceof BaseController)) {\n throw new Error(\n `The class ${target.name} should extends abstract class BaseController`\n )\n }\n\n Reflect.defineMetadata(\n 'route',\n { method, path: `/api/${path}`, middlewares },\n target\n )\n }\n}\n","import { ObjectId } from 'bson'\n\nexport class UniqueObjectId {\n private value: ObjectId\n\n constructor(value?: string) {\n this.value = new ObjectId(value)\n }\n\n toString() {\n return this.value.toString()\n }\n\n toValue() {\n return this.value.toString()\n }\n\n public equals(id: UniqueObjectId) {\n return id.toValue() === this.toValue()\n }\n}\n","import type { CommonDTO } from './common-dto'\nimport { UniqueObjectId } from './unique-object-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class EntityObject<Props> {\n private _id: UniqueObjectId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: UniqueObjectId) {\n this._id = id\n }\n\n get createdAt() {\n return this.props.createdAt\n }\n\n set createdAt(date: Date) {\n this.props.createdAt = date\n }\n\n get updatedAt(): Date | undefined | null {\n return this.props.updatedAt\n }\n\n public touch() {\n this.props.updatedAt = new Date()\n }\n\n protected constructor(props: PropsWithCommonDTO<Props>, id?: UniqueObjectId) {\n this._id = id ?? new UniqueObjectId(id)\n this.props = props\n }\n\n public equals(entity: EntityObject<Props>) {\n if (entity === this) {\n return true\n }\n\n if (entity.id === this._id) {\n return true\n }\n\n return false\n }\n}\n","import { EntityObject } from './entity-object'\n\nexport abstract class AggregateObjectRoot<Props> extends EntityObject<Props> {}\n","import { randomUUID } from 'node:crypto'\n\nexport class UniqueEntityId {\n private value: string\n\n constructor(value?: string) {\n this.value = value ?? randomUUID()\n }\n\n toString() {\n return this.value\n }\n\n toValue() {\n return this.value\n }\n\n public equals(id: UniqueEntityId) {\n return id.toValue() === this.toValue()\n }\n}\n","import { CommonDTO } from './common-dto'\nimport { UniqueEntityId } from './unique-entity-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class Entity<Props> {\n private _id: UniqueEntityId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: UniqueEntityId) {\n this._id = id\n }\n\n get createdAt() {\n return this.props.createdAt\n }\n\n set createdAt(date: Date) {\n this.props.createdAt = date\n }\n\n get updatedAt(): Date | undefined | null {\n return this.props.updatedAt\n }\n\n public touch() {\n this.props.updatedAt = new Date()\n }\n\n protected constructor(props: PropsWithCommonDTO<Props>, id?: UniqueEntityId) {\n this._id = id ?? new UniqueEntityId(id)\n this.props = props\n }\n\n public equals(entity: Entity<any>) {\n if (entity === this) {\n return true\n }\n\n if (entity.id === this._id) {\n return true\n }\n\n return false\n }\n}\n","import { Entity } from './entity'\n\nexport abstract class AggregateRoot<Props> extends Entity<Props> {}\n","export abstract class ValueObject<Props> {\n protected props: Props\n\n protected constructor(props: Props) {\n this.props = props\n }\n}\n","export abstract class WatchedList<T> {\n public currentItems: T[]\n private initial: T[]\n private new: T[]\n private removed: T[]\n private updated: T[]\n\n constructor(initialItems?: T[]) {\n this.currentItems = initialItems || []\n this.initial = initialItems || []\n this.new = []\n this.removed = []\n this.updated = []\n }\n\n abstract compareItems(a: T, b: T): boolean\n\n public getItems(): T[] {\n return this.currentItems\n }\n\n public getNewItems(): T[] {\n return this.new\n }\n\n public getRemovedItems(): T[] {\n return this.removed\n }\n\n public getUpdatedItems(): T[] {\n return this.updated\n }\n\n public addUpdatedItem(item: T) {\n return this.updated.push(item)\n }\n\n private isCurrentItem(item: T): boolean {\n return (\n this.currentItems.filter((v: T) => this.compareItems(item, v)).length !==\n 0\n )\n }\n\n private isNewItem(item: T): boolean {\n return this.new.filter((v: T) => this.compareItems(item, v)).length !== 0\n }\n\n private isRemovedItem(item: T): boolean {\n return (\n this.removed.filter((v: T) => this.compareItems(item, v)).length !== 0\n )\n }\n\n private removeFromNew(item: T): void {\n this.new = this.new.filter((v) => !this.compareItems(v, item))\n }\n\n private removeFromCurrent(item: T): void {\n this.currentItems = this.currentItems.filter(\n (v) => !this.compareItems(item, v)\n )\n }\n\n private removeFromRemoved(item: T): void {\n this.removed = this.removed.filter((v) => !this.compareItems(item, v))\n }\n\n private wasAddedInitially(item: T): boolean {\n return (\n this.initial.filter((v: T) => this.compareItems(item, v)).length !== 0\n )\n }\n\n public exists(item: T): boolean {\n return this.isCurrentItem(item)\n }\n\n public add(item: T): void {\n if (this.isRemovedItem(item)) {\n this.removeFromRemoved(item)\n }\n\n if (!this.isNewItem(item) && !this.wasAddedInitially(item)) {\n this.new.push(item)\n }\n\n if (!this.isCurrentItem(item)) {\n this.currentItems.push(item)\n }\n }\n\n public remove(item: T): void {\n this.removeFromCurrent(item)\n\n if (this.isNewItem(item)) {\n this.removeFromNew(item)\n\n return\n }\n\n if (!this.isRemovedItem(item)) {\n this.removed.push(item)\n }\n }\n\n public update(items: T[]): void {\n const newItems = items.filter((a) => {\n return !this.getItems().some((b) => this.compareItems(a, b))\n })\n\n const removedItems = this.getItems().filter((a) => {\n return !items.some((b) => this.compareItems(a, b))\n })\n\n const updatedItems = items.filter(\n (item) =>\n !newItems.some(\n (a) =>\n this.compareItems(item, a) &&\n !removedItems.some((b) => this.compareItems(item, b))\n )\n )\n\n this.currentItems = items\n this.new = newItems\n this.removed = removedItems\n this.updated = updatedItems\n }\n}\n","export function getTakeAndSkip(size: string, page: string) {\n const take = size ? Number(size) : 20\n const skip = page ? Number(page) : 1\n\n return { take, skip }\n}\n","import cors from '@fastify/cors'\nimport { Inject } from 'core/decorators/dependency-container'\nimport type { BaseController } from 'core/http/base-controller'\nimport type { IHttp } from 'core/http/http'\nimport fastify, { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'\nimport { randomUUID } from 'node:crypto'\nimport qs from 'qs'\n\nimport type { ILogger } from '../logger/logger'\nimport type { IMetricsManager } from '../observability/otel/metric'\nimport { SpanManager } from '../observability/otel/span-manager'\n\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\ntype AnyObject = Record<string, any>\n\ntype Request = {\n body: AnyObject\n params: AnyObject\n headers: AnyObject\n query: AnyObject\n}\n\nexport class FastifyAdapter implements IHttp {\n readonly instance: FastifyInstance\n\n constructor(\n @Inject('Logger') private logger: ILogger,\n @Inject('Metrics') private metrics?: IMetricsManager\n ) {\n this.instance = fastify({\n bodyLimit: 10 * 1024 * 1024,\n querystringParser: (str) => qs.parse(str),\n requestIdHeader: 'x-request-id',\n requestIdLogLabel: 'request-id',\n genReqId: (req) =>\n (req.headers['x-request-id'] as string) || randomUUID(),\n })\n\n this.instance.register(cors)\n\n this.instance.addHook('onRequest', async (request) => {\n const span = SpanManager.getActiveSpan()\n\n span.setAttributes({\n httpMethod: request.method,\n httpUrl: request.url,\n httpRoute: request.routeOptions.url || request.url,\n httpHost: request.hostname,\n httpScheme: request.protocol,\n httpUserAgent: request.headers['user-agent'] || 'unknown',\n httpRequestId: request.id,\n httpClientIp: request.ip,\n })\n\n this.logger.info({\n msg: 'http-in',\n data: {\n requestId: request.id,\n httpUrl: request.url,\n httpMethod: request.method,\n httpHeaders: request?.headers,\n httpParams: request?.params,\n httpQuery: request?.query,\n },\n })\n })\n\n this.instance.addHook('onResponse', async (request, reply) => {\n const route = this.getNormalizedRoute(request)\n const span = SpanManager.getActiveSpan()\n const responseTime = reply.elapsedTime || 0\n\n span.setAttributes({\n httpStatusCode: reply.statusCode,\n })\n\n this.logger.info({\n msg: 'http-out',\n data: {\n requestId: request.id,\n httpRoute: route,\n httpMethod: request.method,\n responseTimeMs: Math.round(responseTime),\n statusCode: reply.statusCode,\n },\n })\n\n if (this.metrics) {\n const responseSizeBytes = reply.getHeader('content-length')\n ? parseInt(reply.getHeader('content-length') as string, 10)\n : undefined\n\n this.metrics.recordHttpRequest({\n method: request.method,\n route,\n statusCode: reply.statusCode,\n durationSeconds: responseTime / 1000,\n responseSizeBytes,\n })\n\n if (responseSizeBytes) {\n this.metrics.recordHttpRequestBytes(responseSizeBytes, {\n method: request.method,\n route,\n statusCode: reply.statusCode,\n })\n }\n }\n })\n }\n\n registerRoute(controllerClass: BaseController): void {\n const { metadata } = validateControllerMetadata(controllerClass)\n\n this.instance[metadata.method](\n metadata.path,\n async (request: FastifyRequest, reply: FastifyReply) => {\n const requestData = {\n body: request.body,\n params: request.params,\n headers: request.headers,\n query: request.query,\n } as Request\n\n const activeSpan = SpanManager.getActiveSpan()\n\n try {\n activeSpan.setAttributes({\n controllerName: controllerClass.constructor.name,\n controllerMethod: metadata.method,\n controllerPath: metadata.path,\n })\n\n const output = await controllerClass.execute(requestData)\n\n activeSpan.setStatus({ code: 1 })\n activeSpan.setAttribute('httpStatusCode', output.code || 200)\n activeSpan.setAttribute(\n 'responseCode',\n output.data?.code || 'no-code'\n )\n\n return reply.status(output.code || 200).send(\n output.data || {\n code: 'B001',\n }\n )\n } catch (err: any) {\n activeSpan.setStatus({\n code: 2,\n message: err.message,\n })\n\n activeSpan.recordException(err)\n\n activeSpan.setAttributes({\n error: true,\n errorType: err.name,\n errorMessage: err.message,\n })\n\n const error = await controllerClass.failure(err, {\n env: process.env.ENVIRONMENT as string,\n request: {\n body: requestData.body,\n headers: requestData.headers,\n params: request.params,\n query: requestData.query,\n url: metadata.path,\n method: metadata.method,\n },\n })\n\n activeSpan.setAttribute('httpStatusCode', error.code || 500)\n activeSpan.setAttribute('responseCode', error.data?.code || 'B002')\n\n return reply.status(error.code || 500).send(\n error.data || {\n code: 'B002',\n }\n )\n }\n }\n )\n }\n\n async startServer(port: number): Promise<void> {\n await this.instance.listen({ port })\n this.logger.info({\n msg: `Server listening on port ${port}`,\n })\n }\n\n async closeServer() {\n this.logger.info({\n msg: 'Server closing...',\n })\n await this.instance.close()\n }\n\n private getNormalizedRoute(request: FastifyRequest): string {\n return (\n (request as any).routerPath ||\n request.routeOptions?.url ||\n request.url.split('?')[0]\n )\n }\n}\n","import { Span, trace } from '@opentelemetry/api'\n\nconst OTEL_ENABLED = process.env.OTEL_ENABLE === 'true'\n\nclass NullSpan {\n setAttributes(): void {\n return\n }\n\n setAttribute(): void {\n return\n }\n\n setStatus(): void {\n return\n }\n\n recordException(): void {\n return\n }\n}\n\nclass SpanManager {\n static getActiveSpan(): Span | NullSpan {\n if (!OTEL_ENABLED) {\n return new NullSpan()\n }\n\n const span = trace.getActiveSpan()\n return span || new NullSpan()\n }\n\n static isEnabled(): boolean {\n return OTEL_ENABLED\n }\n}\n\nexport { NullSpan, SpanManager }\n","import { BaseController } from '../../../core/http/base-controller'\nimport type { MethodType } from '../../../core/http/http'\n\nimport 'reflect-metadata'\n\nexport function validateControllerMetadata(controller: BaseController) {\n const metadata = Reflect.getMetadata('route', controller.constructor) as {\n method: MethodType\n path: string\n }\n\n if (!metadata) {\n throw new Error(\n `Controller ${controller.constructor.name} not have metadata. Need to add decorator.`\n )\n }\n\n return {\n metadata,\n }\n}\n","import type { ZodIssue } from 'zod'\n\nimport type {\n CommonError,\n PropertiesError,\n} from '../../../../core/errors/api-common-error'\n\ntype ZodError = ZodIssue & {\n expected: string\n received: string\n}\n\ntype ZodInvalidUnion = ZodError & {\n code: 'invalid_union'\n}\n\nexport default class ZodMapError {\n private static mapCommon(error: ZodError): PropertiesError {\n return {\n type: error.code,\n path: error.path.join('.'),\n property: error.path.pop(),\n propertyType: error.expected,\n receivedValue: error.received,\n message: error.message,\n }\n }\n\n private static mapInvalidUnion(error: ZodInvalidUnion): PropertiesError[] {\n const [errors] = error.unionErrors\n .flat()\n .map((err) => err.issues.map((item: any) => this.mapCommon(item)))\n\n return errors\n }\n\n private static mapInvalidType(error: ZodError): PropertiesError[] {\n return [this.mapCommon(error)]\n }\n\n private static mapErrorsFactory(error: ZodError): PropertiesError[] {\n if (error.code === 'invalid_union') {\n return this.mapInvalidUnion(error)\n }\n\n return this.mapInvalidType(error)\n }\n\n static mapErrors(errors: ZodIssue[][]) {\n const standardizedErrors = new Map<string | number, CommonError>()\n\n errors.flat().forEach((error) => {\n const keyError = standardizedErrors.get(error.path[0])\n\n if (keyError) {\n if (!keyError.propertyErrors) {\n keyError.propertyErrors = []\n }\n\n keyError.propertyErrors.push(\n ...this.mapErrorsFactory(error as ZodError)\n )\n\n return\n }\n\n standardizedErrors.set(error.path[0], {\n location: error.path[0],\n propertyErrors: Array.from([\n ...this.mapErrorsFactory(error as ZodError),\n ]),\n } as CommonError)\n })\n\n return Array.from(standardizedErrors, ([, arr]) => ({\n ...arr,\n })).flat()\n }\n}\n","import { ZodEffects, type ZodError, ZodObject } from 'zod'\n\nimport ValidationError from '../../../../core/errors/validation-error'\nimport IValidationHTTP, { RequestHttp } from '../../../../core/http/validator'\n\nimport ZodMapError from './zod-map-error'\nimport { zodValidator } from './zod-validator'\n\ntype SchemaDefinition = {\n headers: ZodObject<Record<string, any>>\n params: ZodObject<Record<string, any>>\n query: ZodObject<Record<string, any>>\n body:\n | ZodObject<Record<string, any>>\n | ZodEffects<ZodObject<Record<string, any>>>\n}\n\ntype ZodSchemaObject = ZodObject<SchemaDefinition>\n\nexport default class ZodValidator implements IValidationHTTP {\n constructor(private zodSchema: ZodSchemaObject) {}\n\n async validate<T>(requestHttp: RequestHttp): Promise<T> {\n const errors = []\n\n const {\n data: headersData = {},\n error: headersErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.headers\n ? await this.zodSchema.shape.headers.safeParseAsync(requestHttp.headers, {\n path: ['headers'],\n })\n : {}\n\n if (headersErrors?.errors) {\n errors.push(headersErrors?.errors)\n }\n\n const {\n data: paramsData = {},\n error: paramsErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.params\n ? await this.zodSchema.shape.params.safeParseAsync(requestHttp.params, {\n path: ['params'],\n })\n : {}\n\n if (paramsErrors?.errors) {\n errors.push(paramsErrors?.errors)\n }\n\n const {\n data: queryData = {},\n error: queryErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.query\n ? await this.zodSchema.shape.query.safeParseAsync(requestHttp.query, {\n path: ['query'],\n })\n : {}\n\n if (queryErrors?.errors) {\n errors.push(queryErrors?.errors)\n }\n\n const {\n data: bodyData = {},\n error: bodyErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.body\n ? await this.zodSchema.shape.body.safeParseAsync(requestHttp.body, {\n path: ['body'],\n })\n : {}\n\n if (bodyErrors?.errors) {\n errors.push(bodyErrors?.errors)\n }\n\n if (errors.length) {\n throw new ValidationError(ZodMapError.mapErrors(errors))\n }\n\n return {\n body: bodyData,\n headers: headersData,\n params: paramsData,\n query: queryData,\n } as T\n }\n}\n\nexport { zodValidator }\n","import { z } from 'zod'\n\nimport { Request } from '../../../../core/http/base-controller'\n\nimport ZodValidator from './index'\n\nexport type ZodSchema = z.ZodObject<{\n headers: z.ZodObject<Record<string, any>>\n params: z.ZodObject<Record<string, any>>\n query: z.ZodObject<Record<string, any>>\n body:\n | z.ZodObject<Record<string, any>>\n | z.ZodEffects<z.ZodObject<Record<string, any>>>\n}>\n\nexport type MiddlewareFunction = (request: Request) => Promise<Request>\n\nexport function zodValidator(schema: ZodSchema): MiddlewareFunction {\n return async (request: Request): Promise<Request> => {\n const validator = new ZodValidator(schema)\n const validatedRequest = await validator.validate<Request>(request)\n return validatedRequest\n }\n}\n","import { MessageBuilder, Webhook } from 'discord-webhook-node'\n\nimport { Inject } from '../../../core/decorators/dependency-container'\nimport { getContext } from '../observability/node-context/context'\n\nimport type { ILogger, LogParams } from './logger'\nimport { PinoLogger } from './pino-logger'\n\ntype DiscordOptions = {\n url: string\n env: string\n}\n\nexport class DiscordLogger implements ILogger {\n private webhook: Webhook\n private pinoLogger: PinoLogger\n\n constructor(\n @Inject('DiscordConfig') private readonly options: DiscordOptions\n ) {\n this.webhook = new Webhook(this.options.url)\n this.pinoLogger = new PinoLogger()\n }\n\n private async buildStructuredLog(\n embed: MessageBuilder,\n { msg, data, error }: LogParams\n ) {\n const traceId = getContext().traceId\n\n embed\n .addField('timestamp:', `\\`\\`\\`${new Date().toISOString()}\\`\\`\\``)\n .addField('traceId:', `\\`\\`\\`${traceId}\\`\\`\\``)\n .addField('Message:', `\\`\\`\\`${msg}\\`\\`\\``)\n .addField('Data:', '```json\\n' + JSON.stringify(data, null, 2) + '\\n```')\n\n if (error) {\n const structed = {\n type: error.name,\n message: error.message,\n code: (error as any).code,\n stack: error.stack,\n }\n\n embed.addField(\n 'error:',\n '```json\\n' + JSON.stringify(structed, null, 2) + '\\n```'\n )\n }\n\n await this.webhook.send(embed)\n }\n\n info(params: LogParams): void {\n this.pinoLogger.info(params)\n\n const embed = new MessageBuilder()\n .setTitle(`ℹ️ Info - ${process.env.ENVIRONMENT}`)\n .setColor(0x3498db)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n\n error(params: LogParams): void {\n this.pinoLogger.error(params)\n\n const embed = new MessageBuilder()\n .setTitle(`⛔ Error - ${process.env.ENVIRONMENT}`)\n .setColor(0xe74c3c)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n\n debug(params: LogParams): void {\n this.pinoLogger.debug(params)\n\n const embed = new MessageBuilder()\n .setTitle(`🐛 Degub - ${process.env.ENVIRONMENT}`)\n .setColor(0x9b59b6)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n\n fatal(params: LogParams): void {\n this.pinoLogger.fatal(params)\n\n const embed = new MessageBuilder()\n .setTitle(`💀 Fatal - ${process.env.ENVIRONMENT}`)\n .setColor(0xc0392b)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n\n warn(params: LogParams): void {\n this.pinoLogger.warn(params)\n\n const embed = new MessageBuilder()\n .setTitle(`⚠️ Warn - ${process.env.ENVIRONMENT}`)\n .setColor(0xf1c40f)\n\n this.buildStructuredLog(embed, params).catch(() =>\n this.pinoLogger.info({ msg: 'Error to send log to Discord' })\n )\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nexport const context = new AsyncLocalStorage()\n\ntype Context = {\n traceId: string\n}\n\nexport function getContext(): Context {\n return (context.getStore() as Context) || { traceId: 'no-trace' }\n}\n","import pino from 'pino'\n\nimport type { ILogger, LogParams } from './logger'\n\nexport class PinoLogger implements ILogger {\n private pinoLogger: pino.Logger\n\n constructor() {\n const pinoConfig: pino.LoggerOptions = {\n level: 'debug',\n formatters: {\n level: (label) => {\n return { level: label.toUpperCase() }\n },\n },\n timestamp: pino.stdTimeFunctions.isoTime,\n }\n\n if (process.env.ENVIRONMENT === 'development') {\n this.pinoLogger = pino(\n pinoConfig,\n pino.transport({ target: 'pino-pretty', options: { sync: false } })\n )\n } else {\n this.pinoLogger = pino(pinoConfig, pino.destination({ sync: false }))\n }\n }\n\n private formatLogParams(params: LogParams): Record<string, any> {\n const logData: Record<string, any> = {\n msg: params.msg,\n }\n\n if (params.data) {\n logData.data = params.data\n }\n\n if (params.error) {\n const error = params.error as Error\n\n logData.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: (error as any).code,\n }\n }\n\n return logData\n }\n\n info(params: LogParams): void {\n this.pinoLogger.info(this.formatLogParams(params))\n }\n\n error(params: LogParams): void {\n this.pinoLogger.error(this.formatLogParams(params))\n }\n\n debug(params: LogParams): void {\n this.pinoLogger.debug(this.formatLogParams(params))\n }\n\n fatal(params: LogParams): void {\n this.pinoLogger.fatal(this.formatLogParams(params))\n }\n\n warn(params: LogParams): void {\n this.pinoLogger.warn(this.formatLogParams(params))\n }\n}\n","import { logs, SeverityNumber } from '@opentelemetry/api-logs'\n\nimport type { ILogger, LogParams } from './logger'\nimport { PinoLogger } from './pino-logger'\n\nexport class OtelLogger implements ILogger {\n private otelLogger: ReturnType<typeof logs.getLogger>\n private pinoLogger: PinoLogger\n\n constructor() {\n this.otelLogger = logs.getLogger(\n process.env.OTEL_SERVICE_NAME || 'plutin-boilerplate-common',\n process.env.OTEL_SERVICE_VERSION || '1.0.0'\n )\n this.pinoLogger = new PinoLogger()\n }\n\n private emitOtelLog(\n severityNumber: SeverityNumber,\n severityText: string,\n params: LogParams\n ) {\n const { msg, data, error } = params\n\n const attributes: Record<string, any> = {}\n\n if (data) {\n attributes['data'] = { ...data }\n }\n\n if (error) {\n attributes['error'] = {\n errorType: error.name,\n errorMessage: error.message,\n errorStack: error.stack,\n errorCode: (error as any).code,\n }\n }\n\n this.otelLogger.emit({\n severityNumber,\n severityText,\n body: msg,\n timestamp: new Date(),\n attributes,\n })\n }\n\n info(params: LogParams): void {\n this.pinoLogger.info(params)\n this.emitOtelLog(SeverityNumber.INFO, 'INFO', params)\n }\n\n error(params: LogParams): void {\n this.pinoLogger.error(params)\n this.emitOtelLog(SeverityNumber.ERROR, 'ERROR', params)\n }\n\n debug(params: LogParams): void {\n this.pinoLogger.debug(params)\n this.emitOtelLog(SeverityNumber.DEBUG, 'DEBUG', params)\n }\n\n fatal(params: LogParams): void {\n this.pinoLogger.fatal(params)\n this.emitOtelLog(SeverityNumber.FATAL, 'FATAL', params)\n }\n\n warn(params: LogParams): void {\n this.pinoLogger.warn(params)\n this.emitOtelLog(SeverityNumber.WARN, 'WARN', params)\n }\n}\n","import type { baseEnvSchema } from 'infra/env'\nimport type { z } from 'zod'\n\nimport { DiscordLogger } from './discord-logger'\nimport { OtelLogger } from './otel-logger'\nimport { PinoLogger } from './pino-logger'\n\nexport type LogParams = {\n msg: string\n data?: {\n correlationId?: string\n [key: string]: any\n }\n error?: Error\n}\n\nexport interface ILogger {\n info(data: LogParams): void\n error(data: LogParams): void\n debug(data: LogParams): void\n fatal(data: LogParams): void\n warn(data: LogParams): void\n}\n\ntype OptionsNotifications = 'console' | 'discord' | 'otel'\n\ntype Props = {\n development?: OptionsNotifications\n staging?: OptionsNotifications\n production?: OptionsNotifications\n}\n\nexport class Logger {\n static define(env: z.infer<typeof baseEnvSchema>, definitions?: Props): any {\n const definition = {\n test: 'console',\n development: this.defineProvider(\n env,\n definitions?.development || 'console'\n ),\n staging: this.defineProvider(env, definitions?.staging || 'discord'),\n production: this.defineProvider(env, definitions?.production || 'otel'),\n }\n\n return definition[env.ENVIRONMENT]\n }\n\n private static defineProvider(\n env: z.infer<typeof baseEnvSchema>,\n provider: OptionsNotifications\n ) {\n switch (provider) {\n case 'console':\n return PinoLogger\n case 'discord':\n return DiscordLogger\n case 'otel':\n return env.OTEL_ENABLE === false ? DiscordLogger : OtelLogger\n default:\n return PinoLogger\n }\n }\n}\n","import { metrics } from '@opentelemetry/api'\nimport { cpus } from 'node:os'\nimport { monitorEventLoopDelay, PerformanceObserver } from 'node:perf_hooks'\nimport v8 from 'node:v8'\n\nconst OTEL_ENABLED = process.env.OTEL_ENABLE === 'true'\n\nexport interface IMetricsManager {\n recordHttpRequest(params: {\n method: string\n route: string\n statusCode: number\n durationSeconds: number\n responseSizeBytes?: number\n }): void\n\n recordDbQueryError(params: {\n operation: string\n repository: string\n errorMessage: string\n }): void\n\n recordDbQuery(params: {\n operation: string\n repository: string\n durationSeconds: number\n }): void\n\n recordDbTransaction(params: {\n operation: string\n repository: string\n durationSeconds: number\n }): void\n\n recordDbDeadlock(params: {\n operation: string\n repository: string\n errorMessage: string\n }): void\n\n recordHttpRequestBytes(\n bytes: number,\n attributes: {\n method: string\n route: string\n statusCode: number\n }\n ): void\n\n recordProcessingDuration(params: {\n operation: string\n durationSeconds: number\n }): void\n\n recordProcessingError(params: { operation: string; errorType: string }): void\n\n recordHttpClientRequest(params: {\n method: string\n url: string\n statusCode?: number\n durationSeconds: number\n error?: boolean\n timeout?: boolean\n }): void\n\n recordValidationError(params: { field?: string; errorType: string }): void\n\n startSystemMetricsCollection(intervalMs?: number): void\n\n stopSystemMetricsCollection(): void\n}\n\nexport class MetricsManager implements IMetricsManager {\n private meter = OTEL_ENABLED\n ? metrics.getMeter(\n process.env.OTEL_SERVICE_NAME || 'plutin-boilerplate-common',\n process.env.OTEL_SERVICE_VERSION || '1.0.0'\n )\n : null\n\n private httpRequestsTotal = this.meter?.createCounter('http_requests_total', {\n description: 'Total de requisições HTTP',\n unit: '1',\n })\n\n private httpRequestDuration = this.meter?.createHistogram(\n 'http_request_duration_seconds',\n {\n description: 'Duração das requisições HTTP em segundos',\n unit: 's',\n }\n )\n\n private httpRequestsErrors = this.meter?.createCounter(\n 'http_requests_errors_total',\n {\n description: 'Total de erros HTTP (4xx, 5xx)',\n unit: '1',\n }\n )\n\n private httpResponseSize = this.meter?.createHistogram(\n 'http_response_size_bytes',\n {\n description: 'Tamanho das respostas HTTP em bytes',\n unit: 'By',\n }\n )\n\n private dbQueryDuration = this.meter?.createHistogram(\n 'db_query_duration_seconds',\n {\n description: 'Duração das queries no banco de dados',\n unit: 's',\n }\n )\n\n private dbQueryErrors = this.meter?.createCounter('db_query_errors_total', {\n description: 'Total de erros em queries do banco de dados',\n unit: '1',\n })\n\n private dbTransactionsTotal = this.meter?.createCounter(\n 'db_transactions_total',\n {\n description: 'Total de transações no banco de dados',\n unit: '1',\n }\n )\n\n private dbTransactionDuration = this.meter?.createHistogram(\n 'db_transaction_duration_seconds',\n {\n description: 'Duração das transações no banco de dados',\n unit: 's',\n }\n )\n\n private dbDeadlocksTotal = this.meter?.createCounter('db_deadlocks_total', {\n description: 'Total de deadlocks detectados no banco de dados',\n unit: '1',\n })\n\n private httpRequestBytesTotal = this.meter?.createCounter(\n 'http_request_bytes_total',\n {\n description: 'Total de bytes transferidos em requisições HTTP',\n unit: 'By',\n }\n )\n\n private processingDuration = this.meter?.createHistogram(\n 'processing_duration_seconds',\n {\n description: 'Duração de operações de processamento interno',\n unit: 's',\n }\n )\n\n private processingErrors = this.meter?.createCounter(\n 'processing_errors_total',\n {\n description: 'Total de erros em operações de processamento',\n unit: '1',\n }\n )\n\n private httpClientRequestsTotal = this.meter?.createCounter(\n 'http_client_requests_total',\n {\n description: 'Total de requisições HTTP client realizadas',\n unit: '1',\n }\n )\n\n private httpClientRequestDuration = this.meter?.createHistogram(\n 'http_client_request_duration_seconds',\n {\n description: 'Duração de requisições HTTP client em segundos',\n unit: 's',\n }\n )\n\n private httpClientErrors = this.meter?.createCounter(\n 'http_client_errors_total',\n {\n description: 'Total de erros em requisições HTTP client',\n unit: '1',\n }\n )\n\n private httpClientTimeouts = this.meter?.createCounter(\n 'http_client_timeouts_total',\n {\n description: 'Total de timeouts em requisições HTTP client',\n unit: '1',\n }\n )\n\n private validationErrors = this.meter?.createCounter(\n 'validation_errors_total',\n {\n description: 'Total de erros de validação',\n unit: '1',\n }\n )\n\n private processCpuSecondsTotal = this.meter?.createCounter(\n 'process_cpu_seconds_total',\n {\n description: 'Total CPU time spent in seconds',\n unit: 's',\n }\n )\n\n private processMemoryBytes = this.meter?.createObservableGauge(\n 'process_memory_bytes',\n {\n description: 'Memory usage in bytes',\n unit: 'By',\n }\n )\n\n private nodejsHeapSizeTotalBytes = this.meter?.createObservableGauge(\n 'nodejs_heap_size_total_bytes',\n {\n description: 'Total size of the allocated heap in bytes',\n unit: 'By',\n }\n )\n\n private nodejsHeapSizeUsedBytes = this.meter?.createObservableGauge(\n 'nodejs_heap_size_used_bytes',\n {\n description: 'Used heap size in bytes',\n unit: 'By',\n }\n )\n\n private nodejsEventloopLagSeconds = this.meter?.createObservableGauge(\n 'nodejs_eventloop_lag_seconds',\n {\n description: 'Event loop lag in seconds',\n unit: 's',\n }\n )\n\n private nodejsEventloopDurationSeconds = this.meter?.createHistogram(\n 'nodejs_eventloop_duration_seconds',\n {\n description: 'Event loop duration in seconds',\n unit: 's',\n }\n )\n\n private nodejsGcDurationSeconds = this.meter?.createHistogram(\n 'nodejs_gc_duration_seconds',\n {\n description: 'Garbage collection duration in seconds',\n unit: 's',\n }\n )\n\n private processOpenFds = this.meter?.createObservableGauge(\n 'process_open_fds',\n {\n description: 'Number of open file descriptors',\n unit: '1',\n }\n )\n\n private processUptimeSeconds = this.meter?.createObservableGauge(\n 'process_uptime_seconds',\n {\n description: 'Process uptime in seconds',\n unit: 's',\n }\n )\n\n private eventLoopMonitor = monitorEventLoopDelay({ resolution: 10 })\n private previousCpuUsage = process.cpuUsage()\n private collectionInterval?: NodeJS.Timeout\n private gcObserver?: PerformanceObserver\n\n recordHttpRequest(params: {\n method: string\n route: string\n statusCode: number\n durationSeconds: number\n responseSizeBytes?: number\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { method, route, statusCode, durationSeconds, responseSizeBytes } =\n params\n\n const attributes = {\n method,\n route,\n status_code: statusCode.toString(),\n status_class: this.getStatusClass(statusCode),\n environment: process.env.ENVIRONMENT,\n }\n\n this.httpRequestsTotal?.add(1, attributes)\n\n this.httpRequestDuration?.record(durationSeconds, attributes)\n\n if (statusCode >= 400) {\n this.httpRequestsErrors?.add(1, {\n ...attributes,\n error_type: statusCode >= 500 ? 'server_error' : 'client_error',\n })\n }\n\n if (responseSizeBytes) {\n this.httpResponseSize?.record(responseSizeBytes, attributes)\n }\n }\n\n recordDbQueryError(params: {\n operation: string\n repository: string\n errorMessage: string\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n if (!this.isValidDbQueryErrorParams(params)) {\n return\n }\n\n const { operation, repository, errorMessage } = params\n\n this.dbQueryErrors?.add(1, {\n operation,\n repository,\n errorMessage,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordDbQuery(params: {\n operation: string\n repository: string\n durationSeconds: number\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n if (!this.isValidDbQueryParams(params)) {\n return\n }\n\n const { operation, repository, durationSeconds } = params\n\n this.dbQueryDuration?.record(durationSeconds, {\n operation,\n repository,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n private isValidDbQueryErrorParams(params: {\n operation: string\n repository: string\n errorMessage: string\n }): boolean {\n const { operation, repository, errorMessage } = params\n\n if (!operation || !repository || !errorMessage) {\n console.warn('[MetricsManager] Invalid db query error params:', params)\n return false\n }\n\n return true\n }\n\n private isValidDbQueryParams(params: {\n operation: string\n repository: string\n durationSeconds: number\n }): boolean {\n const { operation, repository, durationSeconds } = params\n\n if (!operation || !repository) {\n console.warn('[MetricsManager] Invalid db query params:', params)\n return false\n }\n\n if (isNaN(durationSeconds) || durationSeconds < 0) {\n console.warn('[MetricsManager] Invalid duration:', durationSeconds)\n return false\n }\n\n return true\n }\n\n recordDbTransaction(params: {\n operation: string\n repository: string\n durationSeconds: number\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { operation, repository, durationSeconds } = params\n\n this.dbTransactionsTotal?.add(1, {\n operation,\n repository,\n environment: process.env.ENVIRONMENT,\n })\n\n this.dbTransactionDuration?.record(durationSeconds, {\n operation,\n repository,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordDbDeadlock(params: {\n operation: string\n repository: string\n errorMessage: string\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { operation, repository, errorMessage } = params\n\n this.dbDeadlocksTotal?.add(1, {\n operation,\n repository,\n errorMessage,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordHttpRequestBytes(\n bytes: number,\n attributes: {\n method: string\n route: string\n statusCode: number\n }\n ) {\n if (!OTEL_ENABLED) {\n return\n }\n\n this.httpRequestBytesTotal?.add(bytes, {\n ...attributes,\n status_code: attributes.statusCode.toString(),\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordProcessingDuration(params: {\n operation: string\n durationSeconds: number\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { operation, durationSeconds } = params\n\n this.processingDuration?.record(durationSeconds, {\n operation,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordProcessingError(params: { operation: string; errorType: string }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { operation, errorType } = params\n\n this.processingErrors?.add(1, {\n operation,\n error_type: errorType,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n recordHttpClientRequest(params: {\n method: string\n url: string\n statusCode?: number\n durationSeconds: number\n error?: boolean\n timeout?: boolean\n }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { method, url, statusCode, durationSeconds, error, timeout } = params\n\n const normalizedUrl = this.normalizeUrl(url)\n const attributes = {\n method,\n url: normalizedUrl,\n environment: process.env.ENVIRONMENT,\n status_code: statusCode?.toString() || 'unknown',\n }\n\n this.httpClientRequestsTotal?.add(1, attributes)\n\n this.httpClientRequestDuration?.record(durationSeconds, attributes)\n\n if (error) {\n this.httpClientErrors?.add(1, {\n ...attributes,\n error_type: timeout ? 'timeout' : 'connection_error',\n })\n }\n\n if (timeout) {\n this.httpClientTimeouts?.add(1, attributes)\n }\n }\n\n recordValidationError(params: { field?: string; errorType: string }) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const { field, errorType } = params\n\n this.validationErrors?.add(1, {\n field: field || 'unknown',\n error_type: errorType,\n environment: process.env.ENVIRONMENT,\n })\n }\n\n startSystemMetricsCollection(intervalMs: number = 5000) {\n if (!OTEL_ENABLED || !this.meter) {\n return\n }\n\n this.eventLoopMonitor.enable()\n\n const observables = [\n this.processMemoryBytes,\n this.nodejsHeapSizeTotalBytes,\n this.nodejsHeapSizeUsedBytes,\n this.nodejsEventloopLagSeconds,\n this.processOpenFds,\n this.processUptimeSeconds,\n ].filter((obs): obs is NonNullable<typeof obs> => obs !== undefined)\n\n this.meter.addBatchObservableCallback((observableResult) => {\n this.collectSystemMetrics(observableResult)\n }, observables)\n\n this.setupGCObserver()\n\n this.collectionInterval = setInterval(() => {\n this.collectPeriodicMetrics()\n }, intervalMs)\n\n this.collectPeriodicMetrics()\n }\n\n stopSystemMetricsCollection() {\n if (!OTEL_ENABLED || !this.meter) {\n return\n }\n\n if (this.collectionInterval) {\n clearInterval(this.collectionInterval)\n this.collectionInterval = undefined\n }\n\n this.eventLoopMonitor.disable()\n\n if (this.gcObserver) {\n this.gcObserver.disconnect()\n this.gcObserver = undefined\n }\n }\n\n private collectSystemMetrics(observableResult: any) {\n if (!OTEL_ENABLED) {\n return\n }\n\n const attributes = {\n environment: process.env.ENVIRONMENT,\n }\n\n const memUsage = process.memoryUsage()\n observableResult.observe(this.processMemoryBytes!, memUsage.rss, {\n ...attributes,\n type: 'rss',\n })\n\n observableResult.observe(this.processMemoryBytes!, memUsage.heapTotal, {\n ...attributes,\n type: 'heap_total',\n })\n\n observableResult.observe(this.processMemoryBytes!, memUsage.heapUsed, {\n ...attributes,\n type: 'heap_used',\n })\n observableResult.observe(this.processMemoryBytes!, memUsage.external, {\n ...attributes,\n type: 'external',\n })\n\n const heapStats = v8.getHeapStatistics()\n\n observableResult.observe(\n this.nodejsHeapSizeTotalBytes!,\n heapStats.total_heap_size,\n attributes\n )\n\n observableResult.observe(\n this.nodejsHeapSizeUsedBytes!,\n heapStats.used_heap_size,\n attributes\n )\n\n const lagMs = this.eventLoopMonitor.mean / 1_000_000\n observableResult.observe(\n this.nodejsEventloopLagSeconds!,\n lagMs / 1000,\n attributes\n )\n\n try {\n const resourceUsage = (process as any).resourceUsage?.()\n\n if (resourceUsage) {\n observableResult.observe(\n this.processOpenFds!,\n resourceUsage.maxRSS || 0,\n {\n ...attributes,\n type: 'max_rss',\n }\n )\n }\n } catch {\n // noop\n }\n\n observableResult.observe(\n this.processUptimeSeconds!,\n process.uptime(),\n attributes\n )\n }\n\n private collectPeriodicMetrics() {\n if (!OTEL_ENABLED) {\n return\n }\n\n const attributes = {\n environment: process.env.ENVIRONMENT,\n }\n\n const currentCpuUsage = process.cpuUsage(this.previousCpuUsage)\n\n const userCpuSeconds = (currentCpuUsage.user / 1_000_000) * cpus().length\n\n const systemCpuSeconds =\n (currentCpuUsage.system / 1_000_000) * cpus().length\n\n this.processCpuSecondsTotal?.add(userCpuSeconds, {\n ...attributes,\n mode: 'user',\n })\n\n this.processCpuSecondsTotal?.add(systemCpuSeconds, {\n ...attributes,\n mode: 'system',\n })\n\n this.previousCpuUsage = process.cpuUsage()\n\n const eventLoopDuration = this.eventLoopMonitor.mean / 1_000_000_000\n\n if (eventLoopDuration > 0) {\n this.nodejsEventloopDurationSeconds?.record(eventLoopDuration, attributes)\n }\n }\n\n private setupGCObserver() {\n if (!OTEL_ENABLED) {\n return\n }\n\n try {\n this.gcObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const gcType = (entry as any).kind || 'unknown'\n const duration = entry.duration / 1000\n\n this.nodejsGcDurationSeconds?.record(duration, {\n environment: process.env.ENVIRONMENT,\n kind: this.getGCKindName(gcType),\n })\n }\n })\n\n this.gcObserver.observe({ entryTypes: ['measure', 'gc'] })\n } catch {\n // noop\n }\n }\n\n private getGCKindName(kind: number): string {\n const gcTypes: Record<number, string> = {\n 1: 'scavenge',\n 2: 'mark_sweep_compact',\n 4: 'incremental_marking',\n 8: 'process_weak_callbacks',\n 15: 'all',\n }\n return gcTypes[kind] || `unknown_${kind}`\n }\n\n private normalizeUrl(url: string): string {\n try {\n const urlObj = new URL(url)\n return `${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`\n } catch {\n return url.split('?')[0].split('#')[0]\n }\n }\n\n private getStatusClass(statusCode: number): string {\n if (statusCode >= 200 && statusCode < 300) return '2xx'\n if (statusCode >= 300 && statusCode < 400) return '3xx'\n if (statusCode >= 400 && statusCode < 500) return '4xx'\n if (statusCode >= 500) return '5xx'\n return '1xx'\n }\n}\n","import FastifyOtelInstrumentation from '@fastify/otel'\nimport { logs } from '@opentelemetry/api-logs'\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\nimport { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base'\nimport { Resource } from '@opentelemetry/resources'\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from '@opentelemetry/sdk-logs'\nimport { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'\nimport { NodeSDK } from '@opentelemetry/sdk-node'\nimport { TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-node'\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n SEMRESATTRS_DEPLOYMENT_ENVIRONMENT,\n} from '@opentelemetry/semantic-conventions'\n\nexport class OtelManager {\n private readonly resource: Resource\n private readonly loggerProvider: LoggerProvider\n private readonly sdk: NodeSDK\n private readonly otlpLogExporter: OTLPLogExporter\n private readonly traceExporter: OTLPTraceExporter\n private readonly metricExporter: OTLPMetricExporter\n private readonly metricReader: PeriodicExportingMetricReader\n private readonly sampler: TraceIdRatioBasedSampler\n\n constructor(private readonly env: Record<string, any>) {\n this.resource = this.createResource()\n this.otlpLogExporter = this.createOtlpLogExporter()\n this.loggerProvider = this.createLoggerProvider()\n this.traceExporter = this.createTraceExporter()\n this.sampler = this.createSampler()\n this.metricExporter = this.createMetricExporter()\n this.metricReader = this.createMetricReader()\n this.sdk = this.createSdk()\n }\n\n private createResource(): Resource {\n return new Resource({\n [ATTR_SERVICE_NAME]:\n this.env.OTEL_SERVICE_NAME || 'plutin-boilerplate-common',\n [ATTR_SERVICE_VERSION]: this.env.OTEL_SERVICE_VERSION || '1.0.0',\n [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: this.env.ENVIRONMENT,\n })\n }\n\n private createOtlpLogExporter(): OTLPLogExporter {\n return new OTLPLogExporter({\n url: `${this.env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/logs`,\n compression: CompressionAlgorithm.GZIP,\n })\n }\n\n private createLoggerProvider(): LoggerProvider {\n const provider = new LoggerProvider({\n resource: this.resource,\n })\n\n this.configureLogProcessors(provider)\n logs.setGlobalLoggerProvider(provider)\n\n return provider\n }\n\n private configureLogProcessors(provider: LoggerProvider): void {\n provider.addLogRecordProcessor(\n new BatchLogRecordProcessor(this.otlpLogExporter)\n )\n }\n\n private createTraceExporter(): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: `${this.env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/traces`,\n compression: CompressionAlgorithm.GZIP,\n })\n }\n\n private createSampler(): TraceIdRatioBasedSampler {\n const DEVELOPMENT_SAMPLE_RATE = 1.0\n const PRODUCTION_SAMPLE_RATE = 0.01\n\n const sampleRate =\n this.env.ENVIRONMENT === 'development'\n ? DEVELOPMENT_SAMPLE_RATE\n : PRODUCTION_SAMPLE_RATE\n\n return new TraceIdRatioBasedSampler(sampleRate)\n }\n\n private createMetricExporter(): OTLPMetricExporter {\n return new OTLPMetricExporter({\n url: `${this.env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/metrics`,\n compression: CompressionAlgorithm.GZIP,\n })\n }\n\n private createMetricReader(): PeriodicExportingMetricReader {\n return new PeriodicExportingMetricReader({\n exporter: this.metricExporter,\n exportIntervalMillis: 5000,\n exportTimeoutMillis: 5000,\n })\n }\n\n private createSdk(): NodeSDK {\n return new NodeSDK({\n resource: this.resource,\n metricReader: this.metricReader,\n traceExporter: this.traceExporter,\n instrumentations: [\n getNodeAutoInstrumentations({\n '@opentelemetry/instrumentation-fs': {\n enabled: false,\n },\n }),\n new HttpInstrumentation(),\n new FastifyOtelInstrumentation({\n registerOnInitialization: true,\n }),\n ],\n sampler: this.sampler,\n })\n }\n\n initialize(): void {\n try {\n this.sdk.start()\n } catch (error) {\n console.error('❌ Erro ao inicializar OpenTelemetry SDK:', error)\n throw error\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.loggerProvider.forceFlush()\n await this.loggerProvider.shutdown()\n await this.sdk.shutdown()\n } catch (error) {\n console.error('❌ Erro ao desligar OpenTelemetry SDK:', error)\n }\n }\n\n getLoggerProvider(): LoggerProvider {\n return this.loggerProvider\n }\n\n getSdk(): NodeSDK {\n return this.sdk\n }\n}\n","import { Span, trace } from '@opentelemetry/api'\n\nimport { DependencyContainer } from '../../core/decorators/dependency-container'\nimport { PinoLogger } from '../../infra/adapters/logger/pino-logger'\nimport type { IMetricsManager } from '../../infra/adapters/observability/otel/metric'\n\nconst MILLISECONDS_TO_SECONDS = 1000\nconst ROUNDING_PRECISION = 100\nconst MAX_SANITIZED_KEYS = 10\n\nconst EXCLUDED_METHODS = new Set([\n 'constructor',\n 'toString',\n 'valueOf',\n 'toJSON',\n])\n\nconst TRACER_NAME = process.env.OTEL_SERVICE_NAME || 'plutin-boilerplate-common'\nconst TRACER_VERSION = process.env.OTEL_SERVICE_VERSION || '1.0.0'\n\nconst OTEL_ENABLED = process.env.OTEL_ENABLE === 'true'\n\nexport type Timer = {\n getDurationSeconds(): number\n}\n\nexport type BaseExecutionContext = {\n operation: string\n logger?: any\n}\n\nexport interface IMetricsRecorder {\n recordSuccess(context: BaseExecutionContext, durationSeconds: number): void\n\n recordError(context: BaseExecutionContext, error: Error): void\n}\n\nexport interface ISpanBuilder {\n createSpan(\n tracer: ReturnType<typeof trace.getTracer>,\n context: BaseExecutionContext\n ): Span | undefined\n\n buildSpanName(context: BaseExecutionContext): string\n\n finalizeSpanSuccess(span: Span, durationSeconds: number): void\n\n finalizeSpanError(span: Span, durationSeconds: number, error: Error): void\n}\n\nexport interface ILogBuilder {\n buildStartMessage(context: BaseExecutionContext): string\n\n buildStartLogData(\n context: BaseExecutionContext,\n args: any[]\n ): Record<string, any>\n\n buildSuccessMessage(context: BaseExecutionContext): string\n\n buildSuccessLogData(\n context: BaseExecutionContext,\n durationMs: number\n ): Record<string, any>\n\n buildErrorMessage(context: BaseExecutionContext): string\n\n buildErrorLogData(\n context: BaseExecutionContext,\n durationMs: number,\n error: Error\n ): Record<string, any>\n}\n\nexport interface IInstrumentationStrategy {\n instrumentMethod(\n originalMethod: (...args: any[]) => any,\n instance: any,\n context: BaseExecutionContext\n ): (...args: any[]) => any\n}\n\nclass Tracer {\n private static instance: ReturnType<typeof trace.getTracer> | null = null\n\n static getTracer(): ReturnType<typeof trace.getTracer> {\n if (!this.instance) {\n this.instance = trace.getTracer(TRACER_NAME, TRACER_VERSION)\n }\n return this.instance\n }\n}\n\nclass Metrics {\n private static instance: IMetricsManager\n\n static getMetrics(): IMetricsManager {\n if (!this.instance) {\n this.instance = DependencyContainer.resolveToken('Metrics')\n }\n return this.instance\n }\n}\n\nabstract class BaseFullInstrumentationStrategy\n implements IInstrumentationStrategy\n{\n constructor(\n protected readonly tracer: ReturnType<typeof trace.getTracer>,\n protected readonly metrics: IMetricsManager,\n protected readonly metricsRecorder: IMetricsRecorder,\n protected readonly spanBuilder: ISpanBuilder,\n protected readonly logBuilder: ILogBuilder\n ) {}\n\n instrumentMethod(\n originalMethod: (...args: any[]) => any,\n instance: any,\n context: BaseExecutionContext\n ): (...args: any[]) => any {\n return async (...args: any[]) => {\n const timer = createTimer()\n const span = this.spanBuilder.createSpan(this.tracer, context)\n\n this.logOperationStart(context, args)\n\n try {\n const result = await originalMethod.call(instance, ...args)\n this.recordSuccess(timer, span, context)\n return result\n } catch (error) {\n this.recordFailure(error, timer, span, context)\n throw error\n }\n }\n }\n\n private recordSuccess(\n timer: Timer,\n span: Span | undefined,\n context: BaseExecutionContext\n ): void {\n const durationSeconds = timer.getDurationSeconds()\n const durationMs = roundDuration(durationSeconds * MILLISECONDS_TO_SECONDS)\n\n this.metricsRecorder.recordSuccess(context, durationSeconds)\n this.logSuccess(context, durationMs)\n\n if (span) {\n this.spanBuilder.finalizeSpanSuccess(span, durationSeconds)\n }\n }\n\n private logSuccess(context: BaseExecutionContext, durationMs: number): void {\n if (!context.logger) {\n return\n }\n\n context.logger.info({\n msg: this.logBuilder.buildSuccessMessage(context),\n data: this.logBuilder.buildSuccessLogData(context, durationMs),\n })\n }\n\n private recordFailure(\n error: unknown,\n timer: Timer,\n span: Span | undefined,\n context: BaseExecutionContext\n ): void {\n const durationSeconds = timer.getDurationSeconds()\n const durationMs = roundDuration(durationSeconds * MILLISECONDS_TO_SECONDS)\n const normalizedError = normalizeError(error)\n\n this.metricsRecorder.recordError(context, normalizedError)\n this.logError(context, durationMs, normalizedError)\n\n if (span) {\n this.spanBuilder.finalizeSpanError(span, durationSeconds, normalizedError)\n }\n }\n\n private logError(\n context: BaseExecutionContext,\n durationMs: number,\n error: Error\n ): void {\n if (!context.logger) {\n return\n }\n\n context.logger.error({\n msg: this.logBuilder.buildErrorMessage(context),\n data: this.logBuilder.buildErrorLogData(context, durationMs, error),\n error,\n })\n }\n\n private logOperationStart(context: BaseExecutionContext, args: any[]): void {\n if (!context.logger) {\n return\n }\n\n context.logger.info({\n msg: this.logBuilder.buildStartMessage(context),\n data: this.logBuilder.buildStartLogData(context, args),\n })\n }\n}\n\nabstract class BaseLogsOnlyInstrumentationStrategy\n implements IInstrumentationStrategy\n{\n constructor(protected readonly logBuilder: ILogBuilder) {}\n\n instrumentMethod(\n originalMethod: (...args: any[]) => any,\n instance: any,\n context: BaseExecutionContext\n ): (...args: any[]) => any {\n return async (...args: any[]) => {\n const timer = createTimer()\n\n this.logOperationStart(context, args)\n\n try {\n const result = await originalMethod.call(instance, ...args)\n this.logSuccess(timer, context)\n return result\n } catch (error) {\n this.logError(error, timer, context)\n throw error\n }\n }\n }\n\n private logOperationStart(context: BaseExecutionContext, args: any[]): void {\n if (!context.logger) {\n return\n }\n\n context.logger.info({\n msg: this.logBuilder.buildStartMessage(context),\n data: this.logBuilder.buildStartLogData(context, args),\n })\n }\n\n private logSuccess(timer: Timer, context: BaseExecutionContext): void {\n if (!context.logger) {\n return\n }\n\n const durationMs = roundDuration(\n timer.getDurationSeconds() * MILLISECONDS_TO_SECONDS\n )\n\n context.logger.info({\n msg: this.logBuilder.buildSuccessMessage(context),\n data: this.logBuilder.buildSuccessLogData(context, durationMs),\n })\n }\n\n private logError(\n error: unknown,\n timer: Timer,\n context: BaseExecutionContext\n ): void {\n if (!context.logger) {\n return\n }\n\n const durationMs = roundDuration(\n timer.getDurationSeconds() * MILLISECONDS_TO_SECONDS\n )\n const normalizedError = normalizeError(error)\n\n context.logger.error({\n msg: this.logBuilder.buildErrorMessage(context),\n data: this.logBuilder.buildErrorLogData(\n context,\n durationMs,\n normalizedError\n ),\n error: normalizedError,\n })\n }\n}\n\nexport function createTimer(): Timer {\n const startTime = Date.now()\n\n return {\n getDurationSeconds(): number {\n return (Date.now() - startTime) / MILLISECONDS_TO_SECONDS\n },\n }\n}\n\nexport function normalizeError(error: unknown): Error {\n if (error instanceof Error) {\n return error\n }\n\n if (typeof error === 'string') {\n return new Error(error)\n }\n\n return new Error(String(error))\n}\n\nexport function roundDuration(durationMs: number): number {\n return Math.round(durationMs * ROUNDING_PRECISION) / ROUNDING_PRECISION\n}\n\nexport function sanitizeArgs(args: any[]): any[] {\n if (args.length === 0) {\n return args\n }\n\n return args.map(sanitizeArg)\n}\n\nfunction sanitizeArg(arg: any): any {\n if (arg === null || arg === undefined) {\n return arg\n }\n\n if (typeof arg !== 'object') {\n return arg\n }\n\n return sanitizeObject(arg)\n}\n\nfunction sanitizeObject(obj: any): any {\n try {\n const keys = Object.keys(obj)\n\n if (keys.length > MAX_SANITIZED_KEYS) {\n return {\n _truncated: true,\n _keyCount: keys.length,\n _keys: keys.slice(0, MAX_SANITIZED_KEYS),\n }\n }\n\n return obj\n } catch {\n return { _error: 'Could not serialize argument' }\n }\n}\n\nexport function resolveLogger(): any {\n try {\n return DependencyContainer.resolveToken('Logger')\n } catch {\n return new PinoLogger()\n }\n}\n\nexport function copyReflectMetadata(source: any, target: any): void {\n const injectMetadata = Reflect.getOwnMetadata('inject:params', source)\n if (injectMetadata) {\n Reflect.defineMetadata('inject:params', injectMetadata, target)\n }\n}\n\nexport function preserveClassName(target: any, className: string): void {\n Object.defineProperty(target, 'name', {\n value: className,\n writable: false,\n configurable: true,\n })\n}\n\nexport function getInstrumentableMethods(instance: object): string[] {\n const methods: string[] = []\n const prototype = Object.getPrototypeOf(instance)\n let current: any = prototype\n\n while (current && current !== Object.prototype) {\n const propertyNames = Object.getOwnPropertyNames(current)\n\n for (const name of propertyNames) {\n if (shouldExcludeMethod(name)) {\n continue\n }\n\n if (isMethod(current, name) && !methods.includes(name)) {\n methods.push(name)\n }\n }\n\n current = Object.getPrototypeOf(current)\n }\n\n return methods\n}\n\nfunction shouldExcludeMethod(name: string): boolean {\n return EXCLUDED_METHODS.has(name) || name.startsWith('_')\n}\n\nfunction isMethod(obj: any, name: string): boolean {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(obj, name)\n return descriptor !== undefined && typeof descriptor.value === 'function'\n } catch {\n return false\n }\n}\n\nexport function instrumentInstanceMethods(\n instance: object,\n contextName: string,\n logger: any,\n strategy: IInstrumentationStrategy,\n createContext: (operation: string, logger?: any) => BaseExecutionContext\n): void {\n const methodsToInstrument = getInstrumentableMethods(instance)\n\n if (methodsToInstrument.length === 0) {\n console.warn(\n `[Instrumentation] No methods found to instrument for ${contextName}. This may indicate a problem with method discovery.`\n )\n return\n }\n\n for (const methodName of methodsToInstrument) {\n instrumentMethod(instance, methodName, logger, strategy, createContext)\n }\n}\n\nfunction instrumentMethod(\n instance: any,\n methodName: string,\n logger: any,\n strategy: IInstrumentationStrategy,\n createContext: (operation: string, logger?: any) => BaseExecutionContext\n): void {\n const originalMethod = instance[methodName]\n\n if (typeof originalMethod !== 'function') {\n return\n }\n\n const context = createContext(methodName, logger)\n\n const wrappedMethod = strategy.instrumentMethod(\n originalMethod,\n instance,\n context\n )\n\n Object.defineProperty(instance, methodName, {\n value: wrappedMethod,\n writable: true,\n configurable: true,\n enumerable: true,\n })\n}\n\nexport {\n BaseFullInstrumentationStrategy,\n BaseLogsOnlyInstrumentationStrategy,\n Metrics,\n OTEL_ENABLED,\n Tracer,\n TRACER_NAME,\n TRACER_VERSION,\n}\n","import { Span, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api'\n\nimport type { IMetricsManager } from '../../infra/adapters/observability/otel/metric'\n\nimport {\n BaseExecutionContext,\n BaseFullInstrumentationStrategy,\n BaseLogsOnlyInstrumentationStrategy,\n copyReflectMetadata,\n ILogBuilder,\n IMetricsRecorder,\n instrumentInstanceMethods,\n ISpanBuilder,\n Metrics,\n OTEL_ENABLED,\n preserveClassName,\n resolveLogger,\n sanitizeArgs,\n Tracer,\n TRACER_NAME,\n} from './base-instrumentation-strategy'\n\ntype ProcessingExecutionContext = BaseExecutionContext & {\n className: string\n}\n\ntype InstrumentationOptions = {\n serviceName?: string\n}\n\nclass ProcessingMetricsRecorder implements IMetricsRecorder {\n constructor(private readonly metrics: IMetricsManager | undefined) {}\n\n recordSuccess(context: BaseExecutionContext, durationSeconds: number): void {\n if (!this.metrics) {\n return\n }\n\n this.metrics.recordProcessingDuration({\n operation: context.operation,\n durationSeconds,\n })\n }\n\n recordError(context: BaseExecutionContext, error: Error): void {\n if (!this.metrics) {\n return\n }\n\n this.metrics.recordProcessingError({\n operation: context.operation,\n errorType: error.name,\n })\n }\n}\n\nclass ProcessingSpanBuilder implements ISpanBuilder {\n constructor(private readonly serviceName: string) {}\n\n createSpan(\n tracer: ReturnType<typeof trace.getTracer>,\n context: BaseExecutionContext\n ): Span | undefined {\n const procContext = context as ProcessingExecutionContext\n const spanName = this.buildSpanName(procContext)\n\n return tracer.startSpan(spanName, {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'service.name': this.serviceName,\n 'class.name': procContext.className,\n 'operation.name': procContext.operation,\n },\n })\n }\n\n buildSpanName(context: BaseExecutionContext): string {\n const procContext = context as ProcessingExecutionContext\n return `process.${procContext.className.toLowerCase()}.${procContext.operation}`\n }\n\n finalizeSpanSuccess(span: Span, durationSeconds: number): void {\n span.setStatus({ code: SpanStatusCode.OK })\n span.setAttribute('processing.duration', durationSeconds)\n span.setAttribute('processing.status', 'success')\n span.end()\n }\n\n finalizeSpanError(span: Span, durationSeconds: number, error: Error): void {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n })\n span.setAttribute('processing.duration', durationSeconds)\n span.setAttribute('processing.status', 'error')\n span.setAttribute('error', true)\n span.setAttribute('error.message', error.message)\n span.setAttribute('error.type', error.name)\n span.recordException(error)\n span.end()\n }\n}\n\nclass ProcessingLogBuilder implements ILogBuilder {\n buildStartMessage(context: BaseExecutionContext): string {\n const procContext = context as ProcessingExecutionContext\n return `[${procContext.className}.${procContext.operation}] started`\n }\n\n buildStartLogData(\n context: BaseExecutionContext,\n args: any[]\n ): Record<string, any> {\n const procContext = context as ProcessingExecutionContext\n return {\n className: procContext.className,\n operation: procContext.operation,\n args: sanitizeArgs(args),\n }\n }\n\n buildSuccessMessage(context: BaseExecutionContext): string {\n const procContext = context as ProcessingExecutionContext\n return `[${procContext.className}.${procContext.operation}] finished successfully`\n }\n\n buildSuccessLogData(\n context: BaseExecutionContext,\n durationMs: number\n ): Record<string, any> {\n const procContext = context as ProcessingExecutionContext\n return {\n className: procContext.className,\n operation: procContext.operation,\n durationMs,\n status: 'success',\n }\n }\n\n buildErrorMessage(context: BaseExecutionContext): string {\n const procContext = context as ProcessingExecutionContext\n return `[${procContext.className}.${procContext.operation}] finished failed`\n }\n\n buildErrorLogData(\n context: BaseExecutionContext,\n durationMs: number,\n error: Error\n ): Record<string, any> {\n const procContext = context as ProcessingExecutionContext\n return {\n className: procContext.className,\n operation: procContext.operation,\n durationMs,\n status: 'error',\n errorMessage: error.message,\n errorName: error.name,\n }\n }\n}\n\nclass ProcessingFullInstrumentationStrategy extends BaseFullInstrumentationStrategy {\n constructor(\n tracer: ReturnType<typeof trace.getTracer>,\n metrics: IMetricsManager,\n serviceName: string\n ) {\n super(\n tracer,\n metrics,\n new ProcessingMetricsRecorder(metrics),\n new ProcessingSpanBuilder(serviceName),\n new ProcessingLogBuilder()\n )\n }\n}\n\nclass ProcessingLogsOnlyInstrumentationStrategy extends BaseLogsOnlyInstrumentationStrategy {\n constructor() {\n super(new ProcessingLogBuilder())\n }\n}\n\nclass ProcessingInstrumentationStrategyFactory {\n static create(serviceName: string) {\n if (!OTEL_ENABLED) {\n return new ProcessingLogsOnlyInstrumentationStrategy()\n }\n\n const tracer = Tracer.getTracer()\n const metrics = Metrics.getMetrics()\n\n return new ProcessingFullInstrumentationStrategy(\n tracer,\n metrics,\n serviceName\n )\n }\n}\n\nexport function Instrumentation(options?: InstrumentationOptions) {\n return function <T extends { new (...args: any[]): object }>(constructor: T) {\n const className = constructor.name\n const serviceName = options?.serviceName || TRACER_NAME\n\n class InstrumentedClass extends constructor {\n constructor(...args: any[]) {\n super(...args)\n\n const logger = resolveLogger()\n const strategy =\n ProcessingInstrumentationStrategyFactory.create(serviceName)\n\n instrumentInstanceMethods(\n this,\n className,\n logger,\n strategy,\n (operation: string, logger?: any): ProcessingExecutionContext => ({\n className,\n operation,\n logger,\n })\n )\n }\n }\n\n copyReflectMetadata(constructor, InstrumentedClass)\n preserveClassName(InstrumentedClass, className)\n\n return InstrumentedClass as T\n }\n}\n","import { Span, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api'\n\nimport type { IMetricsManager } from '../../infra/adapters/observability/otel/metric'\n\nimport {\n BaseExecutionContext,\n BaseFullInstrumentationStrategy,\n BaseLogsOnlyInstrumentationStrategy,\n copyReflectMetadata,\n ILogBuilder,\n IMetricsRecorder,\n instrumentInstanceMethods,\n ISpanBuilder,\n Metrics,\n OTEL_ENABLED,\n preserveClassName,\n resolveLogger,\n sanitizeArgs,\n Tracer,\n} from './base-instrumentation-strategy'\n\nconst DEFAULT_DB_SYSTEM = 'postgresql'\n\ntype RepositoryExecutionContext = BaseExecutionContext & {\n repositoryName: string\n}\n\ntype RepositoryOtelOptions = {\n dbSystem?: string\n}\n\nclass RepositoryMetricsRecorder implements IMetricsRecorder {\n constructor(private readonly metrics: IMetricsManager) {}\n\n recordSuccess(context: BaseExecutionContext, durationSeconds: number): void {\n if (!this.metrics) {\n return\n }\n\n const repoContext = context as RepositoryExecutionContext\n\n this.metrics.recordDbQuery({\n operation: repoContext.operation,\n repository: repoContext.repositoryName,\n durationSeconds,\n })\n }\n\n recordError(context: BaseExecutionContext, error: Error): void {\n if (!this.metrics) {\n return\n }\n\n const repoContext = context as RepositoryExecutionContext\n\n this.metrics.recordDbQueryError({\n operation: repoContext.operation,\n repository: repoContext.repositoryName,\n errorMessage: error.message,\n })\n }\n}\n\nclass RepositorySpanBuilder implements ISpanBuilder {\n constructor(private readonly dbSystem: string) {}\n\n createSpan(\n tracer: ReturnType<typeof trace.getTracer>,\n context: BaseExecutionContext\n ): Span | undefined {\n const repoContext = context as RepositoryExecutionContext\n const spanName = this.buildSpanName(repoContext)\n\n return tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': this.dbSystem,\n 'db.operation': repoContext.operation,\n },\n })\n }\n\n buildSpanName(context: BaseExecutionContext): string {\n const repoContext = context as RepositoryExecutionContext\n return `db.${repoContext.repositoryName.toLowerCase()}.${repoContext.operation}`\n }\n\n finalizeSpanSuccess(span: Span, durationSeconds: number): void {\n span.setStatus({ code: SpanStatusCode.OK })\n span.setAttribute('db.query.duration', durationSeconds)\n span.setAttribute('db.query.status', 'success')\n span.end()\n }\n\n finalizeSpanError(span: Span, durationSeconds: number, error: Error): void {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n })\n span.setAttribute('db.query.duration', durationSeconds)\n span.setAttribute('db.query.status', 'error')\n span.setAttribute('error', true)\n span.setAttribute('error.message', error.message)\n span.recordException(error)\n span.end()\n }\n}\n\nclass RepositoryLogBuilder implements ILogBuilder {\n buildStartMessage(context: BaseExecutionContext): string {\n const repoContext = context as RepositoryExecutionContext\n return `[${repoContext.repositoryName}.${repoContext.operation}] started`\n }\n\n buildStartLogData(\n context: BaseExecutionContext,\n args: any[]\n ): Record<string, any> {\n return {\n repository: (context as RepositoryExecutionContext).repositoryName,\n operation: context.operation,\n args: sanitizeArgs(args),\n }\n }\n\n buildSuccessMessage(context: BaseExecutionContext): string {\n const repoContext = context as RepositoryExecutionContext\n return `[${repoContext.repositoryName}.${repoContext.operation}] finished successfully`\n }\n\n buildSuccessLogData(\n context: BaseExecutionContext,\n durationMs: number\n ): Record<string, any> {\n return {\n repository: (context as RepositoryExecutionContext).repositoryName,\n operation: context.operation,\n durationMs,\n status: 'success',\n }\n }\n\n buildErrorMessage(context: BaseExecutionContext): string {\n const repoContext = context as RepositoryExecutionContext\n return `[${repoContext.repositoryName}.${repoContext.operation}] finished failed`\n }\n\n buildErrorLogData(\n context: BaseExecutionContext,\n durationMs: number,\n error: Error\n ): Record<string, any> {\n return {\n repository: (context as RepositoryExecutionContext).repositoryName,\n operation: context.operation,\n durationMs,\n status: 'error',\n errorMessage: error.message,\n errorName: error.name,\n }\n }\n}\n\nclass RepositoryFullInstrumentationStrategy extends BaseFullInstrumentationStrategy {\n constructor(\n tracer: ReturnType<typeof trace.getTracer>,\n metrics: IMetricsManager,\n dbSystem: string\n ) {\n super(\n tracer,\n metrics,\n new RepositoryMetricsRecorder(metrics),\n new RepositorySpanBuilder(dbSystem),\n new RepositoryLogBuilder()\n )\n }\n}\n\nclass RepositoryLogsOnlyInstrumentationStrategy extends BaseLogsOnlyInstrumentationStrategy {\n constructor() {\n super(new RepositoryLogBuilder())\n }\n}\n\nclass RepositoryInstrumentationStrategyFactory {\n static create(dbSystem: string) {\n if (!OTEL_ENABLED) {\n return new RepositoryLogsOnlyInstrumentationStrategy()\n }\n\n const tracer = Tracer.getTracer()\n const metrics = Metrics.getMetrics()\n\n return new RepositoryFullInstrumentationStrategy(tracer, metrics, dbSystem)\n }\n}\n\nexport function RepositoryInstrumentation(options?: RepositoryOtelOptions) {\n return function <T extends { new (...args: any[]): object }>(constructor: T) {\n const repositoryName = constructor.name\n const dbSystem = options?.dbSystem || DEFAULT_DB_SYSTEM\n\n class InstrumentedRepository extends constructor {\n constructor(...args: any[]) {\n super(...args)\n\n const logger = resolveLogger()\n const strategy =\n RepositoryInstrumentationStrategyFactory.create(dbSystem)\n\n instrumentInstanceMethods(\n this,\n repositoryName,\n logger,\n strategy,\n (operation: string, logger?: any): RepositoryExecutionContext => ({\n repositoryName,\n operation,\n logger,\n })\n )\n }\n }\n\n copyReflectMetadata(constructor, InstrumentedRepository)\n preserveClassName(InstrumentedRepository, repositoryName)\n\n return InstrumentedRepository as T\n }\n}\n","import { z } from 'zod'\n\nimport 'dotenv/config'\n\nexport const baseEnvSchema = z.object({\n NODE_ENV: z.enum(['test', 'development', 'production']).default('production'),\n ENVIRONMENT: z\n .enum(['test', 'development', 'staging', 'production'])\n .default('development'),\n PORT: z.coerce.number().default(3333),\n DISCORD_WEBHOOK_URL: z.string().optional(),\n OTEL_ENABLE: z\n .string()\n .transform((val) => val === 'true')\n .default('false'),\n OTEL_EXPORTER_OTLP_ENDPOINT: z.string().url().optional(),\n OTEL_SERVICE_NAME: z.string().optional(),\n OTEL_SERVICE_VERSION: z.string().optional(),\n})\n","(function () {\n require('./lib/main').config(\n Object.assign(\n {},\n require('./lib/env-options'),\n require('./lib/cli-options')(process.argv)\n )\n )\n})()\n"],"mappings":"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","names":["fs","require","path","os","crypto","packageJson","version","LINE","parse","src","obj","lines","toString","replace","match","exec","key","value","trim","maybeQuote","_parseVault","options","vaultPath","_vaultPath","result","DotenvModule","configDotenv","parsed","err","Error","code","keys","_dotenvKey","split","length","decrypted","i","attrs","_instructions","decrypt","ciphertext","error","_warn","message","console","log","_debug","DOTENV_KEY","process","env","dotenvKey","uri","URL","password","environment","searchParams","get","environmentKey","toUpperCase","possibleVaultPath","Array","isArray","filepath","existsSync","endsWith","resolve","cwd","_resolveHome","envPath","join","homedir","slice","_configVault","debug","Boolean","processEnv","populate","dotenvPath","encoding","optionPaths","push","lastError","parsedAll","readFileSync","e","config","encrypted","keyStr","Buffer","from","nonce","subarray","authTag","aesgcm","createDecipheriv","setAuthTag","update","final","isRange","RangeError","invalidKeyLength","decryptionFailed","override","Object","prototype","hasOwnProperty","call","module","exports","options","process","env","DOTENV_CONFIG_ENCODING","encoding","DOTENV_CONFIG_PATH","path","DOTENV_CONFIG_DEBUG","debug","DOTENV_CONFIG_OVERRIDE","override","DOTENV_CONFIG_DOTENV_KEY","DOTENV_KEY","module","exports","re","module","exports","optionMatcher","args","reduce","acc","cur","matches","match","DependencyContainer","registry","Map","singletons","register","token","myClass","options","set","type","singleton","registerValue","value","resolve","target","injectMetadata","Reflect","getOwnMetadata","paramCount","Object","keys","length","params","Array","from","_","index","Error","name","resolveToken","registration","get","has","instance","Inject","_propertyKey","parameterIndex","constructor","existingInjectedParams","defineMetadata","GlobalListener","logger","callback","DependencyContainer","resolveToken","register","process","on","err","fatal","msg","data","env","ENVIRONMENT","error","Error","message","exit","reason","String","ApiErrorEnum","ApplicationError","Error","props","message","code","errorCode","ApiErrorEnum","APPLICATION","occurredAt","Date","ConflictError","Error","props","conflictProps","code","errorCode","ApiErrorEnum","APPLICATION","message","occurredAt","Date","DomainError","Error","props","message","code","errorCode","ApiErrorEnum","DOMAIN","occurredAt","Date","InfraError","Error","props","message","code","errorCode","ApiErrorEnum","INFRA","occurredAt","Date","ValidationError","Error","props","errors","code","errorCode","ApiErrorEnum","VALIDATOR","message","occurredAt","Date","BaseController","logger","DependencyContainer","resolveToken","success","dto","code","data","noContent","undefined","created","paginated","buildContextError","request","env","process","ENVIRONMENT","body","headers","params","query","failure","error","context","ConflictError","props","message","errorCode","occurredAt","items","Array","isArray","conflictProps","DomainError","ApplicationError","InfraError","ValidationError","errors","fatal","msg","execute","routeMetadata","Reflect","getMetadata","middlewares","processedRequest","length","middleware","handle","Controller","method","path","middlewares","target","prototype","BaseController","Error","name","Reflect","defineMetadata","ObjectId","UniqueObjectId","value","ObjectId","toString","toValue","equals","id","EntityObject","_id","props","id","createdAt","date","updatedAt","touch","Date","UniqueObjectId","equals","entity","AggregateObjectRoot","EntityObject","randomUUID","UniqueEntityId","value","randomUUID","toString","toValue","equals","id","Entity","_id","props","id","createdAt","date","updatedAt","touch","Date","UniqueEntityId","equals","entity","AggregateRoot","Entity","ValueObject","props","WatchedList","currentItems","initial","new","removed","updated","initialItems","getItems","getNewItems","getRemovedItems","getUpdatedItems","addUpdatedItem","item","push","isCurrentItem","filter","v","compareItems","length","isNewItem","isRemovedItem","removeFromNew","removeFromCurrent","removeFromRemoved","wasAddedInitially","exists","add","remove","update","items","newItems","a","some","b","removedItems","updatedItems","getTakeAndSkip","size","page","take","Number","skip","cors","fastify","randomUUID","qs","trace","OTEL_ENABLED","process","env","OTEL_ENABLE","NullSpan","setAttributes","setAttribute","setStatus","recordException","SpanManager","getActiveSpan","span","trace","isEnabled","validateControllerMetadata","controller","metadata","Reflect","getMetadata","Error","name","FastifyAdapter","instance","logger","metrics","fastify","bodyLimit","querystringParser","str","qs","parse","requestIdHeader","requestIdLogLabel","genReqId","req","headers","randomUUID","register","cors","addHook","request","span","SpanManager","getActiveSpan","setAttributes","httpMethod","method","httpUrl","url","httpRoute","routeOptions","httpHost","hostname","httpScheme","protocol","httpUserAgent","httpRequestId","id","httpClientIp","ip","info","msg","data","requestId","httpHeaders","httpParams","params","httpQuery","query","reply","route","getNormalizedRoute","responseTime","elapsedTime","httpStatusCode","statusCode","responseTimeMs","Math","round","responseSizeBytes","getHeader","parseInt","undefined","recordHttpRequest","durationSeconds","recordHttpRequestBytes","registerRoute","controllerClass","metadata","validateControllerMetadata","path","requestData","body","activeSpan","controllerName","name","controllerMethod","controllerPath","output","execute","setStatus","code","setAttribute","status","send","err","message","recordException","error","errorType","errorMessage","failure","env","process","ENVIRONMENT","startServer","port","listen","closeServer","close","routerPath","split","ZodMapError","mapCommon","error","type","code","path","join","property","pop","propertyType","expected","receivedValue","received","message","mapInvalidUnion","errors","unionErrors","flat","map","err","issues","item","mapInvalidType","mapErrorsFactory","mapErrors","standardizedErrors","Map","forEach","keyError","get","propertyErrors","push","set","location","Array","from","arr","ZodValidator","zodSchema","validate","requestHttp","errors","data","headersData","error","headersErrors","headers","shape","safeParseAsync","path","push","paramsData","paramsErrors","params","queryData","queryErrors","query","bodyData","bodyErrors","body","length","ValidationError","ZodMapError","mapErrors","zodValidator","schema","request","validator","ZodValidator","validatedRequest","validate","MessageBuilder","Webhook","AsyncLocalStorage","context","AsyncLocalStorage","getContext","getStore","traceId","pino","PinoLogger","pinoLogger","pinoConfig","level","formatters","label","toUpperCase","timestamp","pino","stdTimeFunctions","isoTime","process","env","ENVIRONMENT","transport","target","options","sync","destination","formatLogParams","params","logData","msg","data","error","name","message","stack","code","info","debug","fatal","warn","DiscordLogger","webhook","pinoLogger","options","Webhook","url","PinoLogger","buildStructuredLog","embed","msg","data","error","traceId","getContext","addField","Date","toISOString","JSON","stringify","structed","type","name","message","code","stack","send","info","params","MessageBuilder","setTitle","process","env","ENVIRONMENT","setColor","catch","debug","fatal","warn","logs","SeverityNumber","OtelLogger","otelLogger","pinoLogger","logs","getLogger","process","env","OTEL_SERVICE_NAME","OTEL_SERVICE_VERSION","PinoLogger","emitOtelLog","severityNumber","severityText","params","msg","data","error","attributes","errorType","name","errorMessage","message","errorStack","stack","errorCode","code","emit","body","timestamp","Date","info","SeverityNumber","INFO","ERROR","debug","DEBUG","fatal","FATAL","warn","WARN","Logger","define","env","definitions","definition","test","development","defineProvider","staging","production","ENVIRONMENT","provider","PinoLogger","DiscordLogger","OTEL_ENABLE","OtelLogger","metrics","cpus","monitorEventLoopDelay","PerformanceObserver","v8","OTEL_ENABLED","process","env","OTEL_ENABLE","MetricsManager","meter","metrics","getMeter","OTEL_SERVICE_NAME","OTEL_SERVICE_VERSION","httpRequestsTotal","createCounter","description","unit","httpRequestDuration","createHistogram","httpRequestsErrors","httpResponseSize","dbQueryDuration","dbQueryErrors","dbTransactionsTotal","dbTransactionDuration","dbDeadlocksTotal","httpRequestBytesTotal","processingDuration","processingErrors","httpClientRequestsTotal","httpClientRequestDuration","httpClientErrors","httpClientTimeouts","validationErrors","processCpuSecondsTotal","processMemoryBytes","createObservableGauge","nodejsHeapSizeTotalBytes","nodejsHeapSizeUsedBytes","nodejsEventloopLagSeconds","nodejsEventloopDurationSeconds","nodejsGcDurationSeconds","processOpenFds","processUptimeSeconds","eventLoopMonitor","monitorEventLoopDelay","resolution","previousCpuUsage","cpuUsage","collectionInterval","gcObserver","recordHttpRequest","params","method","route","statusCode","durationSeconds","responseSizeBytes","attributes","status_code","toString","status_class","getStatusClass","environment","ENVIRONMENT","add","record","error_type","recordDbQueryError","isValidDbQueryErrorParams","operation","repository","errorMessage","recordDbQuery","isValidDbQueryParams","console","warn","isNaN","recordDbTransaction","recordDbDeadlock","recordHttpRequestBytes","bytes","recordProcessingDuration","recordProcessingError","errorType","recordHttpClientRequest","url","error","timeout","normalizedUrl","normalizeUrl","recordValidationError","field","startSystemMetricsCollection","intervalMs","enable","observables","filter","obs","undefined","addBatchObservableCallback","observableResult","collectSystemMetrics","setupGCObserver","setInterval","collectPeriodicMetrics","stopSystemMetricsCollection","clearInterval","disable","disconnect","memUsage","memoryUsage","observe","rss","type","heapTotal","heapUsed","external","heapStats","v8","getHeapStatistics","total_heap_size","used_heap_size","lagMs","mean","resourceUsage","maxRSS","uptime","currentCpuUsage","userCpuSeconds","user","cpus","length","systemCpuSeconds","system","mode","eventLoopDuration","PerformanceObserver","list","entry","getEntries","gcType","kind","duration","getGCKindName","entryTypes","gcTypes","urlObj","URL","protocol","host","pathname","split","FastifyOtelInstrumentation","logs","getNodeAutoInstrumentations","OTLPLogExporter","OTLPMetricExporter","OTLPTraceExporter","HttpInstrumentation","CompressionAlgorithm","Resource","BatchLogRecordProcessor","LoggerProvider","PeriodicExportingMetricReader","NodeSDK","TraceIdRatioBasedSampler","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","SEMRESATTRS_DEPLOYMENT_ENVIRONMENT","OtelManager","resource","loggerProvider","sdk","otlpLogExporter","traceExporter","metricExporter","metricReader","sampler","env","createResource","createOtlpLogExporter","createLoggerProvider","createTraceExporter","createSampler","createMetricExporter","createMetricReader","createSdk","Resource","ATTR_SERVICE_NAME","OTEL_SERVICE_NAME","ATTR_SERVICE_VERSION","OTEL_SERVICE_VERSION","SEMRESATTRS_DEPLOYMENT_ENVIRONMENT","ENVIRONMENT","OTLPLogExporter","url","OTEL_EXPORTER_OTLP_ENDPOINT","compression","CompressionAlgorithm","GZIP","provider","LoggerProvider","configureLogProcessors","logs","setGlobalLoggerProvider","addLogRecordProcessor","BatchLogRecordProcessor","OTLPTraceExporter","DEVELOPMENT_SAMPLE_RATE","PRODUCTION_SAMPLE_RATE","sampleRate","TraceIdRatioBasedSampler","OTLPMetricExporter","PeriodicExportingMetricReader","exporter","exportIntervalMillis","exportTimeoutMillis","NodeSDK","instrumentations","getNodeAutoInstrumentations","enabled","HttpInstrumentation","FastifyOtelInstrumentation","registerOnInitialization","initialize","start","error","console","shutdown","forceFlush","getLoggerProvider","getSdk","trace","MILLISECONDS_TO_SECONDS","ROUNDING_PRECISION","MAX_SANITIZED_KEYS","EXCLUDED_METHODS","Set","TRACER_NAME","process","env","OTEL_SERVICE_NAME","TRACER_VERSION","OTEL_SERVICE_VERSION","OTEL_ENABLED","OTEL_ENABLE","Tracer","instance","getTracer","trace","Metrics","getMetrics","DependencyContainer","resolveToken","BaseFullInstrumentationStrategy","tracer","metrics","metricsRecorder","spanBuilder","logBuilder","instrumentMethod","originalMethod","context","args","timer","createTimer","span","createSpan","logOperationStart","result","call","recordSuccess","error","recordFailure","durationSeconds","getDurationSeconds","durationMs","roundDuration","logSuccess","finalizeSpanSuccess","logger","info","msg","buildSuccessMessage","data","buildSuccessLogData","normalizedError","normalizeError","recordError","logError","finalizeSpanError","buildErrorMessage","buildErrorLogData","buildStartMessage","buildStartLogData","BaseLogsOnlyInstrumentationStrategy","startTime","Date","now","Error","String","Math","round","sanitizeArgs","length","map","sanitizeArg","arg","undefined","sanitizeObject","obj","keys","Object","_truncated","_keyCount","_keys","slice","_error","resolveLogger","PinoLogger","copyReflectMetadata","source","target","injectMetadata","Reflect","getOwnMetadata","defineMetadata","preserveClassName","className","defineProperty","value","writable","configurable","getInstrumentableMethods","methods","prototype","getPrototypeOf","current","propertyNames","getOwnPropertyNames","name","shouldExcludeMethod","isMethod","includes","push","has","startsWith","descriptor","getOwnPropertyDescriptor","instrumentInstanceMethods","contextName","strategy","createContext","methodsToInstrument","console","warn","methodName","wrappedMethod","enumerable","SpanKind","SpanStatusCode","ProcessingMetricsRecorder","metrics","recordSuccess","context","durationSeconds","recordProcessingDuration","operation","recordError","error","recordProcessingError","errorType","name","ProcessingSpanBuilder","serviceName","createSpan","tracer","procContext","spanName","buildSpanName","startSpan","kind","SpanKind","INTERNAL","attributes","className","toLowerCase","finalizeSpanSuccess","span","setStatus","code","SpanStatusCode","OK","setAttribute","end","finalizeSpanError","ERROR","message","recordException","ProcessingLogBuilder","buildStartMessage","buildStartLogData","args","sanitizeArgs","buildSuccessMessage","buildSuccessLogData","durationMs","status","buildErrorMessage","buildErrorLogData","errorMessage","errorName","ProcessingFullInstrumentationStrategy","BaseFullInstrumentationStrategy","ProcessingLogsOnlyInstrumentationStrategy","BaseLogsOnlyInstrumentationStrategy","ProcessingInstrumentationStrategyFactory","create","OTEL_ENABLED","Tracer","getTracer","Metrics","getMetrics","Instrumentation","options","constructor","TRACER_NAME","InstrumentedClass","logger","resolveLogger","strategy","instrumentInstanceMethods","copyReflectMetadata","preserveClassName","SpanKind","SpanStatusCode","DEFAULT_DB_SYSTEM","RepositoryMetricsRecorder","metrics","recordSuccess","context","durationSeconds","repoContext","recordDbQuery","operation","repository","repositoryName","recordError","error","recordDbQueryError","errorMessage","message","RepositorySpanBuilder","dbSystem","createSpan","tracer","spanName","buildSpanName","startSpan","kind","SpanKind","CLIENT","attributes","toLowerCase","finalizeSpanSuccess","span","setStatus","code","SpanStatusCode","OK","setAttribute","end","finalizeSpanError","ERROR","recordException","RepositoryLogBuilder","buildStartMessage","buildStartLogData","args","sanitizeArgs","buildSuccessMessage","buildSuccessLogData","durationMs","status","buildErrorMessage","buildErrorLogData","errorName","name","RepositoryFullInstrumentationStrategy","BaseFullInstrumentationStrategy","RepositoryLogsOnlyInstrumentationStrategy","BaseLogsOnlyInstrumentationStrategy","RepositoryInstrumentationStrategyFactory","create","OTEL_ENABLED","Tracer","getTracer","Metrics","getMetrics","RepositoryInstrumentation","options","constructor","InstrumentedRepository","logger","resolveLogger","strategy","instrumentInstanceMethods","copyReflectMetadata","preserveClassName","z","require","config","Object","assign","process","argv","baseEnvSchema","z","object","NODE_ENV","enum","default","ENVIRONMENT","PORT","coerce","number","DISCORD_WEBHOOK_URL","string","optional","OTEL_ENABLE","transform","val","OTEL_EXPORTER_OTLP_ENDPOINT","url","OTEL_SERVICE_NAME","OTEL_SERVICE_VERSION"]}
|