node-server-engine 1.10.0 → 1.10.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ElasticSearch.js","names":["_fs","require","_path","_interopRequireDefault","_elasticsearch","_EngineError","_LifecycleController","_utils","_checkEnvironment","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","namespace","client","ElasticSearch","exports","init","checkEnvironment","ELASTIC_SEARCH_HOST","envAssert","isString","ELASTIC_SEARCH_USERNAME","ELASTIC_SEARCH_PASSWORD","ELASTIC_SEARCH_MIGRATION_PATH","process","env","EngineError","message","reportDebug","data","host","config","node","auth","username","password","maxRetries","requestTimeout","sniffOnStart","TLS_CA","tls","ca","rejectUnauthorized","NODE_ENV","Client","ping","error","indices","delete","index","migrate","LifecycleController","register","reportInfo","getClient","migrationPath","path","resolve","files","readdirSync","filter","endsWith","indexExists","exists","ran","file","result","search","query","match","total","hits","value","push","migration","specifier","Promise","then","s","id","document","ranAt","Date","toISOString","reportError","stack","length","shutdown","close","undefined"],"sources":["../../../src/entities/ElasticSearch/ElasticSearch.ts"],"sourcesContent":["import { readdirSync } from 'fs';\nimport path from 'path';\nimport { Client } from '@elastic/elasticsearch';\nimport { ElasticSearchMigration } from './ElasticSearch.types';\nimport { EngineError } from 'entities/EngineError';\nimport { LifecycleController } from 'entities/LifecycleController';\nimport { envAssert, reportError, reportInfo, reportDebug } from 'utils';\nimport { checkEnvironment } from 'utils/checkEnvironment';\n\nconst namespace = 'engine:elasticsearch';\n\n/** Elastic search client */\nlet client: undefined | Client;\n\nexport const ElasticSearch = {\n /**\n * Init function that should be called on server startup to establish the connection\n */\n async init(): Promise<void> {\n checkEnvironment({\n ELASTIC_SEARCH_HOST: envAssert.isString(),\n ELASTIC_SEARCH_USERNAME: envAssert.isString(),\n ELASTIC_SEARCH_PASSWORD: envAssert.isString(),\n ELASTIC_SEARCH_MIGRATION_PATH: envAssert.isString()\n });\n\n if (!process.env.ELASTIC_SEARCH_HOST)\n throw new EngineError({\n message: 'ElasticSearch Host not set in environment'\n });\n\n reportDebug({\n namespace,\n message: 'Initializing ElasticSearch client',\n data: { host: process.env.ELASTIC_SEARCH_HOST }\n });\n\n const config: any = {\n node: process.env.ELASTIC_SEARCH_HOST,\n auth: {\n username: process.env.ELASTIC_SEARCH_USERNAME as string,\n password: process.env.ELASTIC_SEARCH_PASSWORD as string\n },\n maxRetries: 3,\n requestTimeout: 30000,\n sniffOnStart: false\n };\n\n // Add TLS configuration if TLS_CA is provided\n if (process.env.TLS_CA) {\n config.tls = {\n ca: process.env.TLS_CA,\n rejectUnauthorized: process.env.NODE_ENV === 'production'\n };\n reportDebug({\n namespace,\n message: 'TLS enabled for ElasticSearch connection'\n });\n }\n\n client = new Client(config);\n\n // Verify connection\n try {\n await client.ping();\n reportDebug({\n namespace,\n message: 'ElasticSearch connection established'\n });\n } catch (error) {\n throw new EngineError({\n message: 'Failed to connect to ElasticSearch',\n data: { error: (error as Error).message }\n });\n }\n\n // In test environment flush the database before running migrations\n if (process.env.NODE_ENV === 'test') {\n reportDebug({\n namespace,\n message: 'Test environment detected, flushing all indices'\n });\n await client.indices.delete({ index: '*' });\n }\n\n await this.migrate();\n LifecycleController.register(this);\n\n reportInfo({ message: 'ElasticSearch initialized successfully' });\n },\n\n /**\n * Get the ElasticSearch client (for advanced use cases)\n */\n getClient(): Client | undefined {\n return client;\n },\n\n /**\n * Migration function called during the init process\n * Manages the database structure\n */\n async migrate(): Promise<void> {\n if (!client) throw new EngineError({ message: 'ElasticSearch was not initialized' });\n\n reportDebug({\n namespace,\n message: 'Starting ElasticSearch migrations'\n });\n\n const migrationPath = path.resolve(\n process.env.ELASTIC_SEARCH_MIGRATION_PATH as string\n );\n\n let files: string[];\n try {\n files = readdirSync(migrationPath).filter(\n f => f.endsWith('.ts') || f.endsWith('.js')\n );\n } catch (error) {\n throw new EngineError({\n message: 'Failed to read migration directory',\n data: { path: migrationPath, error: (error as Error).message }\n });\n }\n\n const indexExists = await client.indices.exists({\n index: 'migrations'\n });\n\n const ran: string[] = [];\n\n for (const file of files) {\n if (indexExists) {\n const result = await client.search({\n index: 'migrations',\n query: { match: { file } }\n });\n\n const total = typeof result.hits.total === 'number'\n ? result.hits.total\n : result.hits.total?.value ?? 0;\n\n if (total > 0) {\n reportDebug({\n namespace,\n message: `Skipping migration ${file} (already ran)`\n });\n continue;\n }\n }\n\n reportDebug({\n namespace,\n message: `Running migration: ${file}`\n });\n\n ran.push(file);\n\n try {\n const migration = (await import(\n `${migrationPath}/${file}`\n )) as ElasticSearchMigration;\n\n await migration.migrate(client);\n\n await client.index({\n index: 'migrations',\n id: file,\n document: { file, ranAt: new Date().toISOString() }\n });\n\n reportDebug({\n namespace,\n message: `Successfully ran migration: ${file}`\n });\n } catch (error) {\n reportError(\n new EngineError({\n message: `Migration failed: ${file}`,\n data: { error: (error as Error).message, stack: (error as Error).stack }\n })\n );\n throw error;\n }\n }\n\n reportInfo({\n message: `ElasticSearch: ran ${ran.length} migration(s)`,\n data: { files: ran }\n });\n },\n\n /**\n * Shutdown function that should be called on server stop to close the connection\n */\n async shutdown(): Promise<void> {\n if (client) {\n try {\n await client.close();\n reportDebug({\n namespace,\n message: 'ElasticSearch client disconnected'\n });\n } catch (error) {\n reportError(\n new EngineError({\n message: 'Error during ElasticSearch shutdown',\n data: { error: (error as Error).message }\n })\n );\n }\n client = undefined;\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ElasticSearch.js","names":["_fs","require","_path","_interopRequireDefault","_elasticsearch","_EngineError","_LifecycleController","_utils","_checkEnvironment","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","namespace","client","ElasticSearch","exports","init","checkEnvironment","ELASTIC_SEARCH_HOST","envAssert","isString","ELASTIC_SEARCH_USERNAME","ELASTIC_SEARCH_PASSWORD","ELASTIC_SEARCH_MIGRATION_PATH","process","env","EngineError","message","reportDebug","data","host","config","node","auth","username","password","maxRetries","requestTimeout","sniffOnStart","TLS_CA","tls","ca","rejectUnauthorized","NODE_ENV","Client","ping","error","indices","delete","index","migrate","LifecycleController","register","reportInfo","getClient","migrationPath","path","resolve","files","readdirSync","filter","endsWith","indexExists","exists","ran","file","result","search","query","match","total","hits","value","push","migration","specifier","Promise","then","s","id","document","ranAt","Date","toISOString","reportError","stack","length","shutdown","close","undefined"],"sources":["../../../src/entities/ElasticSearch/ElasticSearch.ts"],"sourcesContent":["import { readdirSync } from 'fs';\nimport path from 'path';\nimport { Client, ClientOptions } from '@elastic/elasticsearch';\nimport { ElasticSearchMigration } from './ElasticSearch.types';\nimport { EngineError } from 'entities/EngineError';\nimport { LifecycleController } from 'entities/LifecycleController';\nimport { envAssert, reportError, reportInfo, reportDebug } from 'utils';\nimport { checkEnvironment } from 'utils/checkEnvironment';\n\nconst namespace = 'engine:elasticsearch';\n\n/** Elastic search client */\nlet client: undefined | Client;\n\nexport const ElasticSearch = {\n /**\n * Init function that should be called on server startup to establish the connection\n */\n async init(): Promise<void> {\n checkEnvironment({\n ELASTIC_SEARCH_HOST: envAssert.isString(),\n ELASTIC_SEARCH_USERNAME: envAssert.isString(),\n ELASTIC_SEARCH_PASSWORD: envAssert.isString(),\n ELASTIC_SEARCH_MIGRATION_PATH: envAssert.isString()\n });\n\n if (!process.env.ELASTIC_SEARCH_HOST)\n throw new EngineError({\n message: 'ElasticSearch Host not set in environment'\n });\n\n reportDebug({\n namespace,\n message: 'Initializing ElasticSearch client',\n data: { host: process.env.ELASTIC_SEARCH_HOST }\n });\n\n const config: ClientOptions = {\n node: process.env.ELASTIC_SEARCH_HOST,\n auth: {\n username: process.env.ELASTIC_SEARCH_USERNAME as string,\n password: process.env.ELASTIC_SEARCH_PASSWORD as string\n },\n maxRetries: 3,\n requestTimeout: 30000,\n sniffOnStart: false\n };\n\n // Add TLS configuration if TLS_CA is provided\n if (process.env.TLS_CA) {\n config.tls = {\n ca: process.env.TLS_CA,\n rejectUnauthorized: process.env.NODE_ENV === 'production'\n };\n reportDebug({\n namespace,\n message: 'TLS enabled for ElasticSearch connection'\n });\n }\n\n client = new Client(config);\n\n // Verify connection\n try {\n await client.ping();\n reportDebug({\n namespace,\n message: 'ElasticSearch connection established'\n });\n } catch (error) {\n throw new EngineError({\n message: 'Failed to connect to ElasticSearch',\n data: { error: (error as Error).message }\n });\n }\n\n // In test environment flush the database before running migrations\n if (process.env.NODE_ENV === 'test') {\n reportDebug({\n namespace,\n message: 'Test environment detected, flushing all indices'\n });\n await client.indices.delete({ index: '*' });\n }\n\n await this.migrate();\n LifecycleController.register(this);\n\n reportInfo({ message: 'ElasticSearch initialized successfully' });\n },\n\n /**\n * Get the ElasticSearch client (for advanced use cases)\n */\n getClient(): Client | undefined {\n return client;\n },\n\n /**\n * Migration function called during the init process\n * Manages the database structure\n */\n async migrate(): Promise<void> {\n if (!client) throw new EngineError({ message: 'ElasticSearch was not initialized' });\n\n reportDebug({\n namespace,\n message: 'Starting ElasticSearch migrations'\n });\n\n const migrationPath = path.resolve(\n process.env.ELASTIC_SEARCH_MIGRATION_PATH as string\n );\n\n let files: string[];\n try {\n files = readdirSync(migrationPath).filter(\n f => f.endsWith('.ts') || f.endsWith('.js')\n );\n } catch (error) {\n throw new EngineError({\n message: 'Failed to read migration directory',\n data: { path: migrationPath, error: (error as Error).message }\n });\n }\n\n const indexExists = await client.indices.exists({\n index: 'migrations'\n });\n\n const ran: string[] = [];\n\n for (const file of files) {\n if (indexExists) {\n const result = await client.search({\n index: 'migrations',\n query: { match: { file } }\n });\n\n const total = typeof result.hits.total === 'number'\n ? result.hits.total\n : result.hits.total?.value ?? 0;\n\n if (total > 0) {\n reportDebug({\n namespace,\n message: `Skipping migration ${file} (already ran)`\n });\n continue;\n }\n }\n\n reportDebug({\n namespace,\n message: `Running migration: ${file}`\n });\n\n ran.push(file);\n\n try {\n const migration = (await import(\n `${migrationPath}/${file}`\n )) as ElasticSearchMigration;\n\n await migration.migrate(client);\n\n await client.index({\n index: 'migrations',\n id: file,\n document: { file, ranAt: new Date().toISOString() }\n });\n\n reportDebug({\n namespace,\n message: `Successfully ran migration: ${file}`\n });\n } catch (error) {\n reportError(\n new EngineError({\n message: `Migration failed: ${file}`,\n data: { error: (error as Error).message, stack: (error as Error).stack }\n })\n );\n throw error;\n }\n }\n\n reportInfo({\n message: `ElasticSearch: ran ${ran.length} migration(s)`,\n data: { files: ran }\n });\n },\n\n /**\n * Shutdown function that should be called on server stop to close the connection\n */\n async shutdown(): Promise<void> {\n if (client) {\n try {\n await client.close();\n reportDebug({\n namespace,\n message: 'ElasticSearch client disconnected'\n });\n } catch (error) {\n reportError(\n new EngineError({\n message: 'Error during ElasticSearch shutdown',\n data: { error: (error as Error).message }\n })\n );\n }\n client = undefined;\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,10 @@
1
- import { Redis as RedisClient } from 'ioredis';
1
+ import { Redis as RedisClient, RedisOptions } from 'ioredis';
2
2
  import { RedisCreateOptions } from './Redis.types';
3
3
  export declare let redisClient: undefined | RedisClient;
4
4
  /**
5
5
  * Factory function to create a new Redis instance (exported for testing)
6
6
  */
7
- export declare function createRedisInstance(config: any): RedisClient;
7
+ export declare function createRedisInstance(config: RedisOptions): RedisClient;
8
8
  /**
9
9
  * We use a proxy to extend the Redis behavior and allow initialization of the client only when needed while keeping the same interface
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Redis.js","names":["_ioredis","require","_Redis","_EngineError","_LifecycleController","_report","redisClient","exports","createRedisInstance","config","RedisClient","Redis","Proxy","get","target","property","init","shutdown","getClient","EngineError","message","reportDebug","namespace","createRedisClient","on","err","reportError","data","error","LifecycleController","register","quit","undefined","options","validateRedisEnvironment","process","env","REDIS_HOST","port","REDIS_PORT","parseInt","host","username","REDIS_USERNAME","password","REDIS_PASSWORD","db","retryStrategy","times","delay","Math","min","reconnectOnError","targetErrors","some","targetError","includes","maxRetriesPerRequest","enableReadyCheck","lazyConnect","NODE_ENV","redis","TLS_CA","tls","ca","rejectUnauthorized"],"sources":["../../../src/entities/Redis/Redis.ts"],"sourcesContent":["import { Redis as RedisClient } from 'ioredis';\nimport { RedisInterface, RedisCreateOptions } from './Redis.types';\nimport { validateRedisEnvironment } from './Redis.validate';\nimport { EngineError } from 'entities/EngineError';\nimport { LifecycleController } from 'entities/LifecycleController';\nimport { reportDebug, reportError } from 'utils/report';\n\nexport let redisClient: undefined | RedisClient;\n\n/**\n * Factory function to create a new Redis instance (exported for testing)\n */\nexport function createRedisInstance(config: any): RedisClient {\n return new RedisClient(config);\n}\n\n/**\n * We use a proxy to extend the Redis behavior and allow initialization of the client only when needed while keeping the same interface\n */\nexport const Redis = new Proxy<RedisInterface>(\n // Due to how we do the proxying, we are forced to ignore ts-errors, we could never create an object that respects the interface properly\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n {},\n {\n get: function (target, property): unknown {\n if (property === 'init') return init;\n if (property === 'shutdown') return shutdown;\n if (property === 'getClient') return getClient;\n // Create the redis client if it does not exist\n if (!redisClient)\n throw new EngineError({ message: 'Redis client was not initialized' });\n // Call the function on the redis client\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return redisClient[property] as unknown;\n }\n }\n);\n\n/**\n * Get the underlying Redis client (for advanced use cases)\n */\nexport function getClient(): RedisClient | undefined {\n return redisClient;\n}\n\n/**\n * On init create client and connect\n */\nexport function init(): void {\n // Ignore if already initialized\n if (redisClient) {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client already initialized'\n });\n return;\n }\n \n redisClient = createRedisClient();\n \n // Setup event listeners\n redisClient.on('connect', () => {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client connecting'\n });\n });\n \n redisClient.on('ready', () => {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client ready'\n });\n });\n \n redisClient.on('error', (err) => {\n reportError(new EngineError({\n message: 'Redis client error',\n data: { error: err.message }\n }));\n });\n \n redisClient.on('close', () => {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis connection closed'\n });\n });\n \n redisClient.on('reconnecting', () => {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client reconnecting'\n });\n });\n \n LifecycleController.register(Redis);\n}\n\n/**\n * On shutdown close connection and clear client\n */\nexport async function shutdown(): Promise<void> {\n if (redisClient) {\n try {\n await redisClient.quit();\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client disconnected'\n });\n } catch (error) {\n reportError(new EngineError({\n message: 'Error during Redis shutdown',\n data: { error: (error as Error).message }\n }));\n }\n }\n redisClient = undefined;\n}\n\n/**\n * Create Redis client with enhanced configuration\n */\nexport function createRedisClient(\n options: RedisCreateOptions = {}\n): RedisClient {\n // Check that environment variables are correctly set\n validateRedisEnvironment(options);\n \n // Throw an error if there is no host\n if (!process.env.REDIS_HOST)\n throw new EngineError({\n message: 'Host required to initialize Redis connection'\n });\n\n const config: any = {\n port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT) : 6379,\n host: process.env.REDIS_HOST,\n username: process.env.REDIS_USERNAME,\n password: process.env.REDIS_PASSWORD,\n db: options.db ?? 0,\n retryStrategy: (times: number) => {\n const delay = Math.min(times * 50, 2000);\n return delay;\n },\n reconnectOnError: (err: Error) => {\n const targetErrors = ['READONLY', 'ECONNRESET', 'ETIMEDOUT'];\n return targetErrors.some(targetError => err.message.includes(targetError));\n },\n maxRetriesPerRequest: 3,\n enableReadyCheck: options.enableReadyCheck ?? true,\n lazyConnect: options.lazyConnect ?? (process.env.NODE_ENV === 'test'),\n ...options.redis\n };\n\n // Add TLS configuration if TLS_CA is provided\n if (process.env.TLS_CA) {\n config.tls = {\n ca: process.env.TLS_CA,\n rejectUnauthorized: process.env.NODE_ENV === 'production'\n };\n }\n\n return createRedisInstance(config);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Redis.js","names":["_ioredis","require","_Redis","_EngineError","_LifecycleController","_report","redisClient","exports","createRedisInstance","config","RedisClient","Redis","Proxy","get","target","property","init","shutdown","getClient","EngineError","message","reportDebug","namespace","createRedisClient","on","err","reportError","data","error","LifecycleController","register","quit","undefined","options","validateRedisEnvironment","process","env","REDIS_HOST","port","REDIS_PORT","parseInt","host","username","REDIS_USERNAME","password","REDIS_PASSWORD","db","retryStrategy","times","delay","Math","min","reconnectOnError","targetErrors","some","targetError","includes","maxRetriesPerRequest","enableReadyCheck","lazyConnect","NODE_ENV","redis","TLS_CA","tls","ca","rejectUnauthorized"],"sources":["../../../src/entities/Redis/Redis.ts"],"sourcesContent":["import { Redis as RedisClient, RedisOptions } from 'ioredis';\nimport { RedisInterface, RedisCreateOptions } from './Redis.types';\nimport { validateRedisEnvironment } from './Redis.validate';\nimport { EngineError } from 'entities/EngineError';\nimport { LifecycleController } from 'entities/LifecycleController';\nimport { reportDebug, reportError } from 'utils/report';\n\nexport let redisClient: undefined | RedisClient;\n\n/**\n * Factory function to create a new Redis instance (exported for testing)\n */\nexport function createRedisInstance(config: RedisOptions): RedisClient {\n return new RedisClient(config);\n}\n\n/**\n * We use a proxy to extend the Redis behavior and allow initialization of the client only when needed while keeping the same interface\n */\nexport const Redis = new Proxy<RedisInterface>(\n // Due to how we do the proxying, we are forced to ignore ts-errors, we could never create an object that respects the interface properly\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n {},\n {\n get: function (target, property): unknown {\n if (property === 'init') return init;\n if (property === 'shutdown') return shutdown;\n if (property === 'getClient') return getClient;\n // Create the redis client if it does not exist\n if (!redisClient)\n throw new EngineError({ message: 'Redis client was not initialized' });\n // Call the function on the redis client\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return redisClient[property] as unknown;\n }\n }\n);\n\n/**\n * Get the underlying Redis client (for advanced use cases)\n */\nexport function getClient(): RedisClient | undefined {\n return redisClient;\n}\n\n/**\n * On init create client and connect\n */\nexport function init(): void {\n // Ignore if already initialized\n if (redisClient) {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client already initialized'\n });\n return;\n }\n \n redisClient = createRedisClient();\n \n // Setup event listeners\n redisClient.on('connect', () => {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client connecting'\n });\n });\n \n redisClient.on('ready', () => {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client ready'\n });\n });\n \n redisClient.on('error', (err) => {\n reportError(new EngineError({\n message: 'Redis client error',\n data: { error: err.message }\n }));\n });\n \n redisClient.on('close', () => {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis connection closed'\n });\n });\n \n redisClient.on('reconnecting', () => {\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client reconnecting'\n });\n });\n \n LifecycleController.register(Redis);\n}\n\n/**\n * On shutdown close connection and clear client\n */\nexport async function shutdown(): Promise<void> {\n if (redisClient) {\n try {\n await redisClient.quit();\n reportDebug({\n namespace: 'engine:redis',\n message: 'Redis client disconnected'\n });\n } catch (error) {\n reportError(new EngineError({\n message: 'Error during Redis shutdown',\n data: { error: (error as Error).message }\n }));\n }\n }\n redisClient = undefined;\n}\n\n/**\n * Create Redis client with enhanced configuration\n */\nexport function createRedisClient(\n options: RedisCreateOptions = {}\n): RedisClient {\n // Check that environment variables are correctly set\n validateRedisEnvironment(options);\n \n // Throw an error if there is no host\n if (!process.env.REDIS_HOST)\n throw new EngineError({\n message: 'Host required to initialize Redis connection'\n });\n\n const config: RedisOptions = {\n port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT) : 6379,\n host: process.env.REDIS_HOST,\n username: process.env.REDIS_USERNAME,\n password: process.env.REDIS_PASSWORD,\n db: options.db ?? 0,\n retryStrategy: (times: number) => {\n const delay = Math.min(times * 50, 2000);\n return delay;\n },\n reconnectOnError: (err: Error) => {\n const targetErrors = ['READONLY', 'ECONNRESET', 'ETIMEDOUT'];\n return targetErrors.some(targetError => err.message.includes(targetError));\n },\n maxRetriesPerRequest: 3,\n enableReadyCheck: options.enableReadyCheck ?? true,\n lazyConnect: options.lazyConnect ?? (process.env.NODE_ENV === 'test'),\n ...options.redis\n };\n\n // Add TLS configuration if TLS_CA is provided\n if (process.env.TLS_CA) {\n config.tls = {\n ca: process.env.TLS_CA,\n rejectUnauthorized: process.env.NODE_ENV === 'production'\n };\n }\n\n return createRedisInstance(config);\n}\n"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AACA,IAAAG,oBAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AAEO,IAAIK,WAAoC,GAAAC,OAAA,CAAAD,WAAA;;AAE/C;AACA;AACA;AACO,SAASE,mBAAmBA,CAACC,MAAoB,EAAe;EACrE,OAAO,IAAIC,cAAW,CAACD,MAAM,CAAC;AAChC;;AAEA;AACA;AACA;AACO,MAAME,KAAK,GAAAJ,OAAA,CAAAI,KAAA,GAAG,IAAIC,KAAK;AAC5B;AACA;AACA;AACA,CAAC,CAAC,EACF;EACEC,GAAG,EAAE,SAAAA,CAAUC,MAAM,EAAEC,QAAQ,EAAW;IACxC,IAAIA,QAAQ,KAAK,MAAM,EAAE,OAAOC,IAAI;IACpC,IAAID,QAAQ,KAAK,UAAU,EAAE,OAAOE,QAAQ;IAC5C,IAAIF,QAAQ,KAAK,WAAW,EAAE,OAAOG,SAAS;IAC9C;IACA,IAAI,CAACZ,WAAW,EACd,MAAM,IAAIa,wBAAW,CAAC;MAAEC,OAAO,EAAE;IAAmC,CAAC,CAAC;IACxE;IACA;IACA;IACA,OAAOd,WAAW,CAACS,QAAQ,CAAC;EAC9B;AACF,CACF,CAAC;;AAED;AACA;AACA;AACO,SAASG,SAASA,CAAA,EAA4B;EACnD,OAAOZ,WAAW;AACpB;;AAEA;AACA;AACA;AACO,SAASU,IAAIA,CAAA,EAAS;EAC3B;EACA,IAAIV,WAAW,EAAE;IACf,IAAAe,mBAAW,EAAC;MACVC,SAAS,EAAE,cAAc;MACzBF,OAAO,EAAE;IACX,CAAC,CAAC;IACF;EACF;EAEAb,OAAA,CAAAD,WAAA,GAAAA,WAAW,GAAGiB,iBAAiB,CAAC,CAAC;;EAEjC;EACAjB,WAAW,CAACkB,EAAE,CAAC,SAAS,EAAE,MAAM;IAC9B,IAAAH,mBAAW,EAAC;MACVC,SAAS,EAAE,cAAc;MACzBF,OAAO,EAAE;IACX,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFd,WAAW,CAACkB,EAAE,CAAC,OAAO,EAAE,MAAM;IAC5B,IAAAH,mBAAW,EAAC;MACVC,SAAS,EAAE,cAAc;MACzBF,OAAO,EAAE;IACX,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFd,WAAW,CAACkB,EAAE,CAAC,OAAO,EAAGC,GAAG,IAAK;IAC/B,IAAAC,mBAAW,EAAC,IAAIP,wBAAW,CAAC;MAC1BC,OAAO,EAAE,oBAAoB;MAC7BO,IAAI,EAAE;QAAEC,KAAK,EAAEH,GAAG,CAACL;MAAQ;IAC7B,CAAC,CAAC,CAAC;EACL,CAAC,CAAC;EAEFd,WAAW,CAACkB,EAAE,CAAC,OAAO,EAAE,MAAM;IAC5B,IAAAH,mBAAW,EAAC;MACVC,SAAS,EAAE,cAAc;MACzBF,OAAO,EAAE;IACX,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFd,WAAW,CAACkB,EAAE,CAAC,cAAc,EAAE,MAAM;IACnC,IAAAH,mBAAW,EAAC;MACVC,SAAS,EAAE,cAAc;MACzBF,OAAO,EAAE;IACX,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFS,wCAAmB,CAACC,QAAQ,CAACnB,KAAK,CAAC;AACrC;;AAEA;AACA;AACA;AACO,eAAeM,QAAQA,CAAA,EAAkB;EAC9C,IAAIX,WAAW,EAAE;IACf,IAAI;MACF,MAAMA,WAAW,CAACyB,IAAI,CAAC,CAAC;MACxB,IAAAV,mBAAW,EAAC;QACVC,SAAS,EAAE,cAAc;QACzBF,OAAO,EAAE;MACX,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOQ,KAAK,EAAE;MACd,IAAAF,mBAAW,EAAC,IAAIP,wBAAW,CAAC;QAC1BC,OAAO,EAAE,6BAA6B;QACtCO,IAAI,EAAE;UAAEC,KAAK,EAAGA,KAAK,CAAWR;QAAQ;MAC1C,CAAC,CAAC,CAAC;IACL;EACF;EACAb,OAAA,CAAAD,WAAA,GAAAA,WAAW,GAAG0B,SAAS;AACzB;;AAEA;AACA;AACA;AACO,SAAST,iBAAiBA,CAC/BU,OAA2B,GAAG,CAAC,CAAC,EACnB;EACb;EACA,IAAAC,+BAAwB,EAACD,OAAO,CAAC;;EAEjC;EACA,IAAI,CAACE,OAAO,CAACC,GAAG,CAACC,UAAU,EACzB,MAAM,IAAIlB,wBAAW,CAAC;IACpBC,OAAO,EAAE;EACX,CAAC,CAAC;EAEJ,MAAMX,MAAoB,GAAG;IAC3B6B,IAAI,EAAEH,OAAO,CAACC,GAAG,CAACG,UAAU,GAAGC,QAAQ,CAACL,OAAO,CAACC,GAAG,CAACG,UAAU,CAAC,GAAG,IAAI;IACtEE,IAAI,EAAEN,OAAO,CAACC,GAAG,CAACC,UAAU;IAC5BK,QAAQ,EAAEP,OAAO,CAACC,GAAG,CAACO,cAAc;IACpCC,QAAQ,EAAET,OAAO,CAACC,GAAG,CAACS,cAAc;IACpCC,EAAE,EAAEb,OAAO,CAACa,EAAE,IAAI,CAAC;IACnBC,aAAa,EAAGC,KAAa,IAAK;MAChC,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,CAACH,KAAK,GAAG,EAAE,EAAE,IAAI,CAAC;MACxC,OAAOC,KAAK;IACd,CAAC;IACDG,gBAAgB,EAAG3B,GAAU,IAAK;MAChC,MAAM4B,YAAY,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;MAC5D,OAAOA,YAAY,CAACC,IAAI,CAACC,WAAW,IAAI9B,GAAG,CAACL,OAAO,CAACoC,QAAQ,CAACD,WAAW,CAAC,CAAC;IAC5E,CAAC;IACDE,oBAAoB,EAAE,CAAC;IACvBC,gBAAgB,EAAEzB,OAAO,CAACyB,gBAAgB,IAAI,IAAI;IAClDC,WAAW,EAAE1B,OAAO,CAAC0B,WAAW,IAAKxB,OAAO,CAACC,GAAG,CAACwB,QAAQ,KAAK,MAAO;IACrE,GAAG3B,OAAO,CAAC4B;EACb,CAAC;;EAED;EACA,IAAI1B,OAAO,CAACC,GAAG,CAAC0B,MAAM,EAAE;IACtBrD,MAAM,CAACsD,GAAG,GAAG;MACXC,EAAE,EAAE7B,OAAO,CAACC,GAAG,CAAC0B,MAAM;MACtBG,kBAAkB,EAAE9B,OAAO,CAACC,GAAG,CAACwB,QAAQ,KAAK;IAC/C,CAAC;EACH;EAEA,OAAOpD,mBAAmB,CAACC,MAAM,CAAC;AACpC","ignoreList":[]}
@@ -1,3 +1,3 @@
1
1
  import { Request, Response, NextFunction } from 'express';
2
2
  /** Handle errors globally */
3
- export declare function error(error: Error, request: Request, response: Response, next: NextFunction): void;
3
+ export declare function error(error: Error, request: Request, response: Response, _next: NextFunction): void;
@@ -6,12 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.error = error;
7
7
  var _WebError = require("../../entities/WebError");
8
8
  var _report = require("../../utils/report");
9
- const namespace = 'engine:middleware:error';
10
-
11
9
  /** Handle errors globally */
12
- function error(error, request, response,
13
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
14
- next) {
10
+ function error(error, request, response, _next) {
15
11
  (0, _report.reportError)(error, request);
16
12
  if (error instanceof _WebError.WebError) {
17
13
  response.status(error.statusCode).json({
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","names":["_WebError","require","_report","namespace","error","request","response","next","reportError","WebError","status","statusCode","json","errorCode","hint"],"sources":["../../../src/middleware/error/error.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\nimport { WebError } from 'entities/WebError';\nimport { reportError, reportDebug } from 'utils/report';\n\nconst namespace = 'engine:middleware:error';\n\n/** Handle errors globally */\nexport function error(\n error: Error,\n request: Request,\n response: Response,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n next: NextFunction\n): void {\n reportError(error, request);\n if (error instanceof WebError) {\n response.status(error.statusCode).json({\n errorCode: error.errorCode,\n hint: error.hint\n });\n return;\n }\n response.status(500).json({ errorCode: 'server-error' });\n}\n"],"mappings":";;;;;;AACA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,MAAME,SAAS,GAAG,yBAAyB;;AAE3C;AACO,SAASC,KAAKA,CACnBA,KAAY,EACZC,OAAgB,EAChBC,QAAkB;AAClB;AACAC,IAAkB,EACZ;EACN,IAAAC,mBAAW,EAACJ,KAAK,EAAEC,OAAO,CAAC;EAC3B,IAAID,KAAK,YAAYK,kBAAQ,EAAE;IAC7BH,QAAQ,CAACI,MAAM,CAACN,KAAK,CAACO,UAAU,CAAC,CAACC,IAAI,CAAC;MACrCC,SAAS,EAAET,KAAK,CAACS,SAAS;MAC1BC,IAAI,EAAEV,KAAK,CAACU;IACd,CAAC,CAAC;IACF;EACF;EACAR,QAAQ,CAACI,MAAM,CAAC,GAAG,CAAC,CAACE,IAAI,CAAC;IAAEC,SAAS,EAAE;EAAe,CAAC,CAAC;AAC1D","ignoreList":[]}
1
+ {"version":3,"file":"error.js","names":["_WebError","require","_report","error","request","response","_next","reportError","WebError","status","statusCode","json","errorCode","hint"],"sources":["../../../src/middleware/error/error.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\nimport { WebError } from 'entities/WebError';\nimport { reportError } from 'utils/report';\n\n/** Handle errors globally */\nexport function error(\n error: Error,\n request: Request,\n response: Response,\n _next: NextFunction\n): void {\n reportError(error, request);\n if (error instanceof WebError) {\n response.status(error.statusCode).json({\n errorCode: error.errorCode,\n hint: error.hint\n });\n return;\n }\n response.status(500).json({ errorCode: 'server-error' });\n}\n"],"mappings":";;;;;;AACA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA;AACO,SAASE,KAAKA,CACnBA,KAAY,EACZC,OAAgB,EAChBC,QAAkB,EAClBC,KAAmB,EACb;EACN,IAAAC,mBAAW,EAACJ,KAAK,EAAEC,OAAO,CAAC;EAC3B,IAAID,KAAK,YAAYK,kBAAQ,EAAE;IAC7BH,QAAQ,CAACI,MAAM,CAACN,KAAK,CAACO,UAAU,CAAC,CAACC,IAAI,CAAC;MACrCC,SAAS,EAAET,KAAK,CAACS,SAAS;MAC1BC,IAAI,EAAEV,KAAK,CAACU;IACd,CAAC,CAAC;IACF;EACF;EACAR,QAAQ,CAACI,MAAM,CAAC,GAAG,CAAC,CAACE,IAAI,CAAC;IAAEC,SAAS,EAAE;EAAe,CAAC,CAAC;AAC1D","ignoreList":[]}
@@ -68,7 +68,7 @@ function formatLocalLog(severityOrEntry, message) {
68
68
  const time = formatTime();
69
69
  const severityColor = getSeverityColor(severityOrEntry);
70
70
  const useColors = process.env.NODE_ENV !== 'production';
71
- let output = useColors ? `${colors.gray}[${time}]${colors.reset} ${severityColor}${severityOrEntry.padEnd(8)}${colors.reset} ${message}` : `[${time}] ${severityOrEntry.padEnd(8)} ${message}`;
71
+ const output = useColors ? `${colors.gray}[${time}]${colors.reset} ${severityColor}${severityOrEntry.padEnd(8)}${colors.reset} ${message}` : `[${time}] ${severityOrEntry.padEnd(8)} ${message}`;
72
72
  console.log(output);
73
73
  return;
74
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","names":["_crypto","require","_callsite","_interopRequireDefault","_jsonStringifySafe","_const","INSTANCE_ID","exports","randomUUID","colors","reset","bright","dim","red","green","yellow","blue","magenta","cyan","white","gray","getSeverityColor","severity","LogSeverity","DEBUG","INFO","WARNING","ERROR","CRITICAL","formatTime","date","now","Date","toTimeString","split","formatLocalLog","severityOrEntry","message","undefined","time","severityColor","useColors","process","env","NODE_ENV","output","padEnd","console","log","entry","showDetailedLogs","DETAILED_LOGS","parts","push","join","errorType","errorCode","statusCode","errorParts","statusColor","length","context","httpRequest","req","method","url","stack_trace","data","Object","keys","JSON","stringify","fileName","lineNumber","isLocalDevelopment","LOG_FORMAT","KUBERNETES_POD_NAME","CLOUD_RUN_JOB","call","callsite","fullEntry","getLineNumber","getFileName","replace","serviceContext","service","CHART","HOSTNAME","version","BUILD_ID","environment","instance","SILENCE_REPORT","dir","depth","formattedLog","error"],"sources":["../../../src/utils/report/output.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport callsite from 'callsite';\nimport stringify from 'json-stringify-safe';\nimport { LogEntry, FullLogEntry } from './output.types';\nimport { LogSeverity } from 'const';\n\n// NOTE: Server instance id (helpful for distributed logs)\nexport const INSTANCE_ID = randomUUID();\n\n// ANSI color codes for terminal output\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m'\n};\n\n/**\n * Get color for log severity level\n */\nfunction getSeverityColor(severity?: string): string {\n switch (severity) {\n case LogSeverity.DEBUG:\n return colors.cyan;\n case LogSeverity.INFO:\n return colors.green;\n case LogSeverity.WARNING:\n return colors.yellow;\n case LogSeverity.ERROR:\n return colors.red;\n case LogSeverity.CRITICAL:\n return `${colors.bright}${colors.red}`;\n default:\n return colors.white;\n }\n}\n\n/**\n * Format timestamp as HH:MM:SS\n */\nexport function formatTime(date?: Date): string {\n const now = date || new Date();\n return now.toTimeString().split(' ')[0];\n}\n\n/**\n * Format log entry for human-readable local development output\n */\nexport function formatLocalLog(severity: LogSeverity | string, message: string): void;\nexport function formatLocalLog(entry: FullLogEntry): string;\nexport function formatLocalLog(severityOrEntry: LogSeverity | string | FullLogEntry, message?: string): string | void {\n // Handle overloaded signature for testing\n if (typeof severityOrEntry === 'string' && message !== undefined) {\n const time = formatTime();\n const severityColor = getSeverityColor(severityOrEntry);\n const useColors = process.env.NODE_ENV !== 'production';\n \n let output = useColors \n ? `${colors.gray}[${time}]${colors.reset} ${severityColor}${severityOrEntry.padEnd(8)}${colors.reset} ${message}`\n : `[${time}] ${severityOrEntry.padEnd(8)} ${message}`;\n \n console.log(output);\n return;\n }\n \n // Original function implementation\n const entry = severityOrEntry as FullLogEntry;\n const time = formatTime();\n const severity = entry.severity || 'INFO';\n const severityColor = getSeverityColor(severity);\n const showDetailedLogs = process.env.DETAILED_LOGS === 'true';\n \n const parts: string[] = [];\n \n // Timestamp and severity\n parts.push(\n `${colors.gray}[${time}]${colors.reset} ${severityColor}${severity.padEnd(8)}${colors.reset}`\n );\n \n // Message\n if (entry.message) {\n parts.push(`${entry.message}`);\n }\n \n let output = parts.join(' ');\n \n // Error details (compact format)\n if (entry.errorType || entry.errorCode || entry.statusCode) {\n const errorParts: string[] = [];\n if (entry.errorCode) errorParts.push(`${colors.red}${entry.errorCode}${colors.reset}`);\n if (entry.statusCode) {\n const statusColor = entry.statusCode >= 500 ? colors.red : entry.statusCode >= 400 ? colors.yellow : colors.green;\n errorParts.push(`${statusColor}${entry.statusCode}${colors.reset}`);\n }\n if (errorParts.length > 0) {\n output += ` ${colors.dim}[${errorParts.join(' ')}]${colors.reset}`;\n }\n }\n \n // HTTP request context (compact)\n if (entry.context?.httpRequest) {\n const req = entry.context.httpRequest;\n output += ` ${colors.dim}${req.method} ${req.url}${colors.reset}`;\n }\n \n // Stack trace (only in detailed mode)\n if (showDetailedLogs && entry.stack_trace) {\n output += `\\n${colors.gray}Stack Trace:${colors.reset}\\n${colors.dim}${entry.stack_trace}${colors.reset}`;\n }\n \n // Additional data (only in detailed mode or if no message)\n if (showDetailedLogs && entry.data && Object.keys(entry.data).length > 0) {\n output += `\\n${colors.cyan}Data:${colors.reset}\\n${colors.dim}${JSON.stringify(entry.data, null, 2)}${colors.reset}`;\n }\n \n // File location (only in detailed mode)\n if (showDetailedLogs && entry.fileName) {\n output += `\\n ${colors.dim}${entry.fileName}:${entry.lineNumber || '?'}${colors.reset}`;\n }\n \n return output;\n}\n\n/**\n * Check if running in local development environment\n */\nfunction isLocalDevelopment(): boolean {\n // Allow forcing local format via environment variable\n if (process.env.LOG_FORMAT === 'local') return true;\n if (process.env.LOG_FORMAT === 'json') return false;\n \n return (\n process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'dev' ||\n (!process.env.NODE_ENV && !process.env.KUBERNETES_POD_NAME && !process.env.CLOUD_RUN_JOB)\n );\n}\n\n/** Add metadata to the log entry and print it */\nexport function output(data: LogEntry): FullLogEntry {\n // Gather useful information about where the logger was called from\n const call = callsite()[2];\n\n // Append additional metadata to the log entry\n const fullEntry: FullLogEntry = {\n ...data,\n lineNumber: call.getLineNumber(),\n fileName: call\n .getFileName()\n .replace(/.*node_modules\\//, '')\n .replace(/.*src\\//, 'src/'),\n serviceContext: {\n service: process.env.CHART ?? process.env.HOSTNAME,\n version: process.env.BUILD_ID,\n environment: process.env.NODE_ENV,\n instance: process.env.KUBERNETES_POD_NAME ?? INSTANCE_ID\n }\n };\n\n // Ignore when silenced\n if (process.env.SILENCE_REPORT) return fullEntry;\n\n if (process.env.NODE_ENV === 'test') {\n // In test mode pretty print with full depth\n console.dir(fullEntry, { depth: 5 });\n } else if (isLocalDevelopment()) {\n // Local development: use formatted, colorized output\n const formattedLog = formatLocalLog(fullEntry);\n if (data.severity === LogSeverity.ERROR || data.severity === LogSeverity.CRITICAL || (data.statusCode && data.statusCode >= 500)) {\n console.error(formattedLog);\n } else {\n console.log(formattedLog);\n }\n } else {\n // Production/GCP: use JSON format for structured logging\n const entry = stringify(fullEntry);\n if (data.statusCode && data.statusCode >= 500) {\n console.error(entry);\n } else {\n console.log(entry);\n }\n }\n \n return fullEntry;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"output.js","names":["_crypto","require","_callsite","_interopRequireDefault","_jsonStringifySafe","_const","INSTANCE_ID","exports","randomUUID","colors","reset","bright","dim","red","green","yellow","blue","magenta","cyan","white","gray","getSeverityColor","severity","LogSeverity","DEBUG","INFO","WARNING","ERROR","CRITICAL","formatTime","date","now","Date","toTimeString","split","formatLocalLog","severityOrEntry","message","undefined","time","severityColor","useColors","process","env","NODE_ENV","output","padEnd","console","log","entry","showDetailedLogs","DETAILED_LOGS","parts","push","join","errorType","errorCode","statusCode","errorParts","statusColor","length","context","httpRequest","req","method","url","stack_trace","data","Object","keys","JSON","stringify","fileName","lineNumber","isLocalDevelopment","LOG_FORMAT","KUBERNETES_POD_NAME","CLOUD_RUN_JOB","call","callsite","fullEntry","getLineNumber","getFileName","replace","serviceContext","service","CHART","HOSTNAME","version","BUILD_ID","environment","instance","SILENCE_REPORT","dir","depth","formattedLog","error"],"sources":["../../../src/utils/report/output.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport callsite from 'callsite';\nimport stringify from 'json-stringify-safe';\nimport { LogEntry, FullLogEntry } from './output.types';\nimport { LogSeverity } from 'const';\n\n// NOTE: Server instance id (helpful for distributed logs)\nexport const INSTANCE_ID = randomUUID();\n\n// ANSI color codes for terminal output\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m'\n};\n\n/**\n * Get color for log severity level\n */\nfunction getSeverityColor(severity?: string): string {\n switch (severity) {\n case LogSeverity.DEBUG:\n return colors.cyan;\n case LogSeverity.INFO:\n return colors.green;\n case LogSeverity.WARNING:\n return colors.yellow;\n case LogSeverity.ERROR:\n return colors.red;\n case LogSeverity.CRITICAL:\n return `${colors.bright}${colors.red}`;\n default:\n return colors.white;\n }\n}\n\n/**\n * Format timestamp as HH:MM:SS\n */\nexport function formatTime(date?: Date): string {\n const now = date || new Date();\n return now.toTimeString().split(' ')[0];\n}\n\n/**\n * Format log entry for human-readable local development output\n */\nexport function formatLocalLog(severity: LogSeverity | string, message: string): void;\nexport function formatLocalLog(entry: FullLogEntry): string;\nexport function formatLocalLog(severityOrEntry: LogSeverity | string | FullLogEntry, message?: string): string | void {\n // Handle overloaded signature for testing\n if (typeof severityOrEntry === 'string' && message !== undefined) {\n const time = formatTime();\n const severityColor = getSeverityColor(severityOrEntry);\n const useColors = process.env.NODE_ENV !== 'production';\n \n const output = useColors \n ? `${colors.gray}[${time}]${colors.reset} ${severityColor}${severityOrEntry.padEnd(8)}${colors.reset} ${message}`\n : `[${time}] ${severityOrEntry.padEnd(8)} ${message}`;\n \n console.log(output);\n return;\n }\n \n // Original function implementation\n const entry = severityOrEntry as FullLogEntry;\n const time = formatTime();\n const severity = entry.severity || 'INFO';\n const severityColor = getSeverityColor(severity);\n const showDetailedLogs = process.env.DETAILED_LOGS === 'true';\n \n const parts: string[] = [];\n \n // Timestamp and severity\n parts.push(\n `${colors.gray}[${time}]${colors.reset} ${severityColor}${severity.padEnd(8)}${colors.reset}`\n );\n \n // Message\n if (entry.message) {\n parts.push(`${entry.message}`);\n }\n \n let output = parts.join(' ');\n \n // Error details (compact format)\n if (entry.errorType || entry.errorCode || entry.statusCode) {\n const errorParts: string[] = [];\n if (entry.errorCode) errorParts.push(`${colors.red}${entry.errorCode}${colors.reset}`);\n if (entry.statusCode) {\n const statusColor = entry.statusCode >= 500 ? colors.red : entry.statusCode >= 400 ? colors.yellow : colors.green;\n errorParts.push(`${statusColor}${entry.statusCode}${colors.reset}`);\n }\n if (errorParts.length > 0) {\n output += ` ${colors.dim}[${errorParts.join(' ')}]${colors.reset}`;\n }\n }\n \n // HTTP request context (compact)\n if (entry.context?.httpRequest) {\n const req = entry.context.httpRequest;\n output += ` ${colors.dim}${req.method} ${req.url}${colors.reset}`;\n }\n \n // Stack trace (only in detailed mode)\n if (showDetailedLogs && entry.stack_trace) {\n output += `\\n${colors.gray}Stack Trace:${colors.reset}\\n${colors.dim}${entry.stack_trace}${colors.reset}`;\n }\n \n // Additional data (only in detailed mode or if no message)\n if (showDetailedLogs && entry.data && Object.keys(entry.data).length > 0) {\n output += `\\n${colors.cyan}Data:${colors.reset}\\n${colors.dim}${JSON.stringify(entry.data, null, 2)}${colors.reset}`;\n }\n \n // File location (only in detailed mode)\n if (showDetailedLogs && entry.fileName) {\n output += `\\n ${colors.dim}${entry.fileName}:${entry.lineNumber || '?'}${colors.reset}`;\n }\n \n return output;\n}\n\n/**\n * Check if running in local development environment\n */\nfunction isLocalDevelopment(): boolean {\n // Allow forcing local format via environment variable\n if (process.env.LOG_FORMAT === 'local') return true;\n if (process.env.LOG_FORMAT === 'json') return false;\n \n return (\n process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'dev' ||\n (!process.env.NODE_ENV && !process.env.KUBERNETES_POD_NAME && !process.env.CLOUD_RUN_JOB)\n );\n}\n\n/** Add metadata to the log entry and print it */\nexport function output(data: LogEntry): FullLogEntry {\n // Gather useful information about where the logger was called from\n const call = callsite()[2];\n\n // Append additional metadata to the log entry\n const fullEntry: FullLogEntry = {\n ...data,\n lineNumber: call.getLineNumber(),\n fileName: call\n .getFileName()\n .replace(/.*node_modules\\//, '')\n .replace(/.*src\\//, 'src/'),\n serviceContext: {\n service: process.env.CHART ?? process.env.HOSTNAME,\n version: process.env.BUILD_ID,\n environment: process.env.NODE_ENV,\n instance: process.env.KUBERNETES_POD_NAME ?? INSTANCE_ID\n }\n };\n\n // Ignore when silenced\n if (process.env.SILENCE_REPORT) return fullEntry;\n\n if (process.env.NODE_ENV === 'test') {\n // In test mode pretty print with full depth\n console.dir(fullEntry, { depth: 5 });\n } else if (isLocalDevelopment()) {\n // Local development: use formatted, colorized output\n const formattedLog = formatLocalLog(fullEntry);\n if (data.severity === LogSeverity.ERROR || data.severity === LogSeverity.CRITICAL || (data.statusCode && data.statusCode >= 500)) {\n console.error(formattedLog);\n } else {\n console.log(formattedLog);\n }\n } else {\n // Production/GCP: use JSON format for structured logging\n const entry = stringify(fullEntry);\n if (data.statusCode && data.statusCode >= 500) {\n console.error(entry);\n } else {\n console.log(entry);\n }\n }\n \n return fullEntry;\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-server-engine",
3
- "version": "1.10.0",
3
+ "version": "1.10.1",
4
4
  "description": "Framework used to develop backend services. This package ships with a lot of features to standardize the creation of services, letting you focus on the business logic.",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {