@lyxa.ai/core 1.3.131 → 1.3.133

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.js CHANGED
@@ -107,7 +107,7 @@ async function registerLibraries(options) {
107
107
  await (0, mongo_1.initGlobalConnection)(mongoUrl, options.environment);
108
108
  const loggerInstance = new logger_1.LyxaLogger(options.instanceType, mongoUrl);
109
109
  typedi_1.Container.set(logger_1.LyxaLogger, loggerInstance);
110
- const loggerKit = new logger_kit_1.LyxaLoggerKit(options.instanceType);
110
+ const loggerKit = new logger_kit_1.LyxaLoggerKit({ instanceType: options.instanceType });
111
111
  typedi_1.Container.set(logger_kit_1.LyxaLoggerKit, loggerKit);
112
112
  const firebaseInstance = new firebase_1.FirebaseService(configurationInstance);
113
113
  typedi_1.Container.set(firebase_1.FirebaseService, firebaseInstance);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["// Apply the soft delete plugin globally before any connections or models\nimport { applySoftDeletePlugin } from './libraries/mongo/plugins/soft-delete-plugin';\napplySoftDeletePlugin();\n\nimport { LibraryManager } from './libraries';\nimport { Container } from 'typedi';\nimport { ConfigurationOptions, ConfigurationService } from './libraries/configuration';\nimport { LyxaLogger } from './libraries/logger';\nimport { RedisService } from './libraries/redis';\nimport { initGlobalConnection, initLyxaMongoDbConnection } from './libraries/mongo';\nimport { SecretManagerService } from './libraries/secrets';\nimport { MicroServiceDispatcher } from './libraries/dispatcher';\nimport { TwilioService } from './libraries/twilio';\nimport { FirebaseService } from './libraries/firebase';\nimport { initEventBus, subscribeToEvent } from './libraries/event';\nimport { SubscriptionRegistry } from './libraries/event/registry/SubscriptionRegistry';\nimport { GoogleMapsService, MapService } from './libraries/map';\nimport { CachedSettingsService } from './libraries/cache/settings';\nimport {\n\tFCMService,\n\tFCMServiceForRider,\n\tFCMServiceForShop,\n\tFCMServiceForUser,\n} from './libraries/firebase/fcmService';\nimport { BullMQService } from './libraries/bullmq/bull-mq-service';\nimport { BOBSecrets, BOBService, CashSettlementService } from './libraries/cash-settlement';\nimport { EnvironmentConfigurationType } from './libraries/configuration/types/EnvironmentConfigurationType';\nimport { OsrmMapService } from './libraries/map/providers/osrm';\nimport { RabbitMQUrlMap } from './utilities/environment/rabbitmq-environments';\nimport { disconnectAllEntitiesFromInstance } from './libraries/socket/connections/instance-disconnect';\nimport { LyxaLoggerKit } from './libraries/logger-kit';\n\n\n\nexport { ConfigurationOptions } from './libraries/configuration';\nexport { EnvironmentConfigurationType } from './libraries/configuration/types/EnvironmentConfigurationType';\nexport { initGlobalConnection } from './libraries/mongo';\n\nexport async function bootstrapCore(options?: ConfigurationOptions) {\n\ttry {\n\t\tawait registerLibraries(options);\n\n\t\tgetLibraries().getLogger().logger.info('Successfully bootstrapped lyxa-core.');\n\n\t\tconst gracefulShutdown = async () => {\n\t\t\tgetLibraries().getLogger().logger.info('Received shutdown signal, shutting down gracefully...');\n\t\t\tif (options?.instanceType == 'socket') await disconnectAllEntitiesFromInstance();\n\t\t\tprocess.exit();\n\t\t};\n\n\t\tprocess.on('SIGTERM', gracefulShutdown);\n\t\tprocess.on('SIGINT', gracefulShutdown);\n\t\tprocess.on('uncaughtException', err => {\n\t\t\tconsole.log('err', err);\n\t\t\tgetLibraries().getLogger().logger.error('Uncaught exception, shutting down...', err);\n\t\t\tgracefulShutdown();\n\t\t});\n\t\tprocess.on('exit', code => {\n\t\t\tgetLibraries().getLogger().logger.info(`Exiting with code: ${code}`);\n\t\t});\n\n\t\tconsole.log('Created hooks.');\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n}\n\nexport async function registerLibraries(options?: ConfigurationOptions) {\n\t// Setup configuration.\n\tconst configurationInstance = new ConfigurationService(options);\n\tContainer.set(ConfigurationService, configurationInstance);\n\n\t// Setup redis.\n\tconst redisInstance = new RedisService(configurationInstance.redisURL);\n\tContainer.set(RedisService, redisInstance);\n\n\t// Setup secret\n\tconst secretInstance = new SecretManagerService(configurationInstance, redisInstance);\n\tContainer.set(SecretManagerService, secretInstance);\n\n\t// Setup BullMQ\n\tconst bullMQInstance = new BullMQService(redisInstance);\n\tContainer.set(BullMQService, bullMQInstance);\n\n\tconst mongoUrl = options?.mongoDbUrl\n\t\t? options.mongoDbUrl\n\t\t: await getLibraries().getSecretsService().getKey('MONGO_URL');\n\n\tawait initLyxaMongoDbConnection(mongoUrl!, options);\n\tawait initGlobalConnection(mongoUrl!, options!.environment);\n\n\tconst loggerInstance = new LyxaLogger(options!.instanceType!, mongoUrl!);\n\tContainer.set(LyxaLogger, loggerInstance);\n\n\tconst loggerKit = new LyxaLoggerKit(options!.instanceType!);\n\tContainer.set(LyxaLoggerKit, loggerKit);\n\t\n\t// Setup firebase\n\tconst firebaseInstance = new FirebaseService(configurationInstance!);\n\tContainer.set(FirebaseService, firebaseInstance);\n\n\t// Setup microservice dispatcher\n\tconst microserviceDispatcherInstance = new MicroServiceDispatcher(secretInstance);\n\tContainer.set(MicroServiceDispatcher, microserviceDispatcherInstance);\n\n\t// Setup twilio\n\tconst twilioServiceInstance = new TwilioService();\n\tContainer.set(TwilioService, twilioServiceInstance);\n\n\t// Setup map service\n\tconst googleMapsKey = await getLibraries().getSecretsService().getKey('GOOGLE_MAPS_API_KEY');\n\tconst googleMapService = new GoogleMapsService(redisInstance, googleMapsKey as string);\n\tconst osrmMapService = new OsrmMapService();\n\tconst mapServiceInstance = new MapService(googleMapService, osrmMapService);\n\tContainer.set(MapService, mapServiceInstance);\n\n\t// Setup cash settlement service\n\tconst bobUsername = await getLibraries().getSecretsService().getKey('BOB_USER_NAME');\n\tconst bobPassword = await getLibraries().getSecretsService().getKey('BOB_PASSWORD');\n\tconst bobURL = await getLibraries().getSecretsService().getKey('BOB_URL');\n\n\tconst bobService = new BOBService({\n\t\tBOB_USER_NAME: bobUsername,\n\t\tBOB_PASSWORD: bobPassword,\n\t\tBOB_URL: bobURL,\n\t} as BOBSecrets);\n\tconst cashSettlementServiceInstance = new CashSettlementService(bobService);\n\tContainer.set(CashSettlementService, cashSettlementServiceInstance);\n\tContainer.set(BOBService, bobService);\n\n\tconst settingsServiceInstance = new CachedSettingsService(redisInstance);\n\tContainer.set(CachedSettingsService, settingsServiceInstance);\n\n\ttry {\n\t\tconst settings = await settingsServiceInstance.getSettings();\n\t\tconst { _setTimezone } = await import('./utilities/dayjs/dayjs');\n\t\t_setTimezone(settings?.timezone || 'Asia/Beirut');\n\t\tconsole.log('Timezone initialized:', settings?.timezone || 'Asia/Beirut');\n\t} catch (error) {\n\t\tconsole.error('Failed to initialize timezone:', error);\n\t}\n\n\t// Setup fcm service\n\tconst firebaseService = getLibraries().getFirebaseService();\n\tconst fcmServiceInstance = new FCMService(firebaseService.superApp);\n\tconst fcmServiceInstanceForUser = new FCMService(firebaseService.userApp);\n\tconst fcmServiceInstanceForRider = new FCMService(firebaseService.riderApp);\n\tconst fcmServiceInstanceForShop = new FCMService(firebaseService.shopApp);\n\tContainer.set(FCMService, fcmServiceInstance);\n\tContainer.set(FCMServiceForUser, fcmServiceInstanceForUser);\n\tContainer.set(FCMServiceForRider, fcmServiceInstanceForRider);\n\tContainer.set(FCMServiceForShop, fcmServiceInstanceForShop);\n\n\tconsole.log('Initialized everything');\n\n\tawait initEventBus(RabbitMQUrlMap[options?.environment ?? EnvironmentConfigurationType.DEV]);\n\n\tconst allSubscriptions = SubscriptionRegistry.getAllSubscriptions();\n\n\tconst instantiatedServices = new Map<Function, any>();\n\n\tfor (const { eventId, targetConstructor, methodName } of allSubscriptions) {\n\t\tlet instance = instantiatedServices.get(targetConstructor);\n\t\tif (!instance) {\n\t\t\tinstance = Container.get(targetConstructor as any);\n\t\t\tinstantiatedServices.set(targetConstructor, instance);\n\t\t}\n\n\t\tawait subscribeToEvent(eventId, async payload => {\n\t\t\treturn instance[methodName](payload);\n\t\t});\n\t}\n}\n\nexport function getLibraries(): LibraryManager {\n\treturn Container.get(LibraryManager);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["// Apply the soft delete plugin globally before any connections or models\nimport { applySoftDeletePlugin } from './libraries/mongo/plugins/soft-delete-plugin';\napplySoftDeletePlugin();\n\nimport { LibraryManager } from './libraries';\nimport { Container } from 'typedi';\nimport { ConfigurationOptions, ConfigurationService } from './libraries/configuration';\nimport { LyxaLogger } from './libraries/logger';\nimport { RedisService } from './libraries/redis';\nimport { initGlobalConnection, initLyxaMongoDbConnection } from './libraries/mongo';\nimport { SecretManagerService } from './libraries/secrets';\nimport { MicroServiceDispatcher } from './libraries/dispatcher';\nimport { TwilioService } from './libraries/twilio';\nimport { FirebaseService } from './libraries/firebase';\nimport { initEventBus, subscribeToEvent } from './libraries/event';\nimport { SubscriptionRegistry } from './libraries/event/registry/SubscriptionRegistry';\nimport { GoogleMapsService, MapService } from './libraries/map';\nimport { CachedSettingsService } from './libraries/cache/settings';\nimport {\n\tFCMService,\n\tFCMServiceForRider,\n\tFCMServiceForShop,\n\tFCMServiceForUser,\n} from './libraries/firebase/fcmService';\nimport { BullMQService } from './libraries/bullmq/bull-mq-service';\nimport { BOBSecrets, BOBService, CashSettlementService } from './libraries/cash-settlement';\nimport { EnvironmentConfigurationType } from './libraries/configuration/types/EnvironmentConfigurationType';\nimport { OsrmMapService } from './libraries/map/providers/osrm';\nimport { RabbitMQUrlMap } from './utilities/environment/rabbitmq-environments';\nimport { disconnectAllEntitiesFromInstance } from './libraries/socket/connections/instance-disconnect';\nimport { LyxaLoggerKit } from './libraries/logger-kit';\n\n\n\nexport { ConfigurationOptions } from './libraries/configuration';\nexport { EnvironmentConfigurationType } from './libraries/configuration/types/EnvironmentConfigurationType';\nexport { initGlobalConnection } from './libraries/mongo';\n\nexport async function bootstrapCore(options?: ConfigurationOptions) {\n\ttry {\n\t\tawait registerLibraries(options);\n\n\t\tgetLibraries().getLogger().logger.info('Successfully bootstrapped lyxa-core.');\n\n\t\tconst gracefulShutdown = async () => {\n\t\t\tgetLibraries().getLogger().logger.info('Received shutdown signal, shutting down gracefully...');\n\t\t\tif (options?.instanceType == 'socket') await disconnectAllEntitiesFromInstance();\n\t\t\tprocess.exit();\n\t\t};\n\n\t\tprocess.on('SIGTERM', gracefulShutdown);\n\t\tprocess.on('SIGINT', gracefulShutdown);\n\t\tprocess.on('uncaughtException', err => {\n\t\t\tconsole.log('err', err);\n\t\t\tgetLibraries().getLogger().logger.error('Uncaught exception, shutting down...', err);\n\t\t\tgracefulShutdown();\n\t\t});\n\t\tprocess.on('exit', code => {\n\t\t\tgetLibraries().getLogger().logger.info(`Exiting with code: ${code}`);\n\t\t});\n\n\t\tconsole.log('Created hooks.');\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n}\n\nexport async function registerLibraries(options?: ConfigurationOptions) {\n\t// Setup configuration.\n\tconst configurationInstance = new ConfigurationService(options);\n\tContainer.set(ConfigurationService, configurationInstance);\n\n\t// Setup redis.\n\tconst redisInstance = new RedisService(configurationInstance.redisURL);\n\tContainer.set(RedisService, redisInstance);\n\n\t// Setup secret\n\tconst secretInstance = new SecretManagerService(configurationInstance, redisInstance);\n\tContainer.set(SecretManagerService, secretInstance);\n\n\t// Setup BullMQ\n\tconst bullMQInstance = new BullMQService(redisInstance);\n\tContainer.set(BullMQService, bullMQInstance);\n\n\tconst mongoUrl = options?.mongoDbUrl\n\t\t? options.mongoDbUrl\n\t\t: await getLibraries().getSecretsService().getKey('MONGO_URL');\n\n\tawait initLyxaMongoDbConnection(mongoUrl!, options);\n\tawait initGlobalConnection(mongoUrl!, options!.environment);\n\n\tconst loggerInstance = new LyxaLogger(options!.instanceType!, mongoUrl!);\n\tContainer.set(LyxaLogger, loggerInstance);\n\n\tconst loggerKit = new LyxaLoggerKit({ instanceType: options!.instanceType! });\n\tContainer.set(LyxaLoggerKit, loggerKit);\n\t\n\t// Setup firebase\n\tconst firebaseInstance = new FirebaseService(configurationInstance!);\n\tContainer.set(FirebaseService, firebaseInstance);\n\n\t// Setup microservice dispatcher\n\tconst microserviceDispatcherInstance = new MicroServiceDispatcher(secretInstance);\n\tContainer.set(MicroServiceDispatcher, microserviceDispatcherInstance);\n\n\t// Setup twilio\n\tconst twilioServiceInstance = new TwilioService();\n\tContainer.set(TwilioService, twilioServiceInstance);\n\n\t// Setup map service\n\tconst googleMapsKey = await getLibraries().getSecretsService().getKey('GOOGLE_MAPS_API_KEY');\n\tconst googleMapService = new GoogleMapsService(redisInstance, googleMapsKey as string);\n\tconst osrmMapService = new OsrmMapService();\n\tconst mapServiceInstance = new MapService(googleMapService, osrmMapService);\n\tContainer.set(MapService, mapServiceInstance);\n\n\t// Setup cash settlement service\n\tconst bobUsername = await getLibraries().getSecretsService().getKey('BOB_USER_NAME');\n\tconst bobPassword = await getLibraries().getSecretsService().getKey('BOB_PASSWORD');\n\tconst bobURL = await getLibraries().getSecretsService().getKey('BOB_URL');\n\n\tconst bobService = new BOBService({\n\t\tBOB_USER_NAME: bobUsername,\n\t\tBOB_PASSWORD: bobPassword,\n\t\tBOB_URL: bobURL,\n\t} as BOBSecrets);\n\tconst cashSettlementServiceInstance = new CashSettlementService(bobService);\n\tContainer.set(CashSettlementService, cashSettlementServiceInstance);\n\tContainer.set(BOBService, bobService);\n\n\tconst settingsServiceInstance = new CachedSettingsService(redisInstance);\n\tContainer.set(CachedSettingsService, settingsServiceInstance);\n\n\ttry {\n\t\tconst settings = await settingsServiceInstance.getSettings();\n\t\tconst { _setTimezone } = await import('./utilities/dayjs/dayjs');\n\t\t_setTimezone(settings?.timezone || 'Asia/Beirut');\n\t\tconsole.log('Timezone initialized:', settings?.timezone || 'Asia/Beirut');\n\t} catch (error) {\n\t\tconsole.error('Failed to initialize timezone:', error);\n\t}\n\n\t// Setup fcm service\n\tconst firebaseService = getLibraries().getFirebaseService();\n\tconst fcmServiceInstance = new FCMService(firebaseService.superApp);\n\tconst fcmServiceInstanceForUser = new FCMService(firebaseService.userApp);\n\tconst fcmServiceInstanceForRider = new FCMService(firebaseService.riderApp);\n\tconst fcmServiceInstanceForShop = new FCMService(firebaseService.shopApp);\n\tContainer.set(FCMService, fcmServiceInstance);\n\tContainer.set(FCMServiceForUser, fcmServiceInstanceForUser);\n\tContainer.set(FCMServiceForRider, fcmServiceInstanceForRider);\n\tContainer.set(FCMServiceForShop, fcmServiceInstanceForShop);\n\n\tconsole.log('Initialized everything');\n\n\tawait initEventBus(RabbitMQUrlMap[options?.environment ?? EnvironmentConfigurationType.DEV]);\n\n\tconst allSubscriptions = SubscriptionRegistry.getAllSubscriptions();\n\n\tconst instantiatedServices = new Map<Function, any>();\n\n\tfor (const { eventId, targetConstructor, methodName } of allSubscriptions) {\n\t\tlet instance = instantiatedServices.get(targetConstructor);\n\t\tif (!instance) {\n\t\t\tinstance = Container.get(targetConstructor as any);\n\t\t\tinstantiatedServices.set(targetConstructor, instance);\n\t\t}\n\n\t\tawait subscribeToEvent(eventId, async payload => {\n\t\t\treturn instance[methodName](payload);\n\t\t});\n\t}\n}\n\nexport function getLibraries(): LibraryManager {\n\treturn Container.get(LibraryManager);\n}\n"]}
@@ -1,21 +1,74 @@
1
- import { Logger } from 'pino';
2
- import { Log } from '../mongo/models';
1
+ import { LogTag } from '../../utilities/enum';
3
2
  import { ErrorInfo, LogMetadata, RequestContext } from './types';
3
+ import { AsyncLocalStorage } from 'node:async_hooks';
4
+ import { TRPCError } from '@trpc/server';
5
+ interface RequestStore {
6
+ requestId?: string;
7
+ userId?: string;
8
+ metadata?: Record<string, unknown>;
9
+ }
10
+ export declare const requestContext: AsyncLocalStorage<RequestStore>;
11
+ interface LoggerConfig {
12
+ instanceType: string;
13
+ ttlDays?: number;
14
+ persistDebug?: boolean;
15
+ logDirectory?: string;
16
+ environment?: string;
17
+ }
4
18
  export declare class LyxaLoggerKit {
5
- private _logger;
6
- private logDirectory;
7
- private model;
8
- private instanceType;
9
- constructor(instanceType: string, ttlDays?: number);
10
- private ensureLogDirectoryExists;
11
- private initializePino;
12
- private logToMongo;
13
- info(tag: string, message: string, data?: Record<string, unknown>, metadata?: LogMetadata, requestId?: string): Promise<void>;
14
- debug(tag: string, message: string, data?: Record<string, unknown>, metadata?: LogMetadata, requestId?: string): Promise<void>;
15
- warn(tag: string, message: string, data?: Record<string, unknown>, metadata?: LogMetadata, requestId?: string): Promise<void>;
16
- error(tag: string, error: Error | ErrorInfo | string, data?: Record<string, unknown>, metadata?: LogMetadata, requestId?: string, context?: RequestContext): Promise<void>;
17
- fatal(tag: string, error: Error | ErrorInfo | string, data?: Record<string, unknown>, metadata?: LogMetadata, requestId?: string, context?: RequestContext): Promise<void>;
18
- logRequest(method: string, url: string, statusCode: number, duration: number, requestId?: string, userId?: string, metadata?: LogMetadata): Promise<void>;
19
- queryLogs(filter: Partial<Log>, limit?: number): Promise<Log[]>;
20
- get logger(): Logger;
19
+ private readonly logger;
20
+ private readonly model;
21
+ private readonly config;
22
+ constructor(config: LoggerConfig);
23
+ private normalizeConfig;
24
+ private ensureLogDirectory;
25
+ private createPinoLogger;
26
+ private getRequestStore;
27
+ private enrichWithContext;
28
+ private shouldPersist;
29
+ private persistLog;
30
+ private normalizeError;
31
+ private buildLogEntry;
32
+ private write;
33
+ info(message: string, options: {
34
+ tag: LogTag;
35
+ data?: Record<string, unknown>;
36
+ metadata?: LogMetadata;
37
+ }): void;
38
+ debug(message: string, options: {
39
+ tag: LogTag;
40
+ data?: Record<string, unknown>;
41
+ metadata?: LogMetadata;
42
+ }): void;
43
+ warn(message: string, options: {
44
+ tag: LogTag;
45
+ data?: Record<string, unknown>;
46
+ metadata?: LogMetadata;
47
+ }): void;
48
+ error(message: string, error: TRPCError | Error | unknown, options: {
49
+ tag: LogTag;
50
+ data?: Record<string, unknown>;
51
+ metadata?: LogMetadata;
52
+ context?: RequestContext;
53
+ }): void;
54
+ fatal(message: string, error: TRPCError | Error | unknown, options: {
55
+ tag: LogTag;
56
+ data?: Record<string, unknown>;
57
+ metadata?: LogMetadata;
58
+ context?: RequestContext;
59
+ }): void;
60
+ private getHttpLogLevel;
61
+ httpRequest(method: string, url: string, statusCode: number, durationMs: number, userId?: string): void;
62
+ child(defaultContext: {
63
+ tag?: LogTag;
64
+ data?: Record<string, unknown>;
65
+ metadata?: LogMetadata;
66
+ }): {
67
+ info: (message: string, options?: Partial<typeof defaultContext>) => void;
68
+ debug: (message: string, options?: Partial<typeof defaultContext>) => void;
69
+ warn: (message: string, options?: Partial<typeof defaultContext>) => void;
70
+ error: (message: string, error: Error | ErrorInfo, options?: Partial<typeof defaultContext>) => void;
71
+ };
21
72
  }
73
+ export declare function withRequestContext<T>(store: RequestStore, fn: () => T | Promise<T>): Promise<T>;
74
+ export {};
@@ -12,179 +12,226 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.LyxaLoggerKit = void 0;
15
+ exports.LyxaLoggerKit = exports.requestContext = void 0;
16
+ exports.withRequestContext = withRequestContext;
16
17
  const fs_1 = __importDefault(require("fs"));
17
18
  const path_1 = __importDefault(require("path"));
18
19
  const pino_1 = require("pino");
19
20
  const typedi_1 = require("typedi");
20
21
  const models_1 = require("../mongo/models");
21
22
  const enum_1 = require("../../utilities/enum");
23
+ const node_async_hooks_1 = require("node:async_hooks");
24
+ const EnvironmentConfigurationType_1 = require("../configuration/types/EnvironmentConfigurationType");
25
+ const mongoose_1 = __importDefault(require("mongoose"));
26
+ exports.requestContext = new node_async_hooks_1.AsyncLocalStorage();
22
27
  let LyxaLoggerKit = class LyxaLoggerKit {
23
- _logger;
24
- logDirectory;
28
+ logger;
25
29
  model;
26
- instanceType;
27
- constructor(instanceType, ttlDays = 7) {
28
- this.instanceType = instanceType;
29
- this.logDirectory = path_1.default.join(process.cwd(), 'logs');
30
- this.model = (0, models_1.createLogModel)({ ttlDays });
31
- this.ensureLogDirectoryExists();
32
- this.initializePino();
33
- }
34
- ensureLogDirectoryExists() {
35
- try {
36
- fs_1.default.mkdirSync(this.logDirectory, { recursive: true });
37
- }
38
- catch (error) {
39
- console.error('Failed to create log directory:', error);
40
- }
30
+ config;
31
+ constructor(config) {
32
+ this.config = this.normalizeConfig(config);
33
+ this.model = (0, models_1.createLogModel)({ ttlDays: this.config.ttlDays });
34
+ this.ensureLogDirectory();
35
+ this.logger = this.createPinoLogger();
41
36
  }
42
- initializePino() {
43
- const baseLevel = process.env.NODE_ENV === 'production' ? 'info' : 'debug';
44
- const targets = [
45
- {
46
- target: 'pino-pretty',
47
- options: { colorize: true },
48
- level: baseLevel,
49
- },
50
- ];
51
- const transports = pino_1.pino.transport({ targets });
52
- this._logger = (0, pino_1.pino)({
53
- level: baseLevel,
37
+ normalizeConfig(config) {
38
+ return {
39
+ instanceType: config.instanceType,
40
+ ttlDays: config.ttlDays ?? 7,
41
+ persistDebug: config.persistDebug ?? process.env.PERSIST_DEBUG_LOGS === 'true',
42
+ logDirectory: config.logDirectory ?? 'logs',
43
+ environment: config.environment ?? process.env.NODE_ENV ?? 'development',
44
+ };
45
+ }
46
+ ensureLogDirectory() {
47
+ const logPath = path_1.default.join(process.cwd(), this.config.logDirectory);
48
+ fs_1.default.mkdirSync(logPath, { recursive: true });
49
+ }
50
+ createPinoLogger() {
51
+ const isProduction = this.config.environment === EnvironmentConfigurationType_1.EnvironmentConfigurationType.PROD;
52
+ return (0, pino_1.pino)({
53
+ level: isProduction ? 'info' : 'debug',
54
54
  base: {
55
- instanceType: this.instanceType,
55
+ service: this.config.instanceType,
56
56
  pid: process.pid,
57
- hostname: process.env.HOSTNAME || 'unknown',
57
+ hostname: process.env.HOSTNAME ?? 'unknown',
58
+ env: this.config.environment,
58
59
  },
59
- }, transports);
60
+ transport: isProduction
61
+ ? undefined
62
+ : {
63
+ target: 'pino-pretty',
64
+ options: {
65
+ colorize: true,
66
+ translateTime: 'SYS:standard',
67
+ ignore: 'pid,hostname',
68
+ },
69
+ },
70
+ });
71
+ }
72
+ getRequestStore() {
73
+ return exports.requestContext.getStore() ?? {};
74
+ }
75
+ enrichWithContext(data = {}) {
76
+ const store = this.getRequestStore();
77
+ return {
78
+ ...data,
79
+ ...(store.requestId && { requestId: store.requestId }),
80
+ ...(store.userId && { userId: store.userId }),
81
+ };
60
82
  }
61
- async logToMongo(logData) {
83
+ shouldPersist(level) {
84
+ return true;
85
+ }
86
+ async persistLog(log) {
87
+ const currentDebug = mongoose_1.default.get('debug');
62
88
  try {
63
- this.model.create({
64
- ...logData,
65
- microService: this.instanceType,
89
+ mongoose_1.default.set('debug', false);
90
+ await this.model.create({
91
+ ...log,
92
+ microService: this.config.instanceType,
93
+ timestamp: new Date(),
66
94
  });
67
95
  }
68
- catch (error) {
69
- console.error('Failed to log to MongoDB:', error);
96
+ catch (err) {
97
+ console.error('[Logger] MongoDB persistence failed:', err);
98
+ }
99
+ finally {
100
+ mongoose_1.default.set('debug', currentDebug);
70
101
  }
71
102
  }
72
- async info(tag, message, data, metadata, requestId) {
73
- try {
74
- this._logger.info({ data, metadata, requestId }, `[${tag}] ${message}`);
75
- await this.logToMongo({
76
- level: enum_1.LogLevel.INFO,
77
- tag,
103
+ normalizeError(error) {
104
+ if (error instanceof Error) {
105
+ return {
106
+ name: error.name,
107
+ message: error.message,
108
+ stack: error.stack,
109
+ };
110
+ }
111
+ return error;
112
+ }
113
+ buildLogEntry(message, payload) {
114
+ const store = this.getRequestStore();
115
+ return {
116
+ tag: payload.tag,
117
+ message,
118
+ data: this.enrichWithContext(payload.data),
119
+ metadata: {
120
+ ...payload.metadata,
121
+ ...store.metadata,
122
+ },
123
+ error: payload.error,
124
+ context: payload.context,
125
+ requestId: store.requestId,
126
+ };
127
+ }
128
+ write(level, message, payload, opts = {}) {
129
+ const { shouldWrite = true } = opts;
130
+ const entry = this.buildLogEntry(message, payload);
131
+ shouldWrite &&
132
+ this.logger[level.toLowerCase()](entry, message);
133
+ if (this.shouldPersist(level)) {
134
+ this.persistLog({
135
+ level,
136
+ tag: payload.tag,
78
137
  message,
79
- data,
80
- metadata: metadata || {},
81
- requestId,
138
+ data: entry.data,
139
+ metadata: entry.metadata ?? {},
140
+ error: payload.error,
141
+ stackTrace: payload.error?.stack?.split('\n'),
142
+ requestId: entry.requestId,
143
+ context: payload.context,
144
+ }).catch(e => {
145
+ console.error('Something went wrong', e);
82
146
  });
83
147
  }
84
- catch (error) {
85
- console.error('Failed to log to MongoDB:', error);
86
- }
87
148
  }
88
- async debug(tag, message, data, metadata, requestId) {
89
- this._logger.debug({ tag, data, metadata, requestId }, message);
90
- await this.logToMongo({
91
- level: enum_1.LogLevel.DEBUG,
92
- tag,
93
- message,
94
- data,
95
- metadata: metadata || {},
96
- requestId,
97
- });
149
+ info(message, options) {
150
+ this.write(enum_1.LogLevel.INFO, message, options);
98
151
  }
99
- async warn(tag, message, data, metadata, requestId) {
100
- this._logger.warn({ tag, data, metadata, requestId }, message);
101
- await this.logToMongo({
102
- level: enum_1.LogLevel.WARN,
103
- tag,
104
- message,
105
- data,
106
- metadata: metadata || {},
107
- requestId,
108
- });
152
+ debug(message, options) {
153
+ this.write(enum_1.LogLevel.DEBUG, message, options);
109
154
  }
110
- async error(tag, error, data, metadata, requestId, context) {
111
- const errorInfo = typeof error === 'string'
112
- ? { name: 'Error', message: error }
113
- : error instanceof Error
114
- ? {
115
- name: error.name,
116
- message: error.message,
117
- stack: error.stack,
118
- }
119
- : error;
120
- this._logger.error({ tag, error: errorInfo, data, metadata, requestId, context }, errorInfo.message);
121
- await this.logToMongo({
122
- level: enum_1.LogLevel.ERROR,
123
- tag,
124
- message: errorInfo.message,
125
- error: errorInfo,
126
- stackTrace: errorInfo.stack?.split('\n'),
127
- data,
128
- metadata: metadata || {},
129
- requestId,
130
- context,
131
- });
155
+ warn(message, options) {
156
+ this.write(enum_1.LogLevel.WARN, message, options, { shouldWrite: false });
132
157
  }
133
- async fatal(tag, error, data, metadata, requestId, context) {
134
- const errorInfo = typeof error === 'string'
135
- ? { name: 'FatalError', message: error }
136
- : error instanceof Error
137
- ? {
138
- name: error.name,
139
- message: error.message,
140
- stack: error.stack,
141
- }
142
- : error;
143
- this._logger.fatal({ tag, error: errorInfo, data, metadata, requestId, context }, errorInfo.message);
144
- await this.logToMongo({
145
- level: enum_1.LogLevel.FATAL,
146
- tag,
147
- message: errorInfo.message,
148
- error: errorInfo,
149
- stackTrace: errorInfo.stack?.split('\n'),
150
- data,
151
- metadata: metadata || {},
152
- requestId,
153
- context,
158
+ error(message, error, options) {
159
+ this.write(enum_1.LogLevel.ERROR, message, {
160
+ ...options,
161
+ error: this.normalizeError(error),
162
+ }, { shouldWrite: false });
163
+ }
164
+ fatal(message, error, options) {
165
+ this.write(enum_1.LogLevel.FATAL, message, {
166
+ ...options,
167
+ error: this.normalizeError(error),
154
168
  });
155
169
  }
156
- async logRequest(method, url, statusCode, duration, requestId, userId, metadata) {
157
- const level = statusCode >= 500 ? enum_1.LogLevel.ERROR : statusCode >= 400 ? enum_1.LogLevel.WARN : enum_1.LogLevel.INFO;
158
- const message = `${method} ${url} ${statusCode} - ${duration}ms`;
159
- await this.logToMongo({
160
- level,
161
- tag: 'HTTP_REQUEST',
162
- message,
163
- duration,
164
- requestId,
170
+ getHttpLogLevel(statusCode) {
171
+ if (statusCode >= 500)
172
+ return enum_1.LogLevel.ERROR;
173
+ if (statusCode >= 400)
174
+ return enum_1.LogLevel.WARN;
175
+ return enum_1.LogLevel.INFO;
176
+ }
177
+ httpRequest(method, url, statusCode, durationMs, userId) {
178
+ this.write(this.getHttpLogLevel(statusCode), 'HTTP request completed', {
179
+ tag: enum_1.LogTag.HTTP_REQUEST,
180
+ data: {
181
+ method,
182
+ url,
183
+ statusCode,
184
+ durationMs,
185
+ ...(userId && { userId }),
186
+ },
187
+ metadata: {
188
+ ...(userId && { userId }),
189
+ statusCode,
190
+ responseTime: durationMs,
191
+ },
165
192
  context: { method, url },
166
- metadata: { ...metadata, userId, statusCode },
167
193
  });
168
- if (level === enum_1.LogLevel.ERROR) {
169
- this._logger.error({ method, url, statusCode, duration, requestId }, message);
170
- }
171
- else if (level === enum_1.LogLevel.WARN) {
172
- this._logger.warn({ method, url, statusCode, duration, requestId }, message);
173
- }
174
- else {
175
- this._logger.info({ method, url, statusCode, duration, requestId }, message);
176
- }
177
194
  }
178
- async queryLogs(filter, limit = 100) {
179
- return this.model.find(filter).limit(limit).sort({ createdAt: -1 }).exec();
180
- }
181
- get logger() {
182
- return this._logger;
195
+ child(defaultContext) {
196
+ return {
197
+ info: (message, opts = {}) => this.info(message, {
198
+ tag: opts.tag ?? defaultContext.tag ?? enum_1.LogTag.HTTP_REQUEST,
199
+ data: { ...defaultContext.data, ...opts.data },
200
+ metadata: { ...defaultContext.metadata, ...opts.metadata },
201
+ }),
202
+ debug: (message, opts = {}) => this.debug(message, {
203
+ tag: opts.tag ?? defaultContext.tag ?? enum_1.LogTag.HTTP_REQUEST,
204
+ data: { ...defaultContext.data, ...opts.data },
205
+ metadata: { ...defaultContext.metadata, ...opts.metadata },
206
+ }),
207
+ warn: (message, opts = {}) => this.warn(message, {
208
+ tag: opts.tag ?? defaultContext.tag ?? enum_1.LogTag.HTTP_REQUEST,
209
+ data: { ...defaultContext.data, ...opts.data },
210
+ metadata: { ...defaultContext.metadata, ...opts.metadata },
211
+ }),
212
+ error: (message, error, opts = {}) => this.error(message, error, {
213
+ tag: opts.tag ?? defaultContext.tag ?? enum_1.LogTag.HTTP_REQUEST,
214
+ data: { ...defaultContext.data, ...opts.data },
215
+ metadata: { ...defaultContext.metadata, ...opts.metadata },
216
+ }),
217
+ };
183
218
  }
184
219
  };
185
220
  exports.LyxaLoggerKit = LyxaLoggerKit;
186
221
  exports.LyxaLoggerKit = LyxaLoggerKit = __decorate([
187
222
  (0, typedi_1.Service)(),
188
- __metadata("design:paramtypes", [String, Number])
223
+ __metadata("design:paramtypes", [Object])
189
224
  ], LyxaLoggerKit);
225
+ function withRequestContext(store, fn) {
226
+ return new Promise((resolve, reject) => {
227
+ exports.requestContext.run(store, async () => {
228
+ try {
229
+ resolve(await fn());
230
+ }
231
+ catch (err) {
232
+ reject(err);
233
+ }
234
+ });
235
+ });
236
+ }
190
237
  //# sourceMappingURL=logger.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.service.js","sourceRoot":"/","sources":["libraries/logger-kit/logger.service.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Logger, pino } from 'pino';\nimport { Service } from 'typedi';\nimport { createLogModel, Log } from '../mongo/models';\nimport { LogLevel } from '../../utilities/enum';\nimport { ErrorInfo, LogMetadata, RequestContext } from './types';\n\n@Service()\nexport class LyxaLoggerKit {\n\tprivate _logger: Logger;\n\tprivate logDirectory: string;\n\tprivate model: ReturnType<typeof createLogModel>;\n\tprivate instanceType: string;\n\n\tconstructor(instanceType: string, ttlDays: number = 7) {\n\t\tthis.instanceType = instanceType;\n\t\tthis.logDirectory = path.join(process.cwd(), 'logs');\n\n\t\tthis.model = createLogModel({ ttlDays });\n\n\t\tthis.ensureLogDirectoryExists();\n\t\tthis.initializePino();\n\t}\n\n\t// Removed connectToMongo; rely on shared mongoose connection\n\n\tprivate ensureLogDirectoryExists(): void {\n\t\ttry {\n\t\t\tfs.mkdirSync(this.logDirectory, { recursive: true });\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to create log directory:', error);\n\t\t}\n\t}\n\n\tprivate initializePino(): void {\n\t\tconst baseLevel = process.env.NODE_ENV === 'production' ? 'info' : 'debug';\n\n\t\tconst targets: Array<any> = [\n\t\t\t{\n\t\t\t\ttarget: 'pino-pretty',\n\t\t\t\toptions: { colorize: true },\n\t\t\t\tlevel: baseLevel,\n\t\t\t},\n\t\t];\n\n\t\tconst transports = pino.transport({ targets });\n\t\tthis._logger = pino(\n\t\t\t{\n\t\t\t\tlevel: baseLevel,\n\t\t\t\tbase: {\n\t\t\t\t\tinstanceType: this.instanceType,\n\t\t\t\t\tpid: process.pid,\n\t\t\t\t\thostname: process.env.HOSTNAME || 'unknown',\n\t\t\t\t},\n\t\t\t},\n\t\t\ttransports\n\t\t);\n\t}\n\n\t// Direct MongoDB logging methods\n\tprivate async logToMongo(logData: Partial<Log>): Promise<void> {\n\t\ttry {\n\t\t\tthis.model.create({\n\t\t\t\t...logData,\n\t\t\t\tmicroService: this.instanceType,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to log to MongoDB:', error);\n\t\t}\n\t}\n\n\t// Structured logging methods\n\tasync info(\n\t\ttag: string,\n\t\tmessage: string,\n\t\tdata?: Record<string, unknown>,\n\t\tmetadata?: LogMetadata,\n\t\trequestId?: string\n\t): Promise<void> {\n\t\ttry {\n\t\t\tthis._logger.info({ data, metadata, requestId }, `[${tag}] ${message}`);\n\n\t\t\tawait this.logToMongo({\n\t\t\t\tlevel: LogLevel.INFO,\n\t\t\t\ttag,\n\t\t\t\tmessage,\n\t\t\t\tdata,\n\t\t\t\tmetadata: metadata || {},\n\t\t\t\trequestId,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to log to MongoDB:', error);\n\t\t}\n\t}\n\n\tasync debug(\n\t\ttag: string,\n\t\tmessage: string,\n\t\tdata?: Record<string, unknown>,\n\t\tmetadata?: LogMetadata,\n\t\trequestId?: string\n\t): Promise<void> {\n\t\tthis._logger.debug({ tag, data, metadata, requestId }, message);\n\n\t\tawait this.logToMongo({\n\t\t\tlevel: LogLevel.DEBUG,\n\t\t\ttag,\n\t\t\tmessage,\n\t\t\tdata,\n\t\t\tmetadata: metadata || {},\n\t\t\trequestId,\n\t\t});\n\t}\n\n\tasync warn(\n\t\ttag: string,\n\t\tmessage: string,\n\t\tdata?: Record<string, unknown>,\n\t\tmetadata?: LogMetadata,\n\t\trequestId?: string\n\t): Promise<void> {\n\t\tthis._logger.warn({ tag, data, metadata, requestId }, message);\n\n\t\tawait this.logToMongo({\n\t\t\tlevel: LogLevel.WARN,\n\t\t\ttag,\n\t\t\tmessage,\n\t\t\tdata,\n\t\t\tmetadata: metadata || {},\n\t\t\trequestId,\n\t\t});\n\t}\n\n\tasync error(\n\t\ttag: string,\n\t\terror: Error | ErrorInfo | string,\n\t\tdata?: Record<string, unknown>,\n\t\tmetadata?: LogMetadata,\n\t\trequestId?: string,\n\t\tcontext?: RequestContext\n\t): Promise<void> {\n\t\tconst errorInfo: ErrorInfo =\n\t\t\ttypeof error === 'string'\n\t\t\t\t? { name: 'Error', message: error }\n\t\t\t\t: error instanceof Error\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: error.name,\n\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\tstack: error.stack,\n\t\t\t\t\t\t}\n\t\t\t\t\t: error;\n\n\t\tthis._logger.error({ tag, error: errorInfo, data, metadata, requestId, context }, errorInfo.message);\n\n\t\tawait this.logToMongo({\n\t\t\tlevel: LogLevel.ERROR,\n\t\t\ttag,\n\t\t\tmessage: errorInfo.message,\n\t\t\terror: errorInfo,\n\t\t\tstackTrace: errorInfo.stack?.split('\\n'),\n\t\t\tdata,\n\t\t\tmetadata: metadata || {},\n\t\t\trequestId,\n\t\t\tcontext,\n\t\t});\n\t}\n\n\tasync fatal(\n\t\ttag: string,\n\t\terror: Error | ErrorInfo | string,\n\t\tdata?: Record<string, unknown>,\n\t\tmetadata?: LogMetadata,\n\t\trequestId?: string,\n\t\tcontext?: RequestContext\n\t): Promise<void> {\n\t\tconst errorInfo: ErrorInfo =\n\t\t\ttypeof error === 'string'\n\t\t\t\t? { name: 'FatalError', message: error }\n\t\t\t\t: error instanceof Error\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: error.name,\n\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\tstack: error.stack,\n\t\t\t\t\t\t}\n\t\t\t\t\t: error;\n\n\t\tthis._logger.fatal({ tag, error: errorInfo, data, metadata, requestId, context }, errorInfo.message);\n\n\t\tawait this.logToMongo({\n\t\t\tlevel: LogLevel.FATAL,\n\t\t\ttag,\n\t\t\tmessage: errorInfo.message,\n\t\t\terror: errorInfo,\n\t\t\tstackTrace: errorInfo.stack?.split('\\n'),\n\t\t\tdata,\n\t\t\tmetadata: metadata || {},\n\t\t\trequestId,\n\t\t\tcontext,\n\t\t});\n\t}\n\n\t// Convenience method for HTTP request logging\n\tasync logRequest(\n\t\tmethod: string,\n\t\turl: string,\n\t\tstatusCode: number,\n\t\tduration: number,\n\t\trequestId?: string,\n\t\tuserId?: string,\n\t\tmetadata?: LogMetadata\n\t): Promise<void> {\n\t\tconst level = statusCode >= 500 ? LogLevel.ERROR : statusCode >= 400 ? LogLevel.WARN : LogLevel.INFO;\n\t\tconst message = `${method} ${url} ${statusCode} - ${duration}ms`;\n\n\t\tawait this.logToMongo({\n\t\t\tlevel,\n\t\t\ttag: 'HTTP_REQUEST',\n\t\t\tmessage,\n\t\t\tduration,\n\t\t\trequestId,\n\t\t\tcontext: { method, url },\n\t\t\tmetadata: { ...metadata, userId, statusCode },\n\t\t});\n\n\t\tif (level === LogLevel.ERROR) {\n\t\t\tthis._logger.error({ method, url, statusCode, duration, requestId }, message);\n\t\t} else if (level === LogLevel.WARN) {\n\t\t\tthis._logger.warn({ method, url, statusCode, duration, requestId }, message);\n\t\t} else {\n\t\t\tthis._logger.info({ method, url, statusCode, duration, requestId }, message);\n\t\t}\n\t}\n\n\t// Query logs from MongoDB\n\tasync queryLogs(filter: Partial<Log>, limit = 100): Promise<Log[]> {\n\t\treturn this.model.find(filter).limit(limit).sort({ createdAt: -1 }).exec();\n\t}\n\n\t// Backwards compatibility with existing code\n\tget logger(): Logger {\n\t\treturn this._logger;\n\t}\n}\n"]}
1
+ {"version":3,"file":"logger.service.js","sourceRoot":"/","sources":["libraries/logger-kit/logger.service.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Logger, pino } from 'pino';\nimport { Service } from 'typedi';\nimport { createLogModel, Log } from '../mongo/models';\nimport { LogLevel, LogTag } from '../../utilities/enum';\nimport { ErrorInfo, LogMetadata, RequestContext } from './types';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { EnvironmentConfigurationType } from '../configuration/types/EnvironmentConfigurationType';\nimport mongoose from 'mongoose';\nimport { TRPCError } from '@trpc/server';\n\ninterface RequestStore {\n\trequestId?: string;\n\tuserId?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport const requestContext = new AsyncLocalStorage<RequestStore>();\n\ninterface LoggerConfig {\n\tinstanceType: string;\n\tttlDays?: number;\n\tpersistDebug?: boolean;\n\tlogDirectory?: string;\n\tenvironment?: string;\n}\n\n@Service()\nexport class LyxaLoggerKit {\n\tprivate readonly logger: Logger;\n\tprivate readonly model: ReturnType<typeof createLogModel>;\n\tprivate readonly config: Required<LoggerConfig>;\n\n\tconstructor(config: LoggerConfig) {\n\t\tthis.config = this.normalizeConfig(config);\n\t\tthis.model = createLogModel({ ttlDays: this.config.ttlDays });\n\t\tthis.ensureLogDirectory();\n\t\tthis.logger = this.createPinoLogger();\n\t}\n\n\tprivate normalizeConfig(config: LoggerConfig): Required<LoggerConfig> {\n\t\treturn {\n\t\t\tinstanceType: config.instanceType,\n\t\t\tttlDays: config.ttlDays ?? 7,\n\t\t\tpersistDebug: config.persistDebug ?? process.env.PERSIST_DEBUG_LOGS === 'true',\n\t\t\tlogDirectory: config.logDirectory ?? 'logs',\n\t\t\tenvironment: config.environment ?? process.env.NODE_ENV ?? 'development',\n\t\t};\n\t}\n\n\tprivate ensureLogDirectory(): void {\n\t\tconst logPath = path.join(process.cwd(), this.config.logDirectory);\n\t\tfs.mkdirSync(logPath, { recursive: true });\n\t}\n\n\tprivate createPinoLogger(): Logger {\n\t\tconst isProduction = this.config.environment === EnvironmentConfigurationType.PROD;\n\n\t\treturn pino({\n\t\t\tlevel: isProduction ? 'info' : 'debug',\n\t\t\tbase: {\n\t\t\t\tservice: this.config.instanceType,\n\t\t\t\tpid: process.pid,\n\t\t\t\thostname: process.env.HOSTNAME ?? 'unknown',\n\t\t\t\tenv: this.config.environment,\n\t\t\t},\n\t\t\ttransport: isProduction\n\t\t\t\t? undefined\n\t\t\t\t: {\n\t\t\t\t\t\ttarget: 'pino-pretty',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tcolorize: true,\n\t\t\t\t\t\t\ttranslateTime: 'SYS:standard',\n\t\t\t\t\t\t\tignore: 'pid,hostname',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t});\n\t}\n\n\tprivate getRequestStore(): RequestStore {\n\t\treturn requestContext.getStore() ?? {};\n\t}\n\n\tprivate enrichWithContext(data: Record<string, unknown> = {}): Record<string, unknown> {\n\t\tconst store = this.getRequestStore();\n\t\treturn {\n\t\t\t...data,\n\t\t\t...(store.requestId && { requestId: store.requestId }),\n\t\t\t...(store.userId && { userId: store.userId }),\n\t\t};\n\t}\n\n\tprivate shouldPersist(level: LogLevel): boolean {\n\t\t// return level !== LogLevel.DEBUG || this.config.persistDebug;\n\t\treturn true;\n\t}\n\n\tprivate async persistLog(log: Partial<Log>): Promise<void> {\n\t\tconst currentDebug = mongoose.get('debug');\n\t\ttry {\n\t\t\tmongoose.set('debug', false);\n\t\t\tawait this.model.create({\n\t\t\t\t...log,\n\t\t\t\tmicroService: this.config.instanceType,\n\t\t\t\ttimestamp: new Date(),\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error('[Logger] MongoDB persistence failed:', err);\n\t\t} finally {\n\t\t\tmongoose.set('debug', currentDebug);\n\t\t}\n\t}\n\n\tprivate normalizeError(error: TRPCError | Error | unknown): ErrorInfo {\n\t\tif (error instanceof Error) {\n\t\t\treturn {\n\t\t\t\tname: error.name,\n\t\t\t\tmessage: error.message,\n\t\t\t\tstack: error.stack,\n\t\t\t};\n\t\t}\n\t\treturn error as ErrorInfo;\n\t}\n\n\tprivate buildLogEntry(\n\t\tmessage: string,\n\t\tpayload: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t\terror?: ErrorInfo;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t) {\n\t\tconst store = this.getRequestStore();\n\n\t\treturn {\n\t\t\ttag: payload.tag,\n\t\t\tmessage,\n\t\t\tdata: this.enrichWithContext(payload.data),\n\t\t\tmetadata: {\n\t\t\t\t...payload.metadata,\n\t\t\t\t...store.metadata,\n\t\t\t},\n\t\t\terror: payload.error,\n\t\t\tcontext: payload.context,\n\t\t\trequestId: store.requestId,\n\t\t};\n\t}\n\n\tprivate write(\n\t\tlevel: LogLevel,\n\t\tmessage: string,\n\t\tpayload: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t\terror?: ErrorInfo;\n\t\t\tcontext?: RequestContext;\n\t\t},\n\t\topts: { shouldWrite?: boolean } = {}\n\t): void {\n\t\tconst { shouldWrite = true } = opts;\n\t\tconst entry = this.buildLogEntry(message, payload);\n\n\t\t// Console/Pino logging\n\t\tshouldWrite &&\n\t\t\tthis.logger[level.toLowerCase() as 'info' | 'debug' | 'warn' | 'error' | 'fatal'](entry, message);\n\n\t\t// Async persistence (fire-and-forget)\n\t\tif (this.shouldPersist(level)) {\n\t\t\tthis.persistLog({\n\t\t\t\tlevel,\n\t\t\t\ttag: payload.tag,\n\t\t\t\tmessage,\n\t\t\t\tdata: entry.data,\n\t\t\t\tmetadata: entry.metadata ?? {},\n\t\t\t\terror: payload.error,\n\t\t\t\tstackTrace: payload.error?.stack?.split('\\n'),\n\t\t\t\trequestId: entry.requestId,\n\t\t\t\tcontext: payload.context,\n\t\t\t}).catch(e => {\n\t\t\t\tconsole.error('Something went wrong', e);\n\t\t\t});\n\t\t}\n\t}\n\n\t/* ---------------------------------- */\n\t/* Public Logging API */\n\n\t/* ---------------------------------- */\n\n\tinfo(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.INFO, message, options);\n\t}\n\n\tdebug(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.DEBUG, message, options);\n\t}\n\n\twarn(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.WARN, message, options, { shouldWrite: false });\n\t}\n\n\terror(\n\t\tmessage: string,\n\t\terror: TRPCError | Error | unknown,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t): void {\n\t\tthis.write(\n\t\t\tLogLevel.ERROR,\n\t\t\tmessage,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\terror: this.normalizeError(error),\n\t\t\t},\n\t\t\t{ shouldWrite: false }\n\t\t);\n\t}\n\n\tfatal(\n\t\tmessage: string,\n\t\terror: TRPCError | Error | unknown,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.FATAL, message, {\n\t\t\t...options,\n\t\t\terror: this.normalizeError(error),\n\t\t});\n\t}\n\n\t/* ---------------------------------- */\n\t/* HTTP Convenience Methods */\n\n\t/* ---------------------------------- */\n\n\tprivate getHttpLogLevel(statusCode: number): LogLevel {\n\t\tif (statusCode >= 500) return LogLevel.ERROR;\n\t\tif (statusCode >= 400) return LogLevel.WARN;\n\t\treturn LogLevel.INFO;\n\t}\n\n\thttpRequest(method: string, url: string, statusCode: number, durationMs: number, userId?: string): void {\n\t\tthis.write(this.getHttpLogLevel(statusCode), 'HTTP request completed', {\n\t\t\ttag: LogTag.HTTP_REQUEST,\n\t\t\tdata: {\n\t\t\t\tmethod,\n\t\t\t\turl,\n\t\t\t\tstatusCode,\n\t\t\t\tdurationMs,\n\t\t\t\t...(userId && { userId }),\n\t\t\t},\n\t\t\tmetadata: {\n\t\t\t\t...(userId && { userId }),\n\t\t\t\tstatusCode,\n\t\t\t\tresponseTime: durationMs,\n\t\t\t},\n\t\t\tcontext: { method, url },\n\t\t});\n\t}\n\n\tchild(defaultContext: { tag?: LogTag; data?: Record<string, unknown>; metadata?: LogMetadata }): {\n\t\tinfo: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\tdebug: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\twarn: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\terror: (message: string, error: Error | ErrorInfo, options?: Partial<typeof defaultContext>) => void;\n\t} {\n\t\treturn {\n\t\t\tinfo: (message, opts = {}) =>\n\t\t\t\tthis.info(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\tdebug: (message, opts = {}) =>\n\t\t\t\tthis.debug(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\twarn: (message, opts = {}) =>\n\t\t\t\tthis.warn(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\terror: (message, error, opts = {}) =>\n\t\t\t\tthis.error(message, error, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t};\n\t}\n}\n\nexport function withRequestContext<T>(store: RequestStore, fn: () => T | Promise<T>): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\trequestContext.run(store, async () => {\n\t\t\ttry {\n\t\t\t\tresolve(await fn());\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t});\n}"]}
@@ -1,7 +1,8 @@
1
1
  import { ReturnModelType } from '@typegoose/typegoose';
2
2
  import { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';
3
3
  import { LogLevel } from '../../../utilities/enum';
4
- import { ErrorInfo, LogMetadata, RequestContext } from '../../logger-kit';
4
+ import { LogMetadata, RequestContext } from '../../logger-kit';
5
+ import { TRPCError } from '@trpc/server';
5
6
  export interface LogModelConfig {
6
7
  ttlDays?: number;
7
8
  collectionName?: string;
@@ -15,7 +16,7 @@ export declare class Log extends TimeStamps {
15
16
  requestId?: string;
16
17
  data?: Record<string, unknown>;
17
18
  result?: Record<string, unknown>;
18
- error?: ErrorInfo;
19
+ error?: TRPCError | Error | unknown;
19
20
  stackTrace?: string[];
20
21
  message: string;
21
22
  metadata: LogMetadata;