@spfn/core 0.1.0-alpha.6 ā 0.1.0-alpha.8
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/LICENSE +21 -0
- package/dist/index.js +1 -9744
- package/dist/index.js.map +1 -1
- package/dist/server/index.js +1 -9744
- package/dist/server/index.js.map +1 -1
- package/package.json +15 -15
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors/database-errors.ts","../../src/logger/adapters/pino.ts","../../src/logger/logger.ts","../../src/logger/types.ts","../../src/logger/formatters.ts","../../src/logger/transports/console.ts","../../src/logger/transports/file.ts","../../src/logger/config.ts","../../src/logger/adapters/custom.ts","../../src/logger/adapter-factory.ts","../../src/logger/index.ts","../../../../node_modules/.pnpm/@ioredis+commands@1.4.0/node_modules/@ioredis/commands/built/commands.json","../../../../node_modules/.pnpm/@ioredis+commands@1.4.0/node_modules/@ioredis/commands/built/index.js","../../../../node_modules/.pnpm/standard-as-callback@2.1.0/node_modules/standard-as-callback/built/utils.js","../../../../node_modules/.pnpm/standard-as-callback@2.1.0/node_modules/standard-as-callback/built/index.js","../../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/lib/old.js","../../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/lib/modern.js","../../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/index.js","../../../../node_modules/.pnpm/cluster-key-slot@1.1.2/node_modules/cluster-key-slot/lib/index.js","../../../../node_modules/.pnpm/lodash.defaults@4.2.0/node_modules/lodash.defaults/index.js","../../../../node_modules/.pnpm/lodash.isarguments@3.1.0/node_modules/lodash.isarguments/index.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/utils/lodash.js","../../../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js","../../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/common.js","../../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/browser.js","../../../../node_modules/.pnpm/has-flag@4.0.0/node_modules/has-flag/index.js","../../../../node_modules/.pnpm/supports-color@8.1.1/node_modules/supports-color/index.js","../../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/node.js","../../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/index.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/utils/debug.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/constants/TLSProfiles.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/utils/index.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/Command.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/errors/ClusterAllFailedError.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/ScanStream.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/autoPipelining.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/Script.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/utils/Commander.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/Pipeline.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/transaction.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/utils/applyMixin.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/cluster/ClusterOptions.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/cluster/util.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/cluster/ClusterSubscriber.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/cluster/ConnectionPool.js","../../../../node_modules/.pnpm/denque@2.1.0/node_modules/denque/index.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/cluster/DelayQueue.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/cluster/ClusterSubscriberGroup.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/cluster/index.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/connectors/AbstractConnector.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/connectors/StandaloneConnector.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/connectors/SentinelConnector/SentinelIterator.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/connectors/SentinelConnector/FailoverDetector.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/connectors/SentinelConnector/index.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/connectors/index.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/errors/MaxRetriesPerRequestError.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/errors/index.js","../../../../node_modules/.pnpm/redis-parser@3.0.0/node_modules/redis-parser/lib/parser.js","../../../../node_modules/.pnpm/redis-parser@3.0.0/node_modules/redis-parser/index.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/SubscriptionSet.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/DataHandler.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/redis/event_handler.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/redis/RedisOptions.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/Redis.js","../../../../node_modules/.pnpm/ioredis@5.8.0/node_modules/ioredis/built/index.js","../../src/cache/redis-factory.ts","../../src/cache/redis-manager.ts","../../src/cache/index.ts","../../src/errors/http-errors.ts","../../src/errors/error-utils.ts","../../src/errors/index.ts","../../src/db/postgres-errors.ts","../../src/db/manager/connection.ts","../../src/db/manager/config.ts","../../src/db/manager/factory.ts","../../src/db/manager/manager.ts","../../src/db/manager/instance.ts","../../src/db/transaction/context.ts","../../src/db/transaction/middleware.ts","../../src/db/transaction/index.ts","../../src/db/repository/filters.ts","../../src/db/repository/query-builder.ts","../../src/db/repository/repository.ts","../../src/db/repository/factory.ts","../../src/db/repository/request-scope.ts","../../src/db/repository/relation-registry.ts","../../src/db/repository/index.ts","../../src/db/manager/wrapped-db.ts","../../src/db/manager/context.ts","../../src/db/manager/index.ts","../../src/db/manager/config-generator.ts","../../src/db/schema/helpers.ts","../../src/db/schema/index.ts","../../src/db/index.ts","../../src/route/auto-loader.ts","../../src/route/bind.ts","../../src/middleware/error-handler.ts","../../src/middleware/request-logger.ts","../../src/server/server.ts"],"names":["config","timestamp","join","init_logger","flags","args","keys","require_built","toUTF8Array","generate","eq","require_lodash","useColors","require_utils","timeout","pipeline","exec","callback","j","err","_a","Buffer","db","cacheLogger","init_config","writeClient","readClient","dbLogger","readInstance","writeInstance","init_manager","id","init_factory","getCacheKey","AsyncLocalStorage","init_repository","init_context","relativePath","existsSync","app","debug","Hono","getDatabase","getRedis"],"mappings":"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,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,IAAA;AAAA,MAAQ,GAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,IAAA;AAAA,MAAQ,GAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,GAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,IAAA;AAAA,MAAQ,IAAA;AAAA,MACxD,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA,MAAQ,KAAA;AAAA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","file":"index.js","sourcesContent":["/**\n * Database Error Classes\n *\n * Type-safe error handling with custom error class hierarchy\n * Mapped to HTTP status codes for API responses\n */\n\n/**\n * Base Database Error\n *\n * Base class for all database-related errors\n */\nexport class DatabaseError<TDetails extends Record<string, unknown> = Record<string, unknown>> extends Error\n{\n public readonly statusCode: number;\n public readonly details?: TDetails;\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n statusCode: number = 500,\n details?: TDetails\n )\n {\n super(message);\n this.name = 'DatabaseError';\n this.statusCode = statusCode;\n this.details = details;\n this.timestamp = new Date();\n Error.captureStackTrace(this, this.constructor);\n }\n\n /**\n * Serialize error for API response\n */\n toJSON()\n {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n timestamp: this.timestamp.toISOString()\n };\n }\n}\n\n/**\n * Connection Error (503 Service Unavailable)\n *\n * Database connection failure, connection pool exhaustion, etc.\n */\nexport class ConnectionError extends DatabaseError\n{\n constructor(message: string, details?: Record<string, any>)\n {\n super(message, 503, details);\n this.name = 'ConnectionError';\n }\n}\n\n/**\n * Query Error (500 Internal Server Error)\n *\n * SQL query execution failure, syntax errors, etc.\n */\nexport class QueryError extends DatabaseError\n{\n constructor(message: string, statusCode: number = 500, details?: Record<string, any>)\n {\n super(message, statusCode, details);\n this.name = 'QueryError';\n }\n}\n\n/**\n * Not Found Error (404 Not Found)\n *\n * Requested resource does not exist\n */\nexport class NotFoundError extends QueryError\n{\n constructor(resource: string, id: string | number)\n {\n super(`${resource} with id ${id} not found`, 404, { resource, id });\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Validation Error (400 Bad Request)\n *\n * Input data validation failure\n */\nexport class ValidationError extends QueryError\n{\n constructor(message: string, details?: Record<string, any>)\n {\n super(message, 400, details);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Transaction Error (500 Internal Server Error)\n *\n * Transaction start/commit/rollback failure\n */\nexport class TransactionError extends DatabaseError\n{\n constructor(message: string, statusCode: number = 500, details?: Record<string, any>)\n {\n super(message, statusCode, details);\n this.name = 'TransactionError';\n }\n}\n\n/**\n * Deadlock Error (409 Conflict)\n *\n * Database deadlock detected\n */\nexport class DeadlockError extends TransactionError\n{\n constructor(message: string, details?: Record<string, any>)\n {\n super(message, 409, details);\n this.name = 'DeadlockError';\n }\n}\n\n/**\n * Duplicate Entry Error (409 Conflict)\n *\n * Unique constraint violation (e.g., duplicate email)\n */\nexport class DuplicateEntryError extends QueryError\n{\n constructor(field: string, value: string | number)\n {\n super(`${field} '${value}' already exists`, 409, { field, value });\n this.name = 'DuplicateEntryError';\n }\n}","/**\n * Pino Logger Adapter\n *\n * Pino넼 ģ¬ģ©ķė Logger Adapter 구ķ\n *\n * ā
구ķ ģė£:\n * - Pino źø°ė° ė”ź¹
\n * - Child logger ģ§ģ\n * - Error ź°ģ²“ ģ²ė¦¬ (err ķė)\n * - Context ė³ķ©\n * - ķź²½ė³ ģ¤ģ (pretty print)\n * - ķģ¼ ė”ź¹
with Rotation (ģ첓 구ģ¶ģ©)\n *\n * š” ė°°ķ¬ ģė리ģ¤:\n * - K8s: Stdoutė§ (ė”ź·ø ģģ§źø°ź° ģ²ė¦¬)\n * - ģ첓 구ģ¶: Stdout + File with Rotation\n *\n * š” ķ¹ģ§:\n * - ź³ ģ±ė„ (Winstonė³“ė¤ 5-10ė°° ė¹ ė¦)\n * - JSON źø°ė³ø ķ¬ė§·\n * - ķė”ėģ
ź²ģ¦ėØ (Netflix, Elastic ģ¬ģ©)\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/adapters/types.ts (ģøķ°ķģ“ģ¤)\n * - src/logger/index.ts (Adapter ģ ķ)\n * - src/logger/config.ts (ģ¤ģ )\n */\n\nimport pino from 'pino';\nimport type { LoggerAdapter, AdapterConfig, LogLevel } from './types';\n\n/**\n * Pino Logger Adapter\n */\nexport class PinoAdapter implements LoggerAdapter\n{\n private logger: pino.Logger;\n\n constructor(config: AdapterConfig)\n {\n const isProduction = process.env.NODE_ENV === 'production';\n const isDevelopment = process.env.NODE_ENV === 'development';\n const fileLoggingEnabled = process.env.LOGGER_FILE_ENABLED === 'true';\n\n // Transport ģ¤ģ \n const targets: pino.TransportTargetOptions[] = [];\n\n // 1. Stdout Transport (ķģ)\n if (!isProduction && isDevelopment)\n {\n // ź°ė°: Pretty Print\n targets.push({\n target: 'pino-pretty',\n level: 'debug',\n options: {\n colorize: true,\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss.l',\n ignore: 'pid,hostname',\n },\n });\n }\n else\n {\n // ķė”ėģ
: JSON (źø°ė³ø stdout)\n // targetsź° ė¹ģ“ģģ¼ė©“ ģėģ¼ė” stdout JSON ģ¬ģ©\n }\n\n // 2. File Transport (ģ첓 źµ¬ģ¶ ģ)\n if (fileLoggingEnabled && isProduction)\n {\n const logDir = process.env.LOG_DIR || './logs';\n const maxFileSize = process.env.LOG_MAX_FILE_SIZE || '10M';\n const maxFiles = parseInt(process.env.LOG_MAX_FILES || '10', 10);\n\n targets.push({\n target: 'pino-roll',\n level: 'info',\n options: {\n file: `${logDir}/app.log`,\n frequency: 'daily',\n size: maxFileSize,\n limit: { count: maxFiles },\n mkdir: true,\n },\n });\n }\n\n this.logger = pino({\n level: config.level,\n\n // Transport ģ¤ģ (targetsź° ģģ¼ė©“ ģ¬ģ©, ģģ¼ė©“ źø°ė³ø stdout)\n transport: targets.length > 0 ? { targets } : undefined,\n\n // źø°ė³ø ķė\n base: config.module ? { module: config.module } : undefined,\n });\n }\n\n child(module: string): LoggerAdapter\n {\n const childLogger = new PinoAdapter({ level: this.logger.level as LogLevel, module });\n childLogger.logger = this.logger.child({ module });\n return childLogger;\n }\n\n debug(message: string, context?: Record<string, unknown>): void\n {\n this.logger.debug(context || {}, message);\n }\n\n info(message: string, context?: Record<string, unknown>): void\n {\n this.logger.info(context || {}, message);\n }\n\n warn(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.warn({ err: errorOrContext, ...context }, message);\n }\n else\n {\n this.logger.warn(errorOrContext || {}, message);\n }\n }\n\n error(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.error({ err: errorOrContext, ...context }, message);\n }\n else\n {\n this.logger.error(errorOrContext || {}, message);\n }\n }\n\n fatal(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.fatal({ err: errorOrContext, ...context }, message);\n }\n else\n {\n this.logger.fatal(errorOrContext || {}, message);\n }\n }\n\n async close(): Promise<void>\n {\n // Pinoė ģėģ¼ė” flushėØ\n // ķģģ pino.final() ģ¬ģ© ź°ė„\n }\n}","/**\n * Logger Class\n *\n * Main logger class\n *\n * ā
Implemented:\n * - 5 log level methods (debug, info, warn, error, fatal)\n * - Child logger creation (per module)\n * - Multiple Transport support\n * - Context object support\n * - Automatic Error object handling\n *\n * š” Future considerations:\n * - Log sampling (limit high-frequency logs)\n * - Async batch processing\n * - Memory usage monitoring\n *\n * š Related files:\n * - src/logger/types.ts (Type definitions)\n * - src/logger/transports/ (Transport implementations)\n * - src/logger/adapter-factory.ts (Singleton instance)\n */\n\nimport type { LogLevel, LogMetadata, LoggerConfig, Transport } from './types';\n\n/**\n * Logger class\n */\nexport class Logger\n{\n private config: LoggerConfig;\n private module?: string;\n\n constructor(config: LoggerConfig)\n {\n this.config = config;\n this.module = config.module;\n }\n\n /**\n * Get current log level\n */\n get level(): LogLevel\n {\n return this.config.level;\n }\n\n /**\n * Create child logger (per module)\n */\n child(module: string): Logger\n {\n return new Logger({\n ...this.config,\n module,\n });\n }\n\n /**\n * Debug log\n */\n debug(message: string, context?: Record<string, unknown>): void\n {\n this.log('debug', message, undefined, context);\n }\n\n /**\n * Info log\n */\n info(message: string, context?: Record<string, unknown>): void\n {\n this.log('info', message, undefined, context);\n }\n\n /**\n * Warn log\n */\n warn(message: string, context?: Record<string, unknown>): void;\n warn(message: string, error: Error, context?: Record<string, unknown>): void;\n warn(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.log('warn', message, errorOrContext, context);\n }\n else\n {\n this.log('warn', message, undefined, errorOrContext);\n }\n }\n\n /**\n * Error log\n */\n error(message: string, context?: Record<string, unknown>): void;\n error(message: string, error: Error, context?: Record<string, unknown>): void;\n error(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.log('error', message, errorOrContext, context);\n }\n else\n {\n this.log('error', message, undefined, errorOrContext);\n }\n }\n\n /**\n * Fatal log\n */\n fatal(message: string, context?: Record<string, unknown>): void;\n fatal(message: string, error: Error, context?: Record<string, unknown>): void;\n fatal(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.log('fatal', message, errorOrContext, context);\n }\n else\n {\n this.log('fatal', message, undefined, errorOrContext);\n }\n }\n\n /**\n * Log processing (internal)\n */\n private log(level: LogLevel, message: string, error?: Error, context?: Record<string, unknown>): void\n {\n const metadata: LogMetadata = {\n timestamp: new Date(),\n level,\n message,\n module: this.module,\n error,\n context,\n };\n\n // Pass to all enabled Transports\n this.processTransports(metadata);\n }\n\n /**\n * Process Transports\n */\n private processTransports(metadata: LogMetadata): void\n {\n const promises = this.config.transports\n .filter(transport => transport.enabled)\n .map(transport => this.safeTransportLog(transport, metadata));\n\n // Async processing to prevent Transport errors from blocking logs\n Promise.all(promises).catch(error =>\n {\n // Use stderr directly to avoid circular logging\n const errorMessage = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[Logger] Transport error: ${errorMessage}\\n`);\n });\n }\n\n /**\n * Transport log (error-safe)\n */\n private async safeTransportLog(transport: Transport, metadata: LogMetadata): Promise<void>\n {\n try\n {\n await transport.log(metadata);\n }\n catch (error)\n {\n // Use stderr directly to avoid circular logging\n const errorMessage = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[Logger] Transport \"${transport.name}\" failed: ${errorMessage}\\n`);\n }\n }\n\n /**\n * Close all Transports\n */\n async close(): Promise<void>\n {\n const closePromises = this.config.transports\n .filter(transport => transport.close)\n .map(transport => transport.close!());\n\n await Promise.all(closePromises);\n }\n}","/**\n * Logger Type Definitions\n *\n * ė”ź¹
ģģ¤ķ
ķģ
ģ ģ\n *\n * ā
구ķ ģė£:\n * - LogLevel ķģ
ģ ģ\n * - LogMetadata ģøķ°ķģ“ģ¤\n * - Transport ģøķ°ķģ“ģ¤\n * - ķź²½ė³ ģ¤ģ ķģ
\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/logger.ts (Logger ķ“ėģ¤)\n * - src/logger/transports/ (Transport 구ķ첓)\n * - src/logger/config.ts (ģ¤ģ )\n */\n\n/**\n * ė”ź·ø ė 벨\n * debug < info < warn < error < fatal\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\n/**\n * ė”ź·ø ė 벨 ģ°ģ ģģ\n */\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\n/**\n * ė”ź·ø ė©ķė°ģ“ķ°\n */\nexport interface LogMetadata\n{\n timestamp: Date;\n level: LogLevel;\n message: string;\n module?: string;\n error?: Error;\n context?: Record<string, unknown>;\n}\n\n/**\n * Transport ģøķ°ķģ“ģ¤\n * ėŖØė Transportė ģ“ ģøķ°ķģ“ģ¤ė„¼ 구ķķ“ģ¼ ķØ\n */\nexport interface Transport\n{\n /**\n * Transport ģ“ė¦\n */\n name: string;\n\n /**\n * ģµģ ė”ź·ø ė 벨 (ģ“ ė 벨 ģ“ģė§ ģ²ė¦¬)\n */\n level: LogLevel;\n\n /**\n * ķģ±ķ ģ¬ė¶\n */\n enabled: boolean;\n\n /**\n * ė”ź·ø ģ²ė¦¬ ķØģ\n */\n log(metadata: LogMetadata): Promise<void>;\n\n /**\n * Transport ģ¢
ė£ (리ģģ¤ ģ 리)\n */\n close?(): Promise<void>;\n}\n\n/**\n * Logger ģ¤ģ \n */\nexport interface LoggerConfig\n{\n /**\n * źø°ė³ø ė”ź·ø ė 벨\n */\n level: LogLevel;\n\n /**\n * ėŖØėėŖ
(context)\n */\n module?: string;\n\n /**\n * Transport 리ģ¤ķø\n */\n transports: Transport[];\n}\n\n/**\n * Transport ģ¤ģ (ź³µķµ)\n */\nexport interface TransportConfig\n{\n level: LogLevel;\n enabled: boolean;\n}\n\n/**\n * Console Transport ģ¤ģ \n */\nexport interface ConsoleTransportConfig extends TransportConfig\n{\n colorize?: boolean;\n}\n\n/**\n * File Transport ģ¤ģ \n */\nexport interface FileTransportConfig extends TransportConfig\n{\n logDir: string;\n maxFileSize?: number; // bytes\n maxFiles?: number; // ģµė ė”ź·ø ķģ¼ ź°ģ\n}\n\n/**\n * Slack Transport ģ¤ģ \n */\nexport interface SlackTransportConfig extends TransportConfig\n{\n webhookUrl: string;\n channel?: string;\n username?: string;\n}\n\n/**\n * Email Transport ģ¤ģ \n */\nexport interface EmailTransportConfig extends TransportConfig\n{\n from: string;\n to: string[];\n smtpHost: string;\n smtpPort: number;\n smtpUser?: string;\n smtpPassword?: string;\n}","/**\n * Logger Formatters\n *\n * ė”ź·ø ķ¬ė§·ķ
ģ ķøė¦¬ķ°\n *\n * ā
구ķ ģė£:\n * - ģ»¬ė¬ ķ¬ė§·ķ° (ģ½ģ ģ¶ė „ģ©)\n * - JSON ķ¬ė§·ķ° (ķģ¼/ģ ģ”ģ©)\n * - ķģģ¤ķ¬ķ ķ¬ė§·ķ°\n * - ģė¬ ģ¤ķ ķøė ģ“ģ¤ ķ¬ė§·ķ
\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/types.ts (ķģ
ģ ģ)\n * - src/logger/transports/ (Transport 구ķ첓)\n */\n\nimport type { LogLevel, LogMetadata } from './types';\n\n/**\n * ANSI ģ»¬ė¬ ģ½ė\n */\nconst COLORS = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n\n // ė”ź·ø ė 벨 컬ė¬\n debug: '\\x1b[36m', // cyan\n info: '\\x1b[32m', // green\n warn: '\\x1b[33m', // yellow\n error: '\\x1b[31m', // red\n fatal: '\\x1b[35m', // magenta\n\n // ģ¶ź° 컬ė¬\n gray: '\\x1b[90m',\n};\n\n/**\n * ė”ź·ø ė 벨ģ ģ»¬ė¬ ė¬øģģ“ė” ė³ķ\n */\nexport function colorizeLevel(level: LogLevel): string\n{\n const color = COLORS[level];\n const levelStr = level.toUpperCase().padEnd(5);\n return `${color}${levelStr}${COLORS.reset}`;\n}\n\n/**\n * ķģģ¤ķ¬ķ ķ¬ė§· (ISO 8601)\n */\nexport function formatTimestamp(date: Date): string\n{\n return date.toISOString();\n}\n\n/**\n * ķģģ¤ķ¬ķ ķ¬ė§· (ģ¬ėģ“ ģ½źø° ģ¬ģ“ ķģ)\n */\nexport function formatTimestampHuman(date: Date): string\n{\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n const ms = String(date.getMilliseconds()).padStart(3, '0');\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${ms}`;\n}\n\n/**\n * ģė¬ ź°ģ²“넼 문ģģ“ė” ė³ķ (ģ¤ķ ķøė ģ“ģ¤ ķ¬ķØ)\n */\nexport function formatError(error: Error): string\n{\n const lines: string[] = [];\n\n lines.push(`${error.name}: ${error.message}`);\n\n if (error.stack)\n {\n const stackLines = error.stack.split('\\n').slice(1);\n lines.push(...stackLines);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Context ź°ģ²“넼 문ģģ“ė” ė³ķ\n */\nexport function formatContext(context: Record<string, unknown>): string\n{\n try\n {\n return JSON.stringify(context, null, 2);\n }\n catch (error)\n {\n return '[Context serialization failed]';\n }\n}\n\n/**\n * ģ½ģģ© ģ»¬ė¬ ķ¬ė§·\n */\nexport function formatConsole(metadata: LogMetadata, colorize = true): string\n{\n const parts: string[] = [];\n\n // ķģģ¤ķ¬ķ\n const timestamp = formatTimestampHuman(metadata.timestamp);\n if (colorize)\n {\n parts.push(`${COLORS.gray}${timestamp}${COLORS.reset}`);\n }\n else\n {\n parts.push(timestamp);\n }\n\n // ė”ź·ø ė 벨\n if (colorize)\n {\n parts.push(colorizeLevel(metadata.level));\n }\n else\n {\n parts.push(metadata.level.toUpperCase().padEnd(5));\n }\n\n // ėŖØėėŖ
\n if (metadata.module)\n {\n if (colorize)\n {\n parts.push(`${COLORS.dim}[${metadata.module}]${COLORS.reset}`);\n }\n else\n {\n parts.push(`[${metadata.module}]`);\n }\n }\n\n // ė©ģģ§\n parts.push(metadata.message);\n\n let output = parts.join(' ');\n\n // Context ģ¶ź°\n if (metadata.context && Object.keys(metadata.context).length > 0)\n {\n output += '\\n' + formatContext(metadata.context);\n }\n\n // ģė¬ ģ¶ź°\n if (metadata.error)\n {\n output += '\\n' + formatError(metadata.error);\n }\n\n return output;\n}\n\n/**\n * JSON ķ¬ė§· (ķģ¼ ģ ģ„ ė° ģ ģ”ģ©)\n */\nexport function formatJSON(metadata: LogMetadata): string\n{\n const obj: Record<string, unknown> = {\n timestamp: formatTimestamp(metadata.timestamp),\n level: metadata.level,\n message: metadata.message,\n };\n\n if (metadata.module)\n {\n obj.module = metadata.module;\n }\n\n if (metadata.context)\n {\n obj.context = metadata.context;\n }\n\n if (metadata.error)\n {\n obj.error = {\n name: metadata.error.name,\n message: metadata.error.message,\n stack: metadata.error.stack,\n };\n }\n\n return JSON.stringify(obj);\n}\n\n/**\n * Slack ė©ģģ§ ķ¬ė§·\n */\nexport function formatSlack(metadata: LogMetadata): string\n{\n const emoji = {\n debug: ':bug:',\n info: ':information_source:',\n warn: ':warning:',\n error: ':x:',\n fatal: ':fire:',\n };\n\n const parts: string[] = [];\n\n parts.push(`${emoji[metadata.level]} *${metadata.level.toUpperCase()}*`);\n\n if (metadata.module)\n {\n parts.push(`\\`[${metadata.module}]\\``);\n }\n\n parts.push(metadata.message);\n\n let message = parts.join(' ');\n\n if (metadata.context)\n {\n message += '\\n```\\n' + JSON.stringify(metadata.context, null, 2) + '\\n```';\n }\n\n if (metadata.error)\n {\n message += '\\n```\\n' + formatError(metadata.error) + '\\n```';\n }\n\n return message;\n}\n\n/**\n * Email ģ ėŖ© ģģ±\n */\nexport function formatEmailSubject(metadata: LogMetadata): string\n{\n const prefix = `[${metadata.level.toUpperCase()}]`;\n const module = metadata.module ? `[${metadata.module}]` : '';\n\n return `${prefix}${module} ${metadata.message}`;\n}\n\n/**\n * Email 본문 ģģ± (HTML)\n */\nexport function formatEmailBody(metadata: LogMetadata): string\n{\n const parts: string[] = [];\n\n parts.push('<html>');\n parts.push('<body style=\"font-family: monospace; padding: 20px;\">');\n\n // ķ¤ė\n parts.push(`<h2 style=\"color: ${getEmailColor(metadata.level)};\">`);\n parts.push(`${metadata.level.toUpperCase()}`);\n parts.push('</h2>');\n\n // ģź°\n parts.push('<p>');\n parts.push(`<strong>Timestamp:</strong> ${formatTimestamp(metadata.timestamp)}`);\n parts.push('</p>');\n\n // ėŖØė\n if (metadata.module)\n {\n parts.push('<p>');\n parts.push(`<strong>Module:</strong> ${metadata.module}`);\n parts.push('</p>');\n }\n\n // ė©ģģ§\n parts.push('<p>');\n parts.push(`<strong>Message:</strong> ${metadata.message}`);\n parts.push('</p>');\n\n // Context\n if (metadata.context)\n {\n parts.push('<h3>Context</h3>');\n parts.push('<pre style=\"background: #f4f4f4; padding: 10px; border-radius: 4px;\">');\n parts.push(JSON.stringify(metadata.context, null, 2));\n parts.push('</pre>');\n }\n\n // ģė¬\n if (metadata.error)\n {\n parts.push('<h3>Error Stack Trace</h3>');\n parts.push('<pre style=\"background: #fff0f0; padding: 10px; border-radius: 4px;\">');\n parts.push(formatError(metadata.error));\n parts.push('</pre>');\n }\n\n parts.push('</body>');\n parts.push('</html>');\n\n return parts.join('\\n');\n}\n\n/**\n * Email ė ė²Øė³ ģ»¬ė¬\n */\nfunction getEmailColor(level: LogLevel): string\n{\n const colors: Record<LogLevel, string> = {\n debug: '#00BCD4',\n info: '#4CAF50',\n warn: '#FF9800',\n error: '#F44336',\n fatal: '#9C27B0',\n };\n\n return colors[level];\n}","/**\n * Console Transport\n *\n * ģ½ģ ģ¶ė „ Transport\n *\n * ā
구ķ ģė£:\n * - ģ½ģ ģ¶ė „ (stdout/stderr)\n * - ģ»¬ė¬ ģ¶ė „ ģ§ģ\n * - ė”ź·ø ė ė²Øė³ ģ¤ķøė¦¼ ė¶ė¦¬ (warn/error/fatal ā stderr)\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/types.ts (Transport ģøķ°ķģ“ģ¤)\n * - src/logger/formatters.ts (ķ¬ė§·ķ°)\n * - src/logger/config.ts (ģ¤ģ )\n */\n\nimport type { Transport, LogMetadata, LogLevel, ConsoleTransportConfig } from '../types';\nimport { LOG_LEVEL_PRIORITY } from '../types';\nimport { formatConsole } from '../formatters';\n\n/**\n * Console Transport\n */\nexport class ConsoleTransport implements Transport\n{\n public readonly name = 'console';\n public readonly level: LogLevel;\n public readonly enabled: boolean;\n\n private colorize: boolean;\n\n constructor(config: ConsoleTransportConfig)\n {\n this.level = config.level;\n this.enabled = config.enabled;\n this.colorize = config.colorize ?? true;\n }\n\n async log(metadata: LogMetadata): Promise<void>\n {\n // Enabled ģķ 첓ķ¬\n if (!this.enabled)\n {\n return;\n }\n\n // ė”ź·ø ė 벨 첓ķ¬\n if (LOG_LEVEL_PRIORITY[metadata.level] < LOG_LEVEL_PRIORITY[this.level])\n {\n return;\n }\n\n // ķ¬ė§·ķ
\n const message = formatConsole(metadata, this.colorize);\n\n // warn/error/fatalģ stderrė”, ė머ģ§ė stdoutģ¼ė”\n if (metadata.level === 'warn' || metadata.level === 'error' || metadata.level === 'fatal')\n {\n console.error(message);\n }\n else\n {\n console.log(message);\n }\n }\n}","/**\n * File Transport\n *\n * ķģ¼ ģ¶ė „ Transport\n *\n * ā
구ķ ģė£:\n * - ė ģ§ė³ ė”ź·ø ķģ¼ ģģ±\n * - JSON ķ¬ė§· ģ ģ„\n * - ė”ź·ø ėė ķ 리 ģė ģģ±\n * - ė¹ėźø° ģ°źø° (createWriteStream)\n * - ė ģ§ ė³ź²½ ģ ģė ģ¤ķøė¦¼ źµģ²“\n *\n * ā ļø ź°ģ ķģ:\n * - ķģ¼ ķ¬źø° źø°ė° ė”ķ
ģ“ģ
\n * - ģ¤ėė ķģ¼ ģė ģģ \n *\n * š” ķ„ķ ź³ ė ¤ģ¬ķ:\n * - ģģ¶ė ė”ź·ø ģ칓ģ“ė¹\n * - ģøė¶ ģ¤ķ ė¦¬ģ§ ģ ģ” (S3 ė±)\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/types.ts (Transport ģøķ°ķģ“ģ¤)\n * - src/logger/formatters.ts (ķ¬ė§·ķ°)\n * - src/logger/config.ts (ģ¤ģ )\n */\n\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport type { WriteStream } from 'fs';\nimport { join } from 'path';\nimport type { Transport, LogMetadata, LogLevel, FileTransportConfig } from '../types';\nimport { LOG_LEVEL_PRIORITY } from '../types';\nimport { formatJSON } from '../formatters';\n\n/**\n * File Transport\n */\nexport class FileTransport implements Transport\n{\n public readonly name = 'file';\n public readonly level: LogLevel;\n public readonly enabled: boolean;\n\n private logDir: string;\n private currentStream: WriteStream | null = null;\n private currentFilename: string | null = null;\n\n constructor(config: FileTransportConfig)\n {\n this.level = config.level;\n this.enabled = config.enabled;\n this.logDir = config.logDir;\n\n // TODO: ķ„ķ ķģ¼ ė”ķ
ģ“ģ
구ķ ģ ģ¬ģ©\n // this.maxFileSize = config.maxFileSize ?? 10 * 1024 * 1024; // 10MB\n // this.maxFiles = config.maxFiles ?? 10;\n\n // ė”ź·ø ėė ķ ė¦¬ź° ģģ¼ė©“ ģģ±\n if (!existsSync(this.logDir))\n {\n mkdirSync(this.logDir, { recursive: true });\n }\n }\n\n async log(metadata: LogMetadata): Promise<void>\n {\n // Enabled ģķ 첓ķ¬\n if (!this.enabled)\n {\n return;\n }\n\n // ė”ź·ø ė 벨 첓ķ¬\n if (LOG_LEVEL_PRIORITY[metadata.level] < LOG_LEVEL_PRIORITY[this.level])\n {\n return;\n }\n\n // JSON ķ¬ė§·ģ¼ė” ė³ķ\n const message = formatJSON(metadata);\n\n // ķģ¼ėŖ
: YYYY-MM-DD.log\n const filename = this.getLogFilename(metadata.timestamp);\n\n // ė ģ§ź° ė³ź²½ėė©“ ģ¤ķøė¦¼ źµģ²“\n if (this.currentFilename !== filename)\n {\n await this.rotateStream(filename);\n }\n\n // ģ¤ķøė¦¼ģ ģ°źø°\n if (this.currentStream)\n {\n return new Promise((resolve, reject) =>\n {\n this.currentStream!.write(message + '\\n', 'utf-8', (error: Error | null | undefined) =>\n {\n if (error)\n {\n // ķģ¼ ģ°źø° ģ¤ķØ ģ stderrė” ģ¶ė „ (fallback)\n process.stderr.write(`[FileTransport] Failed to write log: ${error.message}\\n`);\n reject(error);\n }\n else\n {\n resolve();\n }\n });\n });\n }\n }\n\n /**\n * ģ¤ķøė¦¼ źµģ²“ (ė ģ§ ė³ź²½ ģ)\n */\n private async rotateStream(filename: string): Promise<void>\n {\n // 기씓 ģ¤ķøė¦¼ ė«źø°\n if (this.currentStream)\n {\n await this.closeStream();\n }\n\n // ģ ģ¤ķøė¦¼ ģģ±\n const filepath = join(this.logDir, filename);\n\n this.currentStream = createWriteStream(filepath, {\n flags: 'a', // append mode\n encoding: 'utf-8',\n });\n\n this.currentFilename = filename;\n\n // ģ¤ķøė¦¼ ģė¬ ķøė¤ė§\n this.currentStream.on('error', (error) =>\n {\n process.stderr.write(`[FileTransport] Stream error: ${error.message}\\n`);\n // ģė¬ ė°ģ ģ ģ¤ķøė¦¼ ģ“źø°ķ\n this.currentStream = null;\n this.currentFilename = null;\n });\n }\n\n /**\n * ķģ¬ ģ¤ķøė¦¼ ė«źø°\n */\n private async closeStream(): Promise<void>\n {\n if (!this.currentStream)\n {\n return;\n }\n\n return new Promise((resolve, reject) =>\n {\n this.currentStream!.end((error: Error | null | undefined) =>\n {\n if (error)\n {\n reject(error);\n }\n else\n {\n this.currentStream = null;\n this.currentFilename = null;\n resolve();\n }\n });\n });\n }\n\n /**\n * ė ģ§ė³ ė”ź·ø ķģ¼ėŖ
ģģ±\n */\n private getLogFilename(date: Date): string\n {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}.log`;\n }\n\n async close(): Promise<void>\n {\n // ģ¤ķøė¦¼ ģ 리\n await this.closeStream();\n }\n}","/**\n * Logger Configuration\n *\n * Logger configuration by environment\n *\n * ā
Implemented:\n * - Environment-specific log level configuration\n * - Console Transport configuration\n * - File Transport configuration (for self-hosted)\n * - File rotation configuration\n * - Slack Transport configuration (environment variable based)\n * - Email Transport configuration (environment variable based)\n *\n * š” Deployment scenarios:\n * - K8s: Disable file logging (Stdout only)\n * - Self-hosted: LOGGER_FILE_ENABLED=true\n *\n * š Related files:\n * - src/logger/types.ts (Type definitions)\n * - src/logger/index.ts (Main export)\n * - .env.local (Environment variables)\n */\n\nimport type {\n LogLevel,\n ConsoleTransportConfig,\n FileTransportConfig,\n SlackTransportConfig,\n EmailTransportConfig,\n} from './types';\n\n/**\n * Check if file logging is enabled (for self-hosted)\n */\nexport function isFileLoggingEnabled(): boolean\n{\n return process.env.LOGGER_FILE_ENABLED === 'true';\n}\n\n/**\n * Get default log level by environment\n */\nexport function getDefaultLogLevel(): LogLevel\n{\n const isProduction = process.env.NODE_ENV === 'production';\n const isDevelopment = process.env.NODE_ENV === 'development';\n\n if (isDevelopment)\n {\n return 'debug';\n }\n\n if (isProduction)\n {\n return 'info';\n }\n\n // Test environment\n return 'warn';\n}\n\n/**\n * Console Transport configuration\n */\nexport function getConsoleConfig(): ConsoleTransportConfig\n{\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n level: 'debug',\n enabled: true,\n colorize: !isProduction, // Dev: colored output, Production: plain text\n };\n}\n\n/**\n * File Transport configuration\n */\nexport function getFileConfig(): FileTransportConfig\n{\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n level: 'info',\n enabled: isProduction, // File logging in production only\n logDir: process.env.LOG_DIR || './logs',\n maxFileSize: 10 * 1024 * 1024, // 10MB\n maxFiles: 10,\n };\n}\n\n/**\n * Slack Transport configuration\n */\nexport function getSlackConfig(): SlackTransportConfig | null\n{\n const webhookUrl = process.env.SLACK_WEBHOOK_URL;\n\n if (!webhookUrl)\n {\n return null; // Disabled if not configured\n }\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n level: 'error', // Send error and above to Slack\n enabled: isProduction, // Enabled in production only\n webhookUrl,\n channel: process.env.SLACK_CHANNEL,\n username: process.env.SLACK_USERNAME || 'Logger Bot',\n };\n}\n\n/**\n * Email Transport configuration\n */\nexport function getEmailConfig(): EmailTransportConfig | null\n{\n const smtpHost = process.env.SMTP_HOST;\n const smtpPort = process.env.SMTP_PORT;\n const emailFrom = process.env.EMAIL_FROM;\n const emailTo = process.env.EMAIL_TO;\n\n // Disabled if required settings are missing\n if (!smtpHost || !smtpPort || !emailFrom || !emailTo)\n {\n return null;\n }\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n level: 'fatal', // Send fatal level only via email\n enabled: isProduction, // Enabled in production only\n from: emailFrom,\n to: emailTo.split(',').map(email => email.trim()),\n smtpHost,\n smtpPort: parseInt(smtpPort, 10),\n smtpUser: process.env.SMTP_USER,\n smtpPassword: process.env.SMTP_PASSWORD,\n };\n}","/**\n * Custom Logger Adapter\n *\n * ģ첓 구ķķ Logger넼 ģ¬ģ©ķė Adapter\n *\n * ā
구ķ ģė£:\n * - 기씓 Logger ķ“ėģ¤ ėķ\n * - Transport ģģ¤ķ
(Console, File)\n * - Child logger ģ§ģ\n *\n * š” ģ©ė:\n * - Pino ģģ”“ģ± ģ ź±° ķģģ\n * - 커ģ¤ķ
Transport ķģģ\n * - ģģ ķ ģ ģ“ź° ķģķ ź²½ģ°\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/logger.ts (Logger ķ“ėģ¤)\n * - src/logger/transports/ (Transport 구ķ)\n * - src/logger/adapters/types.ts (ģøķ°ķģ“ģ¤)\n */\n\nimport { Logger } from '../logger';\nimport { ConsoleTransport } from '../transports/console';\nimport { FileTransport } from '../transports/file';\nimport { getConsoleConfig, getFileConfig } from '../config';\nimport type { LoggerAdapter, AdapterConfig } from './types';\nimport type { Transport } from '../types';\n\n/**\n * Transport ģ“źø°ķ\n */\nfunction initializeTransports(): Transport[]\n{\n const transports: Transport[] = [];\n\n // Console Transport (ķģ ķģ±ķ)\n const consoleConfig = getConsoleConfig();\n transports.push(new ConsoleTransport(consoleConfig));\n\n // File Transport (ķė”ėģ
ģģė§ ķģ±ķ)\n const fileConfig = getFileConfig();\n if (fileConfig.enabled)\n {\n transports.push(new FileTransport(fileConfig));\n }\n\n return transports;\n}\n\n/**\n * Custom Logger Adapter\n */\nexport class CustomAdapter implements LoggerAdapter\n{\n private logger: Logger;\n\n constructor(config: AdapterConfig)\n {\n this.logger = new Logger({\n level: config.level,\n module: config.module,\n transports: initializeTransports(),\n });\n }\n\n child(module: string): LoggerAdapter\n {\n const adapter = new CustomAdapter({ level: this.logger.level, module });\n adapter.logger = this.logger.child(module);\n return adapter;\n }\n\n debug(message: string, context?: Record<string, unknown>): void\n {\n this.logger.debug(message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void\n {\n this.logger.info(message, context);\n }\n\n warn(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.warn(message, errorOrContext, context);\n }\n else\n {\n this.logger.warn(message, errorOrContext);\n }\n }\n\n error(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.error(message, errorOrContext, context);\n }\n else\n {\n this.logger.error(message, errorOrContext);\n }\n }\n\n fatal(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.fatal(message, errorOrContext, context);\n }\n else\n {\n this.logger.fatal(message, errorOrContext);\n }\n }\n\n async close(): Promise<void>\n {\n await this.logger.close();\n }\n}","/**\n * Logger Adapter Factory\n *\n * Adapter creation and initialization logic\n */\n\nimport { PinoAdapter } from './adapters/pino.js';\nimport { CustomAdapter } from './adapters/custom.js';\nimport { getDefaultLogLevel } from './config.js';\nimport type { LoggerAdapter } from './adapters/types.js';\n\n/**\n * Adapter type\n */\ntype AdapterType = 'pino' | 'custom';\n\n/**\n * Create adapter instance\n */\nfunction createAdapter(type: AdapterType): LoggerAdapter\n{\n const level = getDefaultLogLevel();\n\n switch (type)\n {\n case 'pino':\n return new PinoAdapter({ level });\n\n case 'custom':\n return new CustomAdapter({ level });\n\n default:\n return new PinoAdapter({ level });\n }\n}\n\n/**\n * Read adapter type from environment variable\n */\nfunction getAdapterType(): AdapterType\n{\n const adapterEnv = process.env.LOGGER_ADAPTER as AdapterType;\n\n if (adapterEnv === 'custom' || adapterEnv === 'pino')\n {\n return adapterEnv;\n }\n\n // Default: pino\n return 'pino';\n}\n\n/**\n * Singleton Logger instance\n */\nexport const logger: LoggerAdapter = createAdapter(getAdapterType());","/**\n * Logger Module Exports\n *\n * Entry point for logger module (Pure re-export only)\n *\n * š” Usage examples:\n * ```typescript\n * import { logger } from '@spfn/core';\n *\n * // Basic usage\n * logger.info('Application started');\n * logger.error('Connection failed', error);\n *\n * // Create module-specific logger\n * const dbLogger = logger.child('database');\n * dbLogger.debug('Connecting to database...');\n *\n * // Add context\n * logger.warn('Retry attempt', { attempt: 3, delay: 1000 });\n * ```\n *\n * š” Adapter switching:\n * - Environment variable: LOGGER_ADAPTER=pino (default) or custom\n * - Pino: High performance, production-proven\n * - Custom: Full control, no Pino dependency\n */\n\n// Logger Instance\nexport { logger } from './adapter-factory.js';\n\n// Types\nexport type { LogLevel, LoggerAdapter } from './adapters/types.js';\n","{\n \"acl\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"append\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"asking\": {\n \"arity\": 1,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"auth\": {\n \"arity\": -2,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bgrewriteaof\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bgsave\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bitcount\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitfield\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitfield_ro\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 2,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"bitpos\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"blmove\": {\n \"arity\": 6,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"blmpop\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"blpop\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"brpop\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"brpoplpush\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"bzmpop\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bzpopmax\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"bzpopmin\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"client\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"cluster\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"command\": {\n \"arity\": -1,\n \"flags\": [\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"config\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"copy\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"dbsize\": {\n \"arity\": 1,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"debug\": {\n \"arity\": -2,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"decr\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"decrby\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"del\": {\n \"arity\": -2,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"discard\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"dump\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"echo\": {\n \"arity\": 2,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"eval\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"eval_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"evalsha\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"evalsha_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"exec\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"skip_slowlog\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"exists\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"expire\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"expireat\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"expiretime\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"failover\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"fcall\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"fcall_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"flushall\": {\n \"arity\": -1,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"flushdb\": {\n \"arity\": -1,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"function\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"geoadd\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geodist\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geohash\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geopos\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadius\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadius_ro\": {\n \"arity\": -6,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadiusbymember\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadiusbymember_ro\": {\n \"arity\": -5,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geosearch\": {\n \"arity\": -7,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geosearchstore\": {\n \"arity\": -8,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"get\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getbit\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getdel\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getex\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getrange\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getset\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hdel\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hello\": {\n \"arity\": -1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"hexists\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hexpire\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hpexpire\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hget\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hgetall\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hincrby\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hincrbyfloat\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hkeys\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hmget\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hmset\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hrandfield\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hset\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hsetnx\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hstrlen\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hvals\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incr\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incrby\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incrbyfloat\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"info\": {\n \"arity\": -1,\n \"flags\": [\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"keys\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lastsave\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"latency\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lcs\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"lindex\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"linsert\": {\n \"arity\": 5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"llen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lmove\": {\n \"arity\": 5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"lmpop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lolwut\": {\n \"arity\": -1,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lpop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpos\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpush\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpushx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lrange\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lrem\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lset\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"ltrim\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"memory\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"mget\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"migrate\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 3,\n \"keyStop\": 3,\n \"step\": 1\n },\n \"module\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"monitor\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"move\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"mset\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 2\n },\n \"msetnx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 2\n },\n \"multi\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"object\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"persist\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpire\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpireat\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpiretime\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pfadd\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pfcount\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"pfdebug\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"admin\"\n ],\n \"keyStart\": 2,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"pfmerge\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"pfselftest\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"ping\": {\n \"arity\": -1,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"psetex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"psubscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"psync\": {\n \"arity\": -3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"pttl\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"publish\": {\n \"arity\": 3,\n \"flags\": [\n \"pubsub\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"pubsub\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"punsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"quit\": {\n \"arity\": -1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"randomkey\": {\n \"arity\": 1,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"readonly\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"readwrite\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"rename\": {\n \"arity\": 3,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"renamenx\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"replconf\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"replicaof\": {\n \"arity\": 3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"reset\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"restore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"restore-asking\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"asking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"role\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"rpop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"rpoplpush\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"rpush\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"rpushx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sadd\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"save\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"scan\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"scard\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"script\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sdiff\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sdiffstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"select\": {\n \"arity\": 2,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"set\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setbit\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setnx\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setrange\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"shutdown\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\",\n \"no_multi\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sinter\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sintercard\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sinterstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sismember\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"slaveof\": {\n \"arity\": 3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"slowlog\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"smembers\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"smismember\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"smove\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"sort\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sort_ro\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"spop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"spublish\": {\n \"arity\": 3,\n \"flags\": [\n \"pubsub\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"srandmember\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"srem\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"ssubscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"strlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"subscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"substr\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sunion\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sunionstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sunsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"swapdb\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sync\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"time\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"touch\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"ttl\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"type\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"unlink\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"unsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"unwatch\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"wait\": {\n \"arity\": 3,\n \"flags\": [\n \"noscript\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"watch\": {\n \"arity\": -2,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"xack\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xadd\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xautoclaim\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xclaim\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xdel\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xdelex\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xgroup\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xinfo\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xpending\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xread\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xreadgroup\": {\n \"arity\": -7,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xrevrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xsetid\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xtrim\": {\n \"arity\": -4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zadd\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zcard\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zcount\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zdiff\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zdiffstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zincrby\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zinter\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zintercard\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zinterstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zlexcount\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zmpop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zmscore\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zpopmax\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zpopmin\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrandmember\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangebylex\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangebyscore\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangestore\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"zrank\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrem\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebylex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebyrank\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebyscore\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrangebylex\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrangebyscore\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrank\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zscore\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zunion\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zunionstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n }\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKeyIndexes = exports.hasFlag = exports.exists = exports.list = void 0;\nconst commands_json_1 = __importDefault(require(\"./commands.json\"));\n/**\n * Redis command list\n *\n * All commands are lowercased.\n */\nexports.list = Object.keys(commands_json_1.default);\nconst flags = {};\nexports.list.forEach((commandName) => {\n flags[commandName] = commands_json_1.default[commandName].flags.reduce(function (flags, flag) {\n flags[flag] = true;\n return flags;\n }, {});\n});\n/**\n * Check if the command exists\n */\nfunction exists(commandName) {\n return Boolean(commands_json_1.default[commandName]);\n}\nexports.exists = exists;\n/**\n * Check if the command has the flag\n *\n * Some of possible flags: readonly, noscript, loading\n */\nfunction hasFlag(commandName, flag) {\n if (!flags[commandName]) {\n throw new Error(\"Unknown command \" + commandName);\n }\n return Boolean(flags[commandName][flag]);\n}\nexports.hasFlag = hasFlag;\n/**\n * Get indexes of keys in the command arguments\n *\n * @example\n * ```javascript\n * getKeyIndexes('set', ['key', 'value']) // [0]\n * getKeyIndexes('mget', ['key1', 'key2']) // [0, 1]\n * ```\n */\nfunction getKeyIndexes(commandName, args, options) {\n const command = commands_json_1.default[commandName];\n if (!command) {\n throw new Error(\"Unknown command \" + commandName);\n }\n if (!Array.isArray(args)) {\n throw new Error(\"Expect args to be an array\");\n }\n const keys = [];\n const parseExternalKey = Boolean(options && options.parseExternalKey);\n const takeDynamicKeys = (args, startIndex) => {\n const keys = [];\n const keyStop = Number(args[startIndex]);\n for (let i = 0; i < keyStop; i++) {\n keys.push(i + startIndex + 1);\n }\n return keys;\n };\n const takeKeyAfterToken = (args, startIndex, token) => {\n for (let i = startIndex; i < args.length - 1; i += 1) {\n if (String(args[i]).toLowerCase() === token.toLowerCase()) {\n return i + 1;\n }\n }\n return null;\n };\n switch (commandName) {\n case \"zunionstore\":\n case \"zinterstore\":\n case \"zdiffstore\":\n keys.push(0, ...takeDynamicKeys(args, 1));\n break;\n case \"eval\":\n case \"evalsha\":\n case \"eval_ro\":\n case \"evalsha_ro\":\n case \"fcall\":\n case \"fcall_ro\":\n case \"blmpop\":\n case \"bzmpop\":\n keys.push(...takeDynamicKeys(args, 1));\n break;\n case \"sintercard\":\n case \"lmpop\":\n case \"zunion\":\n case \"zinter\":\n case \"zmpop\":\n case \"zintercard\":\n case \"zdiff\": {\n keys.push(...takeDynamicKeys(args, 0));\n break;\n }\n case \"georadius\": {\n keys.push(0);\n const storeKey = takeKeyAfterToken(args, 5, \"STORE\");\n if (storeKey)\n keys.push(storeKey);\n const distKey = takeKeyAfterToken(args, 5, \"STOREDIST\");\n if (distKey)\n keys.push(distKey);\n break;\n }\n case \"georadiusbymember\": {\n keys.push(0);\n const storeKey = takeKeyAfterToken(args, 4, \"STORE\");\n if (storeKey)\n keys.push(storeKey);\n const distKey = takeKeyAfterToken(args, 4, \"STOREDIST\");\n if (distKey)\n keys.push(distKey);\n break;\n }\n case \"sort\":\n case \"sort_ro\":\n keys.push(0);\n for (let i = 1; i < args.length - 1; i++) {\n let arg = args[i];\n if (typeof arg !== \"string\") {\n continue;\n }\n const directive = arg.toUpperCase();\n if (directive === \"GET\") {\n i += 1;\n arg = args[i];\n if (arg !== \"#\") {\n if (parseExternalKey) {\n keys.push([i, getExternalKeyNameLength(arg)]);\n }\n else {\n keys.push(i);\n }\n }\n }\n else if (directive === \"BY\") {\n i += 1;\n if (parseExternalKey) {\n keys.push([i, getExternalKeyNameLength(args[i])]);\n }\n else {\n keys.push(i);\n }\n }\n else if (directive === \"STORE\") {\n i += 1;\n keys.push(i);\n }\n }\n break;\n case \"migrate\":\n if (args[2] === \"\") {\n for (let i = 5; i < args.length - 1; i++) {\n const arg = args[i];\n if (typeof arg === \"string\" && arg.toUpperCase() === \"KEYS\") {\n for (let j = i + 1; j < args.length; j++) {\n keys.push(j);\n }\n break;\n }\n }\n }\n else {\n keys.push(2);\n }\n break;\n case \"xreadgroup\":\n case \"xread\":\n // Keys are 1st half of the args after STREAMS argument.\n for (let i = commandName === \"xread\" ? 0 : 3; i < args.length - 1; i++) {\n if (String(args[i]).toUpperCase() === \"STREAMS\") {\n for (let j = i + 1; j <= i + (args.length - 1 - i) / 2; j++) {\n keys.push(j);\n }\n break;\n }\n }\n break;\n default:\n // Step has to be at least one in this case, otherwise the command does\n // not contain a key.\n if (command.step > 0) {\n const keyStart = command.keyStart - 1;\n const keyStop = command.keyStop > 0\n ? command.keyStop\n : args.length + command.keyStop + 1;\n for (let i = keyStart; i < keyStop; i += command.step) {\n keys.push(i);\n }\n }\n break;\n }\n return keys;\n}\nexports.getKeyIndexes = getKeyIndexes;\nfunction getExternalKeyNameLength(key) {\n if (typeof key !== \"string\") {\n key = String(key);\n }\n const hashPos = key.indexOf(\"->\");\n return hashPos === -1 ? key.length : hashPos;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tryCatch = exports.errorObj = void 0;\n//Try catch is not supported in optimizing\n//compiler, so it is isolated\nexports.errorObj = { e: {} };\nlet tryCatchTarget;\nfunction tryCatcher(err, val) {\n try {\n const target = tryCatchTarget;\n tryCatchTarget = null;\n return target.apply(this, arguments);\n }\n catch (e) {\n exports.errorObj.e = e;\n return exports.errorObj;\n }\n}\nfunction tryCatch(fn) {\n tryCatchTarget = fn;\n return tryCatcher;\n}\nexports.tryCatch = tryCatch;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"./utils\");\nfunction throwLater(e) {\n setTimeout(function () {\n throw e;\n }, 0);\n}\nfunction asCallback(promise, nodeback, options) {\n if (typeof nodeback === \"function\") {\n promise.then((val) => {\n let ret;\n if (options !== undefined &&\n Object(options).spread &&\n Array.isArray(val)) {\n ret = utils_1.tryCatch(nodeback).apply(undefined, [null].concat(val));\n }\n else {\n ret =\n val === undefined\n ? utils_1.tryCatch(nodeback)(null)\n : utils_1.tryCatch(nodeback)(null, val);\n }\n if (ret === utils_1.errorObj) {\n throwLater(ret.e);\n }\n }, (cause) => {\n if (!cause) {\n const newReason = new Error(cause + \"\");\n Object.assign(newReason, { cause });\n cause = newReason;\n }\n const ret = utils_1.tryCatch(nodeback)(cause);\n if (ret === utils_1.errorObj) {\n throwLater(ret.e);\n }\n });\n }\n return promise;\n}\nexports.default = asCallback;\n","'use strict'\n\nconst assert = require('assert')\nconst util = require('util')\n\n// RedisError\n\nfunction RedisError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(RedisError, Error)\n\nObject.defineProperty(RedisError.prototype, 'name', {\n value: 'RedisError',\n configurable: true,\n writable: true\n})\n\n// ParserError\n\nfunction ParserError (message, buffer, offset) {\n assert(buffer)\n assert.strictEqual(typeof offset, 'number')\n\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n Error.captureStackTrace(this, this.constructor)\n Error.stackTraceLimit = tmp\n this.offset = offset\n this.buffer = buffer\n}\n\nutil.inherits(ParserError, RedisError)\n\nObject.defineProperty(ParserError.prototype, 'name', {\n value: 'ParserError',\n configurable: true,\n writable: true\n})\n\n// ReplyError\n\nfunction ReplyError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n Error.captureStackTrace(this, this.constructor)\n Error.stackTraceLimit = tmp\n}\n\nutil.inherits(ReplyError, RedisError)\n\nObject.defineProperty(ReplyError.prototype, 'name', {\n value: 'ReplyError',\n configurable: true,\n writable: true\n})\n\n// AbortError\n\nfunction AbortError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(AbortError, RedisError)\n\nObject.defineProperty(AbortError.prototype, 'name', {\n value: 'AbortError',\n configurable: true,\n writable: true\n})\n\n// InterruptError\n\nfunction InterruptError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(InterruptError, AbortError)\n\nObject.defineProperty(InterruptError.prototype, 'name', {\n value: 'InterruptError',\n configurable: true,\n writable: true\n})\n\nmodule.exports = {\n RedisError,\n ParserError,\n ReplyError,\n AbortError,\n InterruptError\n}\n","'use strict'\n\nconst assert = require('assert')\n\nclass RedisError extends Error {\n get name () {\n return this.constructor.name\n }\n}\n\nclass ParserError extends RedisError {\n constructor (message, buffer, offset) {\n assert(buffer)\n assert.strictEqual(typeof offset, 'number')\n\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n super(message)\n Error.stackTraceLimit = tmp\n this.offset = offset\n this.buffer = buffer\n }\n\n get name () {\n return this.constructor.name\n }\n}\n\nclass ReplyError extends RedisError {\n constructor (message) {\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n super(message)\n Error.stackTraceLimit = tmp\n }\n get name () {\n return this.constructor.name\n }\n}\n\nclass AbortError extends RedisError {\n get name () {\n return this.constructor.name\n }\n}\n\nclass InterruptError extends AbortError {\n get name () {\n return this.constructor.name\n }\n}\n\nmodule.exports = {\n RedisError,\n ParserError,\n ReplyError,\n AbortError,\n InterruptError\n}\n","'use strict'\n\nconst Errors = process.version.charCodeAt(1) < 55 && process.version.charCodeAt(2) === 46\n ? require('./lib/old') // Node.js < 7\n : require('./lib/modern')\n\nmodule.exports = Errors\n","/*\n * Copyright 2001-2010 Georges Menie (www.menie.org)\n * Copyright 2010 Salvatore Sanfilippo (adapted to Redis coding style)\n * Copyright 2015 Zihua Li (http://zihua.li) (ported to JavaScript)\n * Copyright 2016 Mike Diarmid (http://github.com/salakar) (re-write for performance, ~700% perf inc)\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of the University of California, Berkeley nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* CRC16 implementation according to CCITT standards.\n *\n * Note by @antirez: this is actually the XMODEM CRC 16 algorithm, using the\n * following parameters:\n *\n * Name : \"XMODEM\", also known as \"ZMODEM\", \"CRC-16/ACORN\"\n * Width : 16 bit\n * Poly : 1021 (That is actually x^16 + x^12 + x^5 + 1)\n * Initialization : 0000\n * Reflect Input byte : False\n * Reflect Output CRC : False\n * Xor constant to output CRC : 0000\n * Output for \"123456789\" : 31C3\n */\n\nvar lookup = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n\n/**\n * Convert a string to a UTF8 array - faster than via buffer\n * @param str\n * @returns {Array}\n */\nvar toUTF8Array = function toUTF8Array(str) {\n var char;\n var i = 0;\n var p = 0;\n var utf8 = [];\n var len = str.length;\n\n for (; i < len; i++) {\n char = str.charCodeAt(i);\n if (char < 128) {\n utf8[p++] = char;\n } else if (char < 2048) {\n utf8[p++] = (char >> 6) | 192;\n utf8[p++] = (char & 63) | 128;\n } else if (\n ((char & 0xFC00) === 0xD800) && (i + 1) < str.length &&\n ((str.charCodeAt(i + 1) & 0xFC00) === 0xDC00)) {\n char = 0x10000 + ((char & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);\n utf8[p++] = (char >> 18) | 240;\n utf8[p++] = ((char >> 12) & 63) | 128;\n utf8[p++] = ((char >> 6) & 63) | 128;\n utf8[p++] = (char & 63) | 128;\n } else {\n utf8[p++] = (char >> 12) | 224;\n utf8[p++] = ((char >> 6) & 63) | 128;\n utf8[p++] = (char & 63) | 128;\n }\n }\n\n return utf8;\n};\n\n/**\n * Convert a string into a redis slot hash.\n * @param str\n * @returns {number}\n */\nvar generate = module.exports = function generate(str) {\n var char;\n var i = 0;\n var start = -1;\n var result = 0;\n var resultHash = 0;\n var utf8 = typeof str === 'string' ? toUTF8Array(str) : str;\n var len = utf8.length;\n\n while (i < len) {\n char = utf8[i++];\n if (start === -1) {\n if (char === 0x7B) {\n start = i;\n }\n } else if (char !== 0x7D) {\n resultHash = lookup[(char ^ (resultHash >> 8)) & 0xFF] ^ (resultHash << 8);\n } else if (i - 1 !== start) {\n return resultHash & 0x3FFF;\n }\n\n result = lookup[(char ^ (result >> 8)) & 0xFF] ^ (result << 8);\n }\n\n return result & 0x3FFF;\n};\n\n/**\n * Convert an array of multiple strings into a redis slot hash.\n * Returns -1 if one of the keys is not for the same slot as the others\n * @param keys\n * @returns {number}\n */\nmodule.exports.generateMulti = function generateMulti(keys) {\n var i = 1;\n var len = keys.length;\n var base = generate(keys[0]);\n\n while (i < len) {\n if (generate(keys[i++]) !== base) return -1;\n }\n\n return base;\n};\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Used by `_.defaults` to customize its `_.assignIn` use.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\nfunction assignInDefaults(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n});\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(args) {\n args.push(undefined, assignInDefaults);\n return apply(assignInWith, undefined, args);\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = defaults;\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\nmodule.exports = isArguments;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isArguments = exports.defaults = exports.noop = void 0;\nconst defaults = require(\"lodash.defaults\");\nexports.defaults = defaults;\nconst isArguments = require(\"lodash.isarguments\");\nexports.isArguments = isArguments;\nfunction noop() { }\nexports.noop = noop;\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet flagForceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tflagForceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m') ||\n\t\t\thasFlag('color=full') ||\n\t\t\thasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream, options = {}) {\n\tconst level = supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options\n\t});\n\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: getSupportLevel({isTTY: tty.isatty(1)}),\n\tstderr: getSupportLevel({isTTY: tty.isatty(2)})\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.genRedactedString = exports.getStringValue = exports.MAX_ARGUMENT_LENGTH = void 0;\nconst debug_1 = require(\"debug\");\nconst MAX_ARGUMENT_LENGTH = 200;\nexports.MAX_ARGUMENT_LENGTH = MAX_ARGUMENT_LENGTH;\nconst NAMESPACE_PREFIX = \"ioredis\";\n/**\n * helper function that tried to get a string value for\n * arbitrary \"debug\" arg\n */\nfunction getStringValue(v) {\n if (v === null) {\n return;\n }\n switch (typeof v) {\n case \"boolean\":\n return;\n case \"number\":\n return;\n case \"object\":\n if (Buffer.isBuffer(v)) {\n return v.toString(\"hex\");\n }\n if (Array.isArray(v)) {\n return v.join(\",\");\n }\n try {\n return JSON.stringify(v);\n }\n catch (e) {\n return;\n }\n case \"string\":\n return v;\n }\n}\nexports.getStringValue = getStringValue;\n/**\n * helper function that redacts a string representation of a \"debug\" arg\n */\nfunction genRedactedString(str, maxLen) {\n const { length } = str;\n return length <= maxLen\n ? str\n : str.slice(0, maxLen) + ' ... <REDACTED full-length=\"' + length + '\">';\n}\nexports.genRedactedString = genRedactedString;\n/**\n * a wrapper for the `debug` module, used to generate\n * \"debug functions\" that trim the values in their output\n */\nfunction genDebugFunction(namespace) {\n const fn = (0, debug_1.default)(`${NAMESPACE_PREFIX}:${namespace}`);\n function wrappedDebug(...args) {\n if (!fn.enabled) {\n return; // no-op\n }\n // we skip the first arg because that is the message\n for (let i = 1; i < args.length; i++) {\n const str = getStringValue(args[i]);\n if (typeof str === \"string\" && str.length > MAX_ARGUMENT_LENGTH) {\n args[i] = genRedactedString(str, MAX_ARGUMENT_LENGTH);\n }\n }\n return fn.apply(null, args);\n }\n Object.defineProperties(wrappedDebug, {\n namespace: {\n get() {\n return fn.namespace;\n },\n },\n enabled: {\n get() {\n return fn.enabled;\n },\n },\n destroy: {\n get() {\n return fn.destroy;\n },\n },\n log: {\n get() {\n return fn.log;\n },\n set(l) {\n fn.log = l;\n },\n },\n });\n return wrappedDebug;\n}\nexports.default = genDebugFunction;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * TLS settings for Redis Cloud. Updated on 2022-08-19.\n */\nconst RedisCloudCA = `-----BEGIN CERTIFICATE-----\nMIIDTzCCAjegAwIBAgIJAKSVpiDswLcwMA0GCSqGSIb3DQEBBQUAMD4xFjAUBgNV\nBAoMDUdhcmFudGlhIERhdGExJDAiBgNVBAMMG1NTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0xMzEwMDExMjE0NTVaFw0yMzA5MjkxMjE0NTVaMD4xFjAUBgNV\nBAoMDUdhcmFudGlhIERhdGExJDAiBgNVBAMMG1NTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALZqkh/DczWP\nJnxnHLQ7QL0T4B4CDKWBKCcisriGbA6ZePWVNo4hfKQC6JrzfR+081NeD6VcWUiz\nrmd+jtPhIY4c+WVQYm5PKaN6DT1imYdxQw7aqO5j2KUCEh/cznpLxeSHoTxlR34E\nQwF28Wl3eg2vc5ct8LjU3eozWVk3gb7alx9mSA2SgmuX5lEQawl++rSjsBStemY2\nBDwOpAMXIrdEyP/cVn8mkvi/BDs5M5G+09j0gfhyCzRWMQ7Hn71u1eolRxwVxgi3\nTMn+/vTaFSqxKjgck6zuAYjBRPaHe7qLxHNr1So/Mc9nPy+3wHebFwbIcnUojwbp\n4nctkWbjb2cCAwEAAaNQME4wHQYDVR0OBBYEFP1whtcrydmW3ZJeuSoKZIKjze3w\nMB8GA1UdIwQYMBaAFP1whtcrydmW3ZJeuSoKZIKjze3wMAwGA1UdEwQFMAMBAf8w\nDQYJKoZIhvcNAQEFBQADggEBAG2erXhwRAa7+ZOBs0B6X57Hwyd1R4kfmXcs0rta\nlbPpvgULSiB+TCbf3EbhJnHGyvdCY1tvlffLjdA7HJ0PCOn+YYLBA0pTU/dyvrN6\nSu8NuS5yubnt9mb13nDGYo1rnt0YRfxN+8DM3fXIVr038A30UlPX2Ou1ExFJT0MZ\nuFKY6ZvLdI6/1cbgmguMlAhM+DhKyV6Sr5699LM3zqeI816pZmlREETYkGr91q7k\nBpXJu/dtHaGxg1ZGu6w/PCsYGUcECWENYD4VQPd8N32JjOfu6vEgoEAwfPP+3oGp\nZ4m3ewACcWOAenqflb+cQYC4PsF7qbXDmRaWrbKntOlZ3n0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGMTCCBBmgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwajELMAkGA1UEBhMCVVMx\nCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJDQTESMBAGA1UECgwJUmVkaXNMYWJzMS0w\nKwYDVQQDDCRSZWRpc0xhYnMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMTgwMjI1MTUzNzM3WhcNMjgwMjIzMTUzNzM3WjBfMQswCQYDVQQGEwJVUzELMAkG\nA1UECAwCQ0ExEjAQBgNVBAoMCVJlZGlzTGFiczEvMC0GA1UEAwwmUkNQIEludGVy\nbWVkaWF0ZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQDf9dqbxc8Bq7Ctq9rWcxrGNKKHivqLAFpPq02yLPx6fsOv\nTq7GsDChAYBBc4v7Y2Ap9RD5Vs3dIhEANcnolf27QwrG9RMnnvzk8pCvp1o6zSU4\nVuOE1W66/O1/7e2rVxyrnTcP7UgK43zNIXu7+tiAqWsO92uSnuMoGPGpeaUm1jym\nhjWKtkAwDFSqvHY+XL5qDVBEjeUe+WHkYUg40cAXjusAqgm2hZt29c2wnVrxW25W\nP0meNlzHGFdA2AC5z54iRiqj57dTfBTkHoBczQxcyw6hhzxZQ4e5I5zOKjXXEhZN\nr0tA3YC14CTabKRus/JmZieyZzRgEy2oti64tmLYTqSlAD78pRL40VNoaSYetXLw\nhhNsXCHgWaY6d5bLOc/aIQMAV5oLvZQKvuXAF1IDmhPA+bZbpWipp0zagf1P1H3s\nUzsMdn2KM0ejzgotbtNlj5TcrVwpmvE3ktvUAuA+hi3FkVx1US+2Gsp5x4YOzJ7u\nP1WPk6ShF0JgnJH2ILdj6kttTWwFzH17keSFICWDfH/+kM+k7Y1v3EXMQXE7y0T9\nMjvJskz6d/nv+sQhY04xt64xFMGTnZjlJMzfQNi7zWFLTZnDD0lPowq7l3YiPoTT\nt5Xky83lu0KZsZBo0WlWaDG00gLVdtRgVbcuSWxpi5BdLb1kRab66JptWjxwXQID\nAQABo4HrMIHoMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHBzOi8vcmwtY2Etc2VydmVy\nLnJlZGlzbGFicy5jb20vdjEvY3JsMEYGCCsGAQUFBwEBBDowODA2BggrBgEFBQcw\nAYYqaHR0cHM6Ly9ybC1jYS1zZXJ2ZXIucmVkaXNsYWJzLmNvbS92MS9vY3NwMB0G\nA1UdDgQWBBQHar5OKvQUpP2qWt6mckzToeCOHDAfBgNVHSMEGDAWgBQi42wH6hM4\nL2sujEvLM0/u8lRXTzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQsFAAOCAgEAirEn/iTsAKyhd+pu2W3Z5NjCko4NPU0EYUbr\nAP7+POK2rzjIrJO3nFYQ/LLuC7KCXG+2qwan2SAOGmqWst13Y+WHp44Kae0kaChW\nvcYLXXSoGQGC8QuFSNUdaeg3RbMDYFT04dOkqufeWVccoHVxyTSg9eD8LZuHn5jw\n7QDLiEECBmIJHk5Eeo2TAZrx4Yx6ufSUX5HeVjlAzqwtAqdt99uCJ/EL8bgpWbe+\nXoSpvUv0SEC1I1dCAhCKAvRlIOA6VBcmzg5Am12KzkqTul12/VEFIgzqu0Zy2Jbc\nAUPrYVu/+tOGXQaijy7YgwH8P8n3s7ZeUa1VABJHcxrxYduDDJBLZi+MjheUDaZ1\njQRHYevI2tlqeSBqdPKG4zBY5lS0GiAlmuze5oENt0P3XboHoZPHiqcK3VECgTVh\n/BkJcuudETSJcZDmQ8YfoKfBzRQNg2sv/hwvUv73Ss51Sco8GEt2lD8uEdib1Q6z\nzDT5lXJowSzOD5ZA9OGDjnSRL+2riNtKWKEqvtEG3VBJoBzu9GoxbAc7wIZLxmli\niF5a/Zf5X+UXD3s4TMmy6C4QZJpAA2egsSQCnraWO2ULhh7iXMysSkF/nzVfZn43\niqpaB8++9a37hWq14ZmOv0TJIDz//b2+KC4VFXWQ5W5QC6whsjT+OlG4p5ZYG0jo\n616pxqo=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIEjzCCA3egAwIBAgIQe55B/ALCKJDZtdNT8kD6hTANBgkqhkiG9w0BAQsFADBM\nMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xv\nYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0yMjAxMjYxMjAwMDBaFw0y\nNTAxMjYwMDAwMDBaMFgxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWdu\nIG52LXNhMS4wLAYDVQQDEyVHbG9iYWxTaWduIEF0bGFzIFIzIE9WIFRMUyBDQSAy\nMDIyIFEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGmg1LW9b7Lf\n8zDD83yBDTEkt+FOxKJZqF4veWc5KZsQj9HfnUS2e5nj/E+JImlGPsQuoiosLuXD\nBVBNAMcUFa11buFMGMeEMwiTmCXoXRrXQmH0qjpOfKgYc5gHG3BsRGaRrf7VR4eg\nofNMG9wUBw4/g/TT7+bQJdA4NfE7Y4d5gEryZiBGB/swaX6Jp/8MF4TgUmOWmalK\ndZCKyb4sPGQFRTtElk67F7vU+wdGcrcOx1tDcIB0ncjLPMnaFicagl+daWGsKqTh\ncounQb6QJtYHa91KvCfKWocMxQ7OIbB5UARLPmC4CJ1/f8YFm35ebfzAeULYdGXu\njE9CLor0OwIDAQABo4IBXzCCAVswDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG\nCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW\nBBSH5Zq7a7B/t95GfJWkDBpA8HHqdjAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpj\nmove4t0bvDB7BggrBgEFBQcBAQRvMG0wLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3Nw\nMi5nbG9iYWxzaWduLmNvbS9yb290cjMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9zZWN1\ncmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L3Jvb3QtcjMuY3J0MDYGA1UdHwQvMC0w\nK6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vcm9vdC1yMy5jcmwwIQYD\nVR0gBBowGDAIBgZngQwBAgIwDAYKKwYBBAGgMgoBAjANBgkqhkiG9w0BAQsFAAOC\nAQEAKRic9/f+nmhQU/wz04APZLjgG5OgsuUOyUEZjKVhNGDwxGTvKhyXGGAMW2B/\n3bRi+aElpXwoxu3pL6fkElbX3B0BeS5LoDtxkyiVEBMZ8m+sXbocwlPyxrPbX6mY\n0rVIvnuUeBH8X0L5IwfpNVvKnBIilTbcebfHyXkPezGwz7E1yhUULjJFm2bt0SdX\ny+4X/WeiiYIv+fTVgZZgl+/2MKIsu/qdBJc3f3TvJ8nz+Eax1zgZmww+RSQWeOj3\n15Iw6Z5FX+NwzY/Ab+9PosR5UosSeq+9HhtaxZttXG1nVh+avYPGYddWmiMT90J5\nZgKnO/Fx2hBgTxhOTMYaD312kg==\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\nA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\nZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\nMTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\nA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\nRgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\ngHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\nKPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\nQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\nXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\nDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\nLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\nRUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\njjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\n6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\nmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\nMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\nWD9f\n-----END CERTIFICATE-----`;\nconst TLSProfiles = {\n RedisCloudFixed: { ca: RedisCloudCA },\n RedisCloudFlexible: { ca: RedisCloudCA },\n};\nexports.default = TLSProfiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.noop = exports.defaults = exports.Debug = exports.getPackageMeta = exports.zipMap = exports.CONNECTION_CLOSED_ERROR_MSG = exports.shuffle = exports.sample = exports.resolveTLSProfile = exports.parseURL = exports.optimizeErrorStack = exports.toArg = exports.convertMapToArray = exports.convertObjectToArray = exports.timeout = exports.packObject = exports.isInt = exports.wrapMultiResult = exports.convertBufferToString = void 0;\nconst fs_1 = require(\"fs\");\nconst path_1 = require(\"path\");\nconst url_1 = require(\"url\");\nconst lodash_1 = require(\"./lodash\");\nObject.defineProperty(exports, \"defaults\", { enumerable: true, get: function () { return lodash_1.defaults; } });\nObject.defineProperty(exports, \"noop\", { enumerable: true, get: function () { return lodash_1.noop; } });\nconst debug_1 = require(\"./debug\");\nexports.Debug = debug_1.default;\nconst TLSProfiles_1 = require(\"../constants/TLSProfiles\");\n/**\n * Convert a buffer to string, supports buffer array\n *\n * @example\n * ```js\n * const input = [Buffer.from('foo'), [Buffer.from('bar')]]\n * const res = convertBufferToString(input, 'utf8')\n * expect(res).to.eql(['foo', ['bar']])\n * ```\n */\nfunction convertBufferToString(value, encoding) {\n if (value instanceof Buffer) {\n return value.toString(encoding);\n }\n if (Array.isArray(value)) {\n const length = value.length;\n const res = Array(length);\n for (let i = 0; i < length; ++i) {\n res[i] =\n value[i] instanceof Buffer && encoding === \"utf8\"\n ? value[i].toString()\n : convertBufferToString(value[i], encoding);\n }\n return res;\n }\n return value;\n}\nexports.convertBufferToString = convertBufferToString;\n/**\n * Convert a list of results to node-style\n *\n * @example\n * ```js\n * const input = ['a', 'b', new Error('c'), 'd']\n * const output = exports.wrapMultiResult(input)\n * expect(output).to.eql([[null, 'a'], [null, 'b'], [new Error('c')], [null, 'd'])\n * ```\n */\nfunction wrapMultiResult(arr) {\n // When using WATCH/EXEC transactions, the EXEC will return\n // a null instead of an array\n if (!arr) {\n return null;\n }\n const result = [];\n const length = arr.length;\n for (let i = 0; i < length; ++i) {\n const item = arr[i];\n if (item instanceof Error) {\n result.push([item]);\n }\n else {\n result.push([null, item]);\n }\n }\n return result;\n}\nexports.wrapMultiResult = wrapMultiResult;\n/**\n * Detect if the argument is a int\n * @example\n * ```js\n * > isInt('123')\n * true\n * > isInt('123.3')\n * false\n * > isInt('1x')\n * false\n * > isInt(123)\n * true\n * > isInt(true)\n * false\n * ```\n */\nfunction isInt(value) {\n const x = parseFloat(value);\n return !isNaN(value) && (x | 0) === x;\n}\nexports.isInt = isInt;\n/**\n * Pack an array to an Object\n *\n * @example\n * ```js\n * > packObject(['a', 'b', 'c', 'd'])\n * { a: 'b', c: 'd' }\n * ```\n */\nfunction packObject(array) {\n const result = {};\n const length = array.length;\n for (let i = 1; i < length; i += 2) {\n result[array[i - 1]] = array[i];\n }\n return result;\n}\nexports.packObject = packObject;\n/**\n * Return a callback with timeout\n */\nfunction timeout(callback, timeout) {\n let timer = null;\n const run = function () {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n callback.apply(this, arguments);\n }\n };\n timer = setTimeout(run, timeout, new Error(\"timeout\"));\n return run;\n}\nexports.timeout = timeout;\n/**\n * Convert an object to an array\n * @example\n * ```js\n * > convertObjectToArray({ a: '1' })\n * ['a', '1']\n * ```\n */\nfunction convertObjectToArray(obj) {\n const result = [];\n const keys = Object.keys(obj); // Object.entries requires node 7+\n for (let i = 0, l = keys.length; i < l; i++) {\n result.push(keys[i], obj[keys[i]]);\n }\n return result;\n}\nexports.convertObjectToArray = convertObjectToArray;\n/**\n * Convert a map to an array\n * @example\n * ```js\n * > convertMapToArray(new Map([[1, '2']]))\n * [1, '2']\n * ```\n */\nfunction convertMapToArray(map) {\n const result = [];\n let pos = 0;\n map.forEach(function (value, key) {\n result[pos] = key;\n result[pos + 1] = value;\n pos += 2;\n });\n return result;\n}\nexports.convertMapToArray = convertMapToArray;\n/**\n * Convert a non-string arg to a string\n */\nfunction toArg(arg) {\n if (arg === null || typeof arg === \"undefined\") {\n return \"\";\n }\n return String(arg);\n}\nexports.toArg = toArg;\n/**\n * Optimize error stack\n *\n * @param error actually error\n * @param friendlyStack the stack that more meaningful\n * @param filterPath only show stacks with the specified path\n */\nfunction optimizeErrorStack(error, friendlyStack, filterPath) {\n const stacks = friendlyStack.split(\"\\n\");\n let lines = \"\";\n let i;\n for (i = 1; i < stacks.length; ++i) {\n if (stacks[i].indexOf(filterPath) === -1) {\n break;\n }\n }\n for (let j = i; j < stacks.length; ++j) {\n lines += \"\\n\" + stacks[j];\n }\n if (error.stack) {\n const pos = error.stack.indexOf(\"\\n\");\n error.stack = error.stack.slice(0, pos) + lines;\n }\n return error;\n}\nexports.optimizeErrorStack = optimizeErrorStack;\n/**\n * Parse the redis protocol url\n */\nfunction parseURL(url) {\n if (isInt(url)) {\n return { port: url };\n }\n let parsed = (0, url_1.parse)(url, true, true);\n if (!parsed.slashes && url[0] !== \"/\") {\n url = \"//\" + url;\n parsed = (0, url_1.parse)(url, true, true);\n }\n const options = parsed.query || {};\n const result = {};\n if (parsed.auth) {\n const index = parsed.auth.indexOf(\":\");\n result.username = index === -1 ? parsed.auth : parsed.auth.slice(0, index);\n result.password = index === -1 ? \"\" : parsed.auth.slice(index + 1);\n }\n if (parsed.pathname) {\n if (parsed.protocol === \"redis:\" || parsed.protocol === \"rediss:\") {\n if (parsed.pathname.length > 1) {\n result.db = parsed.pathname.slice(1);\n }\n }\n else {\n result.path = parsed.pathname;\n }\n }\n if (parsed.host) {\n result.host = parsed.hostname;\n }\n if (parsed.port) {\n result.port = parsed.port;\n }\n if (typeof options.family === \"string\") {\n const intFamily = Number.parseInt(options.family, 10);\n if (!Number.isNaN(intFamily)) {\n result.family = intFamily;\n }\n }\n (0, lodash_1.defaults)(result, options);\n return result;\n}\nexports.parseURL = parseURL;\n/**\n * Resolve TLS profile shortcut in connection options\n */\nfunction resolveTLSProfile(options) {\n let tls = options === null || options === void 0 ? void 0 : options.tls;\n if (typeof tls === \"string\")\n tls = { profile: tls };\n const profile = TLSProfiles_1.default[tls === null || tls === void 0 ? void 0 : tls.profile];\n if (profile) {\n tls = Object.assign({}, profile, tls);\n delete tls.profile;\n options = Object.assign({}, options, { tls });\n }\n return options;\n}\nexports.resolveTLSProfile = resolveTLSProfile;\n/**\n * Get a random element from `array`\n */\nfunction sample(array, from = 0) {\n const length = array.length;\n if (from >= length) {\n return null;\n }\n return array[from + Math.floor(Math.random() * (length - from))];\n}\nexports.sample = sample;\n/**\n * Shuffle the array using the Fisher-Yates Shuffle.\n * This method will mutate the original array.\n */\nfunction shuffle(array) {\n let counter = array.length;\n // While there are elements in the array\n while (counter > 0) {\n // Pick a random index\n const index = Math.floor(Math.random() * counter);\n // Decrease counter by 1\n counter--;\n // And swap the last element with it\n [array[counter], array[index]] = [array[index], array[counter]];\n }\n return array;\n}\nexports.shuffle = shuffle;\n/**\n * Error message for connection being disconnected\n */\nexports.CONNECTION_CLOSED_ERROR_MSG = \"Connection is closed.\";\nfunction zipMap(keys, values) {\n const map = new Map();\n keys.forEach((key, index) => {\n map.set(key, values[index]);\n });\n return map;\n}\nexports.zipMap = zipMap;\n/**\n * Memoized package metadata to avoid repeated file system reads.\n *\n * @internal\n */\nlet cachedPackageMeta = null;\n/**\n * Retrieves cached package metadata from package.json.\n *\n * @internal\n * @returns {Promise<{version: string} | null>} Package metadata or null if unavailable\n */\nasync function getPackageMeta() {\n if (cachedPackageMeta) {\n return cachedPackageMeta;\n }\n try {\n const filePath = (0, path_1.resolve)(__dirname, \"..\", \"..\", \"package.json\");\n const data = await fs_1.promises.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(data);\n cachedPackageMeta = {\n version: parsed.version,\n };\n return cachedPackageMeta;\n }\n catch (err) {\n cachedPackageMeta = {\n version: \"error-fetching-version\",\n };\n return cachedPackageMeta;\n }\n}\nexports.getPackageMeta = getPackageMeta;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst utils_1 = require(\"./utils\");\n/**\n * Command instance\n *\n * It's rare that you need to create a Command instance yourself.\n *\n * ```js\n * var infoCommand = new Command('info', null, function (err, result) {\n * console.log('result', result);\n * });\n *\n * redis.sendCommand(infoCommand);\n *\n * // When no callback provided, Command instance will have a `promise` property,\n * // which will resolve/reject with the result of the command.\n * var getCommand = new Command('get', ['foo']);\n * getCommand.promise.then(function (result) {\n * console.log('result', result);\n * });\n * ```\n */\nclass Command {\n /**\n * Creates an instance of Command.\n * @param name Command name\n * @param args An array of command arguments\n * @param options\n * @param callback The callback that handles the response.\n * If omit, the response will be handled via Promise\n */\n constructor(name, args = [], options = {}, callback) {\n this.name = name;\n this.inTransaction = false;\n this.isResolved = false;\n this.transformed = false;\n this.replyEncoding = options.replyEncoding;\n this.errorStack = options.errorStack;\n this.args = args.flat();\n this.callback = callback;\n this.initPromise();\n if (options.keyPrefix) {\n // @ts-expect-error\n const isBufferKeyPrefix = options.keyPrefix instanceof Buffer;\n // @ts-expect-error\n let keyPrefixBuffer = isBufferKeyPrefix\n ? options.keyPrefix\n : null;\n this._iterateKeys((key) => {\n if (key instanceof Buffer) {\n if (keyPrefixBuffer === null) {\n keyPrefixBuffer = Buffer.from(options.keyPrefix);\n }\n return Buffer.concat([keyPrefixBuffer, key]);\n }\n else if (isBufferKeyPrefix) {\n // @ts-expect-error\n return Buffer.concat([options.keyPrefix, Buffer.from(String(key))]);\n }\n return options.keyPrefix + key;\n });\n }\n if (options.readOnly) {\n this.isReadOnly = true;\n }\n }\n /**\n * Check whether the command has the flag\n */\n static checkFlag(flagName, commandName) {\n return !!this.getFlagMap()[flagName][commandName];\n }\n static setArgumentTransformer(name, func) {\n this._transformer.argument[name] = func;\n }\n static setReplyTransformer(name, func) {\n this._transformer.reply[name] = func;\n }\n static getFlagMap() {\n if (!this.flagMap) {\n this.flagMap = Object.keys(Command.FLAGS).reduce((map, flagName) => {\n map[flagName] = {};\n Command.FLAGS[flagName].forEach((commandName) => {\n map[flagName][commandName] = true;\n });\n return map;\n }, {});\n }\n return this.flagMap;\n }\n getSlot() {\n if (typeof this.slot === \"undefined\") {\n const key = this.getKeys()[0];\n this.slot = key == null ? null : calculateSlot(key);\n }\n return this.slot;\n }\n getKeys() {\n return this._iterateKeys();\n }\n /**\n * Convert command to writable buffer or string\n */\n toWritable(_socket) {\n let result;\n const commandStr = \"*\" +\n (this.args.length + 1) +\n \"\\r\\n$\" +\n Buffer.byteLength(this.name) +\n \"\\r\\n\" +\n this.name +\n \"\\r\\n\";\n if (this.bufferMode) {\n const buffers = new MixedBuffers();\n buffers.push(commandStr);\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n if (arg instanceof Buffer) {\n if (arg.length === 0) {\n buffers.push(\"$0\\r\\n\\r\\n\");\n }\n else {\n buffers.push(\"$\" + arg.length + \"\\r\\n\");\n buffers.push(arg);\n buffers.push(\"\\r\\n\");\n }\n }\n else {\n buffers.push(\"$\" +\n Buffer.byteLength(arg) +\n \"\\r\\n\" +\n arg +\n \"\\r\\n\");\n }\n }\n result = buffers.toBuffer();\n }\n else {\n result = commandStr;\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n result +=\n \"$\" +\n Buffer.byteLength(arg) +\n \"\\r\\n\" +\n arg +\n \"\\r\\n\";\n }\n }\n return result;\n }\n stringifyArguments() {\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n if (typeof arg === \"string\") {\n // buffers and strings don't need any transformation\n }\n else if (arg instanceof Buffer) {\n this.bufferMode = true;\n }\n else {\n this.args[i] = (0, utils_1.toArg)(arg);\n }\n }\n }\n /**\n * Convert buffer/buffer[] to string/string[],\n * and apply reply transformer.\n */\n transformReply(result) {\n if (this.replyEncoding) {\n result = (0, utils_1.convertBufferToString)(result, this.replyEncoding);\n }\n const transformer = Command._transformer.reply[this.name];\n if (transformer) {\n result = transformer(result);\n }\n return result;\n }\n /**\n * Set the wait time before terminating the attempt to execute a command\n * and generating an error.\n */\n setTimeout(ms) {\n if (!this._commandTimeoutTimer) {\n this._commandTimeoutTimer = setTimeout(() => {\n if (!this.isResolved) {\n this.reject(new Error(\"Command timed out\"));\n }\n }, ms);\n }\n }\n initPromise() {\n const promise = new Promise((resolve, reject) => {\n if (!this.transformed) {\n this.transformed = true;\n const transformer = Command._transformer.argument[this.name];\n if (transformer) {\n this.args = transformer(this.args);\n }\n this.stringifyArguments();\n }\n this.resolve = this._convertValue(resolve);\n if (this.errorStack) {\n this.reject = (err) => {\n reject((0, utils_1.optimizeErrorStack)(err, this.errorStack.stack, __dirname));\n };\n }\n else {\n this.reject = reject;\n }\n });\n this.promise = (0, standard_as_callback_1.default)(promise, this.callback);\n }\n /**\n * Iterate through the command arguments that are considered keys.\n */\n _iterateKeys(transform = (key) => key) {\n if (typeof this.keys === \"undefined\") {\n this.keys = [];\n if ((0, commands_1.exists)(this.name)) {\n // @ts-expect-error\n const keyIndexes = (0, commands_1.getKeyIndexes)(this.name, this.args);\n for (const index of keyIndexes) {\n this.args[index] = transform(this.args[index]);\n this.keys.push(this.args[index]);\n }\n }\n }\n return this.keys;\n }\n /**\n * Convert the value from buffer to the target encoding.\n */\n _convertValue(resolve) {\n return (value) => {\n try {\n const existingTimer = this._commandTimeoutTimer;\n if (existingTimer) {\n clearTimeout(existingTimer);\n delete this._commandTimeoutTimer;\n }\n resolve(this.transformReply(value));\n this.isResolved = true;\n }\n catch (err) {\n this.reject(err);\n }\n return this.promise;\n };\n }\n}\nexports.default = Command;\nCommand.FLAGS = {\n VALID_IN_SUBSCRIBER_MODE: [\n \"subscribe\",\n \"psubscribe\",\n \"unsubscribe\",\n \"punsubscribe\",\n \"ssubscribe\",\n \"sunsubscribe\",\n \"ping\",\n \"quit\",\n ],\n VALID_IN_MONITOR_MODE: [\"monitor\", \"auth\"],\n ENTER_SUBSCRIBER_MODE: [\"subscribe\", \"psubscribe\", \"ssubscribe\"],\n EXIT_SUBSCRIBER_MODE: [\"unsubscribe\", \"punsubscribe\", \"sunsubscribe\"],\n WILL_DISCONNECT: [\"quit\"],\n};\nCommand._transformer = {\n argument: {},\n reply: {},\n};\nconst msetArgumentTransformer = function (args) {\n if (args.length === 1) {\n if (args[0] instanceof Map) {\n return (0, utils_1.convertMapToArray)(args[0]);\n }\n if (typeof args[0] === \"object\" && args[0] !== null) {\n return (0, utils_1.convertObjectToArray)(args[0]);\n }\n }\n return args;\n};\nconst hsetArgumentTransformer = function (args) {\n if (args.length === 2) {\n if (args[1] instanceof Map) {\n return [args[0]].concat((0, utils_1.convertMapToArray)(args[1]));\n }\n if (typeof args[1] === \"object\" && args[1] !== null) {\n return [args[0]].concat((0, utils_1.convertObjectToArray)(args[1]));\n }\n }\n return args;\n};\nCommand.setArgumentTransformer(\"mset\", msetArgumentTransformer);\nCommand.setArgumentTransformer(\"msetnx\", msetArgumentTransformer);\nCommand.setArgumentTransformer(\"hset\", hsetArgumentTransformer);\nCommand.setArgumentTransformer(\"hmset\", hsetArgumentTransformer);\nCommand.setReplyTransformer(\"hgetall\", function (result) {\n if (Array.isArray(result)) {\n const obj = {};\n for (let i = 0; i < result.length; i += 2) {\n const key = result[i];\n const value = result[i + 1];\n if (key in obj) {\n // can only be truthy if the property is special somehow, like '__proto__' or 'constructor'\n // https://github.com/luin/ioredis/issues/1267\n Object.defineProperty(obj, key, {\n value,\n configurable: true,\n enumerable: true,\n writable: true,\n });\n }\n else {\n obj[key] = value;\n }\n }\n return obj;\n }\n return result;\n});\nclass MixedBuffers {\n constructor() {\n this.length = 0;\n this.items = [];\n }\n push(x) {\n this.length += Buffer.byteLength(x);\n this.items.push(x);\n }\n toBuffer() {\n const result = Buffer.allocUnsafe(this.length);\n let offset = 0;\n for (const item of this.items) {\n const length = Buffer.byteLength(item);\n Buffer.isBuffer(item)\n ? item.copy(result, offset)\n : result.write(item, offset, length);\n offset += length;\n }\n return result;\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_errors_1 = require(\"redis-errors\");\nclass ClusterAllFailedError extends redis_errors_1.RedisError {\n constructor(message, lastNodeError) {\n super(message);\n this.lastNodeError = lastNodeError;\n Error.captureStackTrace(this, this.constructor);\n }\n get name() {\n return this.constructor.name;\n }\n}\nexports.default = ClusterAllFailedError;\nClusterAllFailedError.defaultMessage = \"Failed to refresh slots cache.\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\n/**\n * Convenient class to convert the process of scanning keys to a readable stream.\n */\nclass ScanStream extends stream_1.Readable {\n constructor(opt) {\n super(opt);\n this.opt = opt;\n this._redisCursor = \"0\";\n this._redisDrained = false;\n }\n _read() {\n if (this._redisDrained) {\n this.push(null);\n return;\n }\n const args = [this._redisCursor];\n if (this.opt.key) {\n args.unshift(this.opt.key);\n }\n if (this.opt.match) {\n args.push(\"MATCH\", this.opt.match);\n }\n if (this.opt.type) {\n args.push(\"TYPE\", this.opt.type);\n }\n if (this.opt.count) {\n args.push(\"COUNT\", String(this.opt.count));\n }\n if (this.opt.noValues) {\n args.push(\"NOVALUES\");\n }\n this.opt.redis[this.opt.command](args, (err, res) => {\n if (err) {\n this.emit(\"error\", err);\n return;\n }\n this._redisCursor = res[0] instanceof Buffer ? res[0].toString() : res[0];\n if (this._redisCursor === \"0\") {\n this._redisDrained = true;\n }\n this.push(res[1]);\n });\n }\n close() {\n this._redisDrained = true;\n }\n}\nexports.default = ScanStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.executeWithAutoPipelining = exports.getFirstValueInFlattenedArray = exports.shouldUseAutoPipelining = exports.notAllowedAutoPipelineCommands = exports.kCallbacks = exports.kExec = void 0;\nconst lodash_1 = require(\"./utils/lodash\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nexports.kExec = Symbol(\"exec\");\nexports.kCallbacks = Symbol(\"callbacks\");\nexports.notAllowedAutoPipelineCommands = [\n \"auth\",\n \"info\",\n \"script\",\n \"quit\",\n \"cluster\",\n \"pipeline\",\n \"multi\",\n \"subscribe\",\n \"psubscribe\",\n \"unsubscribe\",\n \"unpsubscribe\",\n \"select\",\n];\nfunction executeAutoPipeline(client, slotKey) {\n /*\n If a pipeline is already executing, keep queueing up commands\n since ioredis won't serve two pipelines at the same time\n */\n if (client._runningAutoPipelines.has(slotKey)) {\n return;\n }\n if (!client._autoPipelines.has(slotKey)) {\n /*\n Rare edge case. Somehow, something has deleted this running autopipeline in an immediate\n call to executeAutoPipeline.\n \n Maybe the callback in the pipeline.exec is sometimes called in the same tick,\n e.g. if redis is disconnected?\n */\n return;\n }\n client._runningAutoPipelines.add(slotKey);\n // Get the pipeline and immediately delete it so that new commands are queued on a new pipeline\n const pipeline = client._autoPipelines.get(slotKey);\n client._autoPipelines.delete(slotKey);\n const callbacks = pipeline[exports.kCallbacks];\n // Stop keeping a reference to callbacks immediately after the callbacks stop being used.\n // This allows the GC to reclaim objects referenced by callbacks, especially with 16384 slots\n // in Redis.Cluster\n pipeline[exports.kCallbacks] = null;\n // Perform the call\n pipeline.exec(function (err, results) {\n client._runningAutoPipelines.delete(slotKey);\n /*\n Invoke all callback in nextTick so the stack is cleared\n and callbacks can throw errors without affecting other callbacks.\n */\n if (err) {\n for (let i = 0; i < callbacks.length; i++) {\n process.nextTick(callbacks[i], err);\n }\n }\n else {\n for (let i = 0; i < callbacks.length; i++) {\n process.nextTick(callbacks[i], ...results[i]);\n }\n }\n // If there is another pipeline on the same node, immediately execute it without waiting for nextTick\n if (client._autoPipelines.has(slotKey)) {\n executeAutoPipeline(client, slotKey);\n }\n });\n}\nfunction shouldUseAutoPipelining(client, functionName, commandName) {\n return (functionName &&\n client.options.enableAutoPipelining &&\n !client.isPipeline &&\n !exports.notAllowedAutoPipelineCommands.includes(commandName) &&\n !client.options.autoPipeliningIgnoredCommands.includes(commandName));\n}\nexports.shouldUseAutoPipelining = shouldUseAutoPipelining;\nfunction getFirstValueInFlattenedArray(args) {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === \"string\") {\n return arg;\n }\n else if (Array.isArray(arg) || (0, lodash_1.isArguments)(arg)) {\n if (arg.length === 0) {\n continue;\n }\n return arg[0];\n }\n const flattened = [arg].flat();\n if (flattened.length > 0) {\n return flattened[0];\n }\n }\n return undefined;\n}\nexports.getFirstValueInFlattenedArray = getFirstValueInFlattenedArray;\nfunction executeWithAutoPipelining(client, functionName, commandName, args, callback) {\n // On cluster mode let's wait for slots to be available\n if (client.isCluster && !client.slots.length) {\n if (client.status === \"wait\")\n client.connect().catch(lodash_1.noop);\n return (0, standard_as_callback_1.default)(new Promise(function (resolve, reject) {\n client.delayUntilReady((err) => {\n if (err) {\n reject(err);\n return;\n }\n executeWithAutoPipelining(client, functionName, commandName, args, null).then(resolve, reject);\n });\n }), callback);\n }\n // If we have slot information, we can improve routing by grouping slots served by the same subset of nodes\n // Note that the first value in args may be a (possibly empty) array.\n // ioredis will only flatten one level of the array, in the Command constructor.\n const prefix = client.options.keyPrefix || \"\";\n const slotKey = client.isCluster\n ? client.slots[calculateSlot(`${prefix}${getFirstValueInFlattenedArray(args)}`)].join(\",\")\n : \"main\";\n if (!client._autoPipelines.has(slotKey)) {\n const pipeline = client.pipeline();\n pipeline[exports.kExec] = false;\n pipeline[exports.kCallbacks] = [];\n client._autoPipelines.set(slotKey, pipeline);\n }\n const pipeline = client._autoPipelines.get(slotKey);\n /*\n Mark the pipeline as scheduled.\n The symbol will make sure that the pipeline is only scheduled once per tick.\n New commands are appended to an already scheduled pipeline.\n */\n if (!pipeline[exports.kExec]) {\n pipeline[exports.kExec] = true;\n /*\n Deferring with setImmediate so we have a chance to capture multiple\n commands that can be scheduled by I/O events already in the event loop queue.\n */\n setImmediate(executeAutoPipeline, client, slotKey);\n }\n // Create the promise which will execute the command in the pipeline.\n const autoPipelinePromise = new Promise(function (resolve, reject) {\n pipeline[exports.kCallbacks].push(function (err, value) {\n if (err) {\n reject(err);\n return;\n }\n resolve(value);\n });\n if (functionName === \"call\") {\n args.unshift(commandName);\n }\n pipeline[functionName](...args);\n });\n return (0, standard_as_callback_1.default)(autoPipelinePromise, callback);\n}\nexports.executeWithAutoPipelining = executeWithAutoPipelining;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nconst Command_1 = require(\"./Command\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nclass Script {\n constructor(lua, numberOfKeys = null, keyPrefix = \"\", readOnly = false) {\n this.lua = lua;\n this.numberOfKeys = numberOfKeys;\n this.keyPrefix = keyPrefix;\n this.readOnly = readOnly;\n this.sha = (0, crypto_1.createHash)(\"sha1\").update(lua).digest(\"hex\");\n const sha = this.sha;\n const socketHasScriptLoaded = new WeakSet();\n this.Command = class CustomScriptCommand extends Command_1.default {\n toWritable(socket) {\n const origReject = this.reject;\n this.reject = (err) => {\n if (err.message.indexOf(\"NOSCRIPT\") !== -1) {\n socketHasScriptLoaded.delete(socket);\n }\n origReject.call(this, err);\n };\n if (!socketHasScriptLoaded.has(socket)) {\n socketHasScriptLoaded.add(socket);\n this.name = \"eval\";\n this.args[0] = lua;\n }\n else if (this.name === \"eval\") {\n this.name = \"evalsha\";\n this.args[0] = sha;\n }\n return super.toWritable(socket);\n }\n };\n }\n execute(container, args, options, callback) {\n if (typeof this.numberOfKeys === \"number\") {\n args.unshift(this.numberOfKeys);\n }\n if (this.keyPrefix) {\n options.keyPrefix = this.keyPrefix;\n }\n if (this.readOnly) {\n options.readOnly = true;\n }\n const evalsha = new this.Command(\"evalsha\", [this.sha, ...args], options);\n evalsha.promise = evalsha.promise.catch((err) => {\n if (err.message.indexOf(\"NOSCRIPT\") === -1) {\n throw err;\n }\n // Resend the same custom evalsha command that gets transformed\n // to an eval in case it's not loaded yet on the connection.\n const resend = new this.Command(\"evalsha\", [this.sha, ...args], options);\n const client = container.isPipeline ? container.redis : container;\n return client.sendCommand(resend);\n });\n (0, standard_as_callback_1.default)(evalsha.promise, callback);\n return container.sendCommand(evalsha);\n }\n}\nexports.default = Script;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst autoPipelining_1 = require(\"../autoPipelining\");\nconst Command_1 = require(\"../Command\");\nconst Script_1 = require(\"../Script\");\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nclass Commander {\n constructor() {\n this.options = {};\n /**\n * @ignore\n */\n this.scriptsSet = {};\n /**\n * @ignore\n */\n this.addedBuiltinSet = new Set();\n }\n /**\n * Return supported builtin commands\n */\n getBuiltinCommands() {\n return commands.slice(0);\n }\n /**\n * Create a builtin command\n */\n createBuiltinCommand(commandName) {\n return {\n string: generateFunction(null, commandName, \"utf8\"),\n buffer: generateFunction(null, commandName, null),\n };\n }\n /**\n * Create add builtin command\n */\n addBuiltinCommand(commandName) {\n this.addedBuiltinSet.add(commandName);\n this[commandName] = generateFunction(commandName, commandName, \"utf8\");\n this[commandName + \"Buffer\"] = generateFunction(commandName + \"Buffer\", commandName, null);\n }\n /**\n * Define a custom command using lua script\n */\n defineCommand(name, definition) {\n const script = new Script_1.default(definition.lua, definition.numberOfKeys, this.options.keyPrefix, definition.readOnly);\n this.scriptsSet[name] = script;\n this[name] = generateScriptingFunction(name, name, script, \"utf8\");\n this[name + \"Buffer\"] = generateScriptingFunction(name + \"Buffer\", name, script, null);\n }\n /**\n * @ignore\n */\n sendCommand(command, stream, node) {\n throw new Error('\"sendCommand\" is not implemented');\n }\n}\nconst commands = commands_1.list.filter((command) => command !== \"monitor\");\ncommands.push(\"sentinel\");\ncommands.forEach(function (commandName) {\n Commander.prototype[commandName] = generateFunction(commandName, commandName, \"utf8\");\n Commander.prototype[commandName + \"Buffer\"] = generateFunction(commandName + \"Buffer\", commandName, null);\n});\nCommander.prototype.call = generateFunction(\"call\", \"utf8\");\nCommander.prototype.callBuffer = generateFunction(\"callBuffer\", null);\n// @ts-expect-error\nCommander.prototype.send_command = Commander.prototype.call;\nfunction generateFunction(functionName, _commandName, _encoding) {\n if (typeof _encoding === \"undefined\") {\n _encoding = _commandName;\n _commandName = null;\n }\n return function (...args) {\n const commandName = (_commandName || args.shift());\n let callback = args[args.length - 1];\n if (typeof callback === \"function\") {\n args.pop();\n }\n else {\n callback = undefined;\n }\n const options = {\n errorStack: this.options.showFriendlyErrorStack ? new Error() : undefined,\n keyPrefix: this.options.keyPrefix,\n replyEncoding: _encoding,\n };\n // No auto pipeline, use regular command sending\n if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {\n return this.sendCommand(\n // @ts-expect-error\n new Command_1.default(commandName, args, options, callback));\n }\n // Create a new pipeline and make sure it's scheduled\n return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, \n // @ts-expect-error\n args, callback);\n };\n}\nfunction generateScriptingFunction(functionName, commandName, script, encoding) {\n return function (...args) {\n const callback = typeof args[args.length - 1] === \"function\" ? args.pop() : undefined;\n const options = {\n replyEncoding: encoding,\n };\n if (this.options.showFriendlyErrorStack) {\n options.errorStack = new Error();\n }\n // No auto pipeline, use regular command sending\n if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {\n return script.execute(this, args, options, callback);\n }\n // Create a new pipeline and make sure it's scheduled\n return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, args, callback);\n };\n}\nexports.default = Commander;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst calculateSlot = require(\"cluster-key-slot\");\nconst commands_1 = require(\"@ioredis/commands\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst util_1 = require(\"util\");\nconst Command_1 = require(\"./Command\");\nconst utils_1 = require(\"./utils\");\nconst Commander_1 = require(\"./utils/Commander\");\n/*\n This function derives from the cluster-key-slot implementation.\n Instead of checking that all keys have the same slot, it checks that all slots are served by the same set of nodes.\n If this is satisfied, it returns the first key's slot.\n*/\nfunction generateMultiWithNodes(redis, keys) {\n const slot = calculateSlot(keys[0]);\n const target = redis._groupsBySlot[slot];\n for (let i = 1; i < keys.length; i++) {\n if (redis._groupsBySlot[calculateSlot(keys[i])] !== target) {\n return -1;\n }\n }\n return slot;\n}\nclass Pipeline extends Commander_1.default {\n constructor(redis) {\n super();\n this.redis = redis;\n this.isPipeline = true;\n this.replyPending = 0;\n this._queue = [];\n this._result = [];\n this._transactions = 0;\n this._shaToScript = {};\n this.isCluster =\n this.redis.constructor.name === \"Cluster\" || this.redis.isCluster;\n this.options = redis.options;\n Object.keys(redis.scriptsSet).forEach((name) => {\n const script = redis.scriptsSet[name];\n this._shaToScript[script.sha] = script;\n this[name] = redis[name];\n this[name + \"Buffer\"] = redis[name + \"Buffer\"];\n });\n redis.addedBuiltinSet.forEach((name) => {\n this[name] = redis[name];\n this[name + \"Buffer\"] = redis[name + \"Buffer\"];\n });\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n const _this = this;\n Object.defineProperty(this, \"length\", {\n get: function () {\n return _this._queue.length;\n },\n });\n }\n fillResult(value, position) {\n if (this._queue[position].name === \"exec\" && Array.isArray(value[1])) {\n const execLength = value[1].length;\n for (let i = 0; i < execLength; i++) {\n if (value[1][i] instanceof Error) {\n continue;\n }\n const cmd = this._queue[position - (execLength - i)];\n try {\n value[1][i] = cmd.transformReply(value[1][i]);\n }\n catch (err) {\n value[1][i] = err;\n }\n }\n }\n this._result[position] = value;\n if (--this.replyPending) {\n return;\n }\n if (this.isCluster) {\n let retriable = true;\n let commonError;\n for (let i = 0; i < this._result.length; ++i) {\n const error = this._result[i][0];\n const command = this._queue[i];\n if (error) {\n if (command.name === \"exec\" &&\n error.message ===\n \"EXECABORT Transaction discarded because of previous errors.\") {\n continue;\n }\n if (!commonError) {\n commonError = {\n name: error.name,\n message: error.message,\n };\n }\n else if (commonError.name !== error.name ||\n commonError.message !== error.message) {\n retriable = false;\n break;\n }\n }\n else if (!command.inTransaction) {\n const isReadOnly = (0, commands_1.exists)(command.name) && (0, commands_1.hasFlag)(command.name, \"readonly\");\n if (!isReadOnly) {\n retriable = false;\n break;\n }\n }\n }\n if (commonError && retriable) {\n const _this = this;\n const errv = commonError.message.split(\" \");\n const queue = this._queue;\n let inTransaction = false;\n this._queue = [];\n for (let i = 0; i < queue.length; ++i) {\n if (errv[0] === \"ASK\" &&\n !inTransaction &&\n queue[i].name !== \"asking\" &&\n (!queue[i - 1] || queue[i - 1].name !== \"asking\")) {\n const asking = new Command_1.default(\"asking\");\n asking.ignore = true;\n this.sendCommand(asking);\n }\n queue[i].initPromise();\n this.sendCommand(queue[i]);\n inTransaction = queue[i].inTransaction;\n }\n let matched = true;\n if (typeof this.leftRedirections === \"undefined\") {\n this.leftRedirections = {};\n }\n const exec = function () {\n _this.exec();\n };\n const cluster = this.redis;\n cluster.handleError(commonError, this.leftRedirections, {\n moved: function (_slot, key) {\n _this.preferKey = key;\n cluster.slots[errv[1]] = [key];\n cluster._groupsBySlot[errv[1]] =\n cluster._groupsIds[cluster.slots[errv[1]].join(\";\")];\n cluster.refreshSlotsCache();\n _this.exec();\n },\n ask: function (_slot, key) {\n _this.preferKey = key;\n _this.exec();\n },\n tryagain: exec,\n clusterDown: exec,\n connectionClosed: exec,\n maxRedirections: () => {\n matched = false;\n },\n defaults: () => {\n matched = false;\n },\n });\n if (matched) {\n return;\n }\n }\n }\n let ignoredCount = 0;\n for (let i = 0; i < this._queue.length - ignoredCount; ++i) {\n if (this._queue[i + ignoredCount].ignore) {\n ignoredCount += 1;\n }\n this._result[i] = this._result[i + ignoredCount];\n }\n this.resolve(this._result.slice(0, this._result.length - ignoredCount));\n }\n sendCommand(command) {\n if (this._transactions > 0) {\n command.inTransaction = true;\n }\n const position = this._queue.length;\n command.pipelineIndex = position;\n command.promise\n .then((result) => {\n this.fillResult([null, result], position);\n })\n .catch((error) => {\n this.fillResult([error], position);\n });\n this._queue.push(command);\n return this;\n }\n addBatch(commands) {\n let command, commandName, args;\n for (let i = 0; i < commands.length; ++i) {\n command = commands[i];\n commandName = command[0];\n args = command.slice(1);\n this[commandName].apply(this, args);\n }\n return this;\n }\n}\nexports.default = Pipeline;\n// @ts-expect-error\nconst multi = Pipeline.prototype.multi;\n// @ts-expect-error\nPipeline.prototype.multi = function () {\n this._transactions += 1;\n return multi.apply(this, arguments);\n};\n// @ts-expect-error\nconst execBuffer = Pipeline.prototype.execBuffer;\n// @ts-expect-error\nPipeline.prototype.execBuffer = (0, util_1.deprecate)(function () {\n if (this._transactions > 0) {\n this._transactions -= 1;\n }\n return execBuffer.apply(this, arguments);\n}, \"Pipeline#execBuffer: Use Pipeline#exec instead\");\n// NOTE: To avoid an unhandled promise rejection, this will unconditionally always return this.promise,\n// which always has the rejection handled by standard-as-callback\n// adding the provided rejection callback.\n//\n// If a different promise instance were returned, that promise would cause its own unhandled promise rejection\n// errors, even if that promise unconditionally resolved to **the resolved value of** this.promise.\nPipeline.prototype.exec = function (callback) {\n // Wait for the cluster to be connected, since we need nodes information before continuing\n if (this.isCluster && !this.redis.slots.length) {\n if (this.redis.status === \"wait\")\n this.redis.connect().catch(utils_1.noop);\n if (callback && !this.nodeifiedPromise) {\n this.nodeifiedPromise = true;\n (0, standard_as_callback_1.default)(this.promise, callback);\n }\n this.redis.delayUntilReady((err) => {\n if (err) {\n this.reject(err);\n return;\n }\n this.exec(callback);\n });\n return this.promise;\n }\n if (this._transactions > 0) {\n this._transactions -= 1;\n return execBuffer.apply(this, arguments);\n }\n if (!this.nodeifiedPromise) {\n this.nodeifiedPromise = true;\n (0, standard_as_callback_1.default)(this.promise, callback);\n }\n if (!this._queue.length) {\n this.resolve([]);\n }\n let pipelineSlot;\n if (this.isCluster) {\n // List of the first key for each command\n const sampleKeys = [];\n for (let i = 0; i < this._queue.length; i++) {\n const keys = this._queue[i].getKeys();\n if (keys.length) {\n sampleKeys.push(keys[0]);\n }\n // For each command, check that the keys belong to the same slot\n if (keys.length && calculateSlot.generateMulti(keys) < 0) {\n this.reject(new Error(\"All the keys in a pipeline command should belong to the same slot\"));\n return this.promise;\n }\n }\n if (sampleKeys.length) {\n pipelineSlot = generateMultiWithNodes(this.redis, sampleKeys);\n if (pipelineSlot < 0) {\n this.reject(new Error(\"All keys in the pipeline should belong to the same slots allocation group\"));\n return this.promise;\n }\n }\n else {\n // Send the pipeline to a random node\n pipelineSlot = (Math.random() * 16384) | 0;\n }\n }\n const _this = this;\n execPipeline();\n return this.promise;\n function execPipeline() {\n let writePending = (_this.replyPending = _this._queue.length);\n let node;\n if (_this.isCluster) {\n node = {\n slot: pipelineSlot,\n redis: _this.redis.connectionPool.nodes.all[_this.preferKey],\n };\n }\n let data = \"\";\n let buffers;\n const stream = {\n isPipeline: true,\n destination: _this.isCluster ? node : { redis: _this.redis },\n write(writable) {\n if (typeof writable !== \"string\") {\n if (!buffers) {\n buffers = [];\n }\n if (data) {\n buffers.push(Buffer.from(data, \"utf8\"));\n data = \"\";\n }\n buffers.push(writable);\n }\n else {\n data += writable;\n }\n if (!--writePending) {\n if (buffers) {\n if (data) {\n buffers.push(Buffer.from(data, \"utf8\"));\n }\n stream.destination.redis.stream.write(Buffer.concat(buffers));\n }\n else {\n stream.destination.redis.stream.write(data);\n }\n // Reset writePending for resending\n writePending = _this._queue.length;\n data = \"\";\n buffers = undefined;\n }\n },\n };\n for (let i = 0; i < _this._queue.length; ++i) {\n _this.redis.sendCommand(_this._queue[i], stream, node);\n }\n return _this.promise;\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addTransactionSupport = void 0;\nconst utils_1 = require(\"./utils\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst Pipeline_1 = require(\"./Pipeline\");\nfunction addTransactionSupport(redis) {\n redis.pipeline = function (commands) {\n const pipeline = new Pipeline_1.default(this);\n if (Array.isArray(commands)) {\n pipeline.addBatch(commands);\n }\n return pipeline;\n };\n const { multi } = redis;\n redis.multi = function (commands, options) {\n if (typeof options === \"undefined\" && !Array.isArray(commands)) {\n options = commands;\n commands = null;\n }\n if (options && options.pipeline === false) {\n return multi.call(this);\n }\n const pipeline = new Pipeline_1.default(this);\n // @ts-expect-error\n pipeline.multi();\n if (Array.isArray(commands)) {\n pipeline.addBatch(commands);\n }\n const exec = pipeline.exec;\n pipeline.exec = function (callback) {\n // Wait for the cluster to be connected, since we need nodes information before continuing\n if (this.isCluster && !this.redis.slots.length) {\n if (this.redis.status === \"wait\")\n this.redis.connect().catch(utils_1.noop);\n return (0, standard_as_callback_1.default)(new Promise((resolve, reject) => {\n this.redis.delayUntilReady((err) => {\n if (err) {\n reject(err);\n return;\n }\n this.exec(pipeline).then(resolve, reject);\n });\n }), callback);\n }\n if (this._transactions > 0) {\n exec.call(pipeline);\n }\n // Returns directly when the pipeline\n // has been called multiple times (retries).\n if (this.nodeifiedPromise) {\n return exec.call(pipeline);\n }\n const promise = exec.call(pipeline);\n return (0, standard_as_callback_1.default)(promise.then(function (result) {\n const execResult = result[result.length - 1];\n if (typeof execResult === \"undefined\") {\n throw new Error(\"Pipeline cannot be used to send any commands when the `exec()` has been called on it.\");\n }\n if (execResult[0]) {\n execResult[0].previousErrors = [];\n for (let i = 0; i < result.length - 1; ++i) {\n if (result[i][0]) {\n execResult[0].previousErrors.push(result[i][0]);\n }\n }\n throw execResult[0];\n }\n return (0, utils_1.wrapMultiResult)(execResult[1]);\n }), callback);\n };\n // @ts-expect-error\n const { execBuffer } = pipeline;\n // @ts-expect-error\n pipeline.execBuffer = function (callback) {\n if (this._transactions > 0) {\n execBuffer.call(pipeline);\n }\n return pipeline.exec(callback);\n };\n return pipeline;\n };\n const { exec } = redis;\n redis.exec = function (callback) {\n return (0, standard_as_callback_1.default)(exec.call(this).then(function (results) {\n if (Array.isArray(results)) {\n results = (0, utils_1.wrapMultiResult)(results);\n }\n return results;\n }), callback);\n };\n}\nexports.addTransactionSupport = addTransactionSupport;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction applyMixin(derivedConstructor, mixinConstructor) {\n Object.getOwnPropertyNames(mixinConstructor.prototype).forEach((name) => {\n Object.defineProperty(derivedConstructor.prototype, name, Object.getOwnPropertyDescriptor(mixinConstructor.prototype, name));\n });\n}\nexports.default = applyMixin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_CLUSTER_OPTIONS = void 0;\nconst dns_1 = require(\"dns\");\nexports.DEFAULT_CLUSTER_OPTIONS = {\n clusterRetryStrategy: (times) => Math.min(100 + times * 2, 2000),\n enableOfflineQueue: true,\n enableReadyCheck: true,\n scaleReads: \"master\",\n maxRedirections: 16,\n retryDelayOnMoved: 0,\n retryDelayOnFailover: 100,\n retryDelayOnClusterDown: 100,\n retryDelayOnTryAgain: 100,\n slotsRefreshTimeout: 1000,\n useSRVRecords: false,\n resolveSrv: dns_1.resolveSrv,\n dnsLookup: dns_1.lookup,\n enableAutoPipelining: false,\n autoPipeliningIgnoredCommands: [],\n shardedSubscribers: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getConnectionName = exports.weightSrvRecords = exports.groupSrvRecords = exports.getUniqueHostnamesFromOptions = exports.normalizeNodeOptions = exports.nodeKeyToRedisOptions = exports.getNodeKey = void 0;\nconst utils_1 = require(\"../utils\");\nconst net_1 = require(\"net\");\nfunction getNodeKey(node) {\n node.port = node.port || 6379;\n node.host = node.host || \"127.0.0.1\";\n return node.host + \":\" + node.port;\n}\nexports.getNodeKey = getNodeKey;\nfunction nodeKeyToRedisOptions(nodeKey) {\n const portIndex = nodeKey.lastIndexOf(\":\");\n if (portIndex === -1) {\n throw new Error(`Invalid node key ${nodeKey}`);\n }\n return {\n host: nodeKey.slice(0, portIndex),\n port: Number(nodeKey.slice(portIndex + 1)),\n };\n}\nexports.nodeKeyToRedisOptions = nodeKeyToRedisOptions;\nfunction normalizeNodeOptions(nodes) {\n return nodes.map((node) => {\n const options = {};\n if (typeof node === \"object\") {\n Object.assign(options, node);\n }\n else if (typeof node === \"string\") {\n Object.assign(options, (0, utils_1.parseURL)(node));\n }\n else if (typeof node === \"number\") {\n options.port = node;\n }\n else {\n throw new Error(\"Invalid argument \" + node);\n }\n if (typeof options.port === \"string\") {\n options.port = parseInt(options.port, 10);\n }\n // Cluster mode only support db 0\n delete options.db;\n if (!options.port) {\n options.port = 6379;\n }\n if (!options.host) {\n options.host = \"127.0.0.1\";\n }\n return (0, utils_1.resolveTLSProfile)(options);\n });\n}\nexports.normalizeNodeOptions = normalizeNodeOptions;\nfunction getUniqueHostnamesFromOptions(nodes) {\n const uniqueHostsMap = {};\n nodes.forEach((node) => {\n uniqueHostsMap[node.host] = true;\n });\n return Object.keys(uniqueHostsMap).filter((host) => !(0, net_1.isIP)(host));\n}\nexports.getUniqueHostnamesFromOptions = getUniqueHostnamesFromOptions;\nfunction groupSrvRecords(records) {\n const recordsByPriority = {};\n for (const record of records) {\n if (!recordsByPriority.hasOwnProperty(record.priority)) {\n recordsByPriority[record.priority] = {\n totalWeight: record.weight,\n records: [record],\n };\n }\n else {\n recordsByPriority[record.priority].totalWeight += record.weight;\n recordsByPriority[record.priority].records.push(record);\n }\n }\n return recordsByPriority;\n}\nexports.groupSrvRecords = groupSrvRecords;\nfunction weightSrvRecords(recordsGroup) {\n if (recordsGroup.records.length === 1) {\n recordsGroup.totalWeight = 0;\n return recordsGroup.records.shift();\n }\n // + `recordsGroup.records.length` to support `weight` 0\n const random = Math.floor(Math.random() * (recordsGroup.totalWeight + recordsGroup.records.length));\n let total = 0;\n for (const [i, record] of recordsGroup.records.entries()) {\n total += 1 + record.weight;\n if (total > random) {\n recordsGroup.totalWeight -= record.weight;\n recordsGroup.records.splice(i, 1);\n return record;\n }\n }\n}\nexports.weightSrvRecords = weightSrvRecords;\nfunction getConnectionName(component, nodeConnectionName) {\n const prefix = `ioredis-cluster(${component})`;\n return nodeConnectionName ? `${prefix}:${nodeConnectionName}` : prefix;\n}\nexports.getConnectionName = getConnectionName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_1 = require(\"./util\");\nconst utils_1 = require(\"../utils\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriber\");\nclass ClusterSubscriber {\n constructor(connectionPool, emitter, isSharded = false) {\n this.connectionPool = connectionPool;\n this.emitter = emitter;\n this.isSharded = isSharded;\n this.started = false;\n //There is only one connection for the entire pool\n this.subscriber = null;\n //The slot range for which this subscriber is responsible\n this.slotRange = [];\n this.onSubscriberEnd = () => {\n if (!this.started) {\n debug(\"subscriber has disconnected, but ClusterSubscriber is not started, so not reconnecting.\");\n return;\n }\n // If the subscriber closes whilst it's still the active connection,\n // we might as well try to connecting to a new node if possible to\n // minimise the number of missed publishes.\n debug(\"subscriber has disconnected, selecting a new one...\");\n this.selectSubscriber();\n };\n // If the current node we're using as the subscriber disappears\n // from the node pool for some reason, we will select a new one\n // to connect to.\n // Note that this event is only triggered if the connection to\n // the node has been used; cluster subscriptions are setup with\n // lazyConnect = true. It's possible for the subscriber node to\n // disappear without this method being called!\n // See https://github.com/luin/ioredis/pull/1589\n this.connectionPool.on(\"-node\", (_, key) => {\n if (!this.started || !this.subscriber) {\n return;\n }\n if ((0, util_1.getNodeKey)(this.subscriber.options) === key) {\n debug(\"subscriber has left, selecting a new one...\");\n this.selectSubscriber();\n }\n });\n this.connectionPool.on(\"+node\", () => {\n if (!this.started || this.subscriber) {\n return;\n }\n debug(\"a new node is discovered and there is no subscriber, selecting a new one...\");\n this.selectSubscriber();\n });\n }\n getInstance() {\n return this.subscriber;\n }\n /**\n * Associate this subscriber to a specific slot range.\n *\n * Returns the range or an empty array if the slot range couldn't be associated.\n *\n * BTW: This is more for debugging and testing purposes.\n *\n * @param range\n */\n associateSlotRange(range) {\n if (this.isSharded) {\n this.slotRange = range;\n }\n return this.slotRange;\n }\n start() {\n this.started = true;\n this.selectSubscriber();\n debug(\"started\");\n }\n stop() {\n this.started = false;\n if (this.subscriber) {\n this.subscriber.disconnect();\n this.subscriber = null;\n }\n }\n isStarted() {\n return this.started;\n }\n selectSubscriber() {\n const lastActiveSubscriber = this.lastActiveSubscriber;\n // Disconnect the previous subscriber even if there\n // will not be a new one.\n if (lastActiveSubscriber) {\n lastActiveSubscriber.off(\"end\", this.onSubscriberEnd);\n lastActiveSubscriber.disconnect();\n }\n if (this.subscriber) {\n this.subscriber.off(\"end\", this.onSubscriberEnd);\n this.subscriber.disconnect();\n }\n const sampleNode = (0, utils_1.sample)(this.connectionPool.getNodes());\n if (!sampleNode) {\n debug(\"selecting subscriber failed since there is no node discovered in the cluster yet\");\n this.subscriber = null;\n return;\n }\n const { options } = sampleNode;\n debug(\"selected a subscriber %s:%s\", options.host, options.port);\n /*\n * Create a specialized Redis connection for the subscription.\n * Note that auto reconnection is enabled here.\n *\n * `enableReadyCheck` is also enabled because although subscription is allowed\n * while redis is loading data from the disk, we can check if the password\n * provided for the subscriber is correct, and if not, the current subscriber\n * will be disconnected and a new subscriber will be selected.\n */\n let connectionPrefix = \"subscriber\";\n if (this.isSharded)\n connectionPrefix = \"ssubscriber\";\n this.subscriber = new Redis_1.default({\n port: options.port,\n host: options.host,\n username: options.username,\n password: options.password,\n enableReadyCheck: true,\n connectionName: (0, util_1.getConnectionName)(connectionPrefix, options.connectionName),\n lazyConnect: true,\n tls: options.tls,\n // Don't try to reconnect the subscriber connection. If the connection fails\n // we will get an end event (handled below), at which point we'll pick a new\n // node from the pool and try to connect to that as the subscriber connection.\n retryStrategy: null,\n });\n // Ignore the errors since they're handled in the connection pool.\n this.subscriber.on(\"error\", utils_1.noop);\n this.subscriber.on(\"moved\", () => {\n this.emitter.emit(\"forceRefresh\");\n });\n // The node we lost connection to may not come back up in a\n // reasonable amount of time (e.g. a slave that's taken down\n // for maintainence), we could potentially miss many published\n // messages so we should reconnect as quickly as possible, to\n // a different node if needed.\n this.subscriber.once(\"end\", this.onSubscriberEnd);\n // Re-subscribe previous channels\n const previousChannels = { subscribe: [], psubscribe: [], ssubscribe: [] };\n if (lastActiveSubscriber) {\n const condition = lastActiveSubscriber.condition || lastActiveSubscriber.prevCondition;\n if (condition && condition.subscriber) {\n previousChannels.subscribe = condition.subscriber.channels(\"subscribe\");\n previousChannels.psubscribe =\n condition.subscriber.channels(\"psubscribe\");\n previousChannels.ssubscribe =\n condition.subscriber.channels(\"ssubscribe\");\n }\n }\n if (previousChannels.subscribe.length ||\n previousChannels.psubscribe.length ||\n previousChannels.ssubscribe.length) {\n let pending = 0;\n for (const type of [\"subscribe\", \"psubscribe\", \"ssubscribe\"]) {\n const channels = previousChannels[type];\n if (channels.length) {\n pending += 1;\n debug(\"%s %d channels\", type, channels.length);\n this.subscriber[type](channels)\n .then(() => {\n if (!--pending) {\n this.lastActiveSubscriber = this.subscriber;\n }\n })\n .catch(() => {\n // TODO: should probably disconnect the subscriber and try again.\n debug(\"failed to %s %d channels\", type, channels.length);\n });\n }\n }\n }\n else {\n this.lastActiveSubscriber = this.subscriber;\n }\n for (const event of [\n \"message\",\n \"messageBuffer\",\n ]) {\n this.subscriber.on(event, (arg1, arg2) => {\n this.emitter.emit(event, arg1, arg2);\n });\n }\n for (const event of [\"pmessage\", \"pmessageBuffer\"]) {\n this.subscriber.on(event, (arg1, arg2, arg3) => {\n this.emitter.emit(event, arg1, arg2, arg3);\n });\n }\n if (this.isSharded == true) {\n for (const event of [\n \"smessage\",\n \"smessageBuffer\",\n ]) {\n this.subscriber.on(event, (arg1, arg2) => {\n this.emitter.emit(event, arg1, arg2);\n });\n }\n }\n }\n}\nexports.default = ClusterSubscriber;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst utils_1 = require(\"../utils\");\nconst util_1 = require(\"./util\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:connectionPool\");\nclass ConnectionPool extends events_1.EventEmitter {\n constructor(redisOptions) {\n super();\n this.redisOptions = redisOptions;\n // master + slave = all\n this.nodes = {\n all: {},\n master: {},\n slave: {},\n };\n this.specifiedOptions = {};\n }\n getNodes(role = \"all\") {\n const nodes = this.nodes[role];\n return Object.keys(nodes).map((key) => nodes[key]);\n }\n getInstanceByKey(key) {\n return this.nodes.all[key];\n }\n getSampleInstance(role) {\n const keys = Object.keys(this.nodes[role]);\n const sampleKey = (0, utils_1.sample)(keys);\n return this.nodes[role][sampleKey];\n }\n /**\n * Add a master node to the pool\n * @param node\n */\n addMasterNode(node) {\n const key = (0, util_1.getNodeKey)(node.options);\n const redis = this.createRedisFromOptions(node, node.options.readOnly);\n //Master nodes aren't read-only\n if (!node.options.readOnly) {\n this.nodes.all[key] = redis;\n this.nodes.master[key] = redis;\n return true;\n }\n return false;\n }\n /**\n * Creates a Redis connection instance from the node options\n * @param node\n * @param readOnly\n */\n createRedisFromOptions(node, readOnly) {\n const redis = new Redis_1.default((0, utils_1.defaults)({\n // Never try to reconnect when a node is lose,\n // instead, waiting for a `MOVED` error and\n // fetch the slots again.\n retryStrategy: null,\n // Offline queue should be enabled so that\n // we don't need to wait for the `ready` event\n // before sending commands to the node.\n enableOfflineQueue: true,\n readOnly: readOnly,\n }, node, this.redisOptions, { lazyConnect: true }));\n return redis;\n }\n /**\n * Find or create a connection to the node\n */\n findOrCreate(node, readOnly = false) {\n const key = (0, util_1.getNodeKey)(node);\n readOnly = Boolean(readOnly);\n if (this.specifiedOptions[key]) {\n Object.assign(node, this.specifiedOptions[key]);\n }\n else {\n this.specifiedOptions[key] = node;\n }\n let redis;\n if (this.nodes.all[key]) {\n redis = this.nodes.all[key];\n if (redis.options.readOnly !== readOnly) {\n redis.options.readOnly = readOnly;\n debug(\"Change role of %s to %s\", key, readOnly ? \"slave\" : \"master\");\n redis[readOnly ? \"readonly\" : \"readwrite\"]().catch(utils_1.noop);\n if (readOnly) {\n delete this.nodes.master[key];\n this.nodes.slave[key] = redis;\n }\n else {\n delete this.nodes.slave[key];\n this.nodes.master[key] = redis;\n }\n }\n }\n else {\n debug(\"Connecting to %s as %s\", key, readOnly ? \"slave\" : \"master\");\n redis = this.createRedisFromOptions(node, readOnly);\n this.nodes.all[key] = redis;\n this.nodes[readOnly ? \"slave\" : \"master\"][key] = redis;\n redis.once(\"end\", () => {\n this.removeNode(key);\n this.emit(\"-node\", redis, key);\n if (!Object.keys(this.nodes.all).length) {\n this.emit(\"drain\");\n }\n });\n this.emit(\"+node\", redis, key);\n redis.on(\"error\", function (error) {\n this.emit(\"nodeError\", error, key);\n });\n }\n return redis;\n }\n /**\n * Reset the pool with a set of nodes.\n * The old node will be removed.\n */\n reset(nodes) {\n debug(\"Reset with %O\", nodes);\n const newNodes = {};\n nodes.forEach((node) => {\n const key = (0, util_1.getNodeKey)(node);\n // Don't override the existing (master) node\n // when the current one is slave.\n if (!(node.readOnly && newNodes[key])) {\n newNodes[key] = node;\n }\n });\n Object.keys(this.nodes.all).forEach((key) => {\n if (!newNodes[key]) {\n debug(\"Disconnect %s because the node does not hold any slot\", key);\n this.nodes.all[key].disconnect();\n this.removeNode(key);\n }\n });\n Object.keys(newNodes).forEach((key) => {\n const node = newNodes[key];\n this.findOrCreate(node, node.readOnly);\n });\n }\n /**\n * Remove a node from the pool.\n */\n removeNode(key) {\n const { nodes } = this;\n if (nodes.all[key]) {\n debug(\"Remove %s from the pool\", key);\n delete nodes.all[key];\n }\n delete nodes.master[key];\n delete nodes.slave[key];\n }\n}\nexports.default = ConnectionPool;\n","'use strict';\n\n/**\n * Custom implementation of a double ended queue.\n */\nfunction Denque(array, options) {\n var options = options || {};\n this._capacity = options.capacity;\n\n this._head = 0;\n this._tail = 0;\n\n if (Array.isArray(array)) {\n this._fromArray(array);\n } else {\n this._capacityMask = 0x3;\n this._list = new Array(4);\n }\n}\n\n/**\n * --------------\n * PUBLIC API\n * -------------\n */\n\n/**\n * Returns the item at the specified index from the list.\n * 0 is the first element, 1 is the second, and so on...\n * Elements at negative values are that many from the end: -1 is one before the end\n * (the last element), -2 is two before the end (one before last), etc.\n * @param index\n * @returns {*}\n */\nDenque.prototype.peekAt = function peekAt(index) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n var len = this.size();\n if (i >= len || i < -len) return undefined;\n if (i < 0) i += len;\n i = (this._head + i) & this._capacityMask;\n return this._list[i];\n};\n\n/**\n * Alias for peekAt()\n * @param i\n * @returns {*}\n */\nDenque.prototype.get = function get(i) {\n return this.peekAt(i);\n};\n\n/**\n * Returns the first item in the list without removing it.\n * @returns {*}\n */\nDenque.prototype.peek = function peek() {\n if (this._head === this._tail) return undefined;\n return this._list[this._head];\n};\n\n/**\n * Alias for peek()\n * @returns {*}\n */\nDenque.prototype.peekFront = function peekFront() {\n return this.peek();\n};\n\n/**\n * Returns the item that is at the back of the queue without removing it.\n * Uses peekAt(-1)\n */\nDenque.prototype.peekBack = function peekBack() {\n return this.peekAt(-1);\n};\n\n/**\n * Returns the current length of the queue\n * @return {Number}\n */\nObject.defineProperty(Denque.prototype, 'length', {\n get: function length() {\n return this.size();\n }\n});\n\n/**\n * Return the number of items on the list, or 0 if empty.\n * @returns {number}\n */\nDenque.prototype.size = function size() {\n if (this._head === this._tail) return 0;\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Add an item at the beginning of the list.\n * @param item\n */\nDenque.prototype.unshift = function unshift(item) {\n if (arguments.length === 0) return this.size();\n var len = this._list.length;\n this._head = (this._head - 1 + len) & this._capacityMask;\n this._list[this._head] = item;\n if (this._tail === this._head) this._growArray();\n if (this._capacity && this.size() > this._capacity) this.pop();\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Remove and return the first item on the list,\n * Returns undefined if the list is empty.\n * @returns {*}\n */\nDenque.prototype.shift = function shift() {\n var head = this._head;\n if (head === this._tail) return undefined;\n var item = this._list[head];\n this._list[head] = undefined;\n this._head = (head + 1) & this._capacityMask;\n if (head < 2 && this._tail > 10000 && this._tail <= this._list.length >>> 2) this._shrinkArray();\n return item;\n};\n\n/**\n * Add an item to the bottom of the list.\n * @param item\n */\nDenque.prototype.push = function push(item) {\n if (arguments.length === 0) return this.size();\n var tail = this._tail;\n this._list[tail] = item;\n this._tail = (tail + 1) & this._capacityMask;\n if (this._tail === this._head) {\n this._growArray();\n }\n if (this._capacity && this.size() > this._capacity) {\n this.shift();\n }\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Remove and return the last item on the list.\n * Returns undefined if the list is empty.\n * @returns {*}\n */\nDenque.prototype.pop = function pop() {\n var tail = this._tail;\n if (tail === this._head) return undefined;\n var len = this._list.length;\n this._tail = (tail - 1 + len) & this._capacityMask;\n var item = this._list[this._tail];\n this._list[this._tail] = undefined;\n if (this._head < 2 && tail > 10000 && tail <= len >>> 2) this._shrinkArray();\n return item;\n};\n\n/**\n * Remove and return the item at the specified index from the list.\n * Returns undefined if the list is empty.\n * @param index\n * @returns {*}\n */\nDenque.prototype.removeOne = function removeOne(index) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n if (this._head === this._tail) return void 0;\n var size = this.size();\n var len = this._list.length;\n if (i >= size || i < -size) return void 0;\n if (i < 0) i += size;\n i = (this._head + i) & this._capacityMask;\n var item = this._list[i];\n var k;\n if (index < size / 2) {\n for (k = index; k > 0; k--) {\n this._list[i] = this._list[i = (i - 1 + len) & this._capacityMask];\n }\n this._list[i] = void 0;\n this._head = (this._head + 1 + len) & this._capacityMask;\n } else {\n for (k = size - 1 - index; k > 0; k--) {\n this._list[i] = this._list[i = (i + 1 + len) & this._capacityMask];\n }\n this._list[i] = void 0;\n this._tail = (this._tail - 1 + len) & this._capacityMask;\n }\n return item;\n};\n\n/**\n * Remove number of items from the specified index from the list.\n * Returns array of removed items.\n * Returns undefined if the list is empty.\n * @param index\n * @param count\n * @returns {array}\n */\nDenque.prototype.remove = function remove(index, count) {\n var i = index;\n var removed;\n var del_count = count;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n if (this._head === this._tail) return void 0;\n var size = this.size();\n var len = this._list.length;\n if (i >= size || i < -size || count < 1) return void 0;\n if (i < 0) i += size;\n if (count === 1 || !count) {\n removed = new Array(1);\n removed[0] = this.removeOne(i);\n return removed;\n }\n if (i === 0 && i + count >= size) {\n removed = this.toArray();\n this.clear();\n return removed;\n }\n if (i + count > size) count = size - i;\n var k;\n removed = new Array(count);\n for (k = 0; k < count; k++) {\n removed[k] = this._list[(this._head + i + k) & this._capacityMask];\n }\n i = (this._head + i) & this._capacityMask;\n if (index + count === size) {\n this._tail = (this._tail - count + len) & this._capacityMask;\n for (k = count; k > 0; k--) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n }\n return removed;\n }\n if (index === 0) {\n this._head = (this._head + count + len) & this._capacityMask;\n for (k = count - 1; k > 0; k--) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n }\n return removed;\n }\n if (i < size / 2) {\n this._head = (this._head + index + count + len) & this._capacityMask;\n for (k = index; k > 0; k--) {\n this.unshift(this._list[i = (i - 1 + len) & this._capacityMask]);\n }\n i = (this._head - 1 + len) & this._capacityMask;\n while (del_count > 0) {\n this._list[i = (i - 1 + len) & this._capacityMask] = void 0;\n del_count--;\n }\n if (index < 0) this._tail = i;\n } else {\n this._tail = i;\n i = (i + count + len) & this._capacityMask;\n for (k = size - (count + index); k > 0; k--) {\n this.push(this._list[i++]);\n }\n i = this._tail;\n while (del_count > 0) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n del_count--;\n }\n }\n if (this._head < 2 && this._tail > 10000 && this._tail <= len >>> 2) this._shrinkArray();\n return removed;\n};\n\n/**\n * Native splice implementation.\n * Remove number of items from the specified index from the list and/or add new elements.\n * Returns array of removed items or empty array if count == 0.\n * Returns undefined if the list is empty.\n *\n * @param index\n * @param count\n * @param {...*} [elements]\n * @returns {array}\n */\nDenque.prototype.splice = function splice(index, count) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n var size = this.size();\n if (i < 0) i += size;\n if (i > size) return void 0;\n if (arguments.length > 2) {\n var k;\n var temp;\n var removed;\n var arg_len = arguments.length;\n var len = this._list.length;\n var arguments_index = 2;\n if (!size || i < size / 2) {\n temp = new Array(i);\n for (k = 0; k < i; k++) {\n temp[k] = this._list[(this._head + k) & this._capacityMask];\n }\n if (count === 0) {\n removed = [];\n if (i > 0) {\n this._head = (this._head + i + len) & this._capacityMask;\n }\n } else {\n removed = this.remove(i, count);\n this._head = (this._head + i + len) & this._capacityMask;\n }\n while (arg_len > arguments_index) {\n this.unshift(arguments[--arg_len]);\n }\n for (k = i; k > 0; k--) {\n this.unshift(temp[k - 1]);\n }\n } else {\n temp = new Array(size - (i + count));\n var leng = temp.length;\n for (k = 0; k < leng; k++) {\n temp[k] = this._list[(this._head + i + count + k) & this._capacityMask];\n }\n if (count === 0) {\n removed = [];\n if (i != size) {\n this._tail = (this._head + i + len) & this._capacityMask;\n }\n } else {\n removed = this.remove(i, count);\n this._tail = (this._tail - leng + len) & this._capacityMask;\n }\n while (arguments_index < arg_len) {\n this.push(arguments[arguments_index++]);\n }\n for (k = 0; k < leng; k++) {\n this.push(temp[k]);\n }\n }\n return removed;\n } else {\n return this.remove(i, count);\n }\n};\n\n/**\n * Soft clear - does not reset capacity.\n */\nDenque.prototype.clear = function clear() {\n this._list = new Array(this._list.length);\n this._head = 0;\n this._tail = 0;\n};\n\n/**\n * Returns true or false whether the list is empty.\n * @returns {boolean}\n */\nDenque.prototype.isEmpty = function isEmpty() {\n return this._head === this._tail;\n};\n\n/**\n * Returns an array of all queue items.\n * @returns {Array}\n */\nDenque.prototype.toArray = function toArray() {\n return this._copyArray(false);\n};\n\n/**\n * -------------\n * INTERNALS\n * -------------\n */\n\n/**\n * Fills the queue with items from an array\n * For use in the constructor\n * @param array\n * @private\n */\nDenque.prototype._fromArray = function _fromArray(array) {\n var length = array.length;\n var capacity = this._nextPowerOf2(length);\n\n this._list = new Array(capacity);\n this._capacityMask = capacity - 1;\n this._tail = length;\n\n for (var i = 0; i < length; i++) this._list[i] = array[i];\n};\n\n/**\n *\n * @param fullCopy\n * @param size Initialize the array with a specific size. Will default to the current list size\n * @returns {Array}\n * @private\n */\nDenque.prototype._copyArray = function _copyArray(fullCopy, size) {\n var src = this._list;\n var capacity = src.length;\n var length = this.length;\n size = size | length;\n\n // No prealloc requested and the buffer is contiguous\n if (size == length && this._head < this._tail) {\n // Simply do a fast slice copy\n return this._list.slice(this._head, this._tail);\n }\n\n var dest = new Array(size);\n\n var k = 0;\n var i;\n if (fullCopy || this._head > this._tail) {\n for (i = this._head; i < capacity; i++) dest[k++] = src[i];\n for (i = 0; i < this._tail; i++) dest[k++] = src[i];\n } else {\n for (i = this._head; i < this._tail; i++) dest[k++] = src[i];\n }\n\n return dest;\n}\n\n/**\n * Grows the internal list array.\n * @private\n */\nDenque.prototype._growArray = function _growArray() {\n if (this._head != 0) {\n // double array size and copy existing data, head to end, then beginning to tail.\n var newList = this._copyArray(true, this._list.length << 1);\n\n this._tail = this._list.length;\n this._head = 0;\n\n this._list = newList;\n } else {\n this._tail = this._list.length;\n this._list.length <<= 1;\n }\n\n this._capacityMask = (this._capacityMask << 1) | 1;\n};\n\n/**\n * Shrinks the internal list array.\n * @private\n */\nDenque.prototype._shrinkArray = function _shrinkArray() {\n this._list.length >>>= 1;\n this._capacityMask >>>= 1;\n};\n\n/**\n * Find the next power of 2, at least 4\n * @private\n * @param {number} num \n * @returns {number}\n */\nDenque.prototype._nextPowerOf2 = function _nextPowerOf2(num) {\n var log2 = Math.log(num) / Math.log(2);\n var nextPow2 = 1 << (log2 + 1);\n\n return Math.max(nextPow2, 4);\n}\n\nmodule.exports = Denque;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst Deque = require(\"denque\");\nconst debug = (0, utils_1.Debug)(\"delayqueue\");\n/**\n * Queue that runs items after specified duration\n */\nclass DelayQueue {\n constructor() {\n this.queues = {};\n this.timeouts = {};\n }\n /**\n * Add a new item to the queue\n *\n * @param bucket bucket name\n * @param item function that will run later\n * @param options\n */\n push(bucket, item, options) {\n const callback = options.callback || process.nextTick;\n if (!this.queues[bucket]) {\n this.queues[bucket] = new Deque();\n }\n const queue = this.queues[bucket];\n queue.push(item);\n if (!this.timeouts[bucket]) {\n this.timeouts[bucket] = setTimeout(() => {\n callback(() => {\n this.timeouts[bucket] = null;\n this.execute(bucket);\n });\n }, options.timeout);\n }\n }\n execute(bucket) {\n const queue = this.queues[bucket];\n if (!queue) {\n return;\n }\n const { length } = queue;\n if (!length) {\n return;\n }\n debug(\"send %d commands in %s queue\", length, bucket);\n this.queues[bucket] = null;\n while (queue.length > 0) {\n queue.shift()();\n }\n }\n}\nexports.default = DelayQueue;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst ClusterSubscriber_1 = require(\"./ClusterSubscriber\");\nconst ConnectionPool_1 = require(\"./ConnectionPool\");\nconst util_1 = require(\"./util\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriberGroup\");\n/**\n * Redis differs between \"normal\" and sharded PubSub. If using the \"normal\" PubSub feature, exactly one\n * ClusterSubscriber exists per cluster instance. This works because the Redis cluster bus forwards m\n * messages between shards. However, this has scalability limitations, which is the reason why the sharded\n * PubSub feature was added to Redis. With sharded PubSub, each shard is responsible for its own messages.\n * Given that, we need at least one ClusterSubscriber per master endpoint/node.\n *\n * This class leverages the previously exising ClusterSubscriber by adding support for multiple such subscribers\n * in alignment to the master nodes of the cluster. The ClusterSubscriber class was extended in a non-breaking way\n * to support this feature.\n */\nclass ClusterSubscriberGroup {\n /**\n * Register callbacks\n *\n * @param cluster\n */\n constructor(cluster, refreshSlotsCacheCallback) {\n this.cluster = cluster;\n this.shardedSubscribers = new Map();\n this.clusterSlots = [];\n //Simple [min, max] slot ranges aren't enough because you can migrate single slots\n this.subscriberToSlotsIndex = new Map();\n this.channels = new Map();\n cluster.on(\"+node\", (redis) => {\n this._addSubscriber(redis);\n });\n cluster.on(\"-node\", (redis) => {\n this._removeSubscriber(redis);\n });\n cluster.on(\"refresh\", () => {\n this._refreshSlots(cluster);\n });\n cluster.on(\"forceRefresh\", () => {\n refreshSlotsCacheCallback();\n });\n }\n /**\n * Get the responsible subscriber.\n *\n * Returns null if no subscriber was found\n *\n * @param slot\n */\n getResponsibleSubscriber(slot) {\n const nodeKey = this.clusterSlots[slot][0];\n return this.shardedSubscribers.get(nodeKey);\n }\n /**\n * Adds a channel for which this subscriber group is responsible\n *\n * @param channels\n */\n addChannels(channels) {\n const slot = calculateSlot(channels[0]);\n //Check if the all channels belong to the same slot and otherwise reject the operation\n channels.forEach((c) => {\n if (calculateSlot(c) != slot)\n return -1;\n });\n const currChannels = this.channels.get(slot);\n if (!currChannels) {\n this.channels.set(slot, channels);\n }\n else {\n this.channels.set(slot, currChannels.concat(channels));\n }\n return [...this.channels.values()].flatMap(v => v).length;\n }\n /**\n * Removes channels for which the subscriber group is responsible by optionally unsubscribing\n * @param channels\n */\n removeChannels(channels) {\n const slot = calculateSlot(channels[0]);\n //Check if the all channels belong to the same slot and otherwise reject the operation\n channels.forEach((c) => {\n if (calculateSlot(c) != slot)\n return -1;\n });\n const slotChannels = this.channels.get(slot);\n if (slotChannels) {\n const updatedChannels = slotChannels.filter(c => !channels.includes(c));\n this.channels.set(slot, updatedChannels);\n }\n return [...this.channels.values()].flatMap(v => v).length;\n }\n /**\n * Disconnect all subscribers\n */\n stop() {\n for (const s of this.shardedSubscribers.values()) {\n s.stop();\n }\n }\n /**\n * Start all not yet started subscribers\n */\n start() {\n for (const s of this.shardedSubscribers.values()) {\n if (!s.isStarted()) {\n s.start();\n }\n }\n }\n /**\n * Add a subscriber to the group of subscribers\n *\n * @param redis\n */\n _addSubscriber(redis) {\n const pool = new ConnectionPool_1.default(redis.options);\n if (pool.addMasterNode(redis)) {\n const sub = new ClusterSubscriber_1.default(pool, this.cluster, true);\n const nodeKey = (0, util_1.getNodeKey)(redis.options);\n this.shardedSubscribers.set(nodeKey, sub);\n sub.start();\n // We need to attempt to resubscribe them in case the new node serves their slot\n this._resubscribe();\n this.cluster.emit(\"+subscriber\");\n return sub;\n }\n return null;\n }\n /**\n * Removes a subscriber from the group\n * @param redis\n */\n _removeSubscriber(redis) {\n const nodeKey = (0, util_1.getNodeKey)(redis.options);\n const sub = this.shardedSubscribers.get(nodeKey);\n if (sub) {\n sub.stop();\n this.shardedSubscribers.delete(nodeKey);\n // Even though the subscriber to this node is going down, we might have another subscriber\n // handling the same slots, so we need to attempt to subscribe the orphaned channels\n this._resubscribe();\n this.cluster.emit(\"-subscriber\");\n }\n return this.shardedSubscribers;\n }\n /**\n * Refreshes the subscriber-related slot ranges\n *\n * Returns false if no refresh was needed\n *\n * @param cluster\n */\n _refreshSlots(cluster) {\n //If there was an actual change, then reassign the slot ranges\n if (this._slotsAreEqual(cluster.slots)) {\n debug(\"Nothing to refresh because the new cluster map is equal to the previous one.\");\n }\n else {\n debug(\"Refreshing the slots of the subscriber group.\");\n //Rebuild the slots index\n this.subscriberToSlotsIndex = new Map();\n for (let slot = 0; slot < cluster.slots.length; slot++) {\n const node = cluster.slots[slot][0];\n if (!this.subscriberToSlotsIndex.has(node)) {\n this.subscriberToSlotsIndex.set(node, []);\n }\n this.subscriberToSlotsIndex.get(node).push(Number(slot));\n }\n //Update the subscribers from the index\n this._resubscribe();\n //Update the cached slots map\n this.clusterSlots = JSON.parse(JSON.stringify(cluster.slots));\n this.cluster.emit(\"subscribersReady\");\n return true;\n }\n return false;\n }\n /**\n * Resubscribes to the previous channels\n *\n * @private\n */\n _resubscribe() {\n if (this.shardedSubscribers) {\n this.shardedSubscribers.forEach((s, nodeKey) => {\n const subscriberSlots = this.subscriberToSlotsIndex.get(nodeKey);\n if (subscriberSlots) {\n //More for debugging purposes\n s.associateSlotRange(subscriberSlots);\n //Resubscribe on the underlying connection\n subscriberSlots.forEach((ss) => {\n //Might return null if being disconnected\n const redis = s.getInstance();\n const channels = this.channels.get(ss);\n if (channels && channels.length > 0) {\n //Try to subscribe now\n if (redis) {\n redis.ssubscribe(channels);\n //If the instance isn't ready yet, then register the re-subscription for later\n redis.on(\"ready\", () => {\n redis.ssubscribe(channels);\n });\n }\n }\n });\n }\n });\n }\n }\n /**\n * Deep equality of the cluster slots objects\n *\n * @param other\n * @private\n */\n _slotsAreEqual(other) {\n if (this.clusterSlots === undefined)\n return false;\n else\n return JSON.stringify(this.clusterSlots) === JSON.stringify(other);\n }\n}\nexports.default = ClusterSubscriberGroup;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst events_1 = require(\"events\");\nconst redis_errors_1 = require(\"redis-errors\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst Command_1 = require(\"../Command\");\nconst ClusterAllFailedError_1 = require(\"../errors/ClusterAllFailedError\");\nconst Redis_1 = require(\"../Redis\");\nconst ScanStream_1 = require(\"../ScanStream\");\nconst transaction_1 = require(\"../transaction\");\nconst utils_1 = require(\"../utils\");\nconst applyMixin_1 = require(\"../utils/applyMixin\");\nconst Commander_1 = require(\"../utils/Commander\");\nconst ClusterOptions_1 = require(\"./ClusterOptions\");\nconst ClusterSubscriber_1 = require(\"./ClusterSubscriber\");\nconst ConnectionPool_1 = require(\"./ConnectionPool\");\nconst DelayQueue_1 = require(\"./DelayQueue\");\nconst util_1 = require(\"./util\");\nconst Deque = require(\"denque\");\nconst ClusterSubscriberGroup_1 = require(\"./ClusterSubscriberGroup\");\nconst debug = (0, utils_1.Debug)(\"cluster\");\nconst REJECT_OVERWRITTEN_COMMANDS = new WeakSet();\n/**\n * Client for the official Redis Cluster\n */\nclass Cluster extends Commander_1.default {\n /**\n * Creates an instance of Cluster.\n */\n //TODO: Add an option that enables or disables sharded PubSub\n constructor(startupNodes, options = {}) {\n super();\n this.slots = [];\n /**\n * @ignore\n */\n this._groupsIds = {};\n /**\n * @ignore\n */\n this._groupsBySlot = Array(16384);\n /**\n * @ignore\n */\n this.isCluster = true;\n this.retryAttempts = 0;\n this.delayQueue = new DelayQueue_1.default();\n this.offlineQueue = new Deque();\n this.isRefreshing = false;\n this._refreshSlotsCacheCallbacks = [];\n this._autoPipelines = new Map();\n this._runningAutoPipelines = new Set();\n this._readyDelayedCallbacks = [];\n /**\n * Every time Cluster#connect() is called, this value will be\n * auto-incrementing. The purpose of this value is used for\n * discarding previous connect attampts when creating a new\n * connection.\n */\n this.connectionEpoch = 0;\n events_1.EventEmitter.call(this);\n this.startupNodes = startupNodes;\n this.options = (0, utils_1.defaults)({}, options, ClusterOptions_1.DEFAULT_CLUSTER_OPTIONS, this.options);\n if (this.options.shardedSubscribers == true)\n this.shardedSubscribers = new ClusterSubscriberGroup_1.default(this, this.refreshSlotsCache.bind(this));\n if (this.options.redisOptions &&\n this.options.redisOptions.keyPrefix &&\n !this.options.keyPrefix) {\n this.options.keyPrefix = this.options.redisOptions.keyPrefix;\n }\n // validate options\n if (typeof this.options.scaleReads !== \"function\" &&\n [\"all\", \"master\", \"slave\"].indexOf(this.options.scaleReads) === -1) {\n throw new Error('Invalid option scaleReads \"' +\n this.options.scaleReads +\n '\". Expected \"all\", \"master\", \"slave\" or a custom function');\n }\n this.connectionPool = new ConnectionPool_1.default(this.options.redisOptions);\n this.connectionPool.on(\"-node\", (redis, key) => {\n this.emit(\"-node\", redis);\n });\n this.connectionPool.on(\"+node\", (redis) => {\n this.emit(\"+node\", redis);\n });\n this.connectionPool.on(\"drain\", () => {\n this.setStatus(\"close\");\n });\n this.connectionPool.on(\"nodeError\", (error, key) => {\n this.emit(\"node error\", error, key);\n });\n this.subscriber = new ClusterSubscriber_1.default(this.connectionPool, this);\n if (this.options.scripts) {\n Object.entries(this.options.scripts).forEach(([name, definition]) => {\n this.defineCommand(name, definition);\n });\n }\n if (this.options.lazyConnect) {\n this.setStatus(\"wait\");\n }\n else {\n this.connect().catch((err) => {\n debug(\"connecting failed: %s\", err);\n });\n }\n }\n /**\n * Connect to a cluster\n */\n connect() {\n return new Promise((resolve, reject) => {\n if (this.status === \"connecting\" ||\n this.status === \"connect\" ||\n this.status === \"ready\") {\n reject(new Error(\"Redis is already connecting/connected\"));\n return;\n }\n const epoch = ++this.connectionEpoch;\n this.setStatus(\"connecting\");\n this.resolveStartupNodeHostnames()\n .then((nodes) => {\n if (this.connectionEpoch !== epoch) {\n debug(\"discard connecting after resolving startup nodes because epoch not match: %d != %d\", epoch, this.connectionEpoch);\n reject(new redis_errors_1.RedisError(\"Connection is discarded because a new connection is made\"));\n return;\n }\n if (this.status !== \"connecting\") {\n debug(\"discard connecting after resolving startup nodes because the status changed to %s\", this.status);\n reject(new redis_errors_1.RedisError(\"Connection is aborted\"));\n return;\n }\n this.connectionPool.reset(nodes);\n const readyHandler = () => {\n this.setStatus(\"ready\");\n this.retryAttempts = 0;\n this.executeOfflineCommands();\n this.resetNodesRefreshInterval();\n resolve();\n };\n let closeListener = undefined;\n const refreshListener = () => {\n this.invokeReadyDelayedCallbacks(undefined);\n this.removeListener(\"close\", closeListener);\n this.manuallyClosing = false;\n this.setStatus(\"connect\");\n if (this.options.enableReadyCheck) {\n this.readyCheck((err, fail) => {\n if (err || fail) {\n debug(\"Ready check failed (%s). Reconnecting...\", err || fail);\n if (this.status === \"connect\") {\n this.disconnect(true);\n }\n }\n else {\n readyHandler();\n }\n });\n }\n else {\n readyHandler();\n }\n };\n closeListener = () => {\n const error = new Error(\"None of startup nodes is available\");\n this.removeListener(\"refresh\", refreshListener);\n this.invokeReadyDelayedCallbacks(error);\n reject(error);\n };\n this.once(\"refresh\", refreshListener);\n this.once(\"close\", closeListener);\n this.once(\"close\", this.handleCloseEvent.bind(this));\n this.refreshSlotsCache((err) => {\n if (err && err.message === ClusterAllFailedError_1.default.defaultMessage) {\n Redis_1.default.prototype.silentEmit.call(this, \"error\", err);\n this.connectionPool.reset([]);\n }\n });\n this.subscriber.start();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.start();\n }\n })\n .catch((err) => {\n this.setStatus(\"close\");\n this.handleCloseEvent(err);\n this.invokeReadyDelayedCallbacks(err);\n reject(err);\n });\n });\n }\n /**\n * Disconnect from every node in the cluster.\n */\n disconnect(reconnect = false) {\n const status = this.status;\n this.setStatus(\"disconnecting\");\n if (!reconnect) {\n this.manuallyClosing = true;\n }\n if (this.reconnectTimeout && !reconnect) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n debug(\"Canceled reconnecting attempts\");\n }\n this.clearNodesRefreshInterval();\n this.subscriber.stop();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.stop();\n }\n if (status === \"wait\") {\n this.setStatus(\"close\");\n this.handleCloseEvent();\n }\n else {\n this.connectionPool.reset([]);\n }\n }\n /**\n * Quit the cluster gracefully.\n */\n quit(callback) {\n const status = this.status;\n this.setStatus(\"disconnecting\");\n this.manuallyClosing = true;\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n this.clearNodesRefreshInterval();\n this.subscriber.stop();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.stop();\n }\n if (status === \"wait\") {\n const ret = (0, standard_as_callback_1.default)(Promise.resolve(\"OK\"), callback);\n // use setImmediate to make sure \"close\" event\n // being emitted after quit() is returned\n setImmediate(function () {\n this.setStatus(\"close\");\n this.handleCloseEvent();\n }.bind(this));\n return ret;\n }\n return (0, standard_as_callback_1.default)(Promise.all(this.nodes().map((node) => node.quit().catch((err) => {\n // Ignore the error caused by disconnecting since\n // we're disconnecting...\n if (err.message === utils_1.CONNECTION_CLOSED_ERROR_MSG) {\n return \"OK\";\n }\n throw err;\n }))).then(() => \"OK\"), callback);\n }\n /**\n * Create a new instance with the same startup nodes and options as the current one.\n *\n * @example\n * ```js\n * var cluster = new Redis.Cluster([{ host: \"127.0.0.1\", port: \"30001\" }]);\n * var anotherCluster = cluster.duplicate();\n * ```\n */\n duplicate(overrideStartupNodes = [], overrideOptions = {}) {\n const startupNodes = overrideStartupNodes.length > 0\n ? overrideStartupNodes\n : this.startupNodes.slice(0);\n const options = Object.assign({}, this.options, overrideOptions);\n return new Cluster(startupNodes, options);\n }\n /**\n * Get nodes with the specified role\n */\n nodes(role = \"all\") {\n if (role !== \"all\" && role !== \"master\" && role !== \"slave\") {\n throw new Error('Invalid role \"' + role + '\". Expected \"all\", \"master\" or \"slave\"');\n }\n return this.connectionPool.getNodes(role);\n }\n /**\n * This is needed in order not to install a listener for each auto pipeline\n *\n * @ignore\n */\n delayUntilReady(callback) {\n this._readyDelayedCallbacks.push(callback);\n }\n /**\n * Get the number of commands queued in automatic pipelines.\n *\n * This is not available (and returns 0) until the cluster is connected and slots information have been received.\n */\n get autoPipelineQueueSize() {\n let queued = 0;\n for (const pipeline of this._autoPipelines.values()) {\n queued += pipeline.length;\n }\n return queued;\n }\n /**\n * Refresh the slot cache\n *\n * @ignore\n */\n refreshSlotsCache(callback) {\n if (callback) {\n this._refreshSlotsCacheCallbacks.push(callback);\n }\n if (this.isRefreshing) {\n return;\n }\n this.isRefreshing = true;\n const _this = this;\n const wrapper = (error) => {\n this.isRefreshing = false;\n for (const callback of this._refreshSlotsCacheCallbacks) {\n callback(error);\n }\n this._refreshSlotsCacheCallbacks = [];\n };\n const nodes = (0, utils_1.shuffle)(this.connectionPool.getNodes());\n let lastNodeError = null;\n function tryNode(index) {\n if (index === nodes.length) {\n const error = new ClusterAllFailedError_1.default(ClusterAllFailedError_1.default.defaultMessage, lastNodeError);\n return wrapper(error);\n }\n const node = nodes[index];\n const key = `${node.options.host}:${node.options.port}`;\n debug(\"getting slot cache from %s\", key);\n _this.getInfoFromNode(node, function (err) {\n switch (_this.status) {\n case \"close\":\n case \"end\":\n return wrapper(new Error(\"Cluster is disconnected.\"));\n case \"disconnecting\":\n return wrapper(new Error(\"Cluster is disconnecting.\"));\n }\n if (err) {\n _this.emit(\"node error\", err, key);\n lastNodeError = err;\n tryNode(index + 1);\n }\n else {\n _this.emit(\"refresh\");\n wrapper();\n }\n });\n }\n tryNode(0);\n }\n /**\n * @ignore\n */\n sendCommand(command, stream, node) {\n if (this.status === \"wait\") {\n this.connect().catch(utils_1.noop);\n }\n if (this.status === \"end\") {\n command.reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return command.promise;\n }\n let to = this.options.scaleReads;\n if (to !== \"master\") {\n const isCommandReadOnly = command.isReadOnly ||\n ((0, commands_1.exists)(command.name) && (0, commands_1.hasFlag)(command.name, \"readonly\"));\n if (!isCommandReadOnly) {\n to = \"master\";\n }\n }\n let targetSlot = node ? node.slot : command.getSlot();\n const ttl = {};\n const _this = this;\n if (!node && !REJECT_OVERWRITTEN_COMMANDS.has(command)) {\n REJECT_OVERWRITTEN_COMMANDS.add(command);\n const reject = command.reject;\n command.reject = function (err) {\n const partialTry = tryConnection.bind(null, true);\n _this.handleError(err, ttl, {\n moved: function (slot, key) {\n debug(\"command %s is moved to %s\", command.name, key);\n targetSlot = Number(slot);\n if (_this.slots[slot]) {\n _this.slots[slot][0] = key;\n }\n else {\n _this.slots[slot] = [key];\n }\n _this._groupsBySlot[slot] =\n _this._groupsIds[_this.slots[slot].join(\";\")];\n _this.connectionPool.findOrCreate(_this.natMapper(key));\n tryConnection();\n debug(\"refreshing slot caches... (triggered by MOVED error)\");\n _this.refreshSlotsCache();\n },\n ask: function (slot, key) {\n debug(\"command %s is required to ask %s:%s\", command.name, key);\n const mapped = _this.natMapper(key);\n _this.connectionPool.findOrCreate(mapped);\n tryConnection(false, `${mapped.host}:${mapped.port}`);\n },\n tryagain: partialTry,\n clusterDown: partialTry,\n connectionClosed: partialTry,\n maxRedirections: function (redirectionError) {\n reject.call(command, redirectionError);\n },\n defaults: function () {\n reject.call(command, err);\n },\n });\n };\n }\n tryConnection();\n function tryConnection(random, asking) {\n if (_this.status === \"end\") {\n command.reject(new redis_errors_1.AbortError(\"Cluster is ended.\"));\n return;\n }\n let redis;\n if (_this.status === \"ready\" || command.name === \"cluster\") {\n if (node && node.redis) {\n redis = node.redis;\n }\n else if (Command_1.default.checkFlag(\"ENTER_SUBSCRIBER_MODE\", command.name) ||\n Command_1.default.checkFlag(\"EXIT_SUBSCRIBER_MODE\", command.name)) {\n if (_this.options.shardedSubscribers == true &&\n (command.name == \"ssubscribe\" || command.name == \"sunsubscribe\")) {\n const sub = _this.shardedSubscribers.getResponsibleSubscriber(targetSlot);\n let status = -1;\n if (command.name == \"ssubscribe\")\n status = _this.shardedSubscribers.addChannels(command.getKeys());\n if (command.name == \"sunsubscribe\")\n status = _this.shardedSubscribers.removeChannels(command.getKeys());\n if (status !== -1) {\n redis = sub.getInstance();\n }\n else {\n command.reject(new redis_errors_1.AbortError(\"Can't add or remove the given channels. Are they in the same slot?\"));\n }\n }\n else {\n redis = _this.subscriber.getInstance();\n }\n if (!redis) {\n command.reject(new redis_errors_1.AbortError(\"No subscriber for the cluster\"));\n return;\n }\n }\n else {\n if (!random) {\n if (typeof targetSlot === \"number\" && _this.slots[targetSlot]) {\n const nodeKeys = _this.slots[targetSlot];\n if (typeof to === \"function\") {\n const nodes = nodeKeys.map(function (key) {\n return _this.connectionPool.getInstanceByKey(key);\n });\n redis = to(nodes, command);\n if (Array.isArray(redis)) {\n redis = (0, utils_1.sample)(redis);\n }\n if (!redis) {\n redis = nodes[0];\n }\n }\n else {\n let key;\n if (to === \"all\") {\n key = (0, utils_1.sample)(nodeKeys);\n }\n else if (to === \"slave\" && nodeKeys.length > 1) {\n key = (0, utils_1.sample)(nodeKeys, 1);\n }\n else {\n key = nodeKeys[0];\n }\n redis = _this.connectionPool.getInstanceByKey(key);\n }\n }\n if (asking) {\n redis = _this.connectionPool.getInstanceByKey(asking);\n redis.asking();\n }\n }\n if (!redis) {\n redis =\n (typeof to === \"function\"\n ? null\n : _this.connectionPool.getSampleInstance(to)) ||\n _this.connectionPool.getSampleInstance(\"all\");\n }\n }\n if (node && !node.redis) {\n node.redis = redis;\n }\n }\n if (redis) {\n redis.sendCommand(command, stream);\n }\n else if (_this.options.enableOfflineQueue) {\n _this.offlineQueue.push({\n command: command,\n stream: stream,\n node: node,\n });\n }\n else {\n command.reject(new Error(\"Cluster isn't ready and enableOfflineQueue options is false\"));\n }\n }\n return command.promise;\n }\n sscanStream(key, options) {\n return this.createScanStream(\"sscan\", { key, options });\n }\n sscanBufferStream(key, options) {\n return this.createScanStream(\"sscanBuffer\", { key, options });\n }\n hscanStream(key, options) {\n return this.createScanStream(\"hscan\", { key, options });\n }\n hscanBufferStream(key, options) {\n return this.createScanStream(\"hscanBuffer\", { key, options });\n }\n zscanStream(key, options) {\n return this.createScanStream(\"zscan\", { key, options });\n }\n zscanBufferStream(key, options) {\n return this.createScanStream(\"zscanBuffer\", { key, options });\n }\n /**\n * @ignore\n */\n handleError(error, ttl, handlers) {\n if (typeof ttl.value === \"undefined\") {\n ttl.value = this.options.maxRedirections;\n }\n else {\n ttl.value -= 1;\n }\n if (ttl.value <= 0) {\n handlers.maxRedirections(new Error(\"Too many Cluster redirections. Last error: \" + error));\n return;\n }\n const errv = error.message.split(\" \");\n if (errv[0] === \"MOVED\") {\n const timeout = this.options.retryDelayOnMoved;\n if (timeout && typeof timeout === \"number\") {\n this.delayQueue.push(\"moved\", handlers.moved.bind(null, errv[1], errv[2]), { timeout });\n }\n else {\n handlers.moved(errv[1], errv[2]);\n }\n }\n else if (errv[0] === \"ASK\") {\n handlers.ask(errv[1], errv[2]);\n }\n else if (errv[0] === \"TRYAGAIN\") {\n this.delayQueue.push(\"tryagain\", handlers.tryagain, {\n timeout: this.options.retryDelayOnTryAgain,\n });\n }\n else if (errv[0] === \"CLUSTERDOWN\" &&\n this.options.retryDelayOnClusterDown > 0) {\n this.delayQueue.push(\"clusterdown\", handlers.connectionClosed, {\n timeout: this.options.retryDelayOnClusterDown,\n callback: this.refreshSlotsCache.bind(this),\n });\n }\n else if (error.message === utils_1.CONNECTION_CLOSED_ERROR_MSG &&\n this.options.retryDelayOnFailover > 0 &&\n this.status === \"ready\") {\n this.delayQueue.push(\"failover\", handlers.connectionClosed, {\n timeout: this.options.retryDelayOnFailover,\n callback: this.refreshSlotsCache.bind(this),\n });\n }\n else {\n handlers.defaults();\n }\n }\n resetOfflineQueue() {\n this.offlineQueue = new Deque();\n }\n clearNodesRefreshInterval() {\n if (this.slotsTimer) {\n clearTimeout(this.slotsTimer);\n this.slotsTimer = null;\n }\n }\n resetNodesRefreshInterval() {\n if (this.slotsTimer || !this.options.slotsRefreshInterval) {\n return;\n }\n const nextRound = () => {\n this.slotsTimer = setTimeout(() => {\n debug('refreshing slot caches... (triggered by \"slotsRefreshInterval\" option)');\n this.refreshSlotsCache(() => {\n nextRound();\n });\n }, this.options.slotsRefreshInterval);\n };\n nextRound();\n }\n /**\n * Change cluster instance's status\n */\n setStatus(status) {\n debug(\"status: %s -> %s\", this.status || \"[empty]\", status);\n this.status = status;\n process.nextTick(() => {\n this.emit(status);\n });\n }\n /**\n * Called when closed to check whether a reconnection should be made\n */\n handleCloseEvent(reason) {\n if (reason) {\n debug(\"closed because %s\", reason);\n }\n let retryDelay;\n if (!this.manuallyClosing &&\n typeof this.options.clusterRetryStrategy === \"function\") {\n retryDelay = this.options.clusterRetryStrategy.call(this, ++this.retryAttempts, reason);\n }\n if (typeof retryDelay === \"number\") {\n this.setStatus(\"reconnecting\");\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n debug(\"Cluster is disconnected. Retrying after %dms\", retryDelay);\n this.connect().catch(function (err) {\n debug(\"Got error %s when reconnecting. Ignoring...\", err);\n });\n }, retryDelay);\n }\n else {\n this.setStatus(\"end\");\n this.flushQueue(new Error(\"None of startup nodes is available\"));\n }\n }\n /**\n * Flush offline queue with error.\n */\n flushQueue(error) {\n let item;\n while ((item = this.offlineQueue.shift())) {\n item.command.reject(error);\n }\n }\n executeOfflineCommands() {\n if (this.offlineQueue.length) {\n debug(\"send %d commands in offline queue\", this.offlineQueue.length);\n const offlineQueue = this.offlineQueue;\n this.resetOfflineQueue();\n let item;\n while ((item = offlineQueue.shift())) {\n this.sendCommand(item.command, item.stream, item.node);\n }\n }\n }\n natMapper(nodeKey) {\n const key = typeof nodeKey === \"string\"\n ? nodeKey\n : `${nodeKey.host}:${nodeKey.port}`;\n let mapped = null;\n if (this.options.natMap && typeof this.options.natMap === \"function\") {\n mapped = this.options.natMap(key);\n }\n else if (this.options.natMap && typeof this.options.natMap === \"object\") {\n mapped = this.options.natMap[key];\n }\n if (mapped) {\n debug(\"NAT mapping %s -> %O\", key, mapped);\n return Object.assign({}, mapped);\n }\n return typeof nodeKey === \"string\"\n ? (0, util_1.nodeKeyToRedisOptions)(nodeKey)\n : nodeKey;\n }\n getInfoFromNode(redis, callback) {\n if (!redis) {\n return callback(new Error(\"Node is disconnected\"));\n }\n // Use a duplication of the connection to avoid\n // timeouts when the connection is in the blocking\n // mode (e.g. waiting for BLPOP).\n const duplicatedConnection = redis.duplicate({\n enableOfflineQueue: true,\n enableReadyCheck: false,\n retryStrategy: null,\n connectionName: (0, util_1.getConnectionName)(\"refresher\", this.options.redisOptions && this.options.redisOptions.connectionName),\n });\n // Ignore error events since we will handle\n // exceptions for the CLUSTER SLOTS command.\n duplicatedConnection.on(\"error\", utils_1.noop);\n duplicatedConnection.cluster(\"SLOTS\", (0, utils_1.timeout)((err, result) => {\n duplicatedConnection.disconnect();\n if (err) {\n debug(\"error encountered running CLUSTER.SLOTS: %s\", err);\n return callback(err);\n }\n if (this.status === \"disconnecting\" ||\n this.status === \"close\" ||\n this.status === \"end\") {\n debug(\"ignore CLUSTER.SLOTS results (count: %d) since cluster status is %s\", result.length, this.status);\n callback();\n return;\n }\n const nodes = [];\n debug(\"cluster slots result count: %d\", result.length);\n for (let i = 0; i < result.length; ++i) {\n const items = result[i];\n const slotRangeStart = items[0];\n const slotRangeEnd = items[1];\n const keys = [];\n for (let j = 2; j < items.length; j++) {\n if (!items[j][0]) {\n continue;\n }\n const node = this.natMapper({\n host: items[j][0],\n port: items[j][1],\n });\n node.readOnly = j !== 2;\n nodes.push(node);\n keys.push(node.host + \":\" + node.port);\n }\n debug(\"cluster slots result [%d]: slots %d~%d served by %s\", i, slotRangeStart, slotRangeEnd, keys);\n for (let slot = slotRangeStart; slot <= slotRangeEnd; slot++) {\n this.slots[slot] = keys;\n }\n }\n // Assign to each node keys a numeric value to make autopipeline comparison faster.\n this._groupsIds = Object.create(null);\n let j = 0;\n for (let i = 0; i < 16384; i++) {\n const target = (this.slots[i] || []).join(\";\");\n if (!target.length) {\n this._groupsBySlot[i] = undefined;\n continue;\n }\n if (!this._groupsIds[target]) {\n this._groupsIds[target] = ++j;\n }\n this._groupsBySlot[i] = this._groupsIds[target];\n }\n this.connectionPool.reset(nodes);\n callback();\n }, this.options.slotsRefreshTimeout));\n }\n invokeReadyDelayedCallbacks(err) {\n for (const c of this._readyDelayedCallbacks) {\n process.nextTick(c, err);\n }\n this._readyDelayedCallbacks = [];\n }\n /**\n * Check whether Cluster is able to process commands\n */\n readyCheck(callback) {\n this.cluster(\"INFO\", (err, res) => {\n if (err) {\n return callback(err);\n }\n if (typeof res !== \"string\") {\n return callback();\n }\n let state;\n const lines = res.split(\"\\r\\n\");\n for (let i = 0; i < lines.length; ++i) {\n const parts = lines[i].split(\":\");\n if (parts[0] === \"cluster_state\") {\n state = parts[1];\n break;\n }\n }\n if (state === \"fail\") {\n debug(\"cluster state not ok (%s)\", state);\n callback(null, state);\n }\n else {\n callback();\n }\n });\n }\n resolveSrv(hostname) {\n return new Promise((resolve, reject) => {\n this.options.resolveSrv(hostname, (err, records) => {\n if (err) {\n return reject(err);\n }\n const self = this, groupedRecords = (0, util_1.groupSrvRecords)(records), sortedKeys = Object.keys(groupedRecords).sort((a, b) => parseInt(a) - parseInt(b));\n function tryFirstOne(err) {\n if (!sortedKeys.length) {\n return reject(err);\n }\n const key = sortedKeys[0], group = groupedRecords[key], record = (0, util_1.weightSrvRecords)(group);\n if (!group.records.length) {\n sortedKeys.shift();\n }\n self.dnsLookup(record.name).then((host) => resolve({\n host,\n port: record.port,\n }), tryFirstOne);\n }\n tryFirstOne();\n });\n });\n }\n dnsLookup(hostname) {\n return new Promise((resolve, reject) => {\n this.options.dnsLookup(hostname, (err, address) => {\n if (err) {\n debug(\"failed to resolve hostname %s to IP: %s\", hostname, err.message);\n reject(err);\n }\n else {\n debug(\"resolved hostname %s to IP %s\", hostname, address);\n resolve(address);\n }\n });\n });\n }\n /**\n * Normalize startup nodes, and resolving hostnames to IPs.\n *\n * This process happens every time when #connect() is called since\n * #startupNodes and DNS records may chanage.\n */\n async resolveStartupNodeHostnames() {\n if (!Array.isArray(this.startupNodes) || this.startupNodes.length === 0) {\n throw new Error(\"`startupNodes` should contain at least one node.\");\n }\n const startupNodes = (0, util_1.normalizeNodeOptions)(this.startupNodes);\n const hostnames = (0, util_1.getUniqueHostnamesFromOptions)(startupNodes);\n if (hostnames.length === 0) {\n return startupNodes;\n }\n const configs = await Promise.all(hostnames.map((this.options.useSRVRecords ? this.resolveSrv : this.dnsLookup).bind(this)));\n const hostnameToConfig = (0, utils_1.zipMap)(hostnames, configs);\n return startupNodes.map((node) => {\n const config = hostnameToConfig.get(node.host);\n if (!config) {\n return node;\n }\n if (this.options.useSRVRecords) {\n return Object.assign({}, node, config);\n }\n return Object.assign({}, node, { host: config });\n });\n }\n createScanStream(command, { key, options = {} }) {\n return new ScanStream_1.default({\n objectMode: true,\n key: key,\n redis: this,\n command: command,\n ...options,\n });\n }\n}\n(0, applyMixin_1.default)(Cluster, events_1.EventEmitter);\n(0, transaction_1.addTransactionSupport)(Cluster.prototype);\nexports.default = Cluster;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst debug = (0, utils_1.Debug)(\"AbstractConnector\");\nclass AbstractConnector {\n constructor(disconnectTimeout) {\n this.connecting = false;\n this.disconnectTimeout = disconnectTimeout;\n }\n check(info) {\n return true;\n }\n disconnect() {\n this.connecting = false;\n if (this.stream) {\n const stream = this.stream; // Make sure callbacks refer to the same instance\n const timeout = setTimeout(() => {\n debug(\"stream %s:%s still open, destroying it\", stream.remoteAddress, stream.remotePort);\n stream.destroy();\n }, this.disconnectTimeout);\n stream.on(\"close\", () => clearTimeout(timeout));\n stream.end();\n }\n }\n}\nexports.default = AbstractConnector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst net_1 = require(\"net\");\nconst tls_1 = require(\"tls\");\nconst utils_1 = require(\"../utils\");\nconst AbstractConnector_1 = require(\"./AbstractConnector\");\nclass StandaloneConnector extends AbstractConnector_1.default {\n constructor(options) {\n super(options.disconnectTimeout);\n this.options = options;\n }\n connect(_) {\n const { options } = this;\n this.connecting = true;\n let connectionOptions;\n if (\"path\" in options && options.path) {\n connectionOptions = {\n path: options.path,\n };\n }\n else {\n connectionOptions = {};\n if (\"port\" in options && options.port != null) {\n connectionOptions.port = options.port;\n }\n if (\"host\" in options && options.host != null) {\n connectionOptions.host = options.host;\n }\n if (\"family\" in options && options.family != null) {\n connectionOptions.family = options.family;\n }\n }\n if (options.tls) {\n Object.assign(connectionOptions, options.tls);\n }\n // TODO:\n // We use native Promise here since other Promise\n // implementation may use different schedulers that\n // cause issue when the stream is resolved in the\n // next tick.\n // Should use the provided promise in the next major\n // version and do not connect before resolved.\n return new Promise((resolve, reject) => {\n process.nextTick(() => {\n if (!this.connecting) {\n reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return;\n }\n try {\n if (options.tls) {\n this.stream = (0, tls_1.connect)(connectionOptions);\n }\n else {\n this.stream = (0, net_1.createConnection)(connectionOptions);\n }\n }\n catch (err) {\n reject(err);\n return;\n }\n this.stream.once(\"error\", (err) => {\n this.firstError = err;\n });\n resolve(this.stream);\n });\n });\n }\n}\nexports.default = StandaloneConnector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isSentinelEql(a, b) {\n return ((a.host || \"127.0.0.1\") === (b.host || \"127.0.0.1\") &&\n (a.port || 26379) === (b.port || 26379));\n}\nclass SentinelIterator {\n constructor(sentinels) {\n this.cursor = 0;\n this.sentinels = sentinels.slice(0);\n }\n next() {\n const done = this.cursor >= this.sentinels.length;\n return { done, value: done ? undefined : this.sentinels[this.cursor++] };\n }\n reset(moveCurrentEndpointToFirst) {\n if (moveCurrentEndpointToFirst &&\n this.sentinels.length > 1 &&\n this.cursor !== 1) {\n this.sentinels.unshift(...this.sentinels.splice(this.cursor - 1));\n }\n this.cursor = 0;\n }\n add(sentinel) {\n for (let i = 0; i < this.sentinels.length; i++) {\n if (isSentinelEql(sentinel, this.sentinels[i])) {\n return false;\n }\n }\n this.sentinels.push(sentinel);\n return true;\n }\n toString() {\n return `${JSON.stringify(this.sentinels)} @${this.cursor}`;\n }\n}\nexports.default = SentinelIterator;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FailoverDetector = void 0;\nconst utils_1 = require(\"../../utils\");\nconst debug = (0, utils_1.Debug)(\"FailoverDetector\");\nconst CHANNEL_NAME = \"+switch-master\";\nclass FailoverDetector {\n // sentinels can't be used for regular commands after this\n constructor(connector, sentinels) {\n this.isDisconnected = false;\n this.connector = connector;\n this.sentinels = sentinels;\n }\n cleanup() {\n this.isDisconnected = true;\n for (const sentinel of this.sentinels) {\n sentinel.client.disconnect();\n }\n }\n async subscribe() {\n debug(\"Starting FailoverDetector\");\n const promises = [];\n for (const sentinel of this.sentinels) {\n const promise = sentinel.client.subscribe(CHANNEL_NAME).catch((err) => {\n debug(\"Failed to subscribe to failover messages on sentinel %s:%s (%s)\", sentinel.address.host || \"127.0.0.1\", sentinel.address.port || 26739, err.message);\n });\n promises.push(promise);\n sentinel.client.on(\"message\", (channel) => {\n if (!this.isDisconnected && channel === CHANNEL_NAME) {\n this.disconnect();\n }\n });\n }\n await Promise.all(promises);\n }\n disconnect() {\n // Avoid disconnecting more than once per failover.\n // A new FailoverDetector will be created after reconnecting.\n this.isDisconnected = true;\n debug(\"Failover detected, disconnecting\");\n // Will call this.cleanup()\n this.connector.disconnect();\n }\n}\nexports.FailoverDetector = FailoverDetector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SentinelIterator = void 0;\nconst net_1 = require(\"net\");\nconst utils_1 = require(\"../../utils\");\nconst tls_1 = require(\"tls\");\nconst SentinelIterator_1 = require(\"./SentinelIterator\");\nexports.SentinelIterator = SentinelIterator_1.default;\nconst AbstractConnector_1 = require(\"../AbstractConnector\");\nconst Redis_1 = require(\"../../Redis\");\nconst FailoverDetector_1 = require(\"./FailoverDetector\");\nconst debug = (0, utils_1.Debug)(\"SentinelConnector\");\nclass SentinelConnector extends AbstractConnector_1.default {\n constructor(options) {\n super(options.disconnectTimeout);\n this.options = options;\n this.emitter = null;\n this.failoverDetector = null;\n if (!this.options.sentinels.length) {\n throw new Error(\"Requires at least one sentinel to connect to.\");\n }\n if (!this.options.name) {\n throw new Error(\"Requires the name of master.\");\n }\n this.sentinelIterator = new SentinelIterator_1.default(this.options.sentinels);\n }\n check(info) {\n const roleMatches = !info.role || this.options.role === info.role;\n if (!roleMatches) {\n debug(\"role invalid, expected %s, but got %s\", this.options.role, info.role);\n // Start from the next item.\n // Note that `reset` will move the cursor to the previous element,\n // so we advance two steps here.\n this.sentinelIterator.next();\n this.sentinelIterator.next();\n this.sentinelIterator.reset(true);\n }\n return roleMatches;\n }\n disconnect() {\n super.disconnect();\n if (this.failoverDetector) {\n this.failoverDetector.cleanup();\n }\n }\n connect(eventEmitter) {\n this.connecting = true;\n this.retryAttempts = 0;\n let lastError;\n const connectToNext = async () => {\n const endpoint = this.sentinelIterator.next();\n if (endpoint.done) {\n this.sentinelIterator.reset(false);\n const retryDelay = typeof this.options.sentinelRetryStrategy === \"function\"\n ? this.options.sentinelRetryStrategy(++this.retryAttempts)\n : null;\n let errorMsg = typeof retryDelay !== \"number\"\n ? \"All sentinels are unreachable and retry is disabled.\"\n : `All sentinels are unreachable. Retrying from scratch after ${retryDelay}ms.`;\n if (lastError) {\n errorMsg += ` Last error: ${lastError.message}`;\n }\n debug(errorMsg);\n const error = new Error(errorMsg);\n if (typeof retryDelay === \"number\") {\n eventEmitter(\"error\", error);\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return connectToNext();\n }\n else {\n throw error;\n }\n }\n let resolved = null;\n let err = null;\n try {\n resolved = await this.resolve(endpoint.value);\n }\n catch (error) {\n err = error;\n }\n if (!this.connecting) {\n throw new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG);\n }\n const endpointAddress = endpoint.value.host + \":\" + endpoint.value.port;\n if (resolved) {\n debug(\"resolved: %s:%s from sentinel %s\", resolved.host, resolved.port, endpointAddress);\n if (this.options.enableTLSForSentinelMode && this.options.tls) {\n Object.assign(resolved, this.options.tls);\n this.stream = (0, tls_1.connect)(resolved);\n this.stream.once(\"secureConnect\", this.initFailoverDetector.bind(this));\n }\n else {\n this.stream = (0, net_1.createConnection)(resolved);\n this.stream.once(\"connect\", this.initFailoverDetector.bind(this));\n }\n this.stream.once(\"error\", (err) => {\n this.firstError = err;\n });\n return this.stream;\n }\n else {\n const errorMsg = err\n ? \"failed to connect to sentinel \" +\n endpointAddress +\n \" because \" +\n err.message\n : \"connected to sentinel \" +\n endpointAddress +\n \" successfully, but got an invalid reply: \" +\n resolved;\n debug(errorMsg);\n eventEmitter(\"sentinelError\", new Error(errorMsg));\n if (err) {\n lastError = err;\n }\n return connectToNext();\n }\n };\n return connectToNext();\n }\n async updateSentinels(client) {\n if (!this.options.updateSentinels) {\n return;\n }\n const result = await client.sentinel(\"sentinels\", this.options.name);\n if (!Array.isArray(result)) {\n return;\n }\n result\n .map(utils_1.packObject)\n .forEach((sentinel) => {\n const flags = sentinel.flags ? sentinel.flags.split(\",\") : [];\n if (flags.indexOf(\"disconnected\") === -1 &&\n sentinel.ip &&\n sentinel.port) {\n const endpoint = this.sentinelNatResolve(addressResponseToAddress(sentinel));\n if (this.sentinelIterator.add(endpoint)) {\n debug(\"adding sentinel %s:%s\", endpoint.host, endpoint.port);\n }\n }\n });\n debug(\"Updated internal sentinels: %s\", this.sentinelIterator);\n }\n async resolveMaster(client) {\n const result = await client.sentinel(\"get-master-addr-by-name\", this.options.name);\n await this.updateSentinels(client);\n return this.sentinelNatResolve(Array.isArray(result)\n ? { host: result[0], port: Number(result[1]) }\n : null);\n }\n async resolveSlave(client) {\n const result = await client.sentinel(\"slaves\", this.options.name);\n if (!Array.isArray(result)) {\n return null;\n }\n const availableSlaves = result\n .map(utils_1.packObject)\n .filter((slave) => slave.flags && !slave.flags.match(/(disconnected|s_down|o_down)/));\n return this.sentinelNatResolve(selectPreferredSentinel(availableSlaves, this.options.preferredSlaves));\n }\n sentinelNatResolve(item) {\n if (!item || !this.options.natMap)\n return item;\n const key = `${item.host}:${item.port}`;\n let result = item;\n if (typeof this.options.natMap === \"function\") {\n result = this.options.natMap(key) || item;\n }\n else if (typeof this.options.natMap === \"object\") {\n result = this.options.natMap[key] || item;\n }\n return result;\n }\n connectToSentinel(endpoint, options) {\n const redis = new Redis_1.default({\n port: endpoint.port || 26379,\n host: endpoint.host,\n username: this.options.sentinelUsername || null,\n password: this.options.sentinelPassword || null,\n family: endpoint.family ||\n // @ts-expect-error\n (\"path\" in this.options && this.options.path\n ? undefined\n : // @ts-expect-error\n this.options.family),\n tls: this.options.sentinelTLS,\n retryStrategy: null,\n enableReadyCheck: false,\n connectTimeout: this.options.connectTimeout,\n commandTimeout: this.options.sentinelCommandTimeout,\n ...options,\n });\n // @ts-expect-error\n return redis;\n }\n async resolve(endpoint) {\n const client = this.connectToSentinel(endpoint);\n // ignore the errors since resolve* methods will handle them\n client.on(\"error\", noop);\n try {\n if (this.options.role === \"slave\") {\n return await this.resolveSlave(client);\n }\n else {\n return await this.resolveMaster(client);\n }\n }\n finally {\n client.disconnect();\n }\n }\n async initFailoverDetector() {\n var _a;\n if (!this.options.failoverDetector) {\n return;\n }\n // Move the current sentinel to the first position\n this.sentinelIterator.reset(true);\n const sentinels = [];\n // In case of a large amount of sentinels, limit the number of concurrent connections\n while (sentinels.length < this.options.sentinelMaxConnections) {\n const { done, value } = this.sentinelIterator.next();\n if (done) {\n break;\n }\n const client = this.connectToSentinel(value, {\n lazyConnect: true,\n retryStrategy: this.options.sentinelReconnectStrategy,\n });\n client.on(\"reconnecting\", () => {\n var _a;\n // Tests listen to this event\n (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit(\"sentinelReconnecting\");\n });\n sentinels.push({ address: value, client });\n }\n this.sentinelIterator.reset(false);\n if (this.failoverDetector) {\n // Clean up previous detector\n this.failoverDetector.cleanup();\n }\n this.failoverDetector = new FailoverDetector_1.FailoverDetector(this, sentinels);\n await this.failoverDetector.subscribe();\n // Tests listen to this event\n (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit(\"failoverSubscribed\");\n }\n}\nexports.default = SentinelConnector;\nfunction selectPreferredSentinel(availableSlaves, preferredSlaves) {\n if (availableSlaves.length === 0) {\n return null;\n }\n let selectedSlave;\n if (typeof preferredSlaves === \"function\") {\n selectedSlave = preferredSlaves(availableSlaves);\n }\n else if (preferredSlaves !== null && typeof preferredSlaves === \"object\") {\n const preferredSlavesArray = Array.isArray(preferredSlaves)\n ? preferredSlaves\n : [preferredSlaves];\n // sort by priority\n preferredSlavesArray.sort((a, b) => {\n // default the priority to 1\n if (!a.prio) {\n a.prio = 1;\n }\n if (!b.prio) {\n b.prio = 1;\n }\n // lowest priority first\n if (a.prio < b.prio) {\n return -1;\n }\n if (a.prio > b.prio) {\n return 1;\n }\n return 0;\n });\n // loop over preferred slaves and return the first match\n for (let p = 0; p < preferredSlavesArray.length; p++) {\n for (let a = 0; a < availableSlaves.length; a++) {\n const slave = availableSlaves[a];\n if (slave.ip === preferredSlavesArray[p].ip) {\n if (slave.port === preferredSlavesArray[p].port) {\n selectedSlave = slave;\n break;\n }\n }\n }\n if (selectedSlave) {\n break;\n }\n }\n }\n // if none of the preferred slaves are available, a random available slave is returned\n if (!selectedSlave) {\n selectedSlave = (0, utils_1.sample)(availableSlaves);\n }\n return addressResponseToAddress(selectedSlave);\n}\nfunction addressResponseToAddress(input) {\n return { host: input.ip, port: Number(input.port) };\n}\nfunction noop() { }\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SentinelConnector = exports.StandaloneConnector = void 0;\nconst StandaloneConnector_1 = require(\"./StandaloneConnector\");\nexports.StandaloneConnector = StandaloneConnector_1.default;\nconst SentinelConnector_1 = require(\"./SentinelConnector\");\nexports.SentinelConnector = SentinelConnector_1.default;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_errors_1 = require(\"redis-errors\");\nclass MaxRetriesPerRequestError extends redis_errors_1.AbortError {\n constructor(maxRetriesPerRequest) {\n const message = `Reached the max retries per request limit (which is ${maxRetriesPerRequest}). Refer to \"maxRetriesPerRequest\" option for details.`;\n super(message);\n Error.captureStackTrace(this, this.constructor);\n }\n get name() {\n return this.constructor.name;\n }\n}\nexports.default = MaxRetriesPerRequestError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaxRetriesPerRequestError = void 0;\nconst MaxRetriesPerRequestError_1 = require(\"./MaxRetriesPerRequestError\");\nexports.MaxRetriesPerRequestError = MaxRetriesPerRequestError_1.default;\n","'use strict'\n\nconst Buffer = require('buffer').Buffer\nconst StringDecoder = require('string_decoder').StringDecoder\nconst decoder = new StringDecoder()\nconst errors = require('redis-errors')\nconst ReplyError = errors.ReplyError\nconst ParserError = errors.ParserError\nvar bufferPool = Buffer.allocUnsafe(32 * 1024)\nvar bufferOffset = 0\nvar interval = null\nvar counter = 0\nvar notDecreased = 0\n\n/**\n * Used for integer numbers only\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number}\n */\nfunction parseSimpleNumbers (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n var sign = 1\n\n if (parser.buffer[offset] === 45) {\n sign = -1\n offset++\n }\n\n while (offset < length) {\n const c1 = parser.buffer[offset++]\n if (c1 === 13) { // \\r\\n\n parser.offset = offset + 1\n return sign * number\n }\n number = (number * 10) + (c1 - 48)\n }\n}\n\n/**\n * Used for integer numbers in case of the returnNumbers option\n *\n * Reading the string as parts of n SMI is more efficient than\n * using a string directly.\n *\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|string}\n */\nfunction parseStringNumbers (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n var res = ''\n\n if (parser.buffer[offset] === 45) {\n res += '-'\n offset++\n }\n\n while (offset < length) {\n var c1 = parser.buffer[offset++]\n if (c1 === 13) { // \\r\\n\n parser.offset = offset + 1\n if (number !== 0) {\n res += number\n }\n return res\n } else if (number > 429496728) {\n res += (number * 10) + (c1 - 48)\n number = 0\n } else if (c1 === 48 && number === 0) {\n res += 0\n } else {\n number = (number * 10) + (c1 - 48)\n }\n }\n}\n\n/**\n * Parse a '+' redis simple string response but forward the offsets\n * onto convertBufferRange to generate a string.\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|string|Buffer}\n */\nfunction parseSimpleString (parser) {\n const start = parser.offset\n const buffer = parser.buffer\n const length = buffer.length - 1\n var offset = start\n\n while (offset < length) {\n if (buffer[offset++] === 13) { // \\r\\n\n parser.offset = offset + 1\n if (parser.optionReturnBuffers === true) {\n return parser.buffer.slice(start, offset - 1)\n }\n return parser.buffer.toString('utf8', start, offset - 1)\n }\n }\n}\n\n/**\n * Returns the read length\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number}\n */\nfunction parseLength (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n\n while (offset < length) {\n const c1 = parser.buffer[offset++]\n if (c1 === 13) {\n parser.offset = offset + 1\n return number\n }\n number = (number * 10) + (c1 - 48)\n }\n}\n\n/**\n * Parse a ':' redis integer response\n *\n * If stringNumbers is activated the parser always returns numbers as string\n * This is important for big numbers (number > Math.pow(2, 53)) as js numbers\n * are 64bit floating point numbers with reduced precision\n *\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number|string}\n */\nfunction parseInteger (parser) {\n if (parser.optionStringNumbers === true) {\n return parseStringNumbers(parser)\n }\n return parseSimpleNumbers(parser)\n}\n\n/**\n * Parse a '$' redis bulk string response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|null|string}\n */\nfunction parseBulkString (parser) {\n const length = parseLength(parser)\n if (length === undefined) {\n return\n }\n if (length < 0) {\n return null\n }\n const offset = parser.offset + length\n if (offset + 2 > parser.buffer.length) {\n parser.bigStrSize = offset + 2\n parser.totalChunkSize = parser.buffer.length\n parser.bufferCache.push(parser.buffer)\n return\n }\n const start = parser.offset\n parser.offset = offset + 2\n if (parser.optionReturnBuffers === true) {\n return parser.buffer.slice(start, offset)\n }\n return parser.buffer.toString('utf8', start, offset)\n}\n\n/**\n * Parse a '-' redis error response\n * @param {JavascriptRedisParser} parser\n * @returns {ReplyError}\n */\nfunction parseError (parser) {\n var string = parseSimpleString(parser)\n if (string !== undefined) {\n if (parser.optionReturnBuffers === true) {\n string = string.toString()\n }\n return new ReplyError(string)\n }\n}\n\n/**\n * Parsing error handler, resets parser buffer\n * @param {JavascriptRedisParser} parser\n * @param {number} type\n * @returns {undefined}\n */\nfunction handleError (parser, type) {\n const err = new ParserError(\n 'Protocol error, got ' + JSON.stringify(String.fromCharCode(type)) + ' as reply type byte',\n JSON.stringify(parser.buffer),\n parser.offset\n )\n parser.buffer = null\n parser.returnFatalError(err)\n}\n\n/**\n * Parse a '*' redis array response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|null|any[]}\n */\nfunction parseArray (parser) {\n const length = parseLength(parser)\n if (length === undefined) {\n return\n }\n if (length < 0) {\n return null\n }\n const responses = new Array(length)\n return parseArrayElements(parser, responses, 0)\n}\n\n/**\n * Push a partly parsed array to the stack\n *\n * @param {JavascriptRedisParser} parser\n * @param {any[]} array\n * @param {number} pos\n * @returns {undefined}\n */\nfunction pushArrayCache (parser, array, pos) {\n parser.arrayCache.push(array)\n parser.arrayPos.push(pos)\n}\n\n/**\n * Parse chunked redis array response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|any[]}\n */\nfunction parseArrayChunks (parser) {\n const tmp = parser.arrayCache.pop()\n var pos = parser.arrayPos.pop()\n if (parser.arrayCache.length) {\n const res = parseArrayChunks(parser)\n if (res === undefined) {\n pushArrayCache(parser, tmp, pos)\n return\n }\n tmp[pos++] = res\n }\n return parseArrayElements(parser, tmp, pos)\n}\n\n/**\n * Parse redis array response elements\n * @param {JavascriptRedisParser} parser\n * @param {Array} responses\n * @param {number} i\n * @returns {undefined|null|any[]}\n */\nfunction parseArrayElements (parser, responses, i) {\n const bufferLength = parser.buffer.length\n while (i < responses.length) {\n const offset = parser.offset\n if (parser.offset >= bufferLength) {\n pushArrayCache(parser, responses, i)\n return\n }\n const response = parseType(parser, parser.buffer[parser.offset++])\n if (response === undefined) {\n if (!(parser.arrayCache.length || parser.bufferCache.length)) {\n parser.offset = offset\n }\n pushArrayCache(parser, responses, i)\n return\n }\n responses[i] = response\n i++\n }\n\n return responses\n}\n\n/**\n * Called the appropriate parser for the specified type.\n *\n * 36: $\n * 43: +\n * 42: *\n * 58: :\n * 45: -\n *\n * @param {JavascriptRedisParser} parser\n * @param {number} type\n * @returns {*}\n */\nfunction parseType (parser, type) {\n switch (type) {\n case 36:\n return parseBulkString(parser)\n case 43:\n return parseSimpleString(parser)\n case 42:\n return parseArray(parser)\n case 58:\n return parseInteger(parser)\n case 45:\n return parseError(parser)\n default:\n return handleError(parser, type)\n }\n}\n\n/**\n * Decrease the bufferPool size over time\n *\n * Balance between increasing and decreasing the bufferPool.\n * Decrease the bufferPool by 10% by removing the first 10% of the current pool.\n * @returns {undefined}\n */\nfunction decreaseBufferPool () {\n if (bufferPool.length > 50 * 1024) {\n if (counter === 1 || notDecreased > counter * 2) {\n const minSliceLen = Math.floor(bufferPool.length / 10)\n const sliceLength = minSliceLen < bufferOffset\n ? bufferOffset\n : minSliceLen\n bufferOffset = 0\n bufferPool = bufferPool.slice(sliceLength, bufferPool.length)\n } else {\n notDecreased++\n counter--\n }\n } else {\n clearInterval(interval)\n counter = 0\n notDecreased = 0\n interval = null\n }\n}\n\n/**\n * Check if the requested size fits in the current bufferPool.\n * If it does not, reset and increase the bufferPool accordingly.\n *\n * @param {number} length\n * @returns {undefined}\n */\nfunction resizeBuffer (length) {\n if (bufferPool.length < length + bufferOffset) {\n const multiplier = length > 1024 * 1024 * 75 ? 2 : 3\n if (bufferOffset > 1024 * 1024 * 111) {\n bufferOffset = 1024 * 1024 * 50\n }\n bufferPool = Buffer.allocUnsafe(length * multiplier + bufferOffset)\n bufferOffset = 0\n counter++\n if (interval === null) {\n interval = setInterval(decreaseBufferPool, 50)\n }\n }\n}\n\n/**\n * Concat a bulk string containing multiple chunks\n *\n * Notes:\n * 1) The first chunk might contain the whole bulk string including the \\r\n * 2) We are only safe to fully add up elements that are neither the first nor any of the last two elements\n *\n * @param {JavascriptRedisParser} parser\n * @returns {String}\n */\nfunction concatBulkString (parser) {\n const list = parser.bufferCache\n const oldOffset = parser.offset\n var chunks = list.length\n var offset = parser.bigStrSize - parser.totalChunkSize\n parser.offset = offset\n if (offset <= 2) {\n if (chunks === 2) {\n return list[0].toString('utf8', oldOffset, list[0].length + offset - 2)\n }\n chunks--\n offset = list[list.length - 2].length + offset\n }\n var res = decoder.write(list[0].slice(oldOffset))\n for (var i = 1; i < chunks - 1; i++) {\n res += decoder.write(list[i])\n }\n res += decoder.end(list[i].slice(0, offset - 2))\n return res\n}\n\n/**\n * Concat the collected chunks from parser.bufferCache.\n *\n * Increases the bufferPool size beforehand if necessary.\n *\n * @param {JavascriptRedisParser} parser\n * @returns {Buffer}\n */\nfunction concatBulkBuffer (parser) {\n const list = parser.bufferCache\n const oldOffset = parser.offset\n const length = parser.bigStrSize - oldOffset - 2\n var chunks = list.length\n var offset = parser.bigStrSize - parser.totalChunkSize\n parser.offset = offset\n if (offset <= 2) {\n if (chunks === 2) {\n return list[0].slice(oldOffset, list[0].length + offset - 2)\n }\n chunks--\n offset = list[list.length - 2].length + offset\n }\n resizeBuffer(length)\n const start = bufferOffset\n list[0].copy(bufferPool, start, oldOffset, list[0].length)\n bufferOffset += list[0].length - oldOffset\n for (var i = 1; i < chunks - 1; i++) {\n list[i].copy(bufferPool, bufferOffset)\n bufferOffset += list[i].length\n }\n list[i].copy(bufferPool, bufferOffset, 0, offset - 2)\n bufferOffset += offset - 2\n return bufferPool.slice(start, bufferOffset)\n}\n\nclass JavascriptRedisParser {\n /**\n * Javascript Redis Parser constructor\n * @param {{returnError: Function, returnReply: Function, returnFatalError?: Function, returnBuffers: boolean, stringNumbers: boolean }} options\n * @constructor\n */\n constructor (options) {\n if (!options) {\n throw new TypeError('Options are mandatory.')\n }\n if (typeof options.returnError !== 'function' || typeof options.returnReply !== 'function') {\n throw new TypeError('The returnReply and returnError options have to be functions.')\n }\n this.setReturnBuffers(!!options.returnBuffers)\n this.setStringNumbers(!!options.stringNumbers)\n this.returnError = options.returnError\n this.returnFatalError = options.returnFatalError || options.returnError\n this.returnReply = options.returnReply\n this.reset()\n }\n\n /**\n * Reset the parser values to the initial state\n *\n * @returns {undefined}\n */\n reset () {\n this.offset = 0\n this.buffer = null\n this.bigStrSize = 0\n this.totalChunkSize = 0\n this.bufferCache = []\n this.arrayCache = []\n this.arrayPos = []\n }\n\n /**\n * Set the returnBuffers option\n *\n * @param {boolean} returnBuffers\n * @returns {undefined}\n */\n setReturnBuffers (returnBuffers) {\n if (typeof returnBuffers !== 'boolean') {\n throw new TypeError('The returnBuffers argument has to be a boolean')\n }\n this.optionReturnBuffers = returnBuffers\n }\n\n /**\n * Set the stringNumbers option\n *\n * @param {boolean} stringNumbers\n * @returns {undefined}\n */\n setStringNumbers (stringNumbers) {\n if (typeof stringNumbers !== 'boolean') {\n throw new TypeError('The stringNumbers argument has to be a boolean')\n }\n this.optionStringNumbers = stringNumbers\n }\n\n /**\n * Parse the redis buffer\n * @param {Buffer} buffer\n * @returns {undefined}\n */\n execute (buffer) {\n if (this.buffer === null) {\n this.buffer = buffer\n this.offset = 0\n } else if (this.bigStrSize === 0) {\n const oldLength = this.buffer.length\n const remainingLength = oldLength - this.offset\n const newBuffer = Buffer.allocUnsafe(remainingLength + buffer.length)\n this.buffer.copy(newBuffer, 0, this.offset, oldLength)\n buffer.copy(newBuffer, remainingLength, 0, buffer.length)\n this.buffer = newBuffer\n this.offset = 0\n if (this.arrayCache.length) {\n const arr = parseArrayChunks(this)\n if (arr === undefined) {\n return\n }\n this.returnReply(arr)\n }\n } else if (this.totalChunkSize + buffer.length >= this.bigStrSize) {\n this.bufferCache.push(buffer)\n var tmp = this.optionReturnBuffers ? concatBulkBuffer(this) : concatBulkString(this)\n this.bigStrSize = 0\n this.bufferCache = []\n this.buffer = buffer\n if (this.arrayCache.length) {\n this.arrayCache[0][this.arrayPos[0]++] = tmp\n tmp = parseArrayChunks(this)\n if (tmp === undefined) {\n return\n }\n }\n this.returnReply(tmp)\n } else {\n this.bufferCache.push(buffer)\n this.totalChunkSize += buffer.length\n return\n }\n\n while (this.offset < this.buffer.length) {\n const offset = this.offset\n const type = this.buffer[this.offset++]\n const response = parseType(this, type)\n if (response === undefined) {\n if (!(this.arrayCache.length || this.bufferCache.length)) {\n this.offset = offset\n }\n return\n }\n\n if (type === 45) {\n this.returnError(response)\n } else {\n this.returnReply(response)\n }\n }\n\n this.buffer = null\n }\n}\n\nmodule.exports = JavascriptRedisParser\n","'use strict'\n\nmodule.exports = require('./lib/parser')\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tiny class to simplify dealing with subscription set\n */\nclass SubscriptionSet {\n constructor() {\n this.set = {\n subscribe: {},\n psubscribe: {},\n ssubscribe: {},\n };\n }\n add(set, channel) {\n this.set[mapSet(set)][channel] = true;\n }\n del(set, channel) {\n delete this.set[mapSet(set)][channel];\n }\n channels(set) {\n return Object.keys(this.set[mapSet(set)]);\n }\n isEmpty() {\n return (this.channels(\"subscribe\").length === 0 &&\n this.channels(\"psubscribe\").length === 0 &&\n this.channels(\"ssubscribe\").length === 0);\n }\n}\nexports.default = SubscriptionSet;\nfunction mapSet(set) {\n if (set === \"unsubscribe\") {\n return \"subscribe\";\n }\n if (set === \"punsubscribe\") {\n return \"psubscribe\";\n }\n if (set === \"sunsubscribe\") {\n return \"ssubscribe\";\n }\n return set;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Command_1 = require(\"./Command\");\nconst utils_1 = require(\"./utils\");\nconst RedisParser = require(\"redis-parser\");\nconst SubscriptionSet_1 = require(\"./SubscriptionSet\");\nconst debug = (0, utils_1.Debug)(\"dataHandler\");\nclass DataHandler {\n constructor(redis, parserOptions) {\n this.redis = redis;\n const parser = new RedisParser({\n stringNumbers: parserOptions.stringNumbers,\n returnBuffers: true,\n returnError: (err) => {\n this.returnError(err);\n },\n returnFatalError: (err) => {\n this.returnFatalError(err);\n },\n returnReply: (reply) => {\n this.returnReply(reply);\n },\n });\n // prependListener ensures the parser receives and processes data before socket timeout checks are performed\n redis.stream.prependListener(\"data\", (data) => {\n parser.execute(data);\n });\n // prependListener() doesn't enable flowing mode automatically - we need to resume the stream manually\n redis.stream.resume();\n }\n returnFatalError(err) {\n err.message += \". Please report this.\";\n this.redis.recoverFromFatalError(err, err, { offlineQueue: false });\n }\n returnError(err) {\n const item = this.shiftCommand(err);\n if (!item) {\n return;\n }\n err.command = {\n name: item.command.name,\n args: item.command.args,\n };\n if (item.command.name == \"ssubscribe\" && err.message.includes(\"MOVED\")) {\n this.redis.emit(\"moved\");\n return;\n }\n this.redis.handleReconnection(err, item);\n }\n returnReply(reply) {\n if (this.handleMonitorReply(reply)) {\n return;\n }\n if (this.handleSubscriberReply(reply)) {\n return;\n }\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (Command_1.default.checkFlag(\"ENTER_SUBSCRIBER_MODE\", item.command.name)) {\n this.redis.condition.subscriber = new SubscriptionSet_1.default();\n this.redis.condition.subscriber.add(item.command.name, reply[1].toString());\n if (!fillSubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n }\n else if (Command_1.default.checkFlag(\"EXIT_SUBSCRIBER_MODE\", item.command.name)) {\n if (!fillUnsubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n }\n else {\n item.command.resolve(reply);\n }\n }\n handleSubscriberReply(reply) {\n if (!this.redis.condition.subscriber) {\n return false;\n }\n const replyType = Array.isArray(reply) ? reply[0].toString() : null;\n debug('receive reply \"%s\" in subscriber mode', replyType);\n switch (replyType) {\n case \"message\":\n if (this.redis.listeners(\"message\").length > 0) {\n // Check if there're listeners to avoid unnecessary `toString()`.\n this.redis.emit(\"message\", reply[1].toString(), reply[2] ? reply[2].toString() : \"\");\n }\n this.redis.emit(\"messageBuffer\", reply[1], reply[2]);\n break;\n case \"pmessage\": {\n const pattern = reply[1].toString();\n if (this.redis.listeners(\"pmessage\").length > 0) {\n this.redis.emit(\"pmessage\", pattern, reply[2].toString(), reply[3].toString());\n }\n this.redis.emit(\"pmessageBuffer\", pattern, reply[2], reply[3]);\n break;\n }\n case \"smessage\": {\n if (this.redis.listeners(\"smessage\").length > 0) {\n this.redis.emit(\"smessage\", reply[1].toString(), reply[2] ? reply[2].toString() : \"\");\n }\n this.redis.emit(\"smessageBuffer\", reply[1], reply[2]);\n break;\n }\n case \"ssubscribe\":\n case \"subscribe\":\n case \"psubscribe\": {\n const channel = reply[1].toString();\n this.redis.condition.subscriber.add(replyType, channel);\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (!fillSubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n break;\n }\n case \"sunsubscribe\":\n case \"unsubscribe\":\n case \"punsubscribe\": {\n const channel = reply[1] ? reply[1].toString() : null;\n if (channel) {\n this.redis.condition.subscriber.del(replyType, channel);\n }\n const count = reply[2];\n if (Number(count) === 0) {\n this.redis.condition.subscriber = false;\n }\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (!fillUnsubCommand(item.command, count)) {\n this.redis.commandQueue.unshift(item);\n }\n break;\n }\n default: {\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n item.command.resolve(reply);\n }\n }\n return true;\n }\n handleMonitorReply(reply) {\n if (this.redis.status !== \"monitoring\") {\n return false;\n }\n const replyStr = reply.toString();\n if (replyStr === \"OK\") {\n // Valid commands in the monitoring mode are AUTH and MONITOR,\n // both of which always reply with 'OK'.\n // So if we got an 'OK', we can make certain that\n // the reply is made to AUTH & MONITOR.\n return false;\n }\n // Since commands sent in the monitoring mode will trigger an exception,\n // any replies we received in the monitoring mode should consider to be\n // realtime monitor data instead of result of commands.\n const len = replyStr.indexOf(\" \");\n const timestamp = replyStr.slice(0, len);\n const argIndex = replyStr.indexOf('\"');\n const args = replyStr\n .slice(argIndex + 1, -1)\n .split('\" \"')\n .map((elem) => elem.replace(/\\\\\"/g, '\"'));\n const dbAndSource = replyStr.slice(len + 2, argIndex - 2).split(\" \");\n this.redis.emit(\"monitor\", timestamp, args, dbAndSource[1], dbAndSource[0]);\n return true;\n }\n shiftCommand(reply) {\n const item = this.redis.commandQueue.shift();\n if (!item) {\n const message = \"Command queue state error. If you can reproduce this, please report it.\";\n const error = new Error(message +\n (reply instanceof Error\n ? ` Last error: ${reply.message}`\n : ` Last reply: ${reply.toString()}`));\n this.redis.emit(\"error\", error);\n return null;\n }\n return item;\n }\n}\nexports.default = DataHandler;\nconst remainingRepliesMap = new WeakMap();\nfunction fillSubCommand(command, count) {\n let remainingReplies = remainingRepliesMap.has(command)\n ? remainingRepliesMap.get(command)\n : command.args.length;\n remainingReplies -= 1;\n if (remainingReplies <= 0) {\n command.resolve(count);\n remainingRepliesMap.delete(command);\n return true;\n }\n remainingRepliesMap.set(command, remainingReplies);\n return false;\n}\nfunction fillUnsubCommand(command, count) {\n let remainingReplies = remainingRepliesMap.has(command)\n ? remainingRepliesMap.get(command)\n : command.args.length;\n if (remainingReplies === 0) {\n if (Number(count) === 0) {\n remainingRepliesMap.delete(command);\n command.resolve(count);\n return true;\n }\n return false;\n }\n remainingReplies -= 1;\n if (remainingReplies <= 0) {\n command.resolve(count);\n return true;\n }\n remainingRepliesMap.set(command, remainingReplies);\n return false;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readyHandler = exports.errorHandler = exports.closeHandler = exports.connectHandler = void 0;\nconst redis_errors_1 = require(\"redis-errors\");\nconst Command_1 = require(\"../Command\");\nconst errors_1 = require(\"../errors\");\nconst utils_1 = require(\"../utils\");\nconst DataHandler_1 = require(\"../DataHandler\");\nconst debug = (0, utils_1.Debug)(\"connection\");\nfunction connectHandler(self) {\n return function () {\n self.setStatus(\"connect\");\n self.resetCommandQueue();\n // AUTH command should be processed before any other commands\n let flushed = false;\n const { connectionEpoch } = self;\n if (self.condition.auth) {\n self.auth(self.condition.auth, function (err) {\n if (connectionEpoch !== self.connectionEpoch) {\n return;\n }\n if (err) {\n if (err.message.indexOf(\"no password is set\") !== -1) {\n console.warn(\"[WARN] Redis server does not require a password, but a password was supplied.\");\n }\n else if (err.message.indexOf(\"without any password configured for the default user\") !== -1) {\n console.warn(\"[WARN] This Redis server's `default` user does not require a password, but a password was supplied\");\n }\n else if (err.message.indexOf(\"wrong number of arguments for 'auth' command\") !== -1) {\n console.warn(`[ERROR] The server returned \"wrong number of arguments for 'auth' command\". You are probably passing both username and password to Redis version 5 or below. You should only pass the 'password' option for Redis version 5 and under.`);\n }\n else {\n flushed = true;\n self.recoverFromFatalError(err, err);\n }\n }\n });\n }\n if (self.condition.select) {\n self.select(self.condition.select).catch((err) => {\n // If the node is in cluster mode, select is disallowed.\n // In this case, reconnect won't help.\n self.silentEmit(\"error\", err);\n });\n }\n if (!self.options.enableReadyCheck) {\n exports.readyHandler(self)();\n }\n /*\n No need to keep the reference of DataHandler here\n because we don't need to do the cleanup.\n `Stream#end()` will remove all listeners for us.\n */\n new DataHandler_1.default(self, {\n stringNumbers: self.options.stringNumbers,\n });\n if (self.options.enableReadyCheck) {\n self._readyCheck(function (err, info) {\n if (connectionEpoch !== self.connectionEpoch) {\n return;\n }\n if (err) {\n if (!flushed) {\n self.recoverFromFatalError(new Error(\"Ready check failed: \" + err.message), err);\n }\n }\n else {\n if (self.connector.check(info)) {\n exports.readyHandler(self)();\n }\n else {\n self.disconnect(true);\n }\n }\n });\n }\n };\n}\nexports.connectHandler = connectHandler;\nfunction abortError(command) {\n const err = new redis_errors_1.AbortError(\"Command aborted due to connection close\");\n err.command = {\n name: command.name,\n args: command.args,\n };\n return err;\n}\n// If a contiguous set of pipeline commands starts from index zero then they\n// can be safely reattempted. If however we have a chain of pipelined commands\n// starting at index 1 or more it means we received a partial response before\n// the connection close and those pipelined commands must be aborted. For\n// example, if the queue looks like this: [2, 3, 4, 0, 1, 2] then after\n// aborting and purging we'll have a queue that looks like this: [0, 1, 2]\nfunction abortIncompletePipelines(commandQueue) {\n var _a;\n let expectedIndex = 0;\n for (let i = 0; i < commandQueue.length;) {\n const command = (_a = commandQueue.peekAt(i)) === null || _a === void 0 ? void 0 : _a.command;\n const pipelineIndex = command.pipelineIndex;\n if (pipelineIndex === undefined || pipelineIndex === 0) {\n expectedIndex = 0;\n }\n if (pipelineIndex !== undefined && pipelineIndex !== expectedIndex++) {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n continue;\n }\n i++;\n }\n}\n// If only a partial transaction result was received before connection close,\n// we have to abort any transaction fragments that may have ended up in the\n// offline queue\nfunction abortTransactionFragments(commandQueue) {\n var _a;\n for (let i = 0; i < commandQueue.length;) {\n const command = (_a = commandQueue.peekAt(i)) === null || _a === void 0 ? void 0 : _a.command;\n if (command.name === \"multi\") {\n break;\n }\n if (command.name === \"exec\") {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n break;\n }\n if (command.inTransaction) {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n }\n else {\n i++;\n }\n }\n}\nfunction closeHandler(self) {\n return function () {\n const prevStatus = self.status;\n self.setStatus(\"close\");\n if (self.commandQueue.length) {\n abortIncompletePipelines(self.commandQueue);\n }\n if (self.offlineQueue.length) {\n abortTransactionFragments(self.offlineQueue);\n }\n if (prevStatus === \"ready\") {\n if (!self.prevCondition) {\n self.prevCondition = self.condition;\n }\n if (self.commandQueue.length) {\n self.prevCommandQueue = self.commandQueue;\n }\n }\n if (self.manuallyClosing) {\n self.manuallyClosing = false;\n debug(\"skip reconnecting since the connection is manually closed.\");\n return close();\n }\n if (typeof self.options.retryStrategy !== \"function\") {\n debug(\"skip reconnecting because `retryStrategy` is not a function\");\n return close();\n }\n const retryDelay = self.options.retryStrategy(++self.retryAttempts);\n if (typeof retryDelay !== \"number\") {\n debug(\"skip reconnecting because `retryStrategy` doesn't return a number\");\n return close();\n }\n debug(\"reconnect in %sms\", retryDelay);\n self.setStatus(\"reconnecting\", retryDelay);\n self.reconnectTimeout = setTimeout(function () {\n self.reconnectTimeout = null;\n self.connect().catch(utils_1.noop);\n }, retryDelay);\n const { maxRetriesPerRequest } = self.options;\n if (typeof maxRetriesPerRequest === \"number\") {\n if (maxRetriesPerRequest < 0) {\n debug(\"maxRetriesPerRequest is negative, ignoring...\");\n }\n else {\n const remainder = self.retryAttempts % (maxRetriesPerRequest + 1);\n if (remainder === 0) {\n debug(\"reach maxRetriesPerRequest limitation, flushing command queue...\");\n self.flushQueue(new errors_1.MaxRetriesPerRequestError(maxRetriesPerRequest));\n }\n }\n }\n };\n function close() {\n self.setStatus(\"end\");\n self.flushQueue(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n }\n}\nexports.closeHandler = closeHandler;\nfunction errorHandler(self) {\n return function (error) {\n debug(\"error: %s\", error);\n self.silentEmit(\"error\", error);\n };\n}\nexports.errorHandler = errorHandler;\nfunction readyHandler(self) {\n return function () {\n var _a, _b;\n self.setStatus(\"ready\");\n self.retryAttempts = 0;\n if (self.options.monitor) {\n self.call(\"monitor\").then(() => self.setStatus(\"monitoring\"), (error) => self.emit(\"error\", error));\n const { sendCommand } = self;\n self.sendCommand = function (command) {\n if (Command_1.default.checkFlag(\"VALID_IN_MONITOR_MODE\", command.name)) {\n return sendCommand.call(self, command);\n }\n command.reject(new Error(\"Connection is in monitoring mode, can't process commands.\"));\n return command.promise;\n };\n self.once(\"close\", function () {\n delete self.sendCommand;\n });\n return;\n }\n const finalSelect = self.prevCondition\n ? self.prevCondition.select\n : self.condition.select;\n if (self.options.connectionName) {\n debug(\"set the connection name [%s]\", self.options.connectionName);\n self.client(\"setname\", self.options.connectionName).catch(utils_1.noop);\n }\n if (!((_a = self.options) === null || _a === void 0 ? void 0 : _a.disableClientInfo)) {\n debug(\"set the client info\");\n let version = null;\n (0, utils_1.getPackageMeta)()\n .then((packageMeta) => {\n version = packageMeta === null || packageMeta === void 0 ? void 0 : packageMeta.version;\n })\n .catch(utils_1.noop)\n .finally(() => {\n self\n .client(\"SETINFO\", \"LIB-VER\", version)\n .catch(utils_1.noop);\n });\n self\n .client(\"SETINFO\", \"LIB-NAME\", ((_b = self.options) === null || _b === void 0 ? void 0 : _b.clientInfoTag)\n ? `ioredis(${self.options.clientInfoTag})`\n : \"ioredis\")\n .catch(utils_1.noop);\n }\n if (self.options.readOnly) {\n debug(\"set the connection to readonly mode\");\n self.readonly().catch(utils_1.noop);\n }\n if (self.prevCondition) {\n const condition = self.prevCondition;\n self.prevCondition = null;\n if (condition.subscriber && self.options.autoResubscribe) {\n // We re-select the previous db first since\n // `SELECT` command is not valid in sub mode.\n if (self.condition.select !== finalSelect) {\n debug(\"connect to db [%d]\", finalSelect);\n self.select(finalSelect);\n }\n const subscribeChannels = condition.subscriber.channels(\"subscribe\");\n if (subscribeChannels.length) {\n debug(\"subscribe %d channels\", subscribeChannels.length);\n self.subscribe(subscribeChannels);\n }\n const psubscribeChannels = condition.subscriber.channels(\"psubscribe\");\n if (psubscribeChannels.length) {\n debug(\"psubscribe %d channels\", psubscribeChannels.length);\n self.psubscribe(psubscribeChannels);\n }\n const ssubscribeChannels = condition.subscriber.channels(\"ssubscribe\");\n if (ssubscribeChannels.length) {\n debug(\"ssubscribe %s\", ssubscribeChannels.length);\n for (const channel of ssubscribeChannels) {\n self.ssubscribe(channel);\n }\n }\n }\n }\n if (self.prevCommandQueue) {\n if (self.options.autoResendUnfulfilledCommands) {\n debug(\"resend %d unfulfilled commands\", self.prevCommandQueue.length);\n while (self.prevCommandQueue.length > 0) {\n const item = self.prevCommandQueue.shift();\n if (item.select !== self.condition.select &&\n item.command.name !== \"select\") {\n self.select(item.select);\n }\n self.sendCommand(item.command, item.stream);\n }\n }\n else {\n self.prevCommandQueue = null;\n }\n }\n if (self.offlineQueue.length) {\n debug(\"send %d commands in offline queue\", self.offlineQueue.length);\n const offlineQueue = self.offlineQueue;\n self.resetOfflineQueue();\n while (offlineQueue.length > 0) {\n const item = offlineQueue.shift();\n if (item.select !== self.condition.select &&\n item.command.name !== \"select\") {\n self.select(item.select);\n }\n self.sendCommand(item.command, item.stream);\n }\n }\n if (self.condition.select !== finalSelect) {\n debug(\"connect to db [%d]\", finalSelect);\n self.select(finalSelect);\n }\n };\n}\nexports.readyHandler = readyHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_REDIS_OPTIONS = void 0;\nexports.DEFAULT_REDIS_OPTIONS = {\n // Connection\n port: 6379,\n host: \"localhost\",\n family: 4,\n connectTimeout: 10000,\n disconnectTimeout: 2000,\n retryStrategy: function (times) {\n return Math.min(times * 50, 2000);\n },\n keepAlive: 0,\n noDelay: true,\n connectionName: null,\n disableClientInfo: false,\n clientInfoTag: undefined,\n // Sentinel\n sentinels: null,\n name: null,\n role: \"master\",\n sentinelRetryStrategy: function (times) {\n return Math.min(times * 10, 1000);\n },\n sentinelReconnectStrategy: function () {\n // This strategy only applies when sentinels are used for detecting\n // a failover, not during initial master resolution.\n // The deployment can still function when some of the sentinels are down\n // for a long period of time, so we may not want to attempt reconnection\n // very often. Therefore the default interval is fairly long (1 minute).\n return 60000;\n },\n natMap: null,\n enableTLSForSentinelMode: false,\n updateSentinels: true,\n failoverDetector: false,\n // Status\n username: null,\n password: null,\n db: 0,\n // Others\n enableOfflineQueue: true,\n enableReadyCheck: true,\n autoResubscribe: true,\n autoResendUnfulfilledCommands: true,\n lazyConnect: false,\n keyPrefix: \"\",\n reconnectOnError: null,\n readOnly: false,\n stringNumbers: false,\n maxRetriesPerRequest: 20,\n maxLoadingRetryTime: 10000,\n enableAutoPipelining: false,\n autoPipeliningIgnoredCommands: [],\n sentinelMaxConnections: 10,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst events_1 = require(\"events\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst cluster_1 = require(\"./cluster\");\nconst Command_1 = require(\"./Command\");\nconst connectors_1 = require(\"./connectors\");\nconst SentinelConnector_1 = require(\"./connectors/SentinelConnector\");\nconst eventHandler = require(\"./redis/event_handler\");\nconst RedisOptions_1 = require(\"./redis/RedisOptions\");\nconst ScanStream_1 = require(\"./ScanStream\");\nconst transaction_1 = require(\"./transaction\");\nconst utils_1 = require(\"./utils\");\nconst applyMixin_1 = require(\"./utils/applyMixin\");\nconst Commander_1 = require(\"./utils/Commander\");\nconst lodash_1 = require(\"./utils/lodash\");\nconst Deque = require(\"denque\");\nconst debug = (0, utils_1.Debug)(\"redis\");\n/**\n * This is the major component of ioredis.\n * Use it to connect to a standalone Redis server or Sentinels.\n *\n * ```typescript\n * const redis = new Redis(); // Default port is 6379\n * async function main() {\n * redis.set(\"foo\", \"bar\");\n * redis.get(\"foo\", (err, result) => {\n * // `result` should be \"bar\"\n * console.log(err, result);\n * });\n * // Or use Promise\n * const result = await redis.get(\"foo\");\n * }\n * ```\n */\nclass Redis extends Commander_1.default {\n constructor(arg1, arg2, arg3) {\n super();\n this.status = \"wait\";\n /**\n * @ignore\n */\n this.isCluster = false;\n this.reconnectTimeout = null;\n this.connectionEpoch = 0;\n this.retryAttempts = 0;\n this.manuallyClosing = false;\n // Prepare autopipelines structures\n this._autoPipelines = new Map();\n this._runningAutoPipelines = new Set();\n this.parseOptions(arg1, arg2, arg3);\n events_1.EventEmitter.call(this);\n this.resetCommandQueue();\n this.resetOfflineQueue();\n if (this.options.Connector) {\n this.connector = new this.options.Connector(this.options);\n }\n else if (this.options.sentinels) {\n const sentinelConnector = new SentinelConnector_1.default(this.options);\n sentinelConnector.emitter = this;\n this.connector = sentinelConnector;\n }\n else {\n this.connector = new connectors_1.StandaloneConnector(this.options);\n }\n if (this.options.scripts) {\n Object.entries(this.options.scripts).forEach(([name, definition]) => {\n this.defineCommand(name, definition);\n });\n }\n // end(or wait) -> connecting -> connect -> ready -> end\n if (this.options.lazyConnect) {\n this.setStatus(\"wait\");\n }\n else {\n this.connect().catch(lodash_1.noop);\n }\n }\n /**\n * Create a Redis instance.\n * This is the same as `new Redis()` but is included for compatibility with node-redis.\n */\n static createClient(...args) {\n return new Redis(...args);\n }\n get autoPipelineQueueSize() {\n let queued = 0;\n for (const pipeline of this._autoPipelines.values()) {\n queued += pipeline.length;\n }\n return queued;\n }\n /**\n * Create a connection to Redis.\n * This method will be invoked automatically when creating a new Redis instance\n * unless `lazyConnect: true` is passed.\n *\n * When calling this method manually, a Promise is returned, which will\n * be resolved when the connection status is ready. The promise can reject\n * if the connection fails, times out, or if Redis is already connecting/connected.\n */\n connect(callback) {\n const promise = new Promise((resolve, reject) => {\n if (this.status === \"connecting\" ||\n this.status === \"connect\" ||\n this.status === \"ready\") {\n reject(new Error(\"Redis is already connecting/connected\"));\n return;\n }\n this.connectionEpoch += 1;\n this.setStatus(\"connecting\");\n const { options } = this;\n this.condition = {\n select: options.db,\n auth: options.username\n ? [options.username, options.password]\n : options.password,\n subscriber: false,\n };\n const _this = this;\n (0, standard_as_callback_1.default)(this.connector.connect(function (type, err) {\n _this.silentEmit(type, err);\n }), function (err, stream) {\n if (err) {\n _this.flushQueue(err);\n _this.silentEmit(\"error\", err);\n reject(err);\n _this.setStatus(\"end\");\n return;\n }\n let CONNECT_EVENT = options.tls ? \"secureConnect\" : \"connect\";\n if (\"sentinels\" in options &&\n options.sentinels &&\n !options.enableTLSForSentinelMode) {\n CONNECT_EVENT = \"connect\";\n }\n _this.stream = stream;\n if (options.noDelay) {\n stream.setNoDelay(true);\n }\n // Node ignores setKeepAlive before connect, therefore we wait for the event:\n // https://github.com/nodejs/node/issues/31663\n if (typeof options.keepAlive === \"number\") {\n if (stream.connecting) {\n stream.once(CONNECT_EVENT, () => {\n stream.setKeepAlive(true, options.keepAlive);\n });\n }\n else {\n stream.setKeepAlive(true, options.keepAlive);\n }\n }\n if (stream.connecting) {\n stream.once(CONNECT_EVENT, eventHandler.connectHandler(_this));\n if (options.connectTimeout) {\n /*\n * Typically, Socket#setTimeout(0) will clear the timer\n * set before. However, in some platforms (Electron 3.x~4.x),\n * the timer will not be cleared. So we introduce a variable here.\n *\n * See https://github.com/electron/electron/issues/14915\n */\n let connectTimeoutCleared = false;\n stream.setTimeout(options.connectTimeout, function () {\n if (connectTimeoutCleared) {\n return;\n }\n stream.setTimeout(0);\n stream.destroy();\n const err = new Error(\"connect ETIMEDOUT\");\n // @ts-expect-error\n err.errorno = \"ETIMEDOUT\";\n // @ts-expect-error\n err.code = \"ETIMEDOUT\";\n // @ts-expect-error\n err.syscall = \"connect\";\n eventHandler.errorHandler(_this)(err);\n });\n stream.once(CONNECT_EVENT, function () {\n connectTimeoutCleared = true;\n stream.setTimeout(0);\n });\n }\n }\n else if (stream.destroyed) {\n const firstError = _this.connector.firstError;\n if (firstError) {\n process.nextTick(() => {\n eventHandler.errorHandler(_this)(firstError);\n });\n }\n process.nextTick(eventHandler.closeHandler(_this));\n }\n else {\n process.nextTick(eventHandler.connectHandler(_this));\n }\n if (!stream.destroyed) {\n stream.once(\"error\", eventHandler.errorHandler(_this));\n stream.once(\"close\", eventHandler.closeHandler(_this));\n }\n const connectionReadyHandler = function () {\n _this.removeListener(\"close\", connectionCloseHandler);\n resolve();\n };\n var connectionCloseHandler = function () {\n _this.removeListener(\"ready\", connectionReadyHandler);\n reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n };\n _this.once(\"ready\", connectionReadyHandler);\n _this.once(\"close\", connectionCloseHandler);\n });\n });\n return (0, standard_as_callback_1.default)(promise, callback);\n }\n /**\n * Disconnect from Redis.\n *\n * This method closes the connection immediately,\n * and may lose some pending replies that haven't written to client.\n * If you want to wait for the pending replies, use Redis#quit instead.\n */\n disconnect(reconnect = false) {\n if (!reconnect) {\n this.manuallyClosing = true;\n }\n if (this.reconnectTimeout && !reconnect) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.status === \"wait\") {\n eventHandler.closeHandler(this)();\n }\n else {\n this.connector.disconnect();\n }\n }\n /**\n * Disconnect from Redis.\n *\n * @deprecated\n */\n end() {\n this.disconnect();\n }\n /**\n * Create a new instance with the same options as the current one.\n *\n * @example\n * ```js\n * var redis = new Redis(6380);\n * var anotherRedis = redis.duplicate();\n * ```\n */\n duplicate(override) {\n return new Redis({ ...this.options, ...override });\n }\n /**\n * Mode of the connection.\n *\n * One of `\"normal\"`, `\"subscriber\"`, or `\"monitor\"`. When the connection is\n * not in `\"normal\"` mode, certain commands are not allowed.\n */\n get mode() {\n var _a;\n return this.options.monitor\n ? \"monitor\"\n : ((_a = this.condition) === null || _a === void 0 ? void 0 : _a.subscriber)\n ? \"subscriber\"\n : \"normal\";\n }\n /**\n * Listen for all requests received by the server in real time.\n *\n * This command will create a new connection to Redis and send a\n * MONITOR command via the new connection in order to avoid disturbing\n * the current connection.\n *\n * @param callback The callback function. If omit, a promise will be returned.\n * @example\n * ```js\n * var redis = new Redis();\n * redis.monitor(function (err, monitor) {\n * // Entering monitoring mode.\n * monitor.on('monitor', function (time, args, source, database) {\n * console.log(time + \": \" + util.inspect(args));\n * });\n * });\n *\n * // supports promise as well as other commands\n * redis.monitor().then(function (monitor) {\n * monitor.on('monitor', function (time, args, source, database) {\n * console.log(time + \": \" + util.inspect(args));\n * });\n * });\n * ```\n */\n monitor(callback) {\n const monitorInstance = this.duplicate({\n monitor: true,\n lazyConnect: false,\n });\n return (0, standard_as_callback_1.default)(new Promise(function (resolve, reject) {\n monitorInstance.once(\"error\", reject);\n monitorInstance.once(\"monitoring\", function () {\n resolve(monitorInstance);\n });\n }), callback);\n }\n /**\n * Send a command to Redis\n *\n * This method is used internally and in most cases you should not\n * use it directly. If you need to send a command that is not supported\n * by the library, you can use the `call` method:\n *\n * ```js\n * const redis = new Redis();\n *\n * redis.call('set', 'foo', 'bar');\n * // or\n * redis.call(['set', 'foo', 'bar']);\n * ```\n *\n * @ignore\n */\n sendCommand(command, stream) {\n var _a, _b;\n if (this.status === \"wait\") {\n this.connect().catch(lodash_1.noop);\n }\n if (this.status === \"end\") {\n command.reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return command.promise;\n }\n if (((_a = this.condition) === null || _a === void 0 ? void 0 : _a.subscriber) &&\n !Command_1.default.checkFlag(\"VALID_IN_SUBSCRIBER_MODE\", command.name)) {\n command.reject(new Error(\"Connection in subscriber mode, only subscriber commands may be used\"));\n return command.promise;\n }\n if (typeof this.options.commandTimeout === \"number\") {\n command.setTimeout(this.options.commandTimeout);\n }\n let writable = this.status === \"ready\" ||\n (!stream &&\n this.status === \"connect\" &&\n (0, commands_1.exists)(command.name) &&\n (0, commands_1.hasFlag)(command.name, \"loading\"));\n if (!this.stream) {\n writable = false;\n }\n else if (!this.stream.writable) {\n writable = false;\n // @ts-expect-error\n }\n else if (this.stream._writableState && this.stream._writableState.ended) {\n // TODO: We should be able to remove this as the PR has already been merged.\n // https://github.com/iojs/io.js/pull/1217\n writable = false;\n }\n if (!writable) {\n if (!this.options.enableOfflineQueue) {\n command.reject(new Error(\"Stream isn't writeable and enableOfflineQueue options is false\"));\n return command.promise;\n }\n if (command.name === \"quit\" && this.offlineQueue.length === 0) {\n this.disconnect();\n command.resolve(Buffer.from(\"OK\"));\n return command.promise;\n }\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"queue command[%s]: %d -> %s(%o)\", this._getDescription(), this.condition.select, command.name, command.args);\n }\n this.offlineQueue.push({\n command: command,\n stream: stream,\n select: this.condition.select,\n });\n }\n else {\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"write command[%s]: %d -> %s(%o)\", this._getDescription(), (_b = this.condition) === null || _b === void 0 ? void 0 : _b.select, command.name, command.args);\n }\n if (stream) {\n if (\"isPipeline\" in stream && stream.isPipeline) {\n stream.write(command.toWritable(stream.destination.redis.stream));\n }\n else {\n stream.write(command.toWritable(stream));\n }\n }\n else {\n this.stream.write(command.toWritable(this.stream));\n }\n this.commandQueue.push({\n command: command,\n stream: stream,\n select: this.condition.select,\n });\n if (Command_1.default.checkFlag(\"WILL_DISCONNECT\", command.name)) {\n this.manuallyClosing = true;\n }\n if (this.options.socketTimeout !== undefined && this.socketTimeoutTimer === undefined) {\n this.setSocketTimeout();\n }\n }\n if (command.name === \"select\" && (0, utils_1.isInt)(command.args[0])) {\n const db = parseInt(command.args[0], 10);\n if (this.condition.select !== db) {\n this.condition.select = db;\n this.emit(\"select\", db);\n debug(\"switch to db [%d]\", this.condition.select);\n }\n }\n return command.promise;\n }\n setSocketTimeout() {\n this.socketTimeoutTimer = setTimeout(() => {\n this.stream.destroy(new Error(`Socket timeout. Expecting data, but didn't receive any in ${this.options.socketTimeout}ms.`));\n this.socketTimeoutTimer = undefined;\n }, this.options.socketTimeout);\n // this handler must run after the \"data\" handler in \"DataHandler\"\n // so that `this.commandQueue.length` will be updated\n this.stream.once(\"data\", () => {\n clearTimeout(this.socketTimeoutTimer);\n this.socketTimeoutTimer = undefined;\n if (this.commandQueue.length === 0)\n return;\n this.setSocketTimeout();\n });\n }\n scanStream(options) {\n return this.createScanStream(\"scan\", { options });\n }\n scanBufferStream(options) {\n return this.createScanStream(\"scanBuffer\", { options });\n }\n sscanStream(key, options) {\n return this.createScanStream(\"sscan\", { key, options });\n }\n sscanBufferStream(key, options) {\n return this.createScanStream(\"sscanBuffer\", { key, options });\n }\n hscanStream(key, options) {\n return this.createScanStream(\"hscan\", { key, options });\n }\n hscanBufferStream(key, options) {\n return this.createScanStream(\"hscanBuffer\", { key, options });\n }\n zscanStream(key, options) {\n return this.createScanStream(\"zscan\", { key, options });\n }\n zscanBufferStream(key, options) {\n return this.createScanStream(\"zscanBuffer\", { key, options });\n }\n /**\n * Emit only when there's at least one listener.\n *\n * @ignore\n */\n silentEmit(eventName, arg) {\n let error;\n if (eventName === \"error\") {\n error = arg;\n if (this.status === \"end\") {\n return;\n }\n if (this.manuallyClosing) {\n // ignore connection related errors when manually disconnecting\n if (error instanceof Error &&\n (error.message === utils_1.CONNECTION_CLOSED_ERROR_MSG ||\n // @ts-expect-error\n error.syscall === \"connect\" ||\n // @ts-expect-error\n error.syscall === \"read\")) {\n return;\n }\n }\n }\n if (this.listeners(eventName).length > 0) {\n return this.emit.apply(this, arguments);\n }\n if (error && error instanceof Error) {\n console.error(\"[ioredis] Unhandled error event:\", error.stack);\n }\n return false;\n }\n /**\n * @ignore\n */\n recoverFromFatalError(_commandError, err, options) {\n this.flushQueue(err, options);\n this.silentEmit(\"error\", err);\n this.disconnect(true);\n }\n /**\n * @ignore\n */\n handleReconnection(err, item) {\n var _a;\n let needReconnect = false;\n if (this.options.reconnectOnError) {\n needReconnect = this.options.reconnectOnError(err);\n }\n switch (needReconnect) {\n case 1:\n case true:\n if (this.status !== \"reconnecting\") {\n this.disconnect(true);\n }\n item.command.reject(err);\n break;\n case 2:\n if (this.status !== \"reconnecting\") {\n this.disconnect(true);\n }\n if (((_a = this.condition) === null || _a === void 0 ? void 0 : _a.select) !== item.select &&\n item.command.name !== \"select\") {\n this.select(item.select);\n }\n // TODO\n // @ts-expect-error\n this.sendCommand(item.command);\n break;\n default:\n item.command.reject(err);\n }\n }\n /**\n * Get description of the connection. Used for debugging.\n */\n _getDescription() {\n let description;\n if (\"path\" in this.options && this.options.path) {\n description = this.options.path;\n }\n else if (this.stream &&\n this.stream.remoteAddress &&\n this.stream.remotePort) {\n description = this.stream.remoteAddress + \":\" + this.stream.remotePort;\n }\n else if (\"host\" in this.options && this.options.host) {\n description = this.options.host + \":\" + this.options.port;\n }\n else {\n // Unexpected\n description = \"\";\n }\n if (this.options.connectionName) {\n description += ` (${this.options.connectionName})`;\n }\n return description;\n }\n resetCommandQueue() {\n this.commandQueue = new Deque();\n }\n resetOfflineQueue() {\n this.offlineQueue = new Deque();\n }\n parseOptions(...args) {\n const options = {};\n let isTls = false;\n for (let i = 0; i < args.length; ++i) {\n const arg = args[i];\n if (arg === null || typeof arg === \"undefined\") {\n continue;\n }\n if (typeof arg === \"object\") {\n (0, lodash_1.defaults)(options, arg);\n }\n else if (typeof arg === \"string\") {\n (0, lodash_1.defaults)(options, (0, utils_1.parseURL)(arg));\n if (arg.startsWith(\"rediss://\")) {\n isTls = true;\n }\n }\n else if (typeof arg === \"number\") {\n options.port = arg;\n }\n else {\n throw new Error(\"Invalid argument \" + arg);\n }\n }\n if (isTls) {\n (0, lodash_1.defaults)(options, { tls: true });\n }\n (0, lodash_1.defaults)(options, Redis.defaultOptions);\n if (typeof options.port === \"string\") {\n options.port = parseInt(options.port, 10);\n }\n if (typeof options.db === \"string\") {\n options.db = parseInt(options.db, 10);\n }\n // @ts-expect-error\n this.options = (0, utils_1.resolveTLSProfile)(options);\n }\n /**\n * Change instance's status\n */\n setStatus(status, arg) {\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"status[%s]: %s -> %s\", this._getDescription(), this.status || \"[empty]\", status);\n }\n this.status = status;\n process.nextTick(this.emit.bind(this, status, arg));\n }\n createScanStream(command, { key, options = {} }) {\n return new ScanStream_1.default({\n objectMode: true,\n key: key,\n redis: this,\n command: command,\n ...options,\n });\n }\n /**\n * Flush offline queue and command queue with error.\n *\n * @param error The error object to send to the commands\n * @param options options\n */\n flushQueue(error, options) {\n options = (0, lodash_1.defaults)({}, options, {\n offlineQueue: true,\n commandQueue: true,\n });\n let item;\n if (options.offlineQueue) {\n while ((item = this.offlineQueue.shift())) {\n item.command.reject(error);\n }\n }\n if (options.commandQueue) {\n if (this.commandQueue.length > 0) {\n if (this.stream) {\n this.stream.removeAllListeners(\"data\");\n }\n while ((item = this.commandQueue.shift())) {\n item.command.reject(error);\n }\n }\n }\n }\n /**\n * Check whether Redis has finished loading the persistent data and is able to\n * process commands.\n */\n _readyCheck(callback) {\n const _this = this;\n this.info(function (err, res) {\n if (err) {\n if (err.message && err.message.includes(\"NOPERM\")) {\n console.warn(`Skipping the ready check because INFO command fails: \"${err.message}\". You can disable ready check with \"enableReadyCheck\". More: https://github.com/luin/ioredis/wiki/Disable-ready-check.`);\n return callback(null, {});\n }\n return callback(err);\n }\n if (typeof res !== \"string\") {\n return callback(null, res);\n }\n const info = {};\n const lines = res.split(\"\\r\\n\");\n for (let i = 0; i < lines.length; ++i) {\n const [fieldName, ...fieldValueParts] = lines[i].split(\":\");\n const fieldValue = fieldValueParts.join(\":\");\n if (fieldValue) {\n info[fieldName] = fieldValue;\n }\n }\n if (!info.loading || info.loading === \"0\") {\n callback(null, info);\n }\n else {\n const loadingEtaMs = (info.loading_eta_seconds || 1) * 1000;\n const retryTime = _this.options.maxLoadingRetryTime &&\n _this.options.maxLoadingRetryTime < loadingEtaMs\n ? _this.options.maxLoadingRetryTime\n : loadingEtaMs;\n debug(\"Redis server still loading, trying again in \" + retryTime + \"ms\");\n setTimeout(function () {\n _this._readyCheck(callback);\n }, retryTime);\n }\n }).catch(lodash_1.noop);\n }\n}\nRedis.Cluster = cluster_1.default;\nRedis.Command = Command_1.default;\n/**\n * Default options\n */\nRedis.defaultOptions = RedisOptions_1.DEFAULT_REDIS_OPTIONS;\n(0, applyMixin_1.default)(Redis, events_1.EventEmitter);\n(0, transaction_1.addTransactionSupport)(Redis.prototype);\nexports.default = Redis;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.print = exports.ReplyError = exports.SentinelIterator = exports.SentinelConnector = exports.AbstractConnector = exports.Pipeline = exports.ScanStream = exports.Command = exports.Cluster = exports.Redis = exports.default = void 0;\nexports = module.exports = require(\"./Redis\").default;\nvar Redis_1 = require(\"./Redis\");\nObject.defineProperty(exports, \"default\", { enumerable: true, get: function () { return Redis_1.default; } });\nvar Redis_2 = require(\"./Redis\");\nObject.defineProperty(exports, \"Redis\", { enumerable: true, get: function () { return Redis_2.default; } });\nvar cluster_1 = require(\"./cluster\");\nObject.defineProperty(exports, \"Cluster\", { enumerable: true, get: function () { return cluster_1.default; } });\n/**\n * @ignore\n */\nvar Command_1 = require(\"./Command\");\nObject.defineProperty(exports, \"Command\", { enumerable: true, get: function () { return Command_1.default; } });\n/**\n * @ignore\n */\nvar ScanStream_1 = require(\"./ScanStream\");\nObject.defineProperty(exports, \"ScanStream\", { enumerable: true, get: function () { return ScanStream_1.default; } });\n/**\n * @ignore\n */\nvar Pipeline_1 = require(\"./Pipeline\");\nObject.defineProperty(exports, \"Pipeline\", { enumerable: true, get: function () { return Pipeline_1.default; } });\n/**\n * @ignore\n */\nvar AbstractConnector_1 = require(\"./connectors/AbstractConnector\");\nObject.defineProperty(exports, \"AbstractConnector\", { enumerable: true, get: function () { return AbstractConnector_1.default; } });\n/**\n * @ignore\n */\nvar SentinelConnector_1 = require(\"./connectors/SentinelConnector\");\nObject.defineProperty(exports, \"SentinelConnector\", { enumerable: true, get: function () { return SentinelConnector_1.default; } });\nObject.defineProperty(exports, \"SentinelIterator\", { enumerable: true, get: function () { return SentinelConnector_1.SentinelIterator; } });\n// No TS typings\nexports.ReplyError = require(\"redis-errors\").ReplyError;\n/**\n * @ignore\n */\nObject.defineProperty(exports, \"Promise\", {\n get() {\n console.warn(\"ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.\");\n return Promise;\n },\n set(_lib) {\n console.warn(\"ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.\");\n },\n});\n/**\n * @ignore\n */\nfunction print(err, reply) {\n if (err) {\n console.log(\"Error: \" + err);\n }\n else {\n console.log(\"Reply: \" + reply);\n }\n}\nexports.print = print;\n","/**\n * Redis factory with automatic environment variable detection\n * Supports: Single, Master-Replica, Sentinel, Cluster\n */\n\nimport type { Redis, Cluster, RedisOptions, ClusterOptions } from 'ioredis';\nimport { logger } from '../logger';\n\nconst cacheLogger = logger.child('cache');\n\nexport interface RedisClients {\n /** Primary Redis for writes (or both read/write if no replica) */\n write?: Redis | Cluster;\n /** Replica Redis for reads (optional, falls back to write) */\n read?: Redis | Cluster;\n}\n\n/**\n * Check if any Redis configuration exists in environment\n */\nfunction hasRedisConfig(): boolean\n{\n return !!(\n process.env.REDIS_URL ||\n process.env.REDIS_WRITE_URL ||\n process.env.REDIS_READ_URL ||\n process.env.REDIS_SENTINEL_HOSTS ||\n process.env.REDIS_CLUSTER_NODES\n );\n}\n\n/**\n * Create Redis client with TLS support\n */\nfunction createClient(\n RedisClient: new (url: string, options?: RedisOptions) => Redis,\n url: string\n): Redis\n{\n const options: RedisOptions = {};\n\n // TLS support for rediss://\n if (url.startsWith('rediss://'))\n {\n options.tls = {\n rejectUnauthorized: process.env.REDIS_TLS_REJECT_UNAUTHORIZED !== 'false',\n };\n }\n\n return new RedisClient(url, options);\n}\n\n/**\n * Create Redis client(s) from environment variables\n *\n * Supported patterns (priority order):\n * 1. Single instance: REDIS_URL\n * 2. Master-Replica: REDIS_WRITE_URL + REDIS_READ_URL\n * 3. Sentinel: REDIS_SENTINEL_HOSTS + REDIS_MASTER_NAME\n * 4. Cluster: REDIS_CLUSTER_NODES\n *\n * @returns Redis client(s) or undefined if no configuration found\n *\n * @example\n * ```bash\n * # Single (most common)\n * REDIS_URL=redis://localhost:6379\n * REDIS_URL=rediss://secure.redis.com:6380 # TLS\n *\n * # Master-Replica\n * REDIS_WRITE_URL=redis://master:6379\n * REDIS_READ_URL=redis://replica:6379\n *\n * # Sentinel\n * REDIS_SENTINEL_HOSTS=sentinel1:26379,sentinel2:26379\n * REDIS_MASTER_NAME=mymaster\n * REDIS_PASSWORD=secret\n *\n * # Cluster\n * REDIS_CLUSTER_NODES=node1:6379,node2:6379,node3:6379\n * REDIS_PASSWORD=secret\n * ```\n */\nexport async function createRedisFromEnv(): Promise<RedisClients>\n{\n // Quick exit if no Redis config\n if (!hasRedisConfig())\n {\n return { write: undefined, read: undefined };\n }\n\n try\n {\n // Dynamic import to avoid bundling if not used\n const ioredis = await import('ioredis');\n const RedisClient = ioredis.default;\n\n // 1. Single instance (most common - highest priority)\n if (\n process.env.REDIS_URL &&\n !process.env.REDIS_WRITE_URL &&\n !process.env.REDIS_READ_URL &&\n !process.env.REDIS_CLUSTER_NODES\n )\n {\n const client = createClient(RedisClient, process.env.REDIS_URL);\n return { write: client, read: client };\n }\n\n // 2. Master-Replica pattern (both URLs required)\n if (process.env.REDIS_WRITE_URL && process.env.REDIS_READ_URL)\n {\n const write = createClient(RedisClient, process.env.REDIS_WRITE_URL);\n const read = createClient(RedisClient, process.env.REDIS_READ_URL);\n return { write, read };\n }\n\n // 3. Sentinel pattern\n if (process.env.REDIS_SENTINEL_HOSTS && process.env.REDIS_MASTER_NAME)\n {\n const sentinels = process.env.REDIS_SENTINEL_HOSTS.split(',').map((host) =>\n {\n const [hostname, port] = host.trim().split(':');\n return { host: hostname, port: Number(port) || 26379 };\n });\n\n const options: RedisOptions = {\n sentinels,\n name: process.env.REDIS_MASTER_NAME,\n password: process.env.REDIS_PASSWORD,\n };\n\n const client = new RedisClient(options);\n return { write: client, read: client };\n }\n\n // 4. Cluster pattern\n if (process.env.REDIS_CLUSTER_NODES)\n {\n const nodes = process.env.REDIS_CLUSTER_NODES.split(',').map((node) =>\n {\n const [host, port] = node.trim().split(':');\n return { host, port: Number(port) || 6379 };\n });\n\n const clusterOptions: ClusterOptions = {\n redisOptions: {\n password: process.env.REDIS_PASSWORD,\n },\n };\n\n const cluster = new RedisClient.Cluster(nodes, clusterOptions);\n return { write: cluster, read: cluster };\n }\n\n // 5. Fallback: Single URL with other configs present\n if (process.env.REDIS_URL)\n {\n const client = createClient(RedisClient, process.env.REDIS_URL);\n return { write: client, read: client };\n }\n\n // No valid configuration\n return { write: undefined, read: undefined };\n }\n catch (error)\n {\n if (error instanceof Error)\n {\n cacheLogger.warn(\n 'Failed to create Redis client',\n error,\n { suggestion: 'Using memory-only cache. Install ioredis: npm install ioredis' }\n );\n }\n else\n {\n cacheLogger.warn(\n 'Failed to create Redis client',\n { error: String(error), suggestion: 'Using memory-only cache. Install ioredis: npm install ioredis' }\n );\n }\n return { write: undefined, read: undefined };\n }\n}\n\n/**\n * Create single Redis client (backward compatibility)\n * Only returns write instance\n */\nexport async function createSingleRedisFromEnv(): Promise<Redis | Cluster | undefined>\n{\n const { write } = await createRedisFromEnv();\n return write;\n}","/**\n * Global Redis instance manager\n * Provides singleton access to Redis across all modules\n * Supports Master-Replica pattern with separate read/write instances\n */\n\nimport type { Redis, Cluster } from 'ioredis';\n\nimport { createRedisFromEnv } from './redis-factory.js';\nimport { logger } from '../logger';\n\nconst cacheLogger = logger.child('cache');\n\nlet writeInstance: Redis | Cluster | undefined;\nlet readInstance: Redis | Cluster | undefined;\n\n/**\n * Get global Redis write instance\n *\n * @returns Redis write instance or undefined if not initialized\n *\n * @example\n * ```typescript\n * import { getRedis } from '@spfn/core/cache';\n *\n * const redis = getRedis();\n * if (redis) {\n * await redis.set('key', 'value');\n * }\n * ```\n */\nexport function getRedis(): Redis | Cluster | undefined\n{\n return writeInstance;\n}\n\n/**\n * Get global Redis read instance (falls back to write if no replica)\n *\n * @returns Redis read instance or write instance as fallback\n *\n * @example\n * ```typescript\n * import { getRedisRead } from '@spfn/core/cache';\n *\n * const redis = getRedisRead();\n * if (redis) {\n * const value = await redis.get('key');\n * }\n * ```\n */\nexport function getRedisRead(): Redis | Cluster | undefined\n{\n return readInstance ?? writeInstance;\n}\n\n/**\n * Set global Redis instances (for testing or manual configuration)\n *\n * @param write - Redis write instance\n * @param read - Redis read instance (optional, defaults to write)\n *\n * @example\n * ```typescript\n * import { setRedis } from '@spfn/core/cache';\n * import Redis from 'ioredis';\n *\n * const write = new Redis('redis://master:6379');\n * const read = new Redis('redis://replica:6379');\n * setRedis(write, read);\n * ```\n */\nexport function setRedis(\n write: Redis | Cluster | undefined,\n read?: Redis | Cluster | undefined\n): void\n{\n writeInstance = write;\n readInstance = read ?? write;\n}\n\n/**\n * Initialize Redis from environment variables\n * Automatically called by startServer()\n *\n * Supported environment variables:\n * - REDIS_URL (single instance)\n * - REDIS_WRITE_URL + REDIS_READ_URL (master-replica)\n * - REDIS_SENTINEL_HOSTS + REDIS_MASTER_NAME (sentinel)\n * - REDIS_CLUSTER_NODES (cluster)\n * - REDIS_TLS_REJECT_UNAUTHORIZED (TLS config)\n *\n * @returns Object with write and read instances\n *\n * @example\n * ```typescript\n * import { initRedis } from '@spfn/core/cache';\n *\n * // Manual initialization (not needed if using startServer)\n * const { write, read } = await initRedis();\n * ```\n */\nexport async function initRedis(): Promise<{ write?: Redis | Cluster; read?: Redis | Cluster }>\n{\n // Already initialized\n if (writeInstance)\n {\n return { write: writeInstance, read: readInstance };\n }\n\n // Auto-detect from environment\n const { write, read } = await createRedisFromEnv();\n\n if (write)\n {\n try\n {\n // Test connection\n await write.ping();\n\n // Test read instance if different\n if (read && read !== write)\n {\n await read.ping();\n }\n\n writeInstance = write;\n readInstance = read;\n\n const hasReplica = read && read !== write;\n cacheLogger.info(\n hasReplica\n ? 'Redis connected (Master-Replica)'\n : 'Redis connected'\n );\n }\n catch (error)\n {\n cacheLogger.error(\n 'Redis connection failed',\n error instanceof Error ? error : new Error(String(error))\n );\n\n // Clean up failed connections\n try\n {\n await write.quit();\n if (read && read !== write)\n {\n await read.quit();\n }\n }\n catch\n {\n // Ignore cleanup errors\n }\n\n return { write: undefined, read: undefined };\n }\n }\n\n return { write: writeInstance, read: readInstance };\n}\n\n/**\n * Close all Redis connections and cleanup\n *\n * @example\n * ```typescript\n * import { closeRedis } from '@spfn/core/cache';\n *\n * // During graceful shutdown\n * await closeRedis();\n * ```\n */\nexport async function closeRedis(): Promise<void>\n{\n const closePromises: Promise<unknown>[] = [];\n\n if (writeInstance)\n {\n closePromises.push(\n writeInstance.quit().catch((err: Error) =>\n {\n cacheLogger.error('Error closing Redis write instance', err);\n })\n );\n }\n\n if (readInstance && readInstance !== writeInstance)\n {\n closePromises.push(\n readInstance.quit().catch((err: Error) =>\n {\n cacheLogger.error('Error closing Redis read instance', err);\n })\n );\n }\n\n await Promise.all(closePromises);\n\n writeInstance = undefined;\n readInstance = undefined;\n\n cacheLogger.info('Redis connections closed');\n}\n\n/**\n * Get Redis connection info (for debugging)\n */\nexport function getRedisInfo(): {\n hasWrite: boolean;\n hasRead: boolean;\n isReplica: boolean;\n}\n{\n return {\n hasWrite: !!writeInstance,\n hasRead: !!readInstance,\n isReplica: !!(readInstance && readInstance !== writeInstance),\n };\n}","/**\n * Redis cache infrastructure\n * Provides singleton Redis instance management for all SPFN modules\n * Supports Master-Replica pattern with separate read/write instances\n */\n\nexport { createRedisFromEnv, createSingleRedisFromEnv } from './redis-factory.js';\nexport { getRedis, getRedisRead, setRedis, initRedis, closeRedis, getRedisInfo } from './redis-manager.js';\nexport type { RedisClients } from './redis-factory.js';","/**\n * HTTP Error Classes\n *\n * Standard HTTP error classes for API responses\n * Covers common HTTP status codes beyond database errors\n */\n\n/**\n * Base HTTP Error\n *\n * Base class for all HTTP-related errors\n */\nexport class HttpError<TDetails extends Record<string, unknown> = Record<string, unknown>> extends Error\n{\n public readonly statusCode: number;\n public readonly details?: TDetails;\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n statusCode: number,\n details?: TDetails\n )\n {\n super(message);\n this.name = 'HttpError';\n this.statusCode = statusCode;\n this.details = details;\n this.timestamp = new Date();\n Error.captureStackTrace(this, this.constructor);\n }\n\n /**\n * Serialize error for API response\n */\n toJSON()\n {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n timestamp: this.timestamp.toISOString()\n };\n }\n}\n\n/**\n * Bad Request Error (400)\n *\n * Generic bad request - malformed syntax, invalid parameters, etc.\n */\nexport class BadRequestError extends HttpError\n{\n constructor(message: string = 'Bad request', details?: Record<string, any>)\n {\n super(message, 400, details);\n this.name = 'BadRequestError';\n }\n}\n\n/**\n * Unauthorized Error (401)\n *\n * Authentication required or authentication failed\n */\nexport class UnauthorizedError extends HttpError\n{\n constructor(message: string = 'Authentication required', details?: Record<string, any>)\n {\n super(message, 401, details);\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * Forbidden Error (403)\n *\n * Authenticated but lacks permission to access resource\n */\nexport class ForbiddenError extends HttpError\n{\n constructor(message: string = 'Access forbidden', details?: Record<string, any>)\n {\n super(message, 403, details);\n this.name = 'ForbiddenError';\n }\n}\n\n/**\n * Conflict Error (409)\n *\n * Generic conflict - resource state conflict, concurrent modification, etc.\n * More general than DuplicateEntryError\n */\nexport class ConflictError extends HttpError\n{\n constructor(message: string = 'Resource conflict', details?: Record<string, any>)\n {\n super(message, 409, details);\n this.name = 'ConflictError';\n }\n}\n\n/**\n * Too Many Requests Error (429)\n *\n * Rate limit exceeded\n */\nexport class TooManyRequestsError extends HttpError\n{\n constructor(\n message: string = 'Too many requests',\n retryAfter?: number,\n details?: Record<string, any>\n )\n {\n const fullDetails = retryAfter\n ? { ...details, retryAfter }\n : details;\n\n super(message, 429, fullDetails);\n this.name = 'TooManyRequestsError';\n }\n}\n\n/**\n * Internal Server Error (500)\n *\n * Generic server error when no specific error type applies\n */\nexport class InternalServerError extends HttpError\n{\n constructor(message: string = 'Internal server error', details?: Record<string, any>)\n {\n super(message, 500, details);\n this.name = 'InternalServerError';\n }\n}\n\n/**\n * Service Unavailable Error (503)\n *\n * Service temporarily unavailable (maintenance, overload, etc.)\n */\nexport class ServiceUnavailableError extends HttpError\n{\n constructor(\n message: string = 'Service unavailable',\n retryAfter?: number,\n details?: Record<string, any>\n )\n {\n const fullDetails = retryAfter\n ? { ...details, retryAfter }\n : details;\n\n super(message, 503, fullDetails);\n this.name = 'ServiceUnavailableError';\n }\n}","/**\n * Error Utility Functions\n *\n * Generic error type checking utilities\n */\n\nimport { DatabaseError } from './database-errors.js';\nimport { HttpError } from './http-errors.js';\n\n/**\n * Check if error is a DatabaseError\n */\nexport function isDatabaseError(error: unknown): error is DatabaseError\n{\n return error instanceof DatabaseError;\n}\n\n/**\n * Check if error is an HttpError\n */\nexport function isHttpError(error: unknown): error is HttpError\n{\n return error instanceof HttpError;\n}\n\n/**\n * Check if error has a statusCode property\n */\nexport function hasStatusCode(error: unknown): error is { statusCode: number }\n{\n return (\n typeof error === 'object' &&\n error !== null &&\n 'statusCode' in error &&\n typeof (error as any).statusCode === 'number'\n );\n}\n","/**\n * Error Module Exports\n *\n * Entry point for error handling module (Pure re-export only)\n */\n\n// Database Error Classes\nexport {\n DatabaseError,\n ConnectionError,\n QueryError,\n NotFoundError,\n ValidationError,\n TransactionError,\n DeadlockError,\n DuplicateEntryError,\n} from './database-errors.js';\n\n// HTTP Error Classes\nexport {\n HttpError,\n BadRequestError,\n UnauthorizedError,\n ForbiddenError,\n ConflictError,\n TooManyRequestsError,\n InternalServerError,\n ServiceUnavailableError,\n} from './http-errors.js';\n\n// Error Utilities\nexport {\n isDatabaseError,\n isHttpError,\n hasStatusCode,\n} from './error-utils.js';\n","/**\n * PostgreSQL Error Conversion Utilities\n *\n * Converts PostgreSQL-specific error codes to custom error types\n * @see https://www.postgresql.org/docs/current/errcodes-appendix.html\n */\n\nimport {\n DatabaseError,\n ConnectionError,\n DuplicateEntryError,\n DeadlockError,\n ValidationError,\n QueryError,\n TransactionError,\n} from '../errors/database-errors.js';\n\n/**\n * Extract field and value from PostgreSQL unique violation message\n *\n * Handles various formats:\n * - Simple: Key (email)=(test@example.com)\n * - Complex: Key (user_id, tenant_id)=(123, 456)\n * - With quotes: Key (\"field\")=('value')\n */\nfunction parseUniqueViolation(message: string): { field: string; value: string } | null\n{\n // Try multiple patterns for robustness\n const patterns = [\n // Standard format: Key (field)=(value)\n /Key \\(([^)]+)\\)=\\(([^)]+)\\)/i,\n // With quotes: Key (\"field\")=('value')\n /Key \\([\"']?([^)\"']+)[\"']?\\)=\\([\"']?([^)\"']+)[\"']?\\)/i,\n // Alternative format\n /Key `([^`]+)`=`([^`]+)`/i,\n ];\n\n for (const pattern of patterns)\n {\n const match = message.match(pattern);\n if (match)\n {\n // Clean up extracted values\n const field = match[1].trim().replace(/[\"'`]/g, '');\n const value = match[2].trim().replace(/[\"'`]/g, '');\n return { field, value };\n }\n }\n\n return null;\n}\n\n/**\n * Convert PostgreSQL error to custom DatabaseError\n *\n * Maps PostgreSQL error codes to appropriate error classes with correct status codes\n *\n * @param error - PostgreSQL error object (from pg driver or Drizzle)\n * @returns Custom DatabaseError instance\n *\n * @example\n * ```typescript\n * import { fromPostgresError } from '@spfn/core/db';\n *\n * try {\n * await db.insert(users).values(data);\n * } catch (pgError) {\n * throw fromPostgresError(pgError);\n * }\n * ```\n */\nexport function fromPostgresError(error: any): DatabaseError\n{\n const code = error?.code;\n const message = error?.message || 'Database error occurred';\n\n switch (code)\n {\n // Class 08 ā Connection Exception\n case '08000': // connection_exception\n case '08001': // sqlclient_unable_to_establish_sqlconnection\n case '08003': // connection_does_not_exist\n case '08004': // sqlserver_rejected_establishment_of_sqlconnection\n case '08006': // connection_failure\n case '08007': // transaction_resolution_unknown\n case '08P01': // protocol_violation\n return new ConnectionError(message, { code });\n\n // Class 23 ā Integrity Constraint Violation\n case '23000': // integrity_constraint_violation\n case '23001': // restrict_violation\n return new ValidationError(message, { code, constraint: 'integrity' });\n\n case '23502': // not_null_violation\n return new ValidationError(message, { code, constraint: 'not_null' });\n\n case '23503': // foreign_key_violation\n return new ValidationError(message, { code, constraint: 'foreign_key' });\n\n case '23505': // unique_violation\n const parsed = parseUniqueViolation(message);\n if (parsed)\n {\n return new DuplicateEntryError(parsed.field, parsed.value);\n }\n return new DuplicateEntryError('field', 'value');\n\n case '23514': // check_violation\n return new ValidationError(message, { code, constraint: 'check' });\n\n // Class 40 ā Transaction Rollback\n case '40000': // transaction_rollback\n case '40001': // serialization_failure\n case '40002': // transaction_integrity_constraint_violation\n case '40003': // statement_completion_unknown\n return new TransactionError(message, 500, { code });\n\n case '40P01': // deadlock_detected\n return new DeadlockError(message, { code });\n\n // Class 42 ā Syntax Error or Access Rule Violation\n case '42000': // syntax_error_or_access_rule_violation\n case '42601': // syntax_error\n case '42501': // insufficient_privilege\n case '42602': // invalid_name\n case '42622': // name_too_long\n case '42701': // duplicate_column\n case '42702': // ambiguous_column\n case '42703': // undefined_column\n case '42704': // undefined_object\n case '42P01': // undefined_table\n case '42P02': // undefined_parameter\n return new QueryError(message, 400, { code });\n\n // Class 53 ā Insufficient Resources\n case '53000': // insufficient_resources\n case '53100': // disk_full\n case '53200': // out_of_memory\n case '53300': // too_many_connections\n return new ConnectionError(message, { code });\n\n // Class 57 ā Operator Intervention\n case '57000': // operator_intervention\n case '57014': // query_canceled\n case '57P01': // admin_shutdown\n case '57P02': // crash_shutdown\n case '57P03': // cannot_connect_now\n return new ConnectionError(message, { code });\n\n // Default: Unknown error\n default:\n return new QueryError(message, 500, { code });\n }\n}","/**\n * Database Connection Logic\n *\n * DB ģ°ź²° ģģ± ė° ģ¬ģė ė”ģ§\n *\n * ā
구ķ ģė£:\n * - Exponential Backoff ģ¬ģė ė”ģ§\n * - ģ°ź²° ķ
ģ¤ķø 쿼리\n * - ģģøķ ģė¬ ė”ź¹
\n * - ģ°ź²° ģ±ź³µ/ģ¤ķØ ė”ź¹
\n * - Logger ģ ģ© (console.log ė첓)\n *\n * ā ļø ź°ģ ķģ:\n * - ģė¬ ķģ
ė³ ģ²ė¦¬ (ė¤ķøģķ¬ vs ģøģ¦)\n * - Graceful Shutdown ė”ģ§\n *\n * š” ķ„ķ ź³ ė ¤ģ¬ķ:\n * - ģ°ź²° ķ ģ“ė²¤ķø ė¦¬ģ¤ė\n * - ģ°ź²° ģķ ė©ķøė¦ ģģ§\n * - ģ°ź²° ķ ėģ ģ”°ģ \n *\n * š ź“ė Ø ķģ¼:\n * - src/server/core/db/config.ts (ģ¤ģ )\n * - src/server/core/db/index.ts (ė©ģø export)\n * - src/server/core/logger/ (Logger)\n *\n * š TODO: improvements.md ģ°øź³ \n * - #7: Connection Pool ėŖØėķ°ė§ (Pool ģ“ė²¤ķø ė¦¬ģ¤ė, ķģ±/ģ ķ“ ģ°ź²° ģ¶ģ )\n * - #9: Slow Query ė”ź¹
(쿼리 ģ¤ķ ģź° ģø”ģ ė° ģź³ź° ė”ź¹
)\n * - #10: Graceful Shutdown (SIGTERM ģ²ė¦¬, ģ§ķ ģ¤ģø 쿼리 ģė£ ėźø°)\n * - #11: Read Replica ģ§ģ (ģ½źø°/ģ°źø° ė¶ė¦¬)\n */\nimport type { Sql } from 'postgres';\nimport postgres from 'postgres';\n\nimport { logger } from '../../logger';\nimport { ConnectionError } from '../../errors';\nimport { fromPostgresError } from '../postgres-errors';\nimport type { PoolConfig, RetryConfig } from './config';\n\nconst dbLogger = logger.child('database');\n\n/**\n * ģ§ģ° ķØģ\n */\nfunction delay(ms: number): Promise<void>\n{\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Exponential Backoffė” DB ģ°ź²° ģģ±\n *\n * @param connectionString - PostgreSQL ģ°ź²° 문ģģ“\n * @param poolConfig - Connection Pool ģ¤ģ \n * @param retryConfig - ģ¬ģė ģ¤ģ \n * @returns PostgreSQL ķ“ė¼ģ“ģøķø\n */\nexport async function createDatabaseConnection(\n connectionString: string,\n poolConfig: PoolConfig,\n retryConfig: RetryConfig\n)\n{\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++)\n {\n try\n {\n // PostgreSQL ķ“ė¼ģ“ģøķø ģģ±\n const client = postgres(connectionString, {\n max: poolConfig.max,\n idle_timeout: poolConfig.idleTimeout,\n });\n\n // ģ°ź²° ķ
ģ¤ķø 쿼리\n await client`SELECT 1 as test`;\n\n // ģ°ź²° ģ±ź³µ\n if (attempt > 0)\n {\n dbLogger.info(`Database connected successfully after ${attempt} retries`);\n }\n else\n {\n dbLogger.info('Database connected successfully');\n }\n\n return client;\n }\n catch (error)\n {\n lastError = fromPostgresError(error);\n\n // ė§ģ§ė§ ģėź° ģėė©“ ģ¬ģė\n if (attempt < retryConfig.maxRetries)\n {\n // Exponential Backoff ź³ģ°\n const delayMs = Math.min(\n retryConfig.initialDelay * Math.pow(retryConfig.factor, attempt),\n retryConfig.maxDelay\n );\n\n dbLogger.warn(\n `Connection failed (attempt ${attempt + 1}/${retryConfig.maxRetries + 1}), retrying in ${delayMs}ms...`,\n lastError,\n {\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1,\n delayMs,\n }\n );\n\n await delay(delayMs);\n }\n }\n }\n\n // ėŖØė ģ¬ģė ģ¤ķØ\n const errorMessage =\n `Failed to connect to database after ${retryConfig.maxRetries + 1} attempts: ${lastError?.message || 'Unknown error'}`;\n\n throw new ConnectionError(errorMessage);\n}\n\n/**\n * DB ģ°ź²° ģķ ķģø\n *\n * @param client - PostgreSQL ķ“ė¼ģ“ģøķø\n * @returns ģ°ź²° ź°ė„ ģ¬ė¶\n */\nexport async function checkConnection(client: Sql): Promise<boolean>\n{\n try\n {\n await client`SELECT 1 as health_check`;\n return true;\n }\n catch (error)\n {\n dbLogger.error('Database health check failed', error as Error);\n return false;\n }\n}","/**\n * Database Configuration\n *\n * DB ģ°ź²° ė° Connection Pool ģ¤ģ \n *\n * ā
구ķ ģė£:\n * - ķź²½ė³ Connection Pool ģ¤ģ \n * - ģ¬ģė ģ¤ģ (Exponential Backoff)\n * - ķź²½ė³ģ źø°ė° ģ¤ģ \n *\n * š ź“ė Ø ķģ¼:\n * - src/server/core/db/connection.ts (ģ°ź²° ė”ģ§)\n * - src/server/core/db/index.ts (ė©ģø export)\n */\n\n/**\n * Connection Pool ģ¤ģ \n */\nexport interface PoolConfig\n{\n max: number; // ģµė ģ°ź²° ģ\n idleTimeout: number; // ģ ķ“ ģ°ź²° ķģģģ (ģ“)\n}\n\n/**\n * ģ¬ģė ģ¤ģ \n */\nexport interface RetryConfig\n{\n maxRetries: number; // ģµė ģ¬ģė ķģ\n initialDelay: number; // ģ“źø° ėźø° ģź° (ms)\n maxDelay: number; // ģµė ėźø° ģź° (ms)\n factor: number; // ģ§ģ ģ¦ź° ė°°ģ\n}\n\n/**\n * ķź²½ė³ Connection Pool ģ¤ģ \n *\n * ģ°ģ ģģ:\n * 1. options ķė¼ėÆøķ° (ServerConfigģģ ģ ė¬)\n * 2. ķź²½ė³ģ (DB_POOL_MAX, DB_POOL_IDLE_TIMEOUT)\n * 3. źø°ė³øź° (NODE_ENVģ ė°ė¼)\n *\n * @param options - Optional pool configuration from ServerConfig\n * @returns Pool configuration\n *\n * @example\n * ```typescript\n * // 1. ServerConfig priority (highest)\n * const config = getPoolConfig({ max: 50, idleTimeout: 60 });\n *\n * // 2. Environment variable priority\n * // DB_POOL_MAX=30 DB_POOL_IDLE_TIMEOUT=45\n * const config = getPoolConfig();\n *\n * // 3. Default (lowest)\n * // Production: max=20, idleTimeout=30\n * // Development: max=10, idleTimeout=20\n * ```\n */\nexport function getPoolConfig(options?: Partial<PoolConfig>): PoolConfig\n{\n const isProduction = process.env.NODE_ENV === 'production';\n\n // Priority: options > env > default\n const max = options?.max\n ?? (parseInt(process.env.DB_POOL_MAX || '', 10) || (isProduction ? 20 : 10));\n\n const idleTimeout = options?.idleTimeout\n ?? (parseInt(process.env.DB_POOL_IDLE_TIMEOUT || '', 10) || (isProduction ? 30 : 20));\n\n return { max, idleTimeout };\n}\n\n/**\n * ķź²½ė³ ģ¬ģė ģ¤ģ \n */\nexport function getRetryConfig(): RetryConfig\n{\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n maxRetries: isProduction ? 5 : 3, // ķė”ėģ
: 5ķ, ź°ė°: 3ķ\n initialDelay: 1000, // 1ģ“\n maxDelay: 16000, // 16ģ“\n factor: 2, // 2ė°°ģ© ģ¦ź° (1s ā 2s ā 4s ā 8s ā 16s)\n };\n}","/**\n * Database factory with automatic environment variable detection\n * Supports: Single primary, Primary + Replica\n */\n\nimport { config } from 'dotenv';\nimport { drizzle } from 'drizzle-orm/postgres-js';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport type { Sql } from 'postgres';\n\nimport { createDatabaseConnection } from './connection.js';\nimport { getPoolConfig, getRetryConfig, type PoolConfig } from './config.js';\nimport { logger } from '../../logger';\n\nconst dbLogger = logger.child('database');\n\nexport interface DatabaseClients\n{\n /** Primary database for writes (or both read/write if no replica) */\n write?: PostgresJsDatabase;\n /** Replica database for reads (optional, falls back to write) */\n read?: PostgresJsDatabase;\n /** Raw postgres client for write operations (for cleanup) */\n writeClient?: Sql;\n /** Raw postgres client for read operations (for cleanup) */\n readClient?: Sql;\n}\n\n/**\n * Check if any database configuration exists in environment\n */\nfunction hasDatabaseConfig(): boolean\n{\n return !!(\n process.env.DATABASE_URL ||\n process.env.DATABASE_WRITE_URL ||\n process.env.DATABASE_READ_URL\n );\n}\n\n/**\n * Health check configuration\n */\nexport interface HealthCheckConfig\n{\n enabled: boolean;\n interval: number;\n reconnect: boolean;\n maxRetries: number;\n retryInterval: number;\n}\n\n/**\n * Query performance monitoring configuration\n */\nexport interface MonitoringConfig\n{\n enabled: boolean;\n slowThreshold: number;\n logQueries: boolean;\n}\n\n/**\n * Database initialization options\n */\nexport interface DatabaseOptions\n{\n /**\n * Connection pool configuration\n * Overrides environment variables and defaults\n */\n pool?: Partial<PoolConfig>;\n\n /**\n * Health check configuration\n * Periodic checks to ensure database connection is alive\n */\n healthCheck?: Partial<HealthCheckConfig>;\n\n /**\n * Query performance monitoring configuration\n * Tracks slow queries and logs performance metrics\n */\n monitoring?: Partial<MonitoringConfig>;\n}\n\n/**\n * Create database client(s) from environment variables\n *\n * Supported patterns (priority order):\n * 1. Single primary: DATABASE_URL\n * 2. Primary + Replica: DATABASE_WRITE_URL + DATABASE_READ_URL\n * 3. Legacy replica: DATABASE_URL + DATABASE_REPLICA_URL\n *\n * @param options - Optional database configuration (pool settings, etc.)\n * @returns Database client(s) or undefined if no configuration found\n *\n * @example\n * ```bash\n * # Single primary (most common)\n * DATABASE_URL=postgresql://localhost:5432/mydb\n *\n * # Primary + Replica\n * DATABASE_WRITE_URL=postgresql://primary:5432/mydb\n * DATABASE_READ_URL=postgresql://replica:5432/mydb\n *\n * # Legacy (backward compatibility)\n * DATABASE_URL=postgresql://primary:5432/mydb\n * DATABASE_REPLICA_URL=postgresql://replica:5432/mydb\n * ```\n *\n * @example\n * ```typescript\n * // Custom pool configuration\n * const db = await createDatabaseFromEnv({\n * pool: { max: 50, idleTimeout: 60 }\n * });\n * ```\n */\nexport async function createDatabaseFromEnv(options?: DatabaseOptions): Promise<DatabaseClients>\n{\n // Load .env.local if needed\n if (!hasDatabaseConfig())\n {\n config({ path: '.env.local' });\n }\n\n // Quick exit if no database config\n if (!hasDatabaseConfig())\n {\n return { write: undefined, read: undefined };\n }\n\n try\n {\n const poolConfig = getPoolConfig(options?.pool);\n const retryConfig = getRetryConfig();\n\n // 1. Primary + Replica pattern (explicit separation)\n if (process.env.DATABASE_WRITE_URL && process.env.DATABASE_READ_URL)\n {\n const writeClient = await createDatabaseConnection(\n process.env.DATABASE_WRITE_URL,\n poolConfig,\n retryConfig\n );\n\n const readClient = await createDatabaseConnection(\n process.env.DATABASE_READ_URL,\n poolConfig,\n retryConfig\n );\n\n return {\n write: drizzle(writeClient),\n read: drizzle(readClient),\n writeClient,\n readClient,\n };\n }\n\n // 2. Legacy replica pattern (backward compatibility)\n if (process.env.DATABASE_URL && process.env.DATABASE_REPLICA_URL)\n {\n const writeClient = await createDatabaseConnection(\n process.env.DATABASE_URL,\n poolConfig,\n retryConfig\n );\n\n const readClient = await createDatabaseConnection(\n process.env.DATABASE_REPLICA_URL,\n poolConfig,\n retryConfig\n );\n\n return {\n write: drizzle(writeClient),\n read: drizzle(readClient),\n writeClient,\n readClient,\n };\n }\n\n // 3. Single primary (most common)\n if (process.env.DATABASE_URL)\n {\n const client = await createDatabaseConnection(\n process.env.DATABASE_URL,\n poolConfig,\n retryConfig\n );\n\n const db = drizzle(client);\n return {\n write: db,\n read: db,\n writeClient: client,\n readClient: client,\n };\n }\n\n // 4. DATABASE_WRITE_URL only (no read replica)\n if (process.env.DATABASE_WRITE_URL)\n {\n const client = await createDatabaseConnection(\n process.env.DATABASE_WRITE_URL,\n poolConfig,\n retryConfig\n );\n\n const db = drizzle(client);\n return {\n write: db,\n read: db,\n writeClient: client,\n readClient: client,\n };\n }\n\n // No valid configuration\n return { write: undefined, read: undefined };\n }\n catch (error)\n {\n const message = error instanceof Error ? error.message : 'Unknown error';\n dbLogger.error('Failed to create database connection', {\n error: message,\n stage: 'initialization',\n hasWriteUrl: !!process.env.DATABASE_WRITE_URL,\n hasReadUrl: !!process.env.DATABASE_READ_URL,\n hasUrl: !!process.env.DATABASE_URL,\n hasReplicaUrl: !!process.env.DATABASE_REPLICA_URL,\n });\n return { write: undefined, read: undefined };\n }\n}","/**\n * Global Database instance manager\n * Provides singleton access to database across all modules\n * Supports Primary + Replica pattern with separate read/write instances\n */\n\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport type { Sql } from 'postgres';\n\nimport { createDatabaseFromEnv, type DatabaseOptions, type HealthCheckConfig, type MonitoringConfig } from './factory.js';\nimport { logger } from '../../logger';\n\nconst dbLogger = logger.child('database');\n\nlet writeInstance: PostgresJsDatabase | undefined;\nlet readInstance: PostgresJsDatabase | undefined;\nlet writeClient: Sql | undefined;\nlet readClient: Sql | undefined;\nlet healthCheckInterval: NodeJS.Timeout | undefined;\nlet monitoringConfig: MonitoringConfig | undefined;\n\n/**\n * DB connection type\n */\nexport type DbConnectionType = 'read' | 'write';\n\n/**\n * Get global database write instance\n *\n * @returns Database write instance or undefined if not initialized\n *\n * @example\n * ```typescript\n * import { getDatabase } from '@spfn/core/db';\n *\n * const db = getDatabase();\n * if (db) {\n * const users = await db.select().from(usersTable);\n * }\n * ```\n */\nexport function getDatabase(type?: DbConnectionType): PostgresJsDatabase | undefined\n{\n if (type === 'read')\n {\n return readInstance ?? writeInstance;\n }\n return writeInstance;\n}\n\n/**\n * Set global database instances (for testing or manual configuration)\n *\n * @param write - Database write instance\n * @param read - Database read instance (optional, defaults to write)\n *\n * @example\n * ```typescript\n * import { setDatabase } from '@spfn/core/db';\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n *\n * const writeClient = postgres('postgresql://primary:5432/mydb');\n * const readClient = postgres('postgresql://replica:5432/mydb');\n * setDatabase(drizzle(writeClient), drizzle(readClient));\n * ```\n */\nexport function setDatabase(\n write: PostgresJsDatabase | undefined,\n read?: PostgresJsDatabase | undefined\n): void\n{\n writeInstance = write;\n readInstance = read ?? write;\n}\n\n/**\n * Get health check configuration with priority resolution\n *\n * Priority: options > env > defaults\n */\nfunction getHealthCheckConfig(options?: Partial<HealthCheckConfig>): HealthCheckConfig\n{\n const parseBoolean = (value: string | undefined, defaultValue: boolean): boolean =>\n {\n if (value === undefined) return defaultValue;\n return value.toLowerCase() === 'true';\n };\n\n return {\n enabled: options?.enabled\n ?? parseBoolean(process.env.DB_HEALTH_CHECK_ENABLED, true),\n interval: options?.interval\n ?? (parseInt(process.env.DB_HEALTH_CHECK_INTERVAL || '', 10) || 60000),\n reconnect: options?.reconnect\n ?? parseBoolean(process.env.DB_HEALTH_CHECK_RECONNECT, true),\n maxRetries: options?.maxRetries\n ?? (parseInt(process.env.DB_HEALTH_CHECK_MAX_RETRIES || '', 10) || 3),\n retryInterval: options?.retryInterval\n ?? (parseInt(process.env.DB_HEALTH_CHECK_RETRY_INTERVAL || '', 10) || 5000),\n };\n}\n\n/**\n * Get monitoring configuration with priority resolution\n *\n * Priority: options > env > defaults\n */\nfunction getMonitoringConfig(options?: Partial<MonitoringConfig>): MonitoringConfig\n{\n const isDevelopment = process.env.NODE_ENV !== 'production';\n const parseBoolean = (value: string | undefined, defaultValue: boolean): boolean =>\n {\n if (value === undefined) return defaultValue;\n return value.toLowerCase() === 'true';\n };\n\n return {\n enabled: options?.enabled\n ?? parseBoolean(process.env.DB_MONITORING_ENABLED, isDevelopment),\n slowThreshold: options?.slowThreshold\n ?? (parseInt(process.env.DB_MONITORING_SLOW_THRESHOLD || '', 10) || 1000),\n logQueries: options?.logQueries\n ?? parseBoolean(process.env.DB_MONITORING_LOG_QUERIES, false),\n };\n}\n\n/**\n * Initialize database from environment variables\n * Automatically called by server startup\n *\n * Supported environment variables:\n * - DATABASE_URL (single primary)\n * - DATABASE_WRITE_URL + DATABASE_READ_URL (primary + replica)\n * - DATABASE_URL + DATABASE_REPLICA_URL (legacy replica)\n * - DB_POOL_MAX (connection pool max size)\n * - DB_POOL_IDLE_TIMEOUT (connection idle timeout in seconds)\n * - DB_HEALTH_CHECK_ENABLED (enable health checks, default: true)\n * - DB_HEALTH_CHECK_INTERVAL (health check interval in ms, default: 60000)\n * - DB_HEALTH_CHECK_RECONNECT (enable auto-reconnect, default: true)\n * - DB_HEALTH_CHECK_MAX_RETRIES (max reconnection attempts, default: 3)\n * - DB_HEALTH_CHECK_RETRY_INTERVAL (retry interval in ms, default: 5000)\n * - DB_MONITORING_ENABLED (enable query monitoring, default: true in dev, false in prod)\n * - DB_MONITORING_SLOW_THRESHOLD (slow query threshold in ms, default: 1000)\n * - DB_MONITORING_LOG_QUERIES (log actual SQL queries, default: false)\n *\n * Configuration priority:\n * 1. options parameter (ServerConfig)\n * 2. Environment variables\n * 3. Defaults (based on NODE_ENV)\n *\n * @param options - Optional database configuration (pool settings, etc.)\n * @returns Object with write and read instances\n *\n * @example\n * ```typescript\n * import { initDatabase } from '@spfn/core/db';\n *\n * // Manual initialization (not needed if using server startup)\n * const { write, read } = await initDatabase();\n * if (write) {\n * console.log('Database connected');\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Custom pool configuration\n * const { write, read } = await initDatabase({\n * pool: { max: 50, idleTimeout: 60 }\n * });\n * ```\n */\nexport async function initDatabase(options?: DatabaseOptions): Promise<{\n write?: PostgresJsDatabase;\n read?: PostgresJsDatabase;\n}>\n{\n // Already initialized\n if (writeInstance)\n {\n dbLogger.debug('Database already initialized');\n return { write: writeInstance, read: readInstance };\n }\n\n // Auto-detect from environment\n const result = await createDatabaseFromEnv(options);\n\n if (result.write)\n {\n try\n {\n // Test connection with a simple query\n await result.write.execute('SELECT 1');\n\n // Test read instance if different\n if (result.read && result.read !== result.write)\n {\n await result.read.execute('SELECT 1');\n }\n\n // Store instances\n writeInstance = result.write;\n readInstance = result.read;\n writeClient = result.writeClient;\n readClient = result.readClient;\n\n const hasReplica = result.read && result.read !== result.write;\n dbLogger.info(\n hasReplica\n ? 'Database connected (Primary + Replica)'\n : 'Database connected'\n );\n\n // Start health check (automatic)\n const healthCheckConfig = getHealthCheckConfig(options?.healthCheck);\n if (healthCheckConfig.enabled)\n {\n startHealthCheck(healthCheckConfig);\n }\n\n // Initialize monitoring configuration\n monitoringConfig = getMonitoringConfig(options?.monitoring);\n if (monitoringConfig.enabled)\n {\n dbLogger.info('Database query monitoring enabled', {\n slowThreshold: `${monitoringConfig.slowThreshold}ms`,\n logQueries: monitoringConfig.logQueries,\n });\n }\n }\n catch (error)\n {\n const message = error instanceof Error ? error.message : 'Unknown error';\n dbLogger.error('Database connection failed', { error: message });\n\n // Cleanup on failure\n await closeDatabase();\n\n return { write: undefined, read: undefined };\n }\n }\n else\n {\n dbLogger.warn('No database configuration found');\n dbLogger.warn('Set DATABASE_URL environment variable to enable database');\n }\n\n return { write: writeInstance, read: readInstance };\n}\n\n/**\n * Close all database connections and cleanup\n *\n * Properly closes postgres connection pools with timeout.\n * Should be called during graceful shutdown or after tests.\n *\n * @example\n * ```typescript\n * import { closeDatabase } from '@spfn/core/db';\n *\n * // During graceful shutdown\n * process.on('SIGTERM', async () => {\n * await closeDatabase();\n * process.exit(0);\n * });\n *\n * // In tests\n * afterAll(async () => {\n * await closeDatabase();\n * });\n * ```\n */\nexport async function closeDatabase(): Promise<void>\n{\n if (!writeInstance && !readInstance)\n {\n dbLogger.debug('No database connections to close');\n return;\n }\n\n // Stop health check\n stopHealthCheck();\n\n try\n {\n const closePromises: Promise<void>[] = [];\n\n // Close write client\n if (writeClient)\n {\n dbLogger.debug('Closing write connection...');\n closePromises.push(\n writeClient.end({ timeout: 5 })\n .then(() => dbLogger.debug('Write connection closed'))\n .catch(err => dbLogger.error('Error closing write connection', err))\n );\n }\n\n // Close read client (if different from write)\n if (readClient && readClient !== writeClient)\n {\n dbLogger.debug('Closing read connection...');\n closePromises.push(\n readClient.end({ timeout: 5 })\n .then(() => dbLogger.debug('Read connection closed'))\n .catch(err => dbLogger.error('Error closing read connection', err))\n );\n }\n\n // Wait for all connections to close\n await Promise.all(closePromises);\n\n dbLogger.info('All database connections closed');\n }\n catch (error)\n {\n dbLogger.error('Error during database cleanup', error as Error);\n throw error;\n }\n finally\n {\n // Always clear instances\n writeInstance = undefined;\n readInstance = undefined;\n writeClient = undefined;\n readClient = undefined;\n monitoringConfig = undefined;\n }\n}\n\n/**\n * Get database connection info (for debugging)\n */\nexport function getDatabaseInfo(): {\n hasWrite: boolean;\n hasRead: boolean;\n isReplica: boolean;\n}\n{\n return {\n hasWrite: !!writeInstance,\n hasRead: !!readInstance,\n isReplica: !!(readInstance && readInstance !== writeInstance),\n };\n}\n\n/**\n * Start database health check\n *\n * Periodically checks database connection health and attempts reconnection if enabled.\n * Automatically started by initDatabase() when health check is enabled.\n *\n * @param config - Health check configuration\n *\n * @example\n * ```typescript\n * import { startHealthCheck } from '@spfn/core/db';\n *\n * startHealthCheck({\n * enabled: true,\n * interval: 30000, // 30 seconds\n * reconnect: true,\n * maxRetries: 5,\n * retryInterval: 10000, // 10 seconds\n * });\n * ```\n */\nexport function startHealthCheck(config: HealthCheckConfig): void\n{\n if (healthCheckInterval)\n {\n dbLogger.debug('Health check already running');\n return;\n }\n\n dbLogger.info('Starting database health check', {\n interval: `${config.interval}ms`,\n reconnect: config.reconnect,\n });\n\n healthCheckInterval = setInterval(async () =>\n {\n try\n {\n const write = getDatabase('write');\n const read = getDatabase('read');\n\n // Check write connection\n if (write)\n {\n await write.execute('SELECT 1');\n }\n\n // Check read connection (if different)\n if (read && read !== write)\n {\n await read.execute('SELECT 1');\n }\n\n dbLogger.debug('Database health check passed');\n }\n catch (error)\n {\n const message = error instanceof Error ? error.message : 'Unknown error';\n dbLogger.error('Database health check failed', { error: message });\n\n // Attempt reconnection if enabled\n if (config.reconnect)\n {\n await attemptReconnection(config);\n }\n }\n }, config.interval);\n}\n\n/**\n * Attempt database reconnection with retry logic\n *\n * @param config - Health check configuration\n */\nasync function attemptReconnection(config: HealthCheckConfig): Promise<void>\n{\n dbLogger.warn('Attempting database reconnection', {\n maxRetries: config.maxRetries,\n retryInterval: `${config.retryInterval}ms`,\n });\n\n for (let attempt = 1; attempt <= config.maxRetries; attempt++)\n {\n try\n {\n dbLogger.debug(`Reconnection attempt ${attempt}/${config.maxRetries}`);\n\n // Close existing connections\n await closeDatabase();\n\n // Wait before retry\n await new Promise(resolve => setTimeout(resolve, config.retryInterval));\n\n // Reinitialize database\n const result = await createDatabaseFromEnv();\n\n if (result.write)\n {\n // Test connection\n await result.write.execute('SELECT 1');\n\n // Store instances\n writeInstance = result.write;\n readInstance = result.read;\n writeClient = result.writeClient;\n readClient = result.readClient;\n\n dbLogger.info('Database reconnection successful', { attempt });\n return;\n }\n }\n catch (error)\n {\n const message = error instanceof Error ? error.message : 'Unknown error';\n dbLogger.error(`Reconnection attempt ${attempt} failed`, {\n error: message,\n attempt,\n maxRetries: config.maxRetries,\n });\n\n if (attempt === config.maxRetries)\n {\n dbLogger.error('Max reconnection attempts reached, giving up');\n }\n }\n }\n}\n\n/**\n * Stop database health check\n *\n * Automatically called by closeDatabase().\n * Can also be called manually to stop health checks.\n *\n * @example\n * ```typescript\n * import { stopHealthCheck } from '@spfn/core/db';\n *\n * stopHealthCheck();\n * ```\n */\nexport function stopHealthCheck(): void\n{\n if (healthCheckInterval)\n {\n clearInterval(healthCheckInterval);\n healthCheckInterval = undefined;\n dbLogger.info('Database health check stopped');\n }\n}\n\n/**\n * Get current monitoring configuration\n *\n * Returns the monitoring configuration that was set during database initialization.\n * Used by Repository to determine if and how to monitor query performance.\n *\n * @returns Current monitoring configuration or undefined if database not initialized\n *\n * @example\n * ```typescript\n * import { getDatabaseMonitoringConfig } from '@spfn/core/db';\n *\n * const config = getDatabaseMonitoringConfig();\n * if (config?.enabled) {\n * console.log(`Slow query threshold: ${config.slowThreshold}ms`);\n * }\n * ```\n */\nexport function getDatabaseMonitoringConfig(): MonitoringConfig | undefined\n{\n return monitoringConfig;\n}","/**\n * Database Instance (Backward Compatibility Layer)\n *\n * PostgreSQL + Drizzle ORM connection - now using lazy initialization\n *\n * ā
Implemented:\n * - Lazy initialization (no top-level await)\n * - Automatic environment variable loading\n * - Read Replica support (read/write separation)\n * - Singleton pattern via db-manager\n * - Backward compatibility with existing code\n *\n * ā ļø Migration Note:\n * This file now wraps db-manager for backward compatibility.\n * New code should use:\n * - initDatabase() from db-manager\n * - getDatabase() from db-manager\n *\n * š Related files:\n * - src/db/db-factory.ts (Environment detection)\n * - src/db/db-manager.ts (Singleton management)\n * - src/db/db-context.ts (Transaction-aware access)\n */\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\nimport { getDatabase, type DbConnectionType } from './manager.js';\n\n/**\n * Default DB instance (Primary - for writes)\n *\n * ā ļø IMPORTANT: This is a lazy getter. On first access, it will:\n * 1. Auto-initialize database from environment variables\n * 2. Throw error if DATABASE_URL is not set\n *\n * For better error handling, use initDatabase() explicitly:\n * ```typescript\n * import { initDatabase } from '@spfn/core/db';\n * const { write } = await initDatabase();\n * if (!write) throw new Error('Database not configured');\n * ```\n *\n * @example\n * ```typescript\n * import { db } from '@spfn/core/db';\n * const users = await db.select().from(usersTable);\n * ```\n */\nexport const db = new Proxy({} as PostgresJsDatabase, {\n get(_target, prop)\n {\n const instance = getDatabase('write');\n if (!instance)\n {\n throw new Error(\n 'Database not initialized. ' +\n 'Set DATABASE_URL environment variable or call initDatabase() first.'\n );\n }\n return (instance as Record<string | symbol, any>)[prop];\n },\n});\n\n/**\n * Get raw Drizzle DB instance (direct use without transaction)\n *\n * ā ļø Warning: This function bypasses AsyncLocalStorage transaction context.\n * For normal cases, use `getDb()` from './db-context.js'.\n *\n * @param type - 'read' (Replica) or 'write' (Primary)\n * @returns Raw Drizzle DB instance\n *\n * @example\n * ```typescript\n * // Read-only query (uses Replica)\n * const users = await getRawDb('read').select().from(usersTable);\n *\n * // Write query (uses Primary)\n * await getRawDb('write').insert(usersTable).values({ email: 'test@example.com' });\n * ```\n */\nexport function getRawDb(type: DbConnectionType = 'write'): PostgresJsDatabase\n{\n const instance = getDatabase(type);\n if (!instance)\n {\n throw new Error(\n 'Database not initialized. ' +\n 'Set DATABASE_URL environment variable or call initDatabase() first.'\n );\n }\n return instance;\n}\n\n// Re-export type for backward compatibility\nexport type { DbConnectionType };\n","/**\n * AsyncLocalStorage-based Transaction Context\n *\n * Uses Node.js AsyncLocalStorage to propagate transactions throughout the async call chain.\n *\n * ā
Implemented:\n * - AsyncLocalStorage-based context management\n * - Transaction storage/retrieval functions\n * - Type-safe transaction propagation\n * - Transaction propagation across async chains\n *\n * ā ļø Needs improvement:\n * - Nested transaction handling (currently ignores outer transaction)\n * - Transaction timeout detection\n *\n * š” Future considerations:\n * - Add transaction ID (for debugging/tracing)\n * - Track transaction start time (for performance monitoring)\n * - Store transaction metadata (route info, user info, etc.)\n * - Savepoint support (nested transactions)\n * - Transaction isolation level configuration\n *\n * š Related files:\n * - src/utils/transaction.ts (Transactional middleware)\n * - src/db/db-context.ts (getDb helper)\n */\nimport { AsyncLocalStorage } from 'async_hooks';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\n/**\n * Transaction database type\n * Record<string, never> represents an empty schema; actual schema is determined at runtime\n */\nexport type TransactionDB = PostgresJsDatabase;\n\n/**\n * Transaction context stored in AsyncLocalStorage\n */\nexport type TransactionContext = {\n tx: TransactionDB;\n};\n\n/**\n * Global AsyncLocalStorage instance for transaction context\n */\nexport const asyncContext = new AsyncLocalStorage<TransactionContext>();\n\n/**\n * Get current transaction from AsyncLocalStorage\n *\n * @returns Transaction if available, null otherwise\n */\nexport function getTransaction(): TransactionDB | null\n{\n const context = asyncContext.getStore();\n return context?.tx ?? null;\n}\n\n/**\n * Run a function within a transaction context\n *\n * The transaction will be available to all async operations within the callback\n * via getTransaction()\n *\n * @param tx - Drizzle transaction object\n * @param callback - Function to run within transaction context\n * @returns Result of the callback\n */\nexport function runWithTransaction<T>(\n tx: TransactionDB,\n callback: () => Promise<T>\n): Promise<T>\n{\n return asyncContext.run({ tx }, callback);\n}","/**\n * Transactional Middleware\n *\n * Wraps route handlers in a database transaction.\n * Auto-commits on success, auto-rolls back on error.\n *\n * ā
Implemented:\n * - Automatic transaction start/commit/rollback\n * - Transaction propagation via AsyncLocalStorage\n * - Hono Context error detection\n * - Integration with getDb() helper\n * - Type safety improvements (TransactionDB type, no @ts-ignore)\n * - Transaction logging (start/commit/rollback)\n * - Execution time measurement and slow transaction warnings\n * - Transaction ID tracking (for debugging)\n * - Transaction timeout configuration (with TRANSACTION_TIMEOUT env var support)\n *\n * ā ļø Needs improvement:\n * - Detect and warn about nested transactions\n *\n * š” Future considerations:\n * - Transaction isolation level configuration option\n * - Read-only transaction mode\n * - Transaction retry logic (on deadlock)\n * - Transaction event hooks (beforeCommit, afterCommit, onRollback)\n *\n * š Related files:\n * - src/utils/async-context.ts (AsyncLocalStorage)\n * - src/db/db-context.ts (getDb helper)\n * - src/utils/__tests__/transaction.test.ts (tests)\n *\n * š Future improvements:\n * - Transaction isolation level setting (withTransaction({ isolationLevel: 'SERIALIZABLE' }))\n * - Nested transaction savepoint support\n */\nimport { createMiddleware } from 'hono/factory';\nimport { db } from '../index.js';\nimport { runWithTransaction, type TransactionDB } from './context.js';\nimport { logger } from '../../logger';\nimport { TransactionError } from '../../errors';\nimport { fromPostgresError } from '../postgres-errors';\n\n/**\n * Transaction middleware options\n */\nexport interface TransactionalOptions\n{\n /**\n * Slow transaction warning threshold in milliseconds\n * @default 1000 (1 second)\n */\n slowThreshold?: number;\n\n /**\n * Enable transaction logging\n * @default true\n */\n enableLogging?: boolean;\n\n /**\n * Transaction timeout in milliseconds\n *\n * If transaction exceeds this duration, it will be aborted with TransactionError.\n *\n * @default 30000 (30 seconds) or TRANSACTION_TIMEOUT environment variable\n *\n * @example\n * ```typescript\n * // Default timeout (30s or TRANSACTION_TIMEOUT env var)\n * Transactional()\n *\n * // Custom timeout for specific route (60s)\n * Transactional({ timeout: 60000 })\n *\n * // Disable timeout\n * Transactional({ timeout: 0 })\n * ```\n */\n timeout?: number;\n}\n\n/**\n * Transaction middleware for Hono routes\n *\n * Automatically wraps route handlers in a database transaction.\n * Commits on success, rolls back on error.\n *\n * @example\n * ```typescript\n * // In your route file\n * export const middlewares = [Transactional()];\n *\n * export async function POST(c: RouteContext) {\n * // All DB operations run in a transaction\n * const [user] = await db.insert(users).values(body).returning();\n * await db.insert(profiles).values({ userId: user.id });\n * // Auto-commits on success\n * return c.json(user, 201);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With custom options\n * export const middlewares = [\n * Transactional({\n * slowThreshold: 2000, // Warn if transaction takes > 2s\n * enableLogging: false, // Disable logging\n * timeout: 60000, // 60 second timeout for long operations\n * })\n * ];\n * ```\n *\n * š Transaction behavior:\n * - Success: Auto-commit\n * - Error: Auto-rollback\n * - Detects context.error to trigger rollback\n *\n * š Transaction logging:\n * - Auto-logs transaction start/commit/rollback\n * - Measures and records execution time\n * - Warns about slow transactions (default: > 1s)\n */\nexport function Transactional(options: TransactionalOptions = {})\n{\n // Get default timeout from environment variable (default: 30 seconds)\n const defaultTimeout = parseInt(process.env.TRANSACTION_TIMEOUT || '30000', 10);\n\n const {\n slowThreshold = 1000,\n enableLogging = true,\n timeout = defaultTimeout,\n } = options;\n\n const txLogger = logger.child('transaction');\n\n return createMiddleware(async (c, next) =>\n {\n // Generate transaction ID for debugging\n const txId = `tx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const startTime = Date.now();\n const route = `${c.req.method} ${c.req.path}`;\n\n if (enableLogging)\n {\n txLogger.debug('Transaction started', { txId, route });\n }\n\n try\n {\n // Create transaction promise\n const transactionPromise = db.transaction(async (tx) =>\n {\n // Store transaction in AsyncLocalStorage\n await runWithTransaction(tx as TransactionDB, async () =>\n {\n // Execute handler\n await next();\n\n // Detect if Hono caught an error and stored it in context.error\n // Context type doesn't officially define error property, so we extend it\n type ContextWithError = typeof c & { error?: Error };\n const contextWithError = c as ContextWithError;\n if (contextWithError.error)\n {\n // Throw to rollback transaction\n throw contextWithError.error;\n }\n\n // Auto-commit on success (handled by Drizzle)\n });\n });\n\n // Apply timeout if enabled (timeout > 0)\n if (timeout > 0)\n {\n const timeoutPromise = new Promise<never>((_, reject) =>\n {\n setTimeout(() =>\n {\n reject(\n new TransactionError(\n `Transaction timeout after ${timeout}ms`,\n 500,\n {\n txId,\n route,\n timeout: `${timeout}ms`,\n }\n )\n );\n }, timeout);\n });\n\n // Race between transaction and timeout\n await Promise.race([transactionPromise, timeoutPromise]);\n }\n else\n {\n // No timeout - just await transaction\n await transactionPromise;\n }\n\n // Transaction successful (committed)\n const duration = Date.now() - startTime;\n\n if (enableLogging)\n {\n if (duration >= slowThreshold)\n {\n txLogger.warn('Slow transaction committed', {\n txId,\n route,\n duration: `${duration}ms`,\n threshold: `${slowThreshold}ms`,\n });\n }\n else\n {\n txLogger.debug('Transaction committed', {\n txId,\n route,\n duration: `${duration}ms`,\n });\n }\n }\n }\n catch (error)\n {\n // Transaction failed (rolled back)\n const duration = Date.now() - startTime;\n\n // Convert PostgreSQL error to custom error (unless it's already TransactionError)\n const customError = error instanceof TransactionError\n ? error\n : fromPostgresError(error);\n\n if (enableLogging)\n {\n txLogger.error('Transaction rolled back', {\n txId,\n route,\n duration: `${duration}ms`,\n error: customError.message,\n errorType: customError.name,\n });\n }\n\n // Re-throw for Hono's error handler\n throw customError;\n }\n });\n}","/**\n * Transaction Module\n *\n * Database transaction management with AsyncLocalStorage-based propagation\n */\n\n// AsyncLocalStorage utilities\nexport { getTransaction, runWithTransaction } from './context.js';\nexport type { TransactionContext, TransactionDB } from './context.js';\n\n// Transaction middleware\nexport { Transactional } from './middleware.js';\nexport type { TransactionalOptions } from './middleware.js';","/**\n * Repository Filter Utilities\n *\n * Utilities for building Drizzle ORM WHERE, ORDER BY, and pagination conditions.\n * Moved from deprecated query module for Repository pattern usage.\n *\n * @module db/repository/filters\n */\n\nimport { and, eq, ne, gt, gte, lt, lte, like, inArray, notInArray, isNull, isNotNull, or, asc, desc, sql, SQL } from 'drizzle-orm';\n\nimport type { PgColumn, PgTable } from 'drizzle-orm/pg-core';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Filter operators\n */\nexport type FilterOperator =\n | 'eq' // equals\n | 'ne' // not equals\n | 'gt' // greater than\n | 'gte' // greater than or equal\n | 'lt' // less than\n | 'lte' // less than or equal\n | 'like' // LIKE (partial match)\n | 'in' // IN (array)\n | 'nin' // NOT IN (array)\n | 'is'; // IS NULL / IS NOT NULL\n\n/**\n * Filter value type\n */\nexport type FilterValue = string | number | boolean | null | (string | number)[];\n\n/**\n * Filter condition\n *\n * @example { email: { eq: 'john@example.com' } }\n * @example { age: { gte: 18, lte: 65 } }\n */\nexport type FilterCondition = {\n [operator in FilterOperator]?: FilterValue;\n};\n\n/**\n * Complete filters\n *\n * @example { email: { eq: 'john@example.com' }, role: { in: ['admin', 'user'] } }\n */\nexport type Filters = {\n [field: string]: FilterCondition;\n};\n\n/**\n * Filter builder result type\n */\nexport type FilterResult = SQL<unknown> | undefined;\n\n/**\n * Sort direction\n */\nexport type SortDirection = 'asc' | 'desc';\n\n/**\n * Sort condition\n *\n * @example [{ field: 'createdAt', direction: 'desc' }, { field: 'name', direction: 'asc' }]\n */\nexport type SortCondition = {\n field: string;\n direction: SortDirection;\n};\n\n/**\n * Sort builder result type\n */\nexport type SortResult = SQL<unknown>[];\n\n/**\n * Pagination parameters\n */\nexport type PaginationParams = {\n page: number;\n limit: number;\n};\n\n/**\n * Pagination metadata\n */\nexport type PaginationMeta = {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasNext: boolean;\n hasPrev: boolean;\n};\n\n/**\n * Drizzle table type (generic)\n */\nexport type DrizzleTable = PgTable<any> & Record<string, PgColumn>;\n\n// ============================================================================\n// Filter Builder\n// ============================================================================\n\n/**\n * Convert filter conditions to Drizzle SQL WHERE conditions\n *\n * @param filters - Parsed filter object\n * @param table - Drizzle table schema\n * @returns SQL WHERE condition (undefined if no filters)\n *\n * @example\n * const filters = { email: { eq: 'john@example.com' }, age: { gte: 18 } };\n * const condition = buildFilters(filters, users);\n * const data = await db.select().from(users).where(condition);\n */\nexport function buildFilters(\n filters: Filters,\n table: DrizzleTable\n): FilterResult\n{\n const conditions: SQL<unknown>[] = [];\n\n for (const [field, filterCondition] of Object.entries(filters))\n {\n const column = table[field] as PgColumn;\n\n if (!column)\n {\n console.warn(`[buildFilters] Unknown field: ${field}`);\n continue;\n }\n\n // Build condition for each operator\n for (const [operator, value] of Object.entries(filterCondition))\n {\n const condition = buildCondition(column, operator as FilterOperator, value);\n if (condition)\n {\n conditions.push(condition);\n }\n }\n }\n\n // Combine all conditions with AND\n return conditions.length > 0 ? and(...conditions) : undefined;\n}\n\n/**\n * Convert single filter condition to SQL condition\n */\nfunction buildCondition(\n column: PgColumn,\n operator: FilterOperator,\n value: FilterValue\n): SQL<unknown> | undefined\n{\n switch (operator)\n {\n case 'eq':\n return eq(column, value as string | number);\n\n case 'ne':\n return ne(column, value as string | number);\n\n case 'gt':\n return gt(column, value as string | number);\n\n case 'gte':\n return gte(column, value as string | number);\n\n case 'lt':\n return lt(column, value as string | number);\n\n case 'lte':\n return lte(column, value as string | number);\n\n case 'like':\n return like(column, `%${value}%`);\n\n case 'in':\n if (Array.isArray(value))\n {\n return inArray(column, value);\n }\n console.warn(`[buildCondition] 'in' operator requires array value`);\n return undefined;\n\n case 'nin':\n if (Array.isArray(value))\n {\n return notInArray(column, value);\n }\n console.warn(`[buildCondition] 'nin' operator requires array value`);\n return undefined;\n\n case 'is':\n if (value === 'null') return isNull(column);\n if (value === 'notnull') return isNotNull(column);\n console.warn(`[buildCondition] 'is' operator requires 'null' or 'notnull'`);\n return undefined;\n\n default:\n console.warn(`[buildCondition] Unknown operator: ${operator}`);\n return undefined;\n }\n}\n\n/**\n * Combine conditions with OR\n *\n * @example\n * const conditions = [\n * buildFilters({ status: { eq: 'active' } }, users),\n * buildFilters({ role: { eq: 'admin' } }, users)\n * ];\n * const orCondition = orFilters(...conditions);\n */\nexport function orFilters(...conditions: (FilterResult)[]): FilterResult\n{\n const validConditions = conditions.filter(c => c !== undefined) as SQL<unknown>[];\n return validConditions.length > 0 ? or(...validConditions) : undefined;\n}\n\n// ============================================================================\n// Sort Builder\n// ============================================================================\n\n/**\n * Convert sort conditions to Drizzle SQL ORDER BY conditions\n *\n * @param sortConditions - Sort condition array\n * @param table - Drizzle table schema\n * @returns SQL ORDER BY condition array\n *\n * @example\n * const sort = [\n * { field: 'createdAt', direction: 'desc' },\n * { field: 'name', direction: 'asc' }\n * ];\n * const orderBy = buildSort(sort, users);\n * const data = await db.select().from(users).orderBy(...orderBy);\n */\nexport function buildSort(\n sortConditions: SortCondition[],\n table: DrizzleTable\n): SortResult\n{\n const orderByClauses: SQL<unknown>[] = [];\n\n for (const { field, direction } of sortConditions)\n {\n const column = table[field] as PgColumn;\n\n if (!column)\n {\n console.warn(`[buildSort] Unknown field: ${field}`);\n continue;\n }\n\n const clause = direction === 'desc' ? desc(column) : asc(column);\n orderByClauses.push(clause);\n }\n\n return orderByClauses;\n}\n\n// ============================================================================\n// Pagination Utilities\n// ============================================================================\n\n/**\n * Apply pagination to Drizzle query\n *\n * @param pagination - Pagination parameters\n * @returns { offset, limit } object\n *\n * @example\n * const { offset, limit } = applyPagination({ page: 2, limit: 20 });\n * const data = await db.select().from(users).limit(limit).offset(offset);\n */\nexport function applyPagination(pagination: PaginationParams)\n{\n const { page, limit } = pagination;\n const offset = (page - 1) * limit;\n\n return { offset, limit };\n}\n\n/**\n * Create pagination metadata\n *\n * @param pagination - Pagination parameters\n * @param total - Total count\n * @returns Pagination metadata\n *\n * @example\n * const meta = createPaginationMeta({ page: 2, limit: 20 }, 156);\n * // { page: 2, limit: 20, total: 156, totalPages: 8, hasNext: true, hasPrev: true }\n */\nexport function createPaginationMeta(\n pagination: PaginationParams,\n total: number\n): PaginationMeta\n{\n const { page, limit } = pagination;\n const totalPages = Math.ceil(total / limit);\n\n return {\n page,\n limit,\n total,\n totalPages,\n hasNext: page < totalPages,\n hasPrev: page > 1,\n };\n}\n\n/**\n * Count total records (count query)\n *\n * @param db - Drizzle DB instance\n * @param table - Table schema\n * @param whereCondition - WHERE condition (optional)\n * @returns Total count\n *\n * @example\n * const total = await countTotal(db, users);\n * const total = await countTotal(db, users, eq(users.status, 'active'));\n */\nexport async function countTotal(\n db: PostgresJsDatabase<Record<string, never>>,\n table: DrizzleTable,\n whereCondition?: any\n): Promise<number>\n{\n const query = db\n .select({ count: sql<number>`count(*)::int` })\n .from(table);\n\n if (whereCondition)\n {\n query.where(whereCondition);\n }\n\n const [result] = await query;\n return result?.count || 0;\n}","/**\n * Query Builder (Fluent Interface)\n *\n * Chainable query builder for Repository pattern.\n * Provides a fluent API for building complex queries.\n *\n * @example\n * ```typescript\n * const users = await userRepo\n * .query()\n * .where({ status: 'active' })\n * .where({ role: 'admin' })\n * .orderBy('createdAt', 'desc')\n * .limit(10)\n * .findMany();\n * ```\n */\n\nimport type { PgTable } from 'drizzle-orm/pg-core';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\nimport type { Filters, SortCondition } from './filters.js';\n\nimport { buildFilters, buildSort } from './filters.js';\n\n/**\n * Query Builder class for chainable queries\n *\n * Supports method chaining for building complex queries in a fluent style.\n */\nexport class QueryBuilder<\n TTable extends PgTable,\n TSelect = TTable['$inferSelect']\n>\n{\n private db: PostgresJsDatabase<any>;\n private table: TTable;\n private filterConditions: Filters[] = [];\n private sortConditions: SortCondition[] = [];\n private limitValue?: number;\n private offsetValue?: number;\n\n constructor(db: PostgresJsDatabase<any>, table: TTable)\n {\n this.db = db;\n this.table = table;\n }\n\n /**\n * Add WHERE conditions\n *\n * Multiple where() calls are combined with AND logic.\n *\n * @param filters - Filter conditions\n * @returns QueryBuilder for chaining\n *\n * @example\n * ```typescript\n * query\n * .where({ status: 'active' })\n * .where({ role: 'admin' }) // AND condition\n * ```\n */\n where(filters: Filters): this\n {\n this.filterConditions.push(filters);\n return this;\n }\n\n /**\n * Add ORDER BY clause\n *\n * Multiple orderBy() calls create multi-column sorting.\n *\n * @param field - Field name to sort by\n * @param direction - Sort direction ('asc' or 'desc')\n * @returns QueryBuilder for chaining\n *\n * @example\n * ```typescript\n * query\n * .orderBy('isPremium', 'desc')\n * .orderBy('createdAt', 'desc')\n * ```\n */\n orderBy(field: string, direction: 'asc' | 'desc' = 'asc'): this\n {\n this.sortConditions.push({ field, direction });\n return this;\n }\n\n /**\n * Set LIMIT clause\n *\n * @param limit - Maximum number of records to return\n * @returns QueryBuilder for chaining\n *\n * @example\n * ```typescript\n * query.limit(10)\n * ```\n */\n limit(limit: number): this\n {\n this.limitValue = limit;\n return this;\n }\n\n /**\n * Set OFFSET clause\n *\n * @param offset - Number of records to skip\n * @returns QueryBuilder for chaining\n *\n * @example\n * ```typescript\n * query.offset(20)\n * ```\n */\n offset(offset: number): this\n {\n this.offsetValue = offset;\n return this;\n }\n\n /**\n * Execute query and return multiple records\n *\n * @returns Array of records\n *\n * @example\n * ```typescript\n * const users = await query\n * .where({ status: 'active' })\n * .orderBy('createdAt', 'desc')\n * .limit(10)\n * .findMany();\n * ```\n */\n async findMany(): Promise<TSelect[]>\n {\n // Merge all filter conditions with AND\n const mergedFilters = this.mergeFilters();\n const whereCondition = buildFilters(mergedFilters, this.table as any);\n const orderBy = buildSort(this.sortConditions, this.table as any);\n\n let query = this.db\n .select()\n .from(this.table as any)\n .where(whereCondition)\n .orderBy(...orderBy);\n\n if (this.limitValue !== undefined)\n {\n query = query.limit(this.limitValue) as any;\n }\n\n if (this.offsetValue !== undefined)\n {\n query = query.offset(this.offsetValue) as any;\n }\n\n return query as Promise<TSelect[]>;\n }\n\n /**\n * Execute query and return first record\n *\n * @returns First matching record or null\n *\n * @example\n * ```typescript\n * const user = await query\n * .where({ email: 'john@example.com' })\n * .findOne();\n * ```\n */\n async findOne(): Promise<TSelect | null>\n {\n const results = await this.limit(1).findMany();\n return results[0] ?? null;\n }\n\n /**\n * Execute query and return count\n *\n * @returns Number of matching records\n *\n * @example\n * ```typescript\n * const count = await query\n * .where({ status: 'active' })\n * .count();\n * ```\n */\n async count(): Promise<number>\n {\n const mergedFilters = this.mergeFilters();\n const whereCondition = buildFilters(mergedFilters, this.table as any);\n\n const { count } = await import('drizzle-orm');\n const result = await this.db\n .select({ count: count() })\n .from(this.table as any)\n .where(whereCondition);\n\n return Number(result[0]?.count ?? 0);\n }\n\n /**\n * Merge multiple filter conditions into single object\n *\n * Combines all where() calls into one filter object.\n */\n private mergeFilters(): Filters\n {\n if (this.filterConditions.length === 0)\n {\n return {};\n }\n\n // Merge all filter objects\n return this.filterConditions.reduce((merged, current) => {\n return { ...merged, ...current };\n }, {});\n }\n}","/**\n * Repository Pattern (JPA Style)\n *\n * Spring JPA-inspired Repository pattern for TypeScript/Drizzle ORM\n *\n * ā
Features:\n * - Auto Read/Write Replica routing (read methods use Replica, write methods use Primary)\n * - Type-safe CRUD operations (findById, findWhere, save, update, delete, etc.)\n * - Advanced filtering with operators (eq, gt, like, in, etc.)\n * - Pagination with metadata (findPage)\n * - Batch operations (saveMany, updateWhere, deleteWhere)\n * - Transaction-aware (automatic participation in Transactional middleware)\n */\n\nimport type { SQL } from 'drizzle-orm';\nimport type { PgTable } from 'drizzle-orm/pg-core';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\nimport type { Filters, SortCondition, PaginationParams, PaginationMeta } from './filters.js';\n\nimport { buildFilters, buildSort, applyPagination, createPaginationMeta, countTotal } from './filters.js';\nimport { getRawDb, getDatabaseMonitoringConfig } from '../manager';\nimport { getTransaction } from '../transaction';\nimport { QueryError } from '../../errors';\nimport { QueryBuilder } from './query-builder.js';\nimport { logger } from '../../logger';\n\n/**\n * Pageable interface (Spring Pageable style)\n */\nexport type Pageable = {\n filters?: Filters;\n sort?: SortCondition[];\n pagination?: PaginationParams;\n};\n\n/**\n * Page result (Spring Page style)\n */\nexport type Page<T> = {\n data: T[];\n meta: PaginationMeta;\n};\n\n/**\n * Repository class\n *\n * Provides JPA Repository-style CRUD methods with automatic transaction support\n *\n * ā
Automatic Transaction Detection:\n * - Automatically participates in active Transactional() middleware context\n * - No need to pass transaction explicitly - uses AsyncLocalStorage\n * - All operations within a transaction use the same transaction DB\n *\n * ā
Auto Read/Write Replica routing (when NOT in transaction):\n * - Read methods (findAll, findById, findOne, findPage, count) ā Uses Read Replica\n * - Write methods (save, update, delete) ā Uses Primary DB\n *\n * ā
DB Priority:\n * 1. Explicit DB (if provided in constructor)\n * 2. Transaction context (if inside Transactional middleware)\n * 3. Read Replica or Primary DB (based on operation type)\n *\n * @example\n * ```typescript\n * // Simple usage - automatically detects transaction\n * class UserService {\n * private get repo() {\n * return new Repository(users); // Auto-detects transaction\n * }\n * }\n *\n * // Route with transaction\n * app.bind(contract, Transactional(), async (c) => {\n * const service = new UserService();\n * await service.createUser(data);\n * // Automatic rollback on error!\n * });\n * ```\n */\nexport class Repository<\n TTable extends PgTable,\n TSelect = TTable['$inferSelect']\n>\n{\n protected db: PostgresJsDatabase<any>;\n protected table: TTable;\n protected useReplica: boolean;\n protected explicitDb?: PostgresJsDatabase<any>; // Track if db was explicitly provided\n protected autoUpdateField?: string; // Field name to auto-update (e.g., 'updatedAt', 'modifiedAt')\n\n constructor(\n dbOrTable: PostgresJsDatabase<any> | TTable,\n tableOrUseReplica?: TTable | boolean,\n useReplica: boolean = true\n ) {\n // Overload 1: new Repository(table) - db auto-resolved\n if ('name' in dbOrTable && typeof dbOrTable.name === 'string') {\n this.db = getRawDb('write');\n this.table = dbOrTable as TTable;\n this.useReplica = typeof tableOrUseReplica === 'boolean' ? tableOrUseReplica : true;\n this.explicitDb = undefined; // No explicit db provided\n }\n // Overload 2: new Repository(db, table, useReplica?) - explicit db provided\n else {\n this.db = dbOrTable as PostgresJsDatabase<any>;\n this.table = tableOrUseReplica as TTable;\n this.useReplica = useReplica;\n this.explicitDb = this.db; // Save explicit db\n }\n\n // Detect auto-update timestamp field from schema\n this.autoUpdateField = this.detectAutoUpdateField();\n }\n\n /**\n * Detect which field (if any) should be auto-updated\n *\n * Checks all table columns for __autoUpdate metadata flag.\n * Set by autoUpdateTimestamp() or timestamps({ autoUpdate: true }) helpers.\n *\n * @returns Field name to auto-update, or undefined if none found\n */\n private detectAutoUpdateField(): string | undefined\n {\n // Guard against undefined/null table\n if (!this.table || typeof this.table !== 'object')\n {\n return undefined;\n }\n\n const tableColumns = this.table as Record<string, any>;\n\n for (const [fieldName, column] of Object.entries(tableColumns))\n {\n // Skip non-column properties (like '_', '$inferSelect', etc.)\n if (fieldName.startsWith('_') || fieldName.startsWith('$'))\n {\n continue;\n }\n\n // Check if column has __autoUpdate flag\n if (column && typeof column === 'object' && column.__autoUpdate === true)\n {\n return fieldName;\n }\n }\n\n return undefined;\n }\n\n /**\n * Inject auto-update timestamp if configured\n *\n * Only injects if:\n * 1. Table has an auto-update field configured (via autoUpdateTimestamp() or timestamps({ autoUpdate: true }))\n * 2. The field is not already explicitly provided in the data\n *\n * @param data - Update data object\n * @returns Data with auto-update timestamp injected (if applicable)\n */\n private injectAutoUpdateTimestamp(data: any): any\n {\n // No auto-update field configured\n if (!this.autoUpdateField)\n {\n return data;\n }\n\n // Field already explicitly provided, don't override\n if (data && this.autoUpdateField in data)\n {\n return data;\n }\n\n // Inject current timestamp\n return {\n ...data,\n [this.autoUpdateField]: new Date(),\n };\n }\n\n /**\n * Get id column from table\n *\n * Helper method to reduce code duplication across methods that need id column.\n *\n * @returns The id column object\n * @throws {QueryError} If table does not have an id column\n */\n private getIdColumn()\n {\n const idColumn = (this.table as Record<string, any>).id;\n\n if (!idColumn)\n {\n throw new QueryError('Table does not have an id column');\n }\n\n return idColumn;\n }\n\n /**\n * Get read-only DB\n *\n * Automatically detects and uses transaction context if available.\n * When in transaction, uses transaction DB to ensure read consistency.\n * Priority: explicitDb > transaction > replica/primary DB\n */\n private getReadDb(): PostgresJsDatabase<any>\n {\n // If db was explicitly provided, always use it\n if (this.explicitDb) {\n return this.explicitDb;\n }\n\n // Check if we're inside a transaction context\n // Use transaction for reads too to ensure consistency\n const tx = getTransaction();\n if (tx) {\n return tx;\n }\n\n // Otherwise use getRawDb for replica routing\n return this.useReplica ? getRawDb('read') : this.db;\n }\n\n /**\n * Get write-only DB\n *\n * Automatically detects and uses transaction context if available.\n * Priority: explicitDb > transaction > primary DB\n */\n private getWriteDb(): PostgresJsDatabase<any>\n {\n // If db was explicitly provided, always use it\n if (this.explicitDb) {\n return this.explicitDb;\n }\n\n // Check if we're inside a transaction context\n const tx = getTransaction();\n if (tx) {\n return tx;\n }\n\n // Otherwise use getRawDb for write operations\n return getRawDb('write');\n }\n\n /**\n * Execute operation with performance monitoring\n *\n * Wraps database operations with timing and logging for slow queries.\n * Only logs if monitoring is enabled and query exceeds threshold.\n *\n * @param operation - Name of the operation (for logging)\n * @param fn - Async function to execute\n * @returns Result of the operation\n */\n private async executeWithMonitoring<T>(\n operation: string,\n fn: () => Promise<T>\n ): Promise<T>\n {\n const config = getDatabaseMonitoringConfig();\n\n // If monitoring is disabled, just execute the operation\n if (!config?.enabled)\n {\n return fn();\n }\n\n const startTime = performance.now();\n\n try\n {\n const result = await fn();\n const duration = performance.now() - startTime;\n\n // Log slow queries\n if (duration >= config.slowThreshold)\n {\n const dbLogger = logger.child('database');\n const logData: any = {\n operation,\n table: this.table._.name,\n duration: `${duration.toFixed(2)}ms`,\n threshold: `${config.slowThreshold}ms`,\n };\n\n dbLogger.warn('Slow query detected', logData);\n }\n\n return result;\n }\n catch (error)\n {\n const duration = performance.now() - startTime;\n const dbLogger = logger.child('database');\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n dbLogger.error('Query failed', {\n operation,\n table: this.table._.name,\n duration: `${duration.toFixed(2)}ms`,\n error: message,\n });\n\n throw error;\n }\n }\n\n /**\n * Find all records (uses Replica)\n *\n * @example\n * const users = await userRepo.findAll();\n */\n async findAll(): Promise<TSelect[]>\n {\n return this.executeWithMonitoring('findAll', async () =>\n {\n const readDb = this.getReadDb();\n // Type assertion needed: Drizzle's from() expects specific table signature\n return readDb.select().from(this.table as any) as Promise<TSelect[]>;\n });\n }\n\n /**\n * Find with pagination (uses Replica)\n *\n * @example\n * const result = await userRepo.findPage({\n * filters: { email: { like: 'john' } },\n * sort: [{ field: 'createdAt', direction: 'desc' }],\n * pagination: { page: 1, limit: 20 }\n * });\n */\n async findPage(pageable: Pageable): Promise<Page<TSelect>>\n {\n return this.executeWithMonitoring('findPage', async () =>\n {\n const { filters = {}, sort = [], pagination = { page: 1, limit: 20 } } = pageable;\n\n // Type assertions needed: Helper functions expect DrizzleTable type\n const whereCondition = buildFilters(filters, this.table as any);\n const orderBy = buildSort(sort, this.table as any);\n const { offset, limit } = applyPagination(pagination);\n\n // Fetch data from Replica\n const readDb = this.getReadDb();\n const data = await readDb\n .select()\n .from(this.table as any)\n .where(whereCondition)\n .orderBy(...orderBy)\n .limit(limit)\n .offset(offset) as TSelect[];\n\n // Count total (uses Replica)\n const total = await countTotal(readDb, this.table as any, whereCondition);\n const meta = createPaginationMeta(pagination, total);\n\n return { data, meta };\n });\n }\n\n /**\n * Find one record by ID (uses Replica)\n *\n * @example\n * const user = await userRepo.findById(1);\n */\n async findById(id: number | string): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('findById', async () =>\n {\n const idColumn = this.getIdColumn();\n\n const { eq } = await import('drizzle-orm');\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(eq(idColumn, id)) as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Find one record by condition (uses Replica)\n *\n * @example\n * const user = await userRepo.findOne(eq(users.email, 'john@example.com'));\n */\n async findOne(where: SQL<unknown>): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('findOne', async () =>\n {\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(where) as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Create a new record (uses Primary)\n *\n * @example\n * const user = await userRepo.save({ email: 'john@example.com', name: 'John' });\n */\n async save(data: any): Promise<TSelect>\n {\n return this.executeWithMonitoring('save', async () =>\n {\n const writeDb = this.getWriteDb();\n const [result] = await writeDb\n .insert(this.table)\n .values(data)\n .returning() as TSelect[];\n\n return result;\n });\n }\n\n /**\n * Update a record (uses Primary)\n *\n * Automatically injects current timestamp if table has auto-update field configured.\n *\n * @example\n * const user = await userRepo.update(1, { name: 'Jane' });\n */\n async update(id: number | string, data: any): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('update', async () =>\n {\n const idColumn = this.getIdColumn();\n\n // Auto-inject timestamp if configured and not explicitly provided\n const updateData = this.injectAutoUpdateTimestamp(data);\n\n const { eq } = await import('drizzle-orm');\n const writeDb = this.getWriteDb();\n const [result] = await writeDb\n .update(this.table)\n .set(updateData)\n .where(eq(idColumn, id))\n .returning() as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Delete a record (uses Primary)\n *\n * @example\n * const deleted = await userRepo.delete(1);\n */\n async delete(id: number | string): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('delete', async () =>\n {\n const idColumn = this.getIdColumn();\n\n const { eq } = await import('drizzle-orm');\n const writeDb = this.getWriteDb();\n const [result] = await writeDb\n .delete(this.table)\n .where(eq(idColumn, id))\n .returning() as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Count records (uses Replica)\n *\n * @example\n * const count = await userRepo.count();\n */\n async count(where?: SQL<unknown>): Promise<number>\n {\n return this.executeWithMonitoring('count', async () =>\n {\n const readDb = this.getReadDb();\n return countTotal(readDb, this.table as any, where);\n });\n }\n\n /**\n * Find records by filters (uses Replica)\n *\n * @example\n * const users = await userRepo.findWhere({ email: { like: '@gmail.com' }, status: 'active' });\n */\n async findWhere(filters: Filters): Promise<TSelect[]>\n {\n return this.executeWithMonitoring('findWhere', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const readDb = this.getReadDb();\n return readDb\n .select()\n .from(this.table as any)\n .where(whereCondition) as Promise<TSelect[]>;\n });\n }\n\n /**\n * Find one record by filters (uses Replica)\n *\n * @example\n * const user = await userRepo.findOneWhere({ email: 'john@example.com' });\n */\n async findOneWhere(filters: Filters): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('findOneWhere', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(whereCondition) as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Check if record exists by ID (uses Replica)\n *\n * @example\n * const exists = await userRepo.exists(1);\n */\n async exists(id: number | string): Promise<boolean>\n {\n return this.executeWithMonitoring('exists', async () =>\n {\n const idColumn = this.getIdColumn();\n\n const { eq } = await import('drizzle-orm');\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(eq(idColumn, id))\n .limit(1) as TSelect[];\n\n return !!result;\n });\n }\n\n /**\n * Check if record exists by filters (uses Replica)\n *\n * @example\n * const exists = await userRepo.existsBy({ email: 'john@example.com' });\n */\n async existsBy(filters: Filters): Promise<boolean>\n {\n return this.executeWithMonitoring('existsBy', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(whereCondition)\n .limit(1) as TSelect[];\n\n return !!result;\n });\n }\n\n /**\n * Count records by filters (uses Replica)\n *\n * @example\n * const count = await userRepo.countBy({ status: 'active' });\n */\n async countBy(filters: Filters): Promise<number>\n {\n return this.executeWithMonitoring('countBy', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const readDb = this.getReadDb();\n return countTotal(readDb, this.table as any, whereCondition);\n });\n }\n\n /**\n * Create multiple records (uses Primary)\n *\n * @example\n * const users = await userRepo.saveMany([\n * { email: 'user1@example.com', name: 'User 1' },\n * { email: 'user2@example.com', name: 'User 2' }\n * ]);\n */\n async saveMany(data: any[]): Promise<TSelect[]>\n {\n return this.executeWithMonitoring('saveMany', async () =>\n {\n const writeDb = this.getWriteDb();\n return writeDb\n .insert(this.table)\n .values(data)\n .returning() as Promise<TSelect[]>;\n });\n }\n\n /**\n * Update multiple records by filters (uses Primary)\n *\n * Automatically injects current timestamp if table has auto-update field configured.\n *\n * @example\n * const count = await userRepo.updateWhere({ status: 'inactive' }, { status: 'archived' });\n */\n async updateWhere(filters: Filters, data: any): Promise<number>\n {\n return this.executeWithMonitoring('updateWhere', async () =>\n {\n // Auto-inject timestamp if configured and not explicitly provided\n const updateData = this.injectAutoUpdateTimestamp(data);\n\n const whereCondition = buildFilters(filters, this.table as any);\n const writeDb = this.getWriteDb();\n const results = await writeDb\n .update(this.table)\n .set(updateData)\n .where(whereCondition)\n .returning() as TSelect[];\n\n return results.length;\n });\n }\n\n /**\n * Delete multiple records by filters (uses Primary)\n *\n * @example\n * const count = await userRepo.deleteWhere({ status: 'banned' });\n */\n async deleteWhere(filters: Filters): Promise<number>\n {\n return this.executeWithMonitoring('deleteWhere', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const writeDb = this.getWriteDb();\n const results = await writeDb\n .delete(this.table)\n .where(whereCondition)\n .returning() as TSelect[];\n\n return results.length;\n });\n }\n\n // ============================================================\n // Query Builder (Fluent Interface)\n // ============================================================\n\n /**\n * Start a chainable query builder (uses Replica)\n *\n * Returns a QueryBuilder instance for building complex queries with method chaining.\n *\n * @returns QueryBuilder instance for chaining\n *\n * @example\n * ```typescript\n * // Simple chaining\n * const users = await userRepo\n * .query()\n * .where({ status: 'active' })\n * .orderBy('createdAt', 'desc')\n * .limit(10)\n * .findMany();\n *\n * // Multiple conditions\n * const admins = await userRepo\n * .query()\n * .where({ role: 'admin' })\n * .where({ status: 'active' }) // AND condition\n * .findMany();\n *\n * // Reusable query\n * const activeQuery = userRepo.query().where({ status: 'active' });\n * const users = await activeQuery.findMany();\n * const count = await activeQuery.count();\n * ```\n */\n query(): QueryBuilder<TTable, TSelect>\n {\n const readDb = this.getReadDb();\n return new QueryBuilder<TTable, TSelect>(readDb, this.table);\n }\n}","/**\n * Repository Factory\n *\n * Provides singleton instances of Repository classes to prevent unnecessary instantiation\n * and ensure consistent instances across the application.\n *\n * ā
Features:\n * - Singleton pattern for both base and custom Repository classes\n * - Automatic caching based on table + constructor\n * - Type-safe with full IDE autocomplete\n * - Supports multiple services accessing the same repository\n * - Memory efficient (single instance per table/class combination)\n *\n * @example\n * ```typescript\n * // Base Repository\n * const userRepo = getRepository(users);\n * await userRepo.findById(1);\n *\n * // Custom Repository\n * class UserRepository extends Repository<typeof users> {\n * async findByEmail(email: string) {\n * return this.findOneWhere({ email });\n * }\n * }\n *\n * const userRepo = getRepository(users, UserRepository);\n * await userRepo.findByEmail('john@example.com');\n * ```\n */\n\nimport { Repository } from './repository.js';\nimport type { PgTable } from 'drizzle-orm/pg-core';\n\n/**\n * Repository instance cache\n * Key format: \"tableName:ClassName\"\n */\nconst repositoryCache = new Map<string, Repository<any>>();\n\n/**\n * Generate cache key from table and constructor\n *\n * @param table - Drizzle table definition\n * @param RepositoryClass - Optional custom Repository class\n * @returns Cache key string\n */\nfunction getCacheKey<TTable extends PgTable>(\n table: TTable,\n RepositoryClass?: new (table: TTable) => Repository<TTable>\n): string\n{\n // Get table name from Drizzle's internal symbol or fallback\n const tableName = (table as any)[Symbol.for('drizzle:Name')]\n || (table as any).name\n || table.toString();\n\n const className = RepositoryClass?.name || 'Repository';\n\n return `${tableName}:${className}`;\n}\n\n/**\n * Get or create a Repository singleton instance (Global Singleton Pattern)\n *\n * This function ensures that only one instance of each Repository is created,\n * preventing memory waste and ensuring consistency across the application.\n *\n * ā
Supports both base Repository and custom Repository classes\n * ā
Returns the same instance on subsequent calls\n * ā
Type-safe with full IDE autocomplete\n * ā
Automatically detects transaction context (via Repository internals)\n *\n * ## ā ļø Note: Global Singleton Pattern\n *\n * This uses a **global singleton cache** that persists throughout application lifecycle.\n *\n * **Tradeoffs:**\n * - ā
Simple API, no middleware required\n * - ā
Maximum memory efficiency\n * - ā ļø Requires manual `clearRepositoryCache()` in tests\n * - ā ļø Global state (harder to isolate in testing)\n *\n * **For better test isolation**, consider using **request-scoped repositories**:\n * ```typescript\n * import { getScopedRepository, RepositoryScope } from '@spfn/core/db';\n *\n * // Add middleware (once)\n * app.use(RepositoryScope());\n *\n * // Use getScopedRepository() instead - automatic per-request caching\n * const repo = getScopedRepository(users);\n * ```\n *\n * See: `request-scope.ts` for request-scoped alternative\n *\n * ## š Transaction Handling\n *\n * Repository instances are cached globally, but they automatically detect\n * and use transaction context via AsyncLocalStorage in each method call.\n * This means:\n * - **Same repository instance** can be used both inside and outside transactions\n * - **No need to create separate repository instances** per transaction\n * - **Transaction safety is guaranteed** by AsyncLocalStorage context\n *\n * The Repository internally calls `getTransaction()` on every database operation,\n * ensuring the correct DB instance (transaction or default) is always used.\n *\n * @param table - Drizzle table definition\n * @param RepositoryClass - Optional custom Repository class extending Repository\n * @returns Repository instance (cached singleton)\n *\n * @example\n * ```typescript\n * // Base Repository - simple CRUD\n * import { getRepository } from '@spfn/core/db';\n * import { users } from './entities';\n *\n * export async function getUser(id: number) {\n * const repo = getRepository(users);\n * return repo.findById(id);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Custom Repository - with custom methods\n * import { Repository, getRepository } from '@spfn/core/db';\n * import { users } from './entities';\n *\n * class UserRepository extends Repository<typeof users> {\n * async findByEmail(email: string) {\n * return this.findOneWhere({ email });\n * }\n *\n * async findActiveUsers() {\n * return this.findWhere({ status: 'active' });\n * }\n * }\n *\n * export async function getUserByEmail(email: string) {\n * const repo = getRepository(users, UserRepository);\n * return repo.findByEmail(email);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Multiple services - same instance\n * // services/users.ts\n * const repo = getRepository(users, UserRepository); // Instance A\n *\n * // services/auth.ts\n * const repo = getRepository(users, UserRepository); // Same Instance A\n * ```\n *\n * @example\n * ```typescript\n * // Transaction handling - same instance works everywhere\n * import { getRepository, Transactional } from '@spfn/core/db';\n * import { users } from './entities';\n *\n * const userRepo = getRepository(users);\n *\n * // Outside transaction - uses default DB\n * await userRepo.findById(1);\n *\n * // Inside Transactional() middleware - uses transaction automatically\n * app.use(Transactional());\n * app.post('/', async (c) => {\n * // Same instance, but now uses transaction DB\n * await userRepo.save({ email: 'test@example.com' });\n * return c.json({ success: true });\n * });\n * ```\n */\nexport function getRepository<\n TTable extends PgTable,\n TRepo extends Repository<TTable> = Repository<TTable>\n>(\n table: TTable,\n RepositoryClass?: new (table: TTable) => TRepo\n): TRepo\n{\n const cacheKey = getCacheKey(table, RepositoryClass as any);\n\n // Check cache\n let repo = repositoryCache.get(cacheKey);\n\n if (!repo)\n {\n // Create new instance\n if (RepositoryClass)\n {\n repo = new RepositoryClass(table);\n }\n else\n {\n repo = new Repository(table);\n }\n\n // Cache it\n repositoryCache.set(cacheKey, repo);\n }\n\n return repo as TRepo;\n}\n\n/**\n * Clear repository cache\n *\n * Removes all cached repository instances. Useful for testing scenarios\n * where you need fresh instances.\n *\n * ā ļø Warning: Only use this in tests. In production, cached instances\n * should persist throughout the application lifecycle.\n *\n * @example\n * ```typescript\n * import { clearRepositoryCache } from '@spfn/core/db';\n *\n * beforeEach(() => {\n * clearRepositoryCache(); // Fresh instances for each test\n * });\n * ```\n */\nexport function clearRepositoryCache(): void\n{\n repositoryCache.clear();\n}\n\n/**\n * Get cache size (for debugging/monitoring)\n *\n * @returns Number of cached repository instances\n *\n * @example\n * ```typescript\n * const size = getRepositoryCacheSize();\n * console.log(`Cached repositories: ${size}`);\n * ```\n */\nexport function getRepositoryCacheSize(): number\n{\n return repositoryCache.size;\n}","/**\n * Request-Scoped Repository Pattern\n *\n * Provides request-level repository caching using AsyncLocalStorage.\n *\n * ## Benefits:\n * - ā
**Automatic isolation**: Each request gets its own repository cache\n * - ā
**Memory efficient**: Cache cleared automatically after request ends\n * - ā
**Test-friendly**: No global state, tests are fully isolated\n * - ā
**DI-compatible**: Can inject custom repositories easily\n * - ā
**Zero overhead**: Uses existing AsyncLocalStorage infrastructure\n *\n * ## vs Global Singleton:\n *\n * | Feature | Global Singleton | Request-Scoped |\n * |---------|-----------------|----------------|\n * | Memory | Permanent cache | Request-only cache |\n * | Test isolation | Manual clearRepositoryCache() | Automatic |\n * | Thread-safety | Shared state | Isolated per request |\n * | DI support | Difficult | Easy |\n *\n * @example\n * ```typescript\n * // 1. Add middleware (routes automatically)\n * import { RepositoryScope } from '@spfn/core/db';\n *\n * app.use(RepositoryScope());\n *\n * // 2. Use in service (same request = same instance)\n * import { getScopedRepository } from '@spfn/core/db';\n *\n * export async function createPost(data) {\n * const repo = getScopedRepository(posts, PostRepository); // First call - creates\n * const existing = await repo.findBySlug(slug);\n * return repo.save(data); // Same instance\n * }\n *\n * // 3. Different request = different cache (automatic)\n * ```\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\nimport { Repository } from './repository.js';\nimport type { PgTable } from 'drizzle-orm/pg-core';\nimport type { MiddlewareHandler } from 'hono';\n\n/**\n * AsyncLocalStorage for request-scoped repository cache\n * Each request gets its own Map instance\n */\nconst repositoryStorage = new AsyncLocalStorage<Map<string, Repository<any>>>();\n\n/**\n * Generate cache key from table and repository class\n * Same logic as global singleton for consistency\n */\nfunction getCacheKey<TTable extends PgTable>(\n table: TTable,\n RepositoryClass?: new (table: TTable) => Repository<TTable>\n): string\n{\n const tableName = (table as any)[Symbol.for('drizzle:Name')]\n || (table as any).name\n || table.toString();\n\n const className = RepositoryClass?.name || 'Repository';\n\n return `${tableName}:${className}`;\n}\n\n/**\n * Execute function within a repository scope\n *\n * Creates a new request-scoped cache for the duration of the function.\n * Automatically cleaned up after function completes.\n *\n * @param fn - Async function to execute within scope\n * @returns Result of the function\n *\n * @example\n * ```typescript\n * // Middleware\n * app.use(async (c, next) => {\n * return withRepositoryScope(() => next());\n * });\n *\n * // Manual usage\n * const result = await withRepositoryScope(async () => {\n * const repo = getScopedRepository(users);\n * return repo.findAll();\n * });\n * ```\n */\nexport function withRepositoryScope<T>(fn: () => Promise<T>): Promise<T>\n{\n const cache = new Map<string, Repository<any>>();\n return repositoryStorage.run(cache, fn);\n}\n\n/**\n * Get request-scoped repository instance\n *\n * Returns cached instance within the same request, creates new instance for new requests.\n * Falls back to creating a new instance if called outside of a repository scope.\n *\n * ## Behavior:\n * - **Inside scope**: Returns cached instance (same request = same instance)\n * - **Outside scope**: Creates new instance every time (graceful degradation)\n *\n * @param table - Drizzle table definition\n * @param RepositoryClass - Optional custom Repository class\n * @returns Repository instance (cached or new)\n *\n * @example\n * ```typescript\n * // Base Repository\n * const repo = getScopedRepository(users);\n * await repo.findById(1);\n *\n * // Custom Repository\n * class UserRepository extends Repository<typeof users> {\n * async findByEmail(email: string) {\n * return this.findOneWhere({ email });\n * }\n * }\n *\n * const repo = getScopedRepository(users, UserRepository);\n * await repo.findByEmail('john@example.com');\n *\n * // Within same request - returns cached instance\n * const repo2 = getScopedRepository(users, UserRepository); // Same instance!\n * ```\n */\nexport function getScopedRepository<\n TTable extends PgTable,\n TRepo extends Repository<TTable> = Repository<TTable>\n>(\n table: TTable,\n RepositoryClass?: new (table: TTable) => TRepo\n): TRepo\n{\n const cache = repositoryStorage.getStore();\n\n // Outside scope - create new instance (graceful degradation)\n if (!cache)\n {\n return RepositoryClass\n ? new RepositoryClass(table)\n : new Repository(table) as TRepo;\n }\n\n // Inside scope - use cache\n const key = getCacheKey(table, RepositoryClass as any);\n let repo = cache.get(key);\n\n if (!repo)\n {\n repo = RepositoryClass\n ? new RepositoryClass(table)\n : new Repository(table);\n cache.set(key, repo);\n }\n\n return repo as TRepo;\n}\n\n/**\n * Hono middleware for automatic repository scope management\n *\n * Wraps each request in a repository scope, ensuring automatic cache isolation.\n * All repositories accessed via getScopedRepository() within this request will be cached.\n *\n * @returns Hono middleware handler\n *\n * @example\n * ```typescript\n * // Global middleware (recommended)\n * import { createServer } from '@spfn/core';\n * import { RepositoryScope } from '@spfn/core/db';\n *\n * const app = createServer();\n * app.use(RepositoryScope());\n *\n * // Or in server.config.ts\n * export default {\n * middlewares: [\n * { name: 'repositoryScope', handler: RepositoryScope() }\n * ]\n * };\n * ```\n */\nexport function RepositoryScope(): MiddlewareHandler\n{\n return async (_c, next) =>\n {\n return withRepositoryScope(() => next());\n };\n}\n\n/**\n * Get current repository cache size (for debugging/monitoring)\n *\n * Returns the number of cached repository instances in the current request scope.\n * Returns 0 if called outside a scope.\n *\n * @returns Number of cached repositories in current scope\n *\n * @example\n * ```typescript\n * const size = getScopedCacheSize();\n * console.log(`Cached repositories in this request: ${size}`);\n * ```\n */\nexport function getScopedCacheSize(): number\n{\n const cache = repositoryStorage.getStore();\n return cache?.size ?? 0;\n}\n\n/**\n * Check if currently inside a repository scope\n *\n * @returns true if inside scope, false otherwise\n *\n * @example\n * ```typescript\n * if (isInRepositoryScope()) {\n * console.log('Using scoped cache');\n * } else {\n * console.log('Creating new instances');\n * }\n * ```\n */\nexport function isInRepositoryScope(): boolean\n{\n return repositoryStorage.getStore() !== undefined;\n}","/**\n * Table Name Utilities\n *\n * Helper functions for extracting table names from Drizzle table objects.\n * Used by Repository for accessing db.query API with dynamic table names.\n */\n\nimport type { PgTable } from 'drizzle-orm/pg-core';\n\n/**\n * Table name cache for performance optimization\n * Prevents repeated Symbol.for lookups\n */\nconst tableNameCache = new WeakMap<PgTable, string>();\n\n/**\n * Get table name from Drizzle table object\n *\n * Uses WeakMap cache to avoid repeated Symbol lookups for better performance.\n *\n * @param table - Drizzle table schema\n * @returns Table name string\n *\n * @example\n * ```typescript\n * import { users } from './schema';\n * const name = getTableName(users); // 'users'\n * ```\n */\nexport function getTableName(table: PgTable): string\n{\n // Check cache first\n const cached = tableNameCache.get(table);\n if (cached)\n {\n return cached;\n }\n\n // Extract name from Drizzle table metadata\n // Drizzle stores table name in Symbol.for('drizzle:Name')\n const name = (table as any)[Symbol.for('drizzle:Name')] || table.constructor.name;\n\n // Cache for future lookups\n tableNameCache.set(table, name);\n\n return name;\n}","/**\n * Repository Module Exports\n */\n\n// Repository Pattern\nexport { Repository } from './repository.js';\nexport type {\n Pageable,\n Page,\n} from './repository.js';\n\n// Repository Factory (Singleton Pattern)\nexport {\n getRepository,\n clearRepositoryCache,\n getRepositoryCacheSize\n} from './factory.js';\n\n// Request-Scoped Repository (Recommended for testability)\nexport {\n getScopedRepository,\n withRepositoryScope,\n RepositoryScope,\n getScopedCacheSize,\n isInRepositoryScope\n} from './request-scope.js';\n\n// Query Builder\nexport { QueryBuilder } from './query-builder.js';\n\n// Relation Registry\nexport { getTableName } from './relation-registry.js';\n\n// Filter Utilities (formerly from query module)\nexport {\n buildFilters,\n buildSort,\n orFilters,\n applyPagination,\n createPaginationMeta,\n countTotal,\n} from './filters.js';\n\nexport type {\n FilterOperator,\n FilterValue,\n FilterCondition,\n Filters,\n FilterResult,\n SortDirection,\n SortCondition,\n SortResult,\n PaginationParams,\n PaginationMeta,\n DrizzleTable,\n} from './filters.js';","/**\n * WrappedDb - Drizzle + Repository ķØķ“ ķµķ©\n *\n * Drizzleģ ėŖØė źø°ė„ģ ģ ģ§ķė©“ģ JPA ģ¤ķģ¼ Repository ģ ź·¼ ģ ź³µ\n */\n\nimport type { PgTable } from 'drizzle-orm/pg-core';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\nimport { Repository } from '../repository';\n\n/**\n * WrappedDb ķ“ėģ¤\n *\n * Drizzle DB넼 ėķķģ¬ ģ¶ź° źø°ė„ ģ ź³µ\n */\nexport class WrappedDb\n{\n constructor(private db: PostgresJsDatabase<Record<string, never>>) {}\n\n /**\n * Repository ķØķ“ģ¼ė” ķ
ģ“ėø ģ ź·¼\n *\n * @example\n * const db = getDb();\n * const userRepo = db.for(users);\n * const result = await userRepo.findPage(pageable);\n */\n for<TTable extends PgTable<any>, TSelect = any>(table: TTable): Repository<TTable, TSelect>\n {\n return new Repository<TTable, TSelect>(this.db, table);\n }\n\n /**\n * Drizzleģ ėŖØė ė©ģė넼 ķė”ģ\n *\n * select, insert, update, delete, transaction ė± ėŖØė Drizzle ė©ģė ģ¬ģ© ź°ė„\n */\n get select()\n {\n return this.db.select.bind(this.db);\n }\n\n get insert()\n {\n return this.db.insert.bind(this.db);\n }\n\n get update()\n {\n return this.db.update.bind(this.db);\n }\n\n get delete()\n {\n return this.db.delete.bind(this.db);\n }\n\n get execute()\n {\n return this.db.execute.bind(this.db);\n }\n\n get transaction()\n {\n return this.db.transaction.bind(this.db);\n }\n\n get query()\n {\n return this.db.query;\n }\n\n get $with()\n {\n return this.db.$with.bind(this.db);\n }\n\n /**\n * Raw Drizzle DB ģ ź·¼ (ķģģ)\n */\n get raw(): PostgresJsDatabase\n {\n return this.db;\n }\n}\n","/**\n * DB Context Helper\n *\n * Automatically detects transaction context and returns the appropriate DB instance.\n *\n * ā
Implemented:\n * - AsyncLocalStorage-based transaction detection\n * - Returns default DB instance when no transaction\n * - JPA-style Repository pattern support\n * - Preserves Drizzle core features\n *\n * ā ļø TODO:\n * - Nested transaction detection and warning logs\n * - Transaction timeout checks\n *\n * š” Future considerations:\n * - Add function to force default DB usage (useDefaultDb)\n * - Auto-select Read Replica (detect read-only queries)\n * - Transaction statistics collection (success/failure/rollback count)\n * - Return transaction ID function (for debugging)\n *\n * š Related files:\n * - src/utils/async-context.ts (AsyncLocalStorage implementation)\n * - src/utils/transaction.ts (Transactional middleware)\n * - src/db/db-instance.ts (Default DB instance)\n * - src/db/wrapped-db.ts (WrappedDb implementation)\n * - src/db/repository.ts (Repository implementation)\n */\nimport { getTransaction } from '../transaction';\n\nimport { getDatabase, type DbConnectionType } from './manager.js';\nimport { WrappedDb } from './wrapped-db.js';\n\n/**\n * Get DB instance (WrappedDb)\n *\n * - If transaction context exists: Returns transaction DB\n * - Otherwise: Returns default DB or specified connection type\n * - Wraps with WrappedDb to provide both Repository pattern + Drizzle features\n *\n * Usage 1: Direct Drizzle use\n * ```typescript\n * export async function GET(c: RouteContext) {\n * const db = getDb();\n * const users = await db.select().from(users);\n * return c.json(users);\n * }\n * ```\n *\n * Usage 2: Repository pattern\n * ```typescript\n * export async function GET(c: RouteContext) {\n * const db = getDb();\n * const userRepo = db.for(users);\n * const result = await userRepo.findPage(pageable);\n * return c.json(result);\n * }\n * ```\n *\n * Usage 3: Specify connection type\n * ```typescript\n * const readDb = getDb('read'); // Use read replica\n * const writeDb = getDb('write'); // Use primary\n * ```\n *\n * @param type - Optional connection type ('read' or 'write')\n * @returns WrappedDb instance (transaction or specified DB)\n */\nexport function getDb(type?: DbConnectionType): WrappedDb\n{\n const tx = getTransaction();\n\n // If transaction exists, always use transaction DB\n if (tx)\n {\n return new WrappedDb(tx);\n }\n\n // Otherwise use specified type or default from manager\n const rawDb = getDatabase(type);\n if (!rawDb)\n {\n throw new Error(\n 'Database not initialized. ' +\n 'Set DATABASE_URL environment variable or call initDatabase() first.'\n );\n }\n\n return new WrappedDb(rawDb);\n}","/**\n * Database Manager Module Exports\n */\n\n// DB Instance & Connection (Backward Compatibility)\nexport { db, getRawDb } from './instance.js';\nexport type { DbConnectionType } from './instance.js';\n\n// DB Context\nexport { getDb } from './context.js';\n\n// Database Factory (Environment Detection)\nexport { createDatabaseFromEnv } from './factory.js';\nexport type { DatabaseClients } from './factory.js';\n\n// Database Manager (Singleton Pattern)\nexport {\n initDatabase,\n getDatabase,\n setDatabase,\n closeDatabase,\n getDatabaseInfo,\n getDatabaseMonitoringConfig,\n} from './manager.js';\n\n// Connection Functions\nexport { createDatabaseConnection, checkConnection } from './connection.js';\n\n// Configuration Types\nexport type { PoolConfig, RetryConfig } from './config.js';\n\n// Wrapped DB\nexport { WrappedDb } from './wrapped-db.js';","/**\n * Drizzle Kit configuration generator\n * Automatically generates drizzle.config.ts from environment variables\n */\n\nexport interface DrizzleConfigOptions\n{\n /** Database connection URL (defaults to process.env.DATABASE_URL) */\n databaseUrl?: string;\n\n /** Schema files glob pattern (defaults to './src/server/entities/*.ts') */\n schema?: string;\n\n /** Migration output directory (defaults to './drizzle/migrations') */\n out?: string;\n\n /** Database dialect (auto-detected from URL if not provided) */\n dialect?: 'postgresql' | 'mysql' | 'sqlite';\n}\n\n/**\n * Detect database dialect from connection URL\n */\nexport function detectDialect(url: string): 'postgresql' | 'mysql' | 'sqlite'\n{\n if (url.startsWith('postgres://') || url.startsWith('postgresql://'))\n {\n return 'postgresql';\n }\n\n if (url.startsWith('mysql://'))\n {\n return 'mysql';\n }\n\n if (url.startsWith('sqlite://') || url.includes('.db') || url.includes('.sqlite'))\n {\n return 'sqlite';\n }\n\n throw new Error(\n `Unsupported database URL format: ${url}. Supported: postgresql://, mysql://, sqlite://`\n );\n}\n\n/**\n * Generate Drizzle Kit configuration\n *\n * @param options - Configuration options\n * @returns Drizzle Kit configuration object\n *\n * @example\n * ```ts\n * // Zero-config (reads from process.env.DATABASE_URL)\n * const config = getDrizzleConfig();\n *\n * // Custom config\n * const config = getDrizzleConfig({\n * databaseUrl: 'postgresql://localhost/mydb',\n * schema: './src/db/schema/*.ts',\n * out: './migrations',\n * });\n * ```\n */\nexport function getDrizzleConfig(options: DrizzleConfigOptions = {})\n{\n const databaseUrl = options.databaseUrl ?? process.env.DATABASE_URL;\n\n if (!databaseUrl)\n {\n throw new Error(\n 'DATABASE_URL is required. Set it in .env or pass it to getDrizzleConfig()'\n );\n }\n\n const dialect = options.dialect ?? detectDialect(databaseUrl);\n const schema = options.schema ?? './src/server/entities/*.ts';\n const out = options.out ?? './drizzle/migrations';\n\n return {\n schema,\n out,\n dialect,\n dbCredentials: getDbCredentials(dialect, databaseUrl),\n };\n}\n\n/**\n * Get database credentials based on dialect\n */\nfunction getDbCredentials(dialect: string, url: string)\n{\n switch (dialect)\n {\n case 'postgresql':\n case 'mysql':\n return { url };\n\n case 'sqlite':\n // Extract file path from sqlite:// URL\n const dbPath = url.replace('sqlite://', '').replace('sqlite:', '');\n return { url: dbPath };\n\n default:\n throw new Error(`Unsupported dialect: ${dialect}`);\n }\n}\n\n/**\n * Generate drizzle.config.ts file content\n *\n * @param options - Configuration options\n * @returns File content as string\n */\nexport function generateDrizzleConfigFile(options: DrizzleConfigOptions = {}): string\n{\n const config = getDrizzleConfig(options);\n\n return `import { defineConfig } from 'drizzle-kit';\n\nexport default defineConfig({\n schema: '${config.schema}',\n out: '${config.out}',\n dialect: '${config.dialect}',\n dbCredentials: ${JSON.stringify(config.dbCredentials, null, 4)},\n});\n`;\n}","/**\n * Schema Helper Functions\n *\n * Common field patterns for Drizzle ORM entities to reduce boilerplate.\n *\n * @example\n * ```typescript\n * import { pgTable, text } from 'drizzle-orm/pg-core';\n * import { id, timestamps } from '@spfn/core';\n *\n * export const users = pgTable('users', {\n * id: id(),\n * email: text('email').unique(),\n * ...timestamps(),\n * });\n * ```\n */\n\nimport type { PgColumn } from 'drizzle-orm/pg-core';\nimport { bigserial, timestamp } from 'drizzle-orm/pg-core';\n\n/**\n * Standard auto-incrementing primary key\n *\n * @returns bigserial primary key column\n *\n * @example\n * ```typescript\n * export const users = pgTable('users', {\n * id: id(),\n * // ...\n * });\n * ```\n */\nexport function id()\n{\n return bigserial('id', { mode: 'number' }).primaryKey();\n}\n\n/**\n * Standard timestamp fields (createdAt, updatedAt)\n *\n * Both fields are timezone-aware, auto-set to current time on creation.\n * When autoUpdate is enabled, updatedAt will be automatically updated on record updates.\n *\n * @param options - Optional configuration\n * @param options.autoUpdate - Automatically update updatedAt on record updates (default: false)\n * @returns Object with createdAt and updatedAt columns\n *\n * @example\n * ```typescript\n * // Without auto-update\n * export const users = pgTable('users', {\n * id: id(),\n * email: text('email'),\n * ...timestamps(),\n * });\n *\n * // With auto-update\n * export const posts = pgTable('posts', {\n * id: id(),\n * title: text('title'),\n * ...timestamps({ autoUpdate: true }),\n * });\n * ```\n */\nexport function timestamps(options?: { autoUpdate?: boolean })\n{\n const updatedAtColumn = timestamp('updated_at', { withTimezone: true, mode: 'date' })\n .defaultNow()\n .notNull();\n\n // Mark column for auto-update if enabled\n if (options?.autoUpdate)\n {\n (updatedAtColumn as any).__autoUpdate = true;\n }\n\n return {\n createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' })\n .defaultNow()\n .notNull(),\n updatedAt: updatedAtColumn,\n };\n}\n\n/**\n * Auto-updating timestamp field (for custom timestamp fields)\n *\n * Creates a timestamp field that automatically updates on record updates.\n * Useful when you need a custom name like 'modifiedAt', 'lastUpdated', etc.\n *\n * @param fieldName - Field name in camelCase (default: 'updatedAt')\n * @returns Object with the timestamp column (converts camelCase to snake_case)\n *\n * @example\n * ```typescript\n * // Custom field name\n * export const posts = pgTable('posts', {\n * id: id(),\n * title: text('title'),\n * ...autoUpdateTimestamp('modifiedAt'), // Creates 'modified_at' column\n * });\n *\n * // Default field name\n * export const articles = pgTable('articles', {\n * id: id(),\n * ...autoUpdateTimestamp(), // Creates 'updatedAt' -> 'updated_at'\n * });\n * ```\n */\nexport function autoUpdateTimestamp(fieldName: string = 'updatedAt')\n{\n // Convert camelCase to snake_case for column name\n const columnName = fieldName.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');\n\n const column = timestamp(columnName, { withTimezone: true, mode: 'date' })\n .defaultNow()\n .notNull();\n\n // Mark column for auto-update\n (column as any).__autoUpdate = true;\n\n return {\n [fieldName]: column,\n };\n}\n\n/**\n * Foreign key reference to another table\n *\n * Creates a bigserial column with cascade delete.\n * Type-safe: ensures the reference points to a valid PostgreSQL column.\n *\n * @param name - Column name (e.g., 'author' creates 'author_id')\n * @param reference - Reference to parent table column\n * @param options - Optional foreign key options\n *\n * @example\n * ```typescript\n * import { users } from './users';\n *\n * export const posts = pgTable('posts', {\n * id: id(),\n * authorId: foreignKey('author', () => users.id),\n * ...timestamps(),\n * });\n * ```\n */\nexport function foreignKey<T extends PgColumn>(\n name: string,\n reference: () => T,\n options?: { onDelete?: 'cascade' | 'set null' | 'restrict' | 'no action' }\n)\n{\n return bigserial(`${name}_id`, { mode: 'number' })\n .notNull()\n .references(reference, { onDelete: options?.onDelete ?? 'cascade' });\n}\n\n/**\n * Optional foreign key reference (nullable)\n *\n * Type-safe: ensures the reference points to a valid PostgreSQL column.\n *\n * @param name - Column name (e.g., 'author' creates 'author_id')\n * @param reference - Reference to parent table column\n * @param options - Optional foreign key options\n *\n * @example\n * ```typescript\n * export const posts = pgTable('posts', {\n * id: id(),\n * authorId: optionalForeignKey('author', () => users.id),\n * });\n * ```\n */\nexport function optionalForeignKey<T extends PgColumn>(\n name: string,\n reference: () => T,\n options?: { onDelete?: 'cascade' | 'set null' | 'restrict' | 'no action' }\n)\n{\n return bigserial(`${name}_id`, { mode: 'number' })\n .references(reference, { onDelete: options?.onDelete ?? 'set null' });\n}","/**\n * Schema Module Exports\n */\n\n// Schema Helpers\nexport { id, timestamps, foreignKey, optionalForeignKey } from './helpers.js';","/**\n * Database Module Exports\n *\n * Entry point for DB module (Pure re-export only)\n */\n\n// Manager (DB Instance, Factory, Connection)\nexport {\n db,\n getRawDb,\n getDb,\n createDatabaseFromEnv,\n initDatabase,\n getDatabase,\n setDatabase,\n closeDatabase,\n getDatabaseInfo,\n createDatabaseConnection,\n checkConnection,\n WrappedDb,\n} from './manager';\n\nexport type {\n DbConnectionType,\n DatabaseClients,\n PoolConfig,\n RetryConfig,\n} from './manager';\n\n// Drizzle Config Generator\nexport { getDrizzleConfig, detectDialect, generateDrizzleConfigFile } from './manager/config-generator.js';\nexport type { DrizzleConfigOptions } from './manager/config-generator.js';\n\n// Repository Pattern\nexport {\n Repository,\n getRepository,\n clearRepositoryCache,\n getRepositoryCacheSize,\n getScopedRepository,\n withRepositoryScope,\n RepositoryScope,\n getScopedCacheSize,\n isInRepositoryScope,\n QueryBuilder,\n getTableName,\n} from './repository';\n\nexport type {\n Pageable,\n Page,\n} from './repository';\n\n// Schema Helpers\nexport { id, timestamps, foreignKey, optionalForeignKey } from './schema';\n\n// Transaction\nexport { Transactional, getTransaction, runWithTransaction } from './transaction';\nexport type { TransactionContext, TransactionDB, TransactionalOptions } from './transaction';\n\n// PostgreSQL Error Utilities\nexport { fromPostgresError } from './postgres-errors.js';","import { readdir, stat } from 'fs/promises';\nimport { join, relative } from 'path';\nimport type { Hono } from 'hono';\n\n/**\n * Extend Hono Context to support skipMiddlewares metadata\n */\ndeclare module 'hono' {\n interface ContextVariableMap {\n _skipMiddlewares?: string[];\n }\n}\n\n/**\n * AutoRouteLoader: Simplified File-based Routing System\n *\n * ## Features\n * - š Auto-discovery: Scans routes directory and auto-registers\n * - š Dynamic routes: [id] ā :id, [...slug] ā *\n * - š Statistics: Route registration stats for dashboard\n * - š·ļø Grouping: Natural grouping by directory structure\n *\n * ## Usage\n * ```typescript\n * const app = new Hono();\n * await loadRoutes(app);\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RouteInfo = {\n /** URL path (e.g., /users/:id) */\n path: string;\n /** File path relative to routes dir */\n file: string;\n /** Route metadata from export */\n meta?: {\n description?: string;\n tags?: string[];\n auth?: boolean;\n [key: string]: unknown;\n };\n /** Priority (1=static, 2=dynamic, 3=catch-all) */\n priority: number;\n};\n\nexport type RouteStats = {\n total: number;\n byPriority: {\n static: number;\n dynamic: number;\n catchAll: number;\n };\n byTag: Record<string, number>;\n routes: RouteInfo[];\n};\n\n// ============================================================================\n// Main Loader Class\n// ============================================================================\n\nexport class AutoRouteLoader\n{\n private routes: RouteInfo[] = [];\n private registeredRoutes = new Map<string, string>(); // normalized path ā file\n private debug: boolean;\n private readonly middlewares: Array<{ name: string; handler: any }>;\n\n constructor(\n private routesDir: string,\n debug = false,\n middlewares: Array<{ name: string; handler: any }> = []\n )\n {\n this.debug = debug;\n this.middlewares = middlewares;\n }\n\n /**\n * Load all routes from directory\n */\n async load(app: Hono): Promise<RouteStats>\n {\n const startTime = Date.now();\n\n // 1. Scan files\n const files = await this.scanFiles(this.routesDir);\n\n if (files.length === 0)\n {\n console.warn('ā ļø No route files found');\n return this.getStats();\n }\n\n // 2. Calculate priorities for all files\n const filesWithPriority = files.map(file => ({\n path: file,\n priority: this.calculatePriority(relative(this.routesDir, file)),\n }));\n\n // 3. Sort by priority (static=1, dynamic=2, catch-all=3)\n filesWithPriority.sort((a, b) => a.priority - b.priority);\n\n if (this.debug)\n {\n console.log(`\\nš Route Registration Order:`);\n console.log(` Priority 1 (Static): ${filesWithPriority.filter(f => f.priority === 1).length} routes`);\n console.log(` Priority 2 (Dynamic): ${filesWithPriority.filter(f => f.priority === 2).length} routes`);\n console.log(` Priority 3 (Catch-all): ${filesWithPriority.filter(f => f.priority === 3).length} routes\\n`);\n }\n\n // 4. Load and register routes in priority order\n let successCount = 0;\n let failureCount = 0;\n\n for (const { path } of filesWithPriority)\n {\n const success = await this.loadRoute(app, path);\n if (success)\n {\n successCount++;\n }\n else\n {\n failureCount++;\n }\n }\n\n // 5. Log stats\n const elapsed = Date.now() - startTime;\n const stats = this.getStats();\n\n if (this.debug)\n {\n this.logStats(stats, elapsed);\n }\n\n if (failureCount > 0)\n {\n console.warn(`ā ļø ${failureCount} route(s) failed to load`);\n }\n\n return stats;\n }\n\n /**\n * Get route statistics\n */\n getStats(): RouteStats\n {\n const stats: RouteStats = {\n total: this.routes.length,\n byPriority: { static: 0, dynamic: 0, catchAll: 0 },\n byTag: {},\n routes: this.routes,\n };\n\n for (const route of this.routes)\n {\n // Count by priority\n if (route.priority === 1) stats.byPriority.static++;\n else if (route.priority === 2) stats.byPriority.dynamic++;\n else if (route.priority === 3) stats.byPriority.catchAll++;\n\n // Count by tag\n if (route.meta?.tags)\n {\n for (const tag of route.meta.tags)\n {\n stats.byTag[tag] = (stats.byTag[tag] || 0) + 1;\n }\n }\n }\n\n return stats;\n }\n\n // ========================================================================\n // Private Methods\n // ========================================================================\n\n /**\n * Recursively scan directory for .ts files\n */\n private async scanFiles(dir: string, files: string[] = []): Promise<string[]>\n {\n const entries = await readdir(dir);\n\n for (const entry of entries)\n {\n const fullPath = join(dir, entry);\n const fileStat = await stat(fullPath);\n\n if (fileStat.isDirectory())\n {\n // Recurse into subdirectories\n await this.scanFiles(fullPath, files);\n }\n else if (this.isValidRouteFile(entry))\n {\n files.push(fullPath);\n }\n }\n\n return files;\n }\n\n /**\n * Check if file is a valid route file\n */\n private isValidRouteFile(fileName: string): boolean\n {\n return (\n fileName.endsWith('.ts') &&\n !fileName.endsWith('.test.ts') &&\n !fileName.endsWith('.spec.ts') &&\n !fileName.endsWith('.d.ts') &&\n fileName !== 'contract.ts'\n );\n }\n\n /**\n * Load and register a single route\n * Returns true if successful, false if failed\n */\n private async loadRoute(app: Hono, absolutePath: string): Promise<boolean>\n {\n const relativePath = relative(this.routesDir, absolutePath);\n\n try\n {\n // Import module\n const module = await import(absolutePath);\n\n if (!module.default)\n {\n console.error(`ā ${relativePath}: Must export Hono instance as default`);\n return false;\n }\n\n // Validate that it's actually a Hono instance\n if (typeof module.default.route !== 'function')\n {\n console.error(`ā ${relativePath}: Default export is not a Hono instance`);\n return false;\n }\n\n // Convert file path to URL path\n const urlPath = this.fileToPath(relativePath);\n const priority = this.calculatePriority(relativePath);\n\n // Check for route conflicts\n const normalizedPath = this.normalizePath(urlPath);\n const existingFile = this.registeredRoutes.get(normalizedPath);\n\n if (existingFile)\n {\n console.warn(`ā ļø Route conflict detected:`);\n console.warn(` Path: ${urlPath} (normalized: ${normalizedPath})`);\n console.warn(` Already registered by: ${existingFile}`);\n console.warn(` Attempted by: ${relativePath}`);\n console.warn(` ā Skipping duplicate registration`);\n return false;\n }\n\n // Track registration\n this.registeredRoutes.set(normalizedPath, relativePath);\n\n // Check if module uses contract-based routing (createApp)\n const hasContractMetas = module.default._contractMetas && module.default._contractMetas.size > 0;\n\n if (hasContractMetas)\n {\n // Contract-based routing: method-level skipMiddlewares\n // Use wildcard pattern to match all sub-paths (e.g., /test/* matches /test/public, /test/private)\n const middlewarePath = urlPath === '/' ? '/*' : `${urlPath}/*`;\n\n // 1. Register meta-setting middleware first\n app.use(middlewarePath, (c, next) =>\n {\n const method = c.req.method;\n const requestPath = new URL(c.req.url).pathname;\n\n // Calculate relative path by removing the route base path\n // E.g., if urlPath = '/test' and requestPath = '/test/public', then relativePath = '/public'\n const relativePath = requestPath.startsWith(urlPath)\n ? requestPath.slice(urlPath.length) || '/'\n : requestPath;\n\n const key = `${method} ${relativePath}`;\n const meta = module.default._contractMetas?.get(key);\n\n if (meta?.skipMiddlewares)\n {\n c.set('_skipMiddlewares', meta.skipMiddlewares);\n }\n\n return next();\n });\n\n // 2. Wrap global middlewares to check skipMiddlewares\n for (const middleware of this.middlewares)\n {\n app.use(middlewarePath, async (c, next) =>\n {\n const skipList = c.get('_skipMiddlewares') || [];\n\n if (skipList.includes(middleware.name))\n {\n return next(); // Skip this middleware\n }\n\n return middleware.handler(c, next); // Execute middleware\n });\n }\n }\n else\n {\n // File-based routing: file-level skipMiddlewares (fallback)\n const skipList = module.meta?.skipMiddlewares || [];\n const activeMiddlewares = this.middlewares\n .filter(m => !skipList.includes(m.name));\n\n for (const middleware of activeMiddlewares)\n {\n app.use(urlPath, middleware.handler);\n }\n }\n\n // Register route\n app.route(urlPath, module.default);\n\n // Store route info\n this.routes.push({\n path: urlPath,\n file: relativePath,\n meta: module.meta,\n priority,\n });\n\n if (this.debug)\n {\n const icon = priority === 1 ? 'š¹' : priority === 2 ? 'šø' : 'ā';\n console.log(` ${icon} ${urlPath.padEnd(40)} ā ${relativePath}`);\n }\n\n return true;\n }\n catch (error)\n {\n const err = error as Error;\n\n // Categorize error types and provide helpful messages\n if (err.message.includes('Cannot find module') || err.message.includes('MODULE_NOT_FOUND'))\n {\n console.error(`ā ${relativePath}: Missing dependency`);\n console.error(` ${err.message}`);\n console.error(` ā Run: npm install`);\n }\n else if (err.message.includes('SyntaxError') || err.stack?.includes('SyntaxError'))\n {\n console.error(`ā ${relativePath}: Syntax error`);\n console.error(` ${err.message}`);\n\n if (this.debug && err.stack)\n {\n console.error(` Stack trace (first 5 lines):`);\n const stackLines = err.stack.split('\\n').slice(0, 5);\n stackLines.forEach(line => console.error(` ${line}`));\n }\n }\n else if (err.message.includes('Unexpected token'))\n {\n console.error(`ā ${relativePath}: Parse error`);\n console.error(` ${err.message}`);\n console.error(` ā Check for syntax errors or invalid TypeScript`);\n }\n else\n {\n console.error(`ā ${relativePath}: ${err.message}`);\n\n if (this.debug && err.stack)\n {\n console.error(` Stack: ${err.stack}`);\n }\n }\n\n return false;\n }\n }\n\n /**\n * Convert file path to URL path\n *\n * Examples:\n * - users/index.ts ā /users\n * - users/[id].ts ā /users/:id\n * - posts/[...slug].ts ā /posts/*\n */\n private fileToPath(filePath: string): string\n {\n // Remove .ts extension\n let path = filePath.replace(/\\.ts$/, '');\n\n // Split into segments\n const segments = path.split('/');\n\n // Remove 'index' if it's the last segment\n if (segments[segments.length - 1] === 'index')\n {\n segments.pop();\n }\n\n // Transform segments: [id] ā :id, [...slug] ā *\n const transformed = segments.map(seg =>\n {\n // Catch-all: [...slug] ā *\n if (/^\\[\\.\\.\\.[\\w-]+]$/.test(seg))\n {\n return '*';\n }\n // Dynamic: [id] ā :id\n if (/^\\[[\\w-]+]$/.test(seg))\n {\n return ':' + seg.slice(1, -1);\n }\n // Skip 'index' segments (index/index.ts ā /, posts/index/index.ts ā /posts)\n if (seg === 'index')\n {\n return null;\n }\n // Static: users ā users\n return seg;\n }).filter(seg => seg !== null);\n\n // Join and ensure leading slash\n const result = '/' + transformed.join('/');\n return result.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\n }\n\n /**\n * Calculate route priority\n * 1 = static, 2 = dynamic, 3 = catch-all\n */\n private calculatePriority(path: string): number\n {\n if (/\\[\\.\\.\\.[\\w-]+]/.test(path)) return 3; // Catch-all\n if (/\\[[\\w-]+]/.test(path)) return 2; // Dynamic\n return 1; // Static\n }\n\n /**\n * Normalize path for conflict detection\n *\n * Converts dynamic parameter names to generic placeholders:\n * - /users/:id ā /users/:param\n * - /users/:userId ā /users/:param (conflict!)\n * - /posts/* ā /posts/* (unchanged)\n *\n * This allows detection of routes with different param names\n * that would match the same URL patterns.\n */\n private normalizePath(path: string): string\n {\n // Replace all dynamic params (:xxx) with :param\n // This allows us to detect conflicts like /users/:id and /users/:userId\n return path.replace(/:\\w+/g, ':param');\n }\n\n /**\n * Log statistics\n */\n private logStats(stats: RouteStats, elapsed: number): void\n {\n console.log(`\\nš Route Statistics:`);\n console.log(` Total: ${stats.total} routes`);\n console.log(\n ` Priority: ${stats.byPriority.static} static, ` +\n `${stats.byPriority.dynamic} dynamic, ` +\n `${stats.byPriority.catchAll} catch-all`\n );\n\n if (Object.keys(stats.byTag).length > 0)\n {\n const tagCounts = Object.entries(stats.byTag)\n .map(([tag, count]) => `${tag}(${count})`)\n .join(', ');\n console.log(` Tags: ${tagCounts}`);\n }\n\n console.log(`\\nā
Routes loaded in ${elapsed}ms\\n`);\n }\n}\n\n// ============================================================================\n// Convenience Function\n// ============================================================================\n\n/**\n * Load routes from default location (src/server/routes)\n */\nexport async function loadRoutes(\n app: Hono,\n options?: {\n routesDir?: string;\n debug?: boolean;\n middlewares?: Array<{ name: string; handler: any }>;\n }\n): Promise<RouteStats>\n{\n const routesDir = options?.routesDir ?? join(process.cwd(), 'src', 'server', 'routes');\n const debug = options?.debug ?? false;\n const middlewares = options?.middlewares ?? [];\n\n const loader = new AutoRouteLoader(routesDir, debug, middlewares);\n return loader.load(app);\n}","import type { Context } from 'hono';\nimport { Value } from '@sinclair/typebox/value';\nimport type { RouteContract, RouteContext, InferContract } from './types.js';\nimport { ValidationError } from '../errors/database-errors.js';\n\n/**\n * Contract-based Route Handler Wrapper\n *\n * Binds a contract to a route handler, providing automatic validation\n * and type-safe context creation.\n *\n * ## Features\n * - ā
Automatic params/query/body validation using TypeBox\n * - ā
Type-safe RouteContext with contract-based inference\n * - ā
Clean separation: bind() for validation, Hono for middleware\n *\n * ## Usage\n *\n * ```typescript\n * // Basic usage\n * export const GET = bind(contract, async (c) => {\n * return c.json({ data: 'public' });\n * });\n *\n * // For middleware, use Hono's app-level or route-level middleware:\n * // app.use('/api/*', authMiddleware);\n * // app.get('/users/:id', authMiddleware, bind(contract, handler));\n * ```\n *\n * @param contract - Route contract defining params, query, body, response schemas\n * @param handler - Route handler function\n * @returns Hono-compatible handler function\n */\nexport function bind<TContract extends RouteContract>(\n contract: TContract,\n handler: (c: RouteContext<TContract>) => Response | Promise<Response>\n)\n{\n return async (rawContext: Context) =>\n {\n // ============================================================\n // 1. Validate params\n // ============================================================\n const params = rawContext.req.param();\n if (contract.params)\n {\n const errors = [...Value.Errors(contract.params, params)];\n if (errors.length > 0)\n {\n throw new ValidationError(\n 'Invalid path parameters',\n {\n fields: errors.map(e => ({\n path: e.path,\n message: e.message,\n value: e.value,\n }))\n }\n );\n }\n }\n\n // ============================================================\n // 2. Validate query\n // ============================================================\n const url = new URL(rawContext.req.url);\n const query: Record<string, string | string[]> = {};\n url.searchParams.forEach((v, k) =>\n {\n const existing = query[k];\n if (existing)\n {\n // Convert to array or append to existing array\n query[k] = Array.isArray(existing) ? [...existing, v] : [existing, v];\n }\n else\n {\n query[k] = v;\n }\n });\n\n if (contract.query)\n {\n const errors = [...Value.Errors(contract.query, query)];\n if (errors.length > 0)\n {\n throw new ValidationError(\n 'Invalid query parameters',\n {\n fields: errors.map(e => ({\n path: e.path,\n message: e.message,\n value: e.value,\n }))\n }\n );\n }\n }\n\n // ============================================================\n // 3. Create RouteContext\n // ============================================================\n const routeContext: RouteContext<TContract> = {\n params: params as InferContract<TContract>['params'],\n query: query as InferContract<TContract>['query'],\n\n // data() - validates and returns body\n data: async () =>\n {\n const body = await rawContext.req.json();\n if (contract.body)\n {\n const errors = [...Value.Errors(contract.body, body)];\n if (errors.length > 0)\n {\n throw new ValidationError(\n 'Invalid request body',\n {\n fields: errors.map(e => ({\n path: e.path,\n message: e.message,\n value: e.value,\n }))\n }\n );\n }\n }\n return body as InferContract<TContract>['body'];\n },\n\n // json() - returns typed response\n json: (data, status, headers) =>\n {\n return rawContext.json(data, status, headers);\n },\n\n // raw Hono context for advanced usage\n raw: rawContext,\n };\n\n // ============================================================\n // 4. Execute handler\n // ============================================================\n return handler(routeContext);\n };\n}","/**\n * Error Handler Middleware\n *\n * Generic middleware that converts errors with statusCode to HTTP responses\n *\n * ā
Features:\n * - Convert any error with statusCode property to appropriate HTTP status codes\n * - Error logging (log level by status code)\n * - Environment-specific error response format (Production/Development)\n * - Stack trace inclusion (development only)\n * - Support for additional error details\n *\n * š” Design:\n * - Domain-independent (doesn't depend on specific error types)\n * - Works with any error that has a statusCode property\n * - Follows dependency inversion principle\n */\nimport type { Context } from 'hono';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { logger } from '../logger';\n\nconst errorLogger = logger.child('error-handler');\n\n/**\n * Error handler options\n */\nexport interface ErrorHandlerOptions\n{\n /**\n * Include stack trace in response\n * @default process.env.NODE_ENV !== 'production'\n */\n includeStack?: boolean;\n\n /**\n * Enable error logging\n * @default true\n */\n enableLogging?: boolean;\n}\n\n/**\n * Error response format\n */\ninterface ErrorResponse\n{\n error: {\n message: string;\n type: string;\n statusCode: number;\n stack?: string;\n };\n}\n\n/**\n * Error handler middleware\n *\n * Used in Hono's onError hook\n *\n * @example\n * ```typescript\n * const app = new Hono();\n * app.onError(ErrorHandler());\n * ```\n */\nexport function ErrorHandler(options: ErrorHandlerOptions = {}): (err: Error, c: Context) => Response | Promise<Response>\n{\n const {\n includeStack = process.env.NODE_ENV !== 'production',\n enableLogging = true,\n } = options;\n\n return (err: Error, c: Context) =>\n {\n // Generic error handling: check for statusCode property\n const statusCode = (err as any).statusCode || 500;\n const errorType = err.name || 'Error';\n\n if (enableLogging)\n {\n // 4xx: warn, 5xx: error\n const logLevel = statusCode >= 500 ? 'error' : 'warn';\n\n errorLogger[logLevel]('Error occurred', {\n type: errorType,\n message: err.message,\n statusCode,\n path: c.req.path,\n method: c.req.method,\n });\n }\n\n const response: ErrorResponse = {\n error: {\n message: err.message || 'Internal Server Error',\n type: errorType,\n statusCode,\n },\n };\n\n // Include additional error details if available\n if ((err as any).details)\n {\n (response.error as any).details = (err as any).details;\n }\n\n if (includeStack)\n {\n response.error.stack = err.stack;\n }\n\n return c.json(response, statusCode as ContentfulStatusCode);\n };\n}","/**\n * Request Logger Middleware\n *\n * Automatic API request/response logging middleware\n *\n * ā
Features:\n * - Automatic request start/completion logging\n * - Response time measurement\n * - Automatic error logging\n * - Request ID generation (distributed tracing)\n * - Sensitive data masking\n * - Exclude path configuration (health checks, etc.)\n *\n * š” Benefits:\n * - Automatic monitoring of all API requests\n * - Identify performance bottlenecks\n * - Easy error tracking\n *\n * š” Usage:\n * ```typescript\n * import { RequestLogger } from '@spfn/core';\n *\n * app.use(RequestLogger());\n * ```\n *\n * š Related files:\n * - src/logger/ (Logger)\n * - src/index.ts (Export)\n */\n\nimport type { Context, Next } from 'hono';\nimport { randomBytes } from 'crypto';\nimport { logger } from '../logger';\n\n/**\n * Request Logger configuration\n */\nexport interface RequestLoggerConfig\n{\n /**\n * Paths to exclude from logging (health checks, etc.)\n */\n excludePaths?: string[];\n\n /**\n * Field names to mask for sensitive data\n */\n sensitiveFields?: string[];\n\n /**\n * Slow request threshold (ms)\n */\n slowRequestThreshold?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<RequestLoggerConfig> = {\n excludePaths: ['/health', '/ping', '/favicon.ico'],\n sensitiveFields: ['password', 'token', 'apiKey', 'secret', 'authorization'],\n slowRequestThreshold: 1000, // 1 second\n};\n\n/**\n * Generate cryptographically secure request ID\n *\n * Format: req_<timestamp>_<random-hex>\n * Example: req_1759541628730_a3f9c2d8e1b4\n *\n * Collision probability: ~2^-48 (extremely low)\n */\nfunction generateRequestId(): string\n{\n const timestamp = Date.now();\n const randomPart = randomBytes(6).toString('hex'); // 12 hex chars\n return `req_${timestamp}_${randomPart}`;\n}\n\n/**\n * Mask sensitive data with circular reference handling\n *\n * Optimizations:\n * - Pre-computes lowercase fields to avoid repeated toLowerCase() calls\n * - Handles circular references with WeakSet\n */\nexport function maskSensitiveData(\n obj: any,\n sensitiveFields: string[],\n seen = new WeakSet()\n): any\n{\n if (!obj || typeof obj !== 'object') return obj;\n\n // Prevent circular references\n if (seen.has(obj)) return '[Circular]';\n seen.add(obj);\n\n // Pre-compute lowercase fields (optimization)\n const lowerFields = sensitiveFields.map(f => f.toLowerCase());\n\n const masked = Array.isArray(obj) ? [...obj] : { ...obj };\n\n for (const key in masked)\n {\n const lowerKey = key.toLowerCase();\n\n // Check if sensitive (optimized)\n if (lowerFields.some(field => lowerKey.includes(field)))\n {\n masked[key] = '***MASKED***';\n }\n // Recursively mask nested objects\n else if (typeof masked[key] === 'object' && masked[key] !== null)\n {\n masked[key] = maskSensitiveData(masked[key], sensitiveFields, seen);\n }\n }\n\n return masked;\n}\n\n/**\n * Request Logger middleware\n */\nexport function RequestLogger(config?: RequestLoggerConfig)\n{\n const cfg = { ...DEFAULT_CONFIG, ...config };\n const apiLogger = logger.child('api');\n\n return async (c: Context, next: Next) =>\n {\n const path = new URL(c.req.url).pathname;\n\n // Check excluded paths\n if (cfg.excludePaths.includes(path))\n {\n return next();\n }\n\n // Generate Request ID and store in context\n const requestId = generateRequestId();\n c.set('requestId', requestId);\n\n // Collect request information\n const method = c.req.method;\n const userAgent = c.req.header('user-agent');\n const ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip') || 'unknown';\n\n // Log request start\n const startTime = Date.now();\n\n apiLogger.info('Request received', {\n requestId,\n method,\n path,\n ip,\n userAgent,\n });\n\n try\n {\n // Process request\n await next();\n\n // Response completed\n const duration = Date.now() - startTime;\n const status = c.res.status;\n\n // Log response completion\n const logLevel = status >= 400 ? 'warn' : 'info';\n const isSlowRequest = duration >= cfg.slowRequestThreshold;\n\n // Build log data (only include 'slow' when true)\n const logData: Record<string, any> = {\n requestId,\n method,\n path,\n status,\n duration,\n };\n\n if (isSlowRequest)\n {\n logData.slow = true;\n }\n\n apiLogger[logLevel]('Request completed', logData);\n\n // Warn for slow requests\n if (isSlowRequest)\n {\n apiLogger.warn('Slow request detected', {\n requestId,\n method,\n path,\n duration,\n threshold: cfg.slowRequestThreshold,\n });\n }\n }\n catch (error)\n {\n // Error occurred\n const duration = Date.now() - startTime;\n\n apiLogger.error('Request failed', error as Error, {\n requestId,\n method,\n path,\n duration,\n });\n\n // Re-throw error for error handler to process\n throw error;\n }\n };\n}","import { Hono } from 'hono';\nimport { serve } from '@hono/node-server';\nimport { cors } from 'hono/cors';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport type { Server } from 'http';\n\nimport { loadRoutes } from '../route';\nimport { ErrorHandler } from '../middleware';\nimport { RequestLogger } from '../middleware';\nimport { initRedis, closeRedis } from '../cache';\nimport { initDatabase, closeDatabase } from '../db';\nimport { logger } from '../logger';\n\nimport type { ServerConfig, AppFactory, ServerInstance } from './types.js';\n\nconst serverLogger = logger.child('server');\n\n/**\n * Create Hono app with automatic configuration\n *\n * Levels:\n * 1. No app.ts -> Full auto config\n * 2. server.config.ts -> Partial customization\n * 3. app.ts -> Full control (no auto config)\n */\nexport async function createServer(config?: ServerConfig): Promise<Hono>\n{\n const cwd = process.cwd();\n const appPath = join(cwd, 'src', 'server', 'app.ts');\n const appJsPath = join(cwd, 'src', 'server', 'app.js');\n\n // Level 3: Full control with app.ts\n if (existsSync(appPath) || existsSync(appJsPath))\n {\n const appModule = await import(existsSync(appPath) ? appPath : appJsPath);\n const appFactory: AppFactory = appModule.default;\n\n if (!appFactory)\n {\n throw new Error('app.ts must export a default function that returns a Hono app');\n }\n\n const app = await appFactory();\n\n // Only load routes, everything else is user's responsibility\n const debug = config?.debug ?? process.env.NODE_ENV === 'development';\n await loadRoutes(app, { routesDir: config?.routesPath, debug });\n\n return app;\n }\n\n // Level 1 & 2: Auto config\n const app = new Hono();\n\n const middlewareConfig = config?.middleware ?? {};\n const enableLogger = middlewareConfig.logger !== false;\n const enableCors = middlewareConfig.cors !== false;\n const enableErrorHandler = middlewareConfig.errorHandler !== false;\n\n // 1. Default middleware (can be disabled)\n if (enableLogger)\n {\n app.use('*', RequestLogger());\n }\n\n if (enableCors && config?.cors !== false)\n {\n app.use('*', cors(config?.cors));\n }\n\n // 2. Custom middleware from config\n config?.use?.forEach(mw => app.use('*', mw));\n\n // 3. Health check endpoint (before routes)\n const healthCheckConfig = config?.healthCheck ?? {};\n const healthCheckEnabled = healthCheckConfig.enabled !== false;\n const healthCheckPath = healthCheckConfig.path ?? '/health';\n const healthCheckDetailed = healthCheckConfig.detailed\n ?? process.env.NODE_ENV === 'development';\n\n if (healthCheckEnabled)\n {\n app.get(healthCheckPath, async (c) =>\n {\n const response: any = {\n status: 'ok',\n timestamp: new Date().toISOString(),\n };\n\n if (healthCheckDetailed)\n {\n const { getDatabase } = await import('../db/index.js');\n const { getRedis } = await import('../cache/index.js');\n\n // Check database\n const db = getDatabase();\n let dbStatus = 'disconnected';\n if (db)\n {\n try\n {\n await db.execute('SELECT 1');\n dbStatus = 'connected';\n }\n catch\n {\n dbStatus = 'error';\n }\n }\n\n // Check Redis\n const redis = getRedis();\n let redisStatus = 'disconnected';\n if (redis)\n {\n try\n {\n await redis.ping();\n redisStatus = 'connected';\n }\n catch\n {\n redisStatus = 'error';\n }\n }\n\n response.services = {\n database: dbStatus,\n redis: redisStatus,\n };\n }\n\n return c.json(response);\n });\n\n serverLogger.debug(`Health check endpoint enabled at ${healthCheckPath}`);\n }\n\n // 4. beforeRoutes hook\n await config?.beforeRoutes?.(app);\n\n // 4. Load routes\n const debug = config?.debug ?? process.env.NODE_ENV === 'development';\n await loadRoutes(app, {\n routesDir: config?.routesPath,\n debug,\n middlewares: config?.middlewares\n });\n\n // 5. afterRoutes hook\n await config?.afterRoutes?.(app);\n\n // 6. Error handler (last)\n if (enableErrorHandler)\n {\n app.onError(ErrorHandler());\n }\n\n return app;\n}\n\n/**\n * Start SPFN server\n *\n * Automatically loads server.config.ts if exists\n * Automatically initializes Database and Redis from environment\n * Sets up graceful shutdown handlers for SIGTERM and SIGINT\n *\n * @returns ServerInstance with server, app, config, and close() method\n */\nexport async function startServer(config?: ServerConfig): Promise<ServerInstance>\n{\n const cwd = process.cwd();\n const configPath = join(cwd, 'src', 'server', 'server.config.ts');\n const configJsPath = join(cwd, 'src', 'server', 'server.config.js');\n\n // Load server.config.ts if exists\n let fileConfig: ServerConfig = {};\n if (existsSync(configPath) || existsSync(configJsPath))\n {\n const configModule = await import(existsSync(configPath) ? configPath : configJsPath);\n fileConfig = configModule.default ?? {};\n }\n\n // Merge config (runtime > file > env > defaults)\n const finalConfig: ServerConfig =\n {\n ...fileConfig,\n ...config,\n port: config?.port ?? fileConfig?.port ?? (parseInt(process.env.PORT || '', 10) || 4000),\n host: config?.host ?? fileConfig?.host ?? (process.env.HOST || 'localhost'),\n };\n\n const { host, port, debug } = finalConfig;\n\n try\n {\n // Initialize infrastructure (Database and Redis) with config\n serverLogger.debug('Initializing database...');\n await initDatabase(finalConfig.database);\n\n serverLogger.debug('Initializing Redis...');\n await initRedis();\n\n // Create app\n serverLogger.debug('Creating Hono app...');\n const app = await createServer(finalConfig);\n\n // Start server\n serverLogger.debug(`Starting server on ${host}:${port}...`);\n\n const server = serve(\n {\n fetch: app.fetch,\n port: port!,\n hostname: host,\n });\n\n // Configure server timeouts\n const timeoutConfig = finalConfig.timeout ?? {};\n\n const requestTimeout = timeoutConfig.request\n ?? (parseInt(process.env.SERVER_TIMEOUT || '', 10) || 120000); // 2 minutes default\n\n const keepAliveTimeout = timeoutConfig.keepAlive\n ?? (parseInt(process.env.SERVER_KEEPALIVE_TIMEOUT || '', 10) || 65000); // 65 seconds (longer than typical LB timeout)\n\n const headersTimeout = timeoutConfig.headers\n ?? (parseInt(process.env.SERVER_HEADERS_TIMEOUT || '', 10) || 60000); // 60 seconds\n\n // Apply timeouts to Node.js HTTP server\n // The serve() function returns ServerType (Server | Http2Server | Http2SecureServer)\n // All these types support timeout properties\n if ('timeout' in server)\n {\n (server as Server).timeout = requestTimeout;\n (server as Server).keepAliveTimeout = keepAliveTimeout;\n (server as Server).headersTimeout = headersTimeout;\n }\n\n serverLogger.info('Server timeouts configured', {\n request: `${requestTimeout}ms`,\n keepAlive: `${keepAliveTimeout}ms`,\n headers: `${headersTimeout}ms`,\n });\n\n // Clean output similar to Next.js\n console.log(` ā² SPFN ${debug ? 'dev' : 'production'}`);\n console.log(` - Local: http://${host}:${port}`);\n console.log('');\n\n // Core shutdown logic (without process.exit)\n const shutdownServer = async () =>\n {\n serverLogger.debug('Closing HTTP server...');\n await new Promise<void>((resolve) =>\n {\n server.close(() =>\n {\n serverLogger.info('HTTP server closed');\n resolve();\n });\n });\n\n serverLogger.debug('Closing database connections...');\n await closeDatabase();\n\n serverLogger.debug('Closing Redis connections...');\n await closeRedis();\n\n serverLogger.info('Server shutdown completed');\n };\n\n // Graceful shutdown handler (with process.exit and timeout)\n const shutdown = async (signal: string) =>\n {\n serverLogger.info(`${signal} received, starting graceful shutdown...`);\n\n // Get shutdown timeout from config\n const shutdownTimeout = finalConfig.shutdown?.timeout\n ?? (parseInt(process.env.SHUTDOWN_TIMEOUT || '', 10) || 30000);\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) =>\n {\n setTimeout(() =>\n {\n reject(new Error(`Graceful shutdown timeout after ${shutdownTimeout}ms`));\n }, shutdownTimeout);\n });\n\n try\n {\n // Race between graceful shutdown and timeout\n await Promise.race([\n shutdownServer(),\n timeoutPromise,\n ]);\n\n serverLogger.info('Graceful shutdown completed successfully');\n process.exit(0);\n }\n catch (error)\n {\n const err = error as Error;\n\n if (err.message && err.message.includes('timeout'))\n {\n serverLogger.error('Graceful shutdown timeout, forcing exit', err);\n }\n else\n {\n serverLogger.error('Error during graceful shutdown', err);\n }\n\n process.exit(1);\n }\n };\n\n // Manual close method (without process.exit, for tests)\n const close = async () =>\n {\n serverLogger.info('Manual server shutdown requested');\n await shutdownServer();\n };\n\n // Register shutdown handlers\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Handle uncaught exceptions\n process.on('uncaughtException', (error) =>\n {\n serverLogger.error('Uncaught exception', error);\n shutdown('UNCAUGHT_EXCEPTION');\n });\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason, promise) =>\n {\n serverLogger.error('Unhandled promise rejection', {\n reason,\n promise,\n });\n shutdown('UNHANDLED_REJECTION');\n });\n\n // Return server instance\n return {\n server,\n app,\n config: finalConfig,\n close,\n };\n }\n catch (error)\n {\n const err = error as Error;\n serverLogger.error('Server initialization failed', err);\n\n // Cleanup on failure\n try\n {\n serverLogger.debug('Cleaning up after initialization failure...');\n await closeDatabase();\n await closeRedis();\n serverLogger.debug('Cleanup completed');\n }\n catch (cleanupError)\n {\n serverLogger.error('Cleanup failed', cleanupError as Error);\n }\n\n throw error;\n }\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/errors/database-errors.ts","../../src/logger/adapters/pino.ts","../../src/logger/logger.ts","../../src/logger/types.ts","../../src/logger/formatters.ts","../../src/logger/transports/console.ts","../../src/logger/transports/file.ts","../../src/logger/config.ts","../../src/logger/adapters/custom.ts","../../src/logger/adapter-factory.ts","../../src/logger/index.ts","../../src/cache/redis-factory.ts","../../src/cache/redis-manager.ts","../../src/cache/index.ts","../../src/errors/http-errors.ts","../../src/errors/error-utils.ts","../../src/errors/index.ts","../../src/db/postgres-errors.ts","../../src/db/manager/connection.ts","../../src/db/manager/config.ts","../../src/db/manager/factory.ts","../../src/db/manager/manager.ts","../../src/db/manager/instance.ts","../../src/db/transaction/context.ts","../../src/db/transaction/middleware.ts","../../src/db/transaction/index.ts","../../src/db/repository/filters.ts","../../src/db/repository/query-builder.ts","../../src/db/repository/repository.ts","../../src/db/repository/factory.ts","../../src/db/repository/request-scope.ts","../../src/db/repository/relation-registry.ts","../../src/db/repository/index.ts","../../src/db/manager/wrapped-db.ts","../../src/db/manager/context.ts","../../src/db/manager/index.ts","../../src/db/manager/config-generator.ts","../../src/db/schema/helpers.ts","../../src/db/schema/index.ts","../../src/db/index.ts","../../src/route/auto-loader.ts","../../src/route/bind.ts","../../src/middleware/error-handler.ts","../../src/middleware/request-logger.ts","../../src/server/server.ts"],"names":["config","timestamp","join","init_logger","cacheLogger","init_config","writeClient","readClient","db","dbLogger","readInstance","writeInstance","init_manager","id","eq","init_factory","getCacheKey","AsyncLocalStorage","init_repository","init_context","relativePath","existsSync","app","debug","Hono","getDatabase","getRedis"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Database Error Classes\n *\n * Type-safe error handling with custom error class hierarchy\n * Mapped to HTTP status codes for API responses\n */\n\n/**\n * Base Database Error\n *\n * Base class for all database-related errors\n */\nexport class DatabaseError<TDetails extends Record<string, unknown> = Record<string, unknown>> extends Error\n{\n public readonly statusCode: number;\n public readonly details?: TDetails;\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n statusCode: number = 500,\n details?: TDetails\n )\n {\n super(message);\n this.name = 'DatabaseError';\n this.statusCode = statusCode;\n this.details = details;\n this.timestamp = new Date();\n Error.captureStackTrace(this, this.constructor);\n }\n\n /**\n * Serialize error for API response\n */\n toJSON()\n {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n timestamp: this.timestamp.toISOString()\n };\n }\n}\n\n/**\n * Connection Error (503 Service Unavailable)\n *\n * Database connection failure, connection pool exhaustion, etc.\n */\nexport class ConnectionError extends DatabaseError\n{\n constructor(message: string, details?: Record<string, any>)\n {\n super(message, 503, details);\n this.name = 'ConnectionError';\n }\n}\n\n/**\n * Query Error (500 Internal Server Error)\n *\n * SQL query execution failure, syntax errors, etc.\n */\nexport class QueryError extends DatabaseError\n{\n constructor(message: string, statusCode: number = 500, details?: Record<string, any>)\n {\n super(message, statusCode, details);\n this.name = 'QueryError';\n }\n}\n\n/**\n * Not Found Error (404 Not Found)\n *\n * Requested resource does not exist\n */\nexport class NotFoundError extends QueryError\n{\n constructor(resource: string, id: string | number)\n {\n super(`${resource} with id ${id} not found`, 404, { resource, id });\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Validation Error (400 Bad Request)\n *\n * Input data validation failure\n */\nexport class ValidationError extends QueryError\n{\n constructor(message: string, details?: Record<string, any>)\n {\n super(message, 400, details);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Transaction Error (500 Internal Server Error)\n *\n * Transaction start/commit/rollback failure\n */\nexport class TransactionError extends DatabaseError\n{\n constructor(message: string, statusCode: number = 500, details?: Record<string, any>)\n {\n super(message, statusCode, details);\n this.name = 'TransactionError';\n }\n}\n\n/**\n * Deadlock Error (409 Conflict)\n *\n * Database deadlock detected\n */\nexport class DeadlockError extends TransactionError\n{\n constructor(message: string, details?: Record<string, any>)\n {\n super(message, 409, details);\n this.name = 'DeadlockError';\n }\n}\n\n/**\n * Duplicate Entry Error (409 Conflict)\n *\n * Unique constraint violation (e.g., duplicate email)\n */\nexport class DuplicateEntryError extends QueryError\n{\n constructor(field: string, value: string | number)\n {\n super(`${field} '${value}' already exists`, 409, { field, value });\n this.name = 'DuplicateEntryError';\n }\n}","/**\n * Pino Logger Adapter\n *\n * Pino넼 ģ¬ģ©ķė Logger Adapter 구ķ\n *\n * ā
구ķ ģė£:\n * - Pino źø°ė° ė”ź¹
\n * - Child logger ģ§ģ\n * - Error ź°ģ²“ ģ²ė¦¬ (err ķė)\n * - Context ė³ķ©\n * - ķź²½ė³ ģ¤ģ (pretty print)\n * - ķģ¼ ė”ź¹
with Rotation (ģ첓 구ģ¶ģ©)\n *\n * š” ė°°ķ¬ ģė리ģ¤:\n * - K8s: Stdoutė§ (ė”ź·ø ģģ§źø°ź° ģ²ė¦¬)\n * - ģ첓 구ģ¶: Stdout + File with Rotation\n *\n * š” ķ¹ģ§:\n * - ź³ ģ±ė„ (Winstonė³“ė¤ 5-10ė°° ė¹ ė¦)\n * - JSON źø°ė³ø ķ¬ė§·\n * - ķė”ėģ
ź²ģ¦ėØ (Netflix, Elastic ģ¬ģ©)\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/adapters/types.ts (ģøķ°ķģ“ģ¤)\n * - src/logger/index.ts (Adapter ģ ķ)\n * - src/logger/config.ts (ģ¤ģ )\n */\n\nimport pino from 'pino';\nimport type { LoggerAdapter, AdapterConfig, LogLevel } from './types';\n\n/**\n * Pino Logger Adapter\n */\nexport class PinoAdapter implements LoggerAdapter\n{\n private logger: pino.Logger;\n\n constructor(config: AdapterConfig)\n {\n const isProduction = process.env.NODE_ENV === 'production';\n const isDevelopment = process.env.NODE_ENV === 'development';\n const fileLoggingEnabled = process.env.LOGGER_FILE_ENABLED === 'true';\n\n // Transport ģ¤ģ \n const targets: pino.TransportTargetOptions[] = [];\n\n // 1. Stdout Transport (ķģ)\n if (!isProduction && isDevelopment)\n {\n // ź°ė°: Pretty Print\n targets.push({\n target: 'pino-pretty',\n level: 'debug',\n options: {\n colorize: true,\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss.l',\n ignore: 'pid,hostname',\n },\n });\n }\n else\n {\n // ķė”ėģ
: JSON (źø°ė³ø stdout)\n // targetsź° ė¹ģ“ģģ¼ė©“ ģėģ¼ė” stdout JSON ģ¬ģ©\n }\n\n // 2. File Transport (ģ첓 źµ¬ģ¶ ģ)\n if (fileLoggingEnabled && isProduction)\n {\n const logDir = process.env.LOG_DIR || './logs';\n const maxFileSize = process.env.LOG_MAX_FILE_SIZE || '10M';\n const maxFiles = parseInt(process.env.LOG_MAX_FILES || '10', 10);\n\n targets.push({\n target: 'pino-roll',\n level: 'info',\n options: {\n file: `${logDir}/app.log`,\n frequency: 'daily',\n size: maxFileSize,\n limit: { count: maxFiles },\n mkdir: true,\n },\n });\n }\n\n this.logger = pino({\n level: config.level,\n\n // Transport ģ¤ģ (targetsź° ģģ¼ė©“ ģ¬ģ©, ģģ¼ė©“ źø°ė³ø stdout)\n transport: targets.length > 0 ? { targets } : undefined,\n\n // źø°ė³ø ķė\n base: config.module ? { module: config.module } : undefined,\n });\n }\n\n child(module: string): LoggerAdapter\n {\n const childLogger = new PinoAdapter({ level: this.logger.level as LogLevel, module });\n childLogger.logger = this.logger.child({ module });\n return childLogger;\n }\n\n debug(message: string, context?: Record<string, unknown>): void\n {\n this.logger.debug(context || {}, message);\n }\n\n info(message: string, context?: Record<string, unknown>): void\n {\n this.logger.info(context || {}, message);\n }\n\n warn(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.warn({ err: errorOrContext, ...context }, message);\n }\n else\n {\n this.logger.warn(errorOrContext || {}, message);\n }\n }\n\n error(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.error({ err: errorOrContext, ...context }, message);\n }\n else\n {\n this.logger.error(errorOrContext || {}, message);\n }\n }\n\n fatal(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.fatal({ err: errorOrContext, ...context }, message);\n }\n else\n {\n this.logger.fatal(errorOrContext || {}, message);\n }\n }\n\n async close(): Promise<void>\n {\n // Pinoė ģėģ¼ė” flushėØ\n // ķģģ pino.final() ģ¬ģ© ź°ė„\n }\n}","/**\n * Logger Class\n *\n * Main logger class\n *\n * ā
Implemented:\n * - 5 log level methods (debug, info, warn, error, fatal)\n * - Child logger creation (per module)\n * - Multiple Transport support\n * - Context object support\n * - Automatic Error object handling\n *\n * š” Future considerations:\n * - Log sampling (limit high-frequency logs)\n * - Async batch processing\n * - Memory usage monitoring\n *\n * š Related files:\n * - src/logger/types.ts (Type definitions)\n * - src/logger/transports/ (Transport implementations)\n * - src/logger/adapter-factory.ts (Singleton instance)\n */\n\nimport type { LogLevel, LogMetadata, LoggerConfig, Transport } from './types';\n\n/**\n * Logger class\n */\nexport class Logger\n{\n private config: LoggerConfig;\n private module?: string;\n\n constructor(config: LoggerConfig)\n {\n this.config = config;\n this.module = config.module;\n }\n\n /**\n * Get current log level\n */\n get level(): LogLevel\n {\n return this.config.level;\n }\n\n /**\n * Create child logger (per module)\n */\n child(module: string): Logger\n {\n return new Logger({\n ...this.config,\n module,\n });\n }\n\n /**\n * Debug log\n */\n debug(message: string, context?: Record<string, unknown>): void\n {\n this.log('debug', message, undefined, context);\n }\n\n /**\n * Info log\n */\n info(message: string, context?: Record<string, unknown>): void\n {\n this.log('info', message, undefined, context);\n }\n\n /**\n * Warn log\n */\n warn(message: string, context?: Record<string, unknown>): void;\n warn(message: string, error: Error, context?: Record<string, unknown>): void;\n warn(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.log('warn', message, errorOrContext, context);\n }\n else\n {\n this.log('warn', message, undefined, errorOrContext);\n }\n }\n\n /**\n * Error log\n */\n error(message: string, context?: Record<string, unknown>): void;\n error(message: string, error: Error, context?: Record<string, unknown>): void;\n error(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.log('error', message, errorOrContext, context);\n }\n else\n {\n this.log('error', message, undefined, errorOrContext);\n }\n }\n\n /**\n * Fatal log\n */\n fatal(message: string, context?: Record<string, unknown>): void;\n fatal(message: string, error: Error, context?: Record<string, unknown>): void;\n fatal(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.log('fatal', message, errorOrContext, context);\n }\n else\n {\n this.log('fatal', message, undefined, errorOrContext);\n }\n }\n\n /**\n * Log processing (internal)\n */\n private log(level: LogLevel, message: string, error?: Error, context?: Record<string, unknown>): void\n {\n const metadata: LogMetadata = {\n timestamp: new Date(),\n level,\n message,\n module: this.module,\n error,\n context,\n };\n\n // Pass to all enabled Transports\n this.processTransports(metadata);\n }\n\n /**\n * Process Transports\n */\n private processTransports(metadata: LogMetadata): void\n {\n const promises = this.config.transports\n .filter(transport => transport.enabled)\n .map(transport => this.safeTransportLog(transport, metadata));\n\n // Async processing to prevent Transport errors from blocking logs\n Promise.all(promises).catch(error =>\n {\n // Use stderr directly to avoid circular logging\n const errorMessage = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[Logger] Transport error: ${errorMessage}\\n`);\n });\n }\n\n /**\n * Transport log (error-safe)\n */\n private async safeTransportLog(transport: Transport, metadata: LogMetadata): Promise<void>\n {\n try\n {\n await transport.log(metadata);\n }\n catch (error)\n {\n // Use stderr directly to avoid circular logging\n const errorMessage = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[Logger] Transport \"${transport.name}\" failed: ${errorMessage}\\n`);\n }\n }\n\n /**\n * Close all Transports\n */\n async close(): Promise<void>\n {\n const closePromises = this.config.transports\n .filter(transport => transport.close)\n .map(transport => transport.close!());\n\n await Promise.all(closePromises);\n }\n}","/**\n * Logger Type Definitions\n *\n * ė”ź¹
ģģ¤ķ
ķģ
ģ ģ\n *\n * ā
구ķ ģė£:\n * - LogLevel ķģ
ģ ģ\n * - LogMetadata ģøķ°ķģ“ģ¤\n * - Transport ģøķ°ķģ“ģ¤\n * - ķź²½ė³ ģ¤ģ ķģ
\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/logger.ts (Logger ķ“ėģ¤)\n * - src/logger/transports/ (Transport 구ķ첓)\n * - src/logger/config.ts (ģ¤ģ )\n */\n\n/**\n * ė”ź·ø ė 벨\n * debug < info < warn < error < fatal\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\n/**\n * ė”ź·ø ė 벨 ģ°ģ ģģ\n */\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\n/**\n * ė”ź·ø ė©ķė°ģ“ķ°\n */\nexport interface LogMetadata\n{\n timestamp: Date;\n level: LogLevel;\n message: string;\n module?: string;\n error?: Error;\n context?: Record<string, unknown>;\n}\n\n/**\n * Transport ģøķ°ķģ“ģ¤\n * ėŖØė Transportė ģ“ ģøķ°ķģ“ģ¤ė„¼ 구ķķ“ģ¼ ķØ\n */\nexport interface Transport\n{\n /**\n * Transport ģ“ė¦\n */\n name: string;\n\n /**\n * ģµģ ė”ź·ø ė 벨 (ģ“ ė 벨 ģ“ģė§ ģ²ė¦¬)\n */\n level: LogLevel;\n\n /**\n * ķģ±ķ ģ¬ė¶\n */\n enabled: boolean;\n\n /**\n * ė”ź·ø ģ²ė¦¬ ķØģ\n */\n log(metadata: LogMetadata): Promise<void>;\n\n /**\n * Transport ģ¢
ė£ (리ģģ¤ ģ 리)\n */\n close?(): Promise<void>;\n}\n\n/**\n * Logger ģ¤ģ \n */\nexport interface LoggerConfig\n{\n /**\n * źø°ė³ø ė”ź·ø ė 벨\n */\n level: LogLevel;\n\n /**\n * ėŖØėėŖ
(context)\n */\n module?: string;\n\n /**\n * Transport 리ģ¤ķø\n */\n transports: Transport[];\n}\n\n/**\n * Transport ģ¤ģ (ź³µķµ)\n */\nexport interface TransportConfig\n{\n level: LogLevel;\n enabled: boolean;\n}\n\n/**\n * Console Transport ģ¤ģ \n */\nexport interface ConsoleTransportConfig extends TransportConfig\n{\n colorize?: boolean;\n}\n\n/**\n * File Transport ģ¤ģ \n */\nexport interface FileTransportConfig extends TransportConfig\n{\n logDir: string;\n maxFileSize?: number; // bytes\n maxFiles?: number; // ģµė ė”ź·ø ķģ¼ ź°ģ\n}\n\n/**\n * Slack Transport ģ¤ģ \n */\nexport interface SlackTransportConfig extends TransportConfig\n{\n webhookUrl: string;\n channel?: string;\n username?: string;\n}\n\n/**\n * Email Transport ģ¤ģ \n */\nexport interface EmailTransportConfig extends TransportConfig\n{\n from: string;\n to: string[];\n smtpHost: string;\n smtpPort: number;\n smtpUser?: string;\n smtpPassword?: string;\n}","/**\n * Logger Formatters\n *\n * ė”ź·ø ķ¬ė§·ķ
ģ ķøė¦¬ķ°\n *\n * ā
구ķ ģė£:\n * - ģ»¬ė¬ ķ¬ė§·ķ° (ģ½ģ ģ¶ė „ģ©)\n * - JSON ķ¬ė§·ķ° (ķģ¼/ģ ģ”ģ©)\n * - ķģģ¤ķ¬ķ ķ¬ė§·ķ°\n * - ģė¬ ģ¤ķ ķøė ģ“ģ¤ ķ¬ė§·ķ
\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/types.ts (ķģ
ģ ģ)\n * - src/logger/transports/ (Transport 구ķ첓)\n */\n\nimport type { LogLevel, LogMetadata } from './types';\n\n/**\n * ANSI ģ»¬ė¬ ģ½ė\n */\nconst COLORS = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n\n // ė”ź·ø ė 벨 컬ė¬\n debug: '\\x1b[36m', // cyan\n info: '\\x1b[32m', // green\n warn: '\\x1b[33m', // yellow\n error: '\\x1b[31m', // red\n fatal: '\\x1b[35m', // magenta\n\n // ģ¶ź° 컬ė¬\n gray: '\\x1b[90m',\n};\n\n/**\n * ė”ź·ø ė 벨ģ ģ»¬ė¬ ė¬øģģ“ė” ė³ķ\n */\nexport function colorizeLevel(level: LogLevel): string\n{\n const color = COLORS[level];\n const levelStr = level.toUpperCase().padEnd(5);\n return `${color}${levelStr}${COLORS.reset}`;\n}\n\n/**\n * ķģģ¤ķ¬ķ ķ¬ė§· (ISO 8601)\n */\nexport function formatTimestamp(date: Date): string\n{\n return date.toISOString();\n}\n\n/**\n * ķģģ¤ķ¬ķ ķ¬ė§· (ģ¬ėģ“ ģ½źø° ģ¬ģ“ ķģ)\n */\nexport function formatTimestampHuman(date: Date): string\n{\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n const ms = String(date.getMilliseconds()).padStart(3, '0');\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${ms}`;\n}\n\n/**\n * ģė¬ ź°ģ²“넼 문ģģ“ė” ė³ķ (ģ¤ķ ķøė ģ“ģ¤ ķ¬ķØ)\n */\nexport function formatError(error: Error): string\n{\n const lines: string[] = [];\n\n lines.push(`${error.name}: ${error.message}`);\n\n if (error.stack)\n {\n const stackLines = error.stack.split('\\n').slice(1);\n lines.push(...stackLines);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Context ź°ģ²“넼 문ģģ“ė” ė³ķ\n */\nexport function formatContext(context: Record<string, unknown>): string\n{\n try\n {\n return JSON.stringify(context, null, 2);\n }\n catch (error)\n {\n return '[Context serialization failed]';\n }\n}\n\n/**\n * ģ½ģģ© ģ»¬ė¬ ķ¬ė§·\n */\nexport function formatConsole(metadata: LogMetadata, colorize = true): string\n{\n const parts: string[] = [];\n\n // ķģģ¤ķ¬ķ\n const timestamp = formatTimestampHuman(metadata.timestamp);\n if (colorize)\n {\n parts.push(`${COLORS.gray}${timestamp}${COLORS.reset}`);\n }\n else\n {\n parts.push(timestamp);\n }\n\n // ė”ź·ø ė 벨\n if (colorize)\n {\n parts.push(colorizeLevel(metadata.level));\n }\n else\n {\n parts.push(metadata.level.toUpperCase().padEnd(5));\n }\n\n // ėŖØėėŖ
\n if (metadata.module)\n {\n if (colorize)\n {\n parts.push(`${COLORS.dim}[${metadata.module}]${COLORS.reset}`);\n }\n else\n {\n parts.push(`[${metadata.module}]`);\n }\n }\n\n // ė©ģģ§\n parts.push(metadata.message);\n\n let output = parts.join(' ');\n\n // Context ģ¶ź°\n if (metadata.context && Object.keys(metadata.context).length > 0)\n {\n output += '\\n' + formatContext(metadata.context);\n }\n\n // ģė¬ ģ¶ź°\n if (metadata.error)\n {\n output += '\\n' + formatError(metadata.error);\n }\n\n return output;\n}\n\n/**\n * JSON ķ¬ė§· (ķģ¼ ģ ģ„ ė° ģ ģ”ģ©)\n */\nexport function formatJSON(metadata: LogMetadata): string\n{\n const obj: Record<string, unknown> = {\n timestamp: formatTimestamp(metadata.timestamp),\n level: metadata.level,\n message: metadata.message,\n };\n\n if (metadata.module)\n {\n obj.module = metadata.module;\n }\n\n if (metadata.context)\n {\n obj.context = metadata.context;\n }\n\n if (metadata.error)\n {\n obj.error = {\n name: metadata.error.name,\n message: metadata.error.message,\n stack: metadata.error.stack,\n };\n }\n\n return JSON.stringify(obj);\n}\n\n/**\n * Slack ė©ģģ§ ķ¬ė§·\n */\nexport function formatSlack(metadata: LogMetadata): string\n{\n const emoji = {\n debug: ':bug:',\n info: ':information_source:',\n warn: ':warning:',\n error: ':x:',\n fatal: ':fire:',\n };\n\n const parts: string[] = [];\n\n parts.push(`${emoji[metadata.level]} *${metadata.level.toUpperCase()}*`);\n\n if (metadata.module)\n {\n parts.push(`\\`[${metadata.module}]\\``);\n }\n\n parts.push(metadata.message);\n\n let message = parts.join(' ');\n\n if (metadata.context)\n {\n message += '\\n```\\n' + JSON.stringify(metadata.context, null, 2) + '\\n```';\n }\n\n if (metadata.error)\n {\n message += '\\n```\\n' + formatError(metadata.error) + '\\n```';\n }\n\n return message;\n}\n\n/**\n * Email ģ ėŖ© ģģ±\n */\nexport function formatEmailSubject(metadata: LogMetadata): string\n{\n const prefix = `[${metadata.level.toUpperCase()}]`;\n const module = metadata.module ? `[${metadata.module}]` : '';\n\n return `${prefix}${module} ${metadata.message}`;\n}\n\n/**\n * Email 본문 ģģ± (HTML)\n */\nexport function formatEmailBody(metadata: LogMetadata): string\n{\n const parts: string[] = [];\n\n parts.push('<html>');\n parts.push('<body style=\"font-family: monospace; padding: 20px;\">');\n\n // ķ¤ė\n parts.push(`<h2 style=\"color: ${getEmailColor(metadata.level)};\">`);\n parts.push(`${metadata.level.toUpperCase()}`);\n parts.push('</h2>');\n\n // ģź°\n parts.push('<p>');\n parts.push(`<strong>Timestamp:</strong> ${formatTimestamp(metadata.timestamp)}`);\n parts.push('</p>');\n\n // ėŖØė\n if (metadata.module)\n {\n parts.push('<p>');\n parts.push(`<strong>Module:</strong> ${metadata.module}`);\n parts.push('</p>');\n }\n\n // ė©ģģ§\n parts.push('<p>');\n parts.push(`<strong>Message:</strong> ${metadata.message}`);\n parts.push('</p>');\n\n // Context\n if (metadata.context)\n {\n parts.push('<h3>Context</h3>');\n parts.push('<pre style=\"background: #f4f4f4; padding: 10px; border-radius: 4px;\">');\n parts.push(JSON.stringify(metadata.context, null, 2));\n parts.push('</pre>');\n }\n\n // ģė¬\n if (metadata.error)\n {\n parts.push('<h3>Error Stack Trace</h3>');\n parts.push('<pre style=\"background: #fff0f0; padding: 10px; border-radius: 4px;\">');\n parts.push(formatError(metadata.error));\n parts.push('</pre>');\n }\n\n parts.push('</body>');\n parts.push('</html>');\n\n return parts.join('\\n');\n}\n\n/**\n * Email ė ė²Øė³ ģ»¬ė¬\n */\nfunction getEmailColor(level: LogLevel): string\n{\n const colors: Record<LogLevel, string> = {\n debug: '#00BCD4',\n info: '#4CAF50',\n warn: '#FF9800',\n error: '#F44336',\n fatal: '#9C27B0',\n };\n\n return colors[level];\n}","/**\n * Console Transport\n *\n * ģ½ģ ģ¶ė „ Transport\n *\n * ā
구ķ ģė£:\n * - ģ½ģ ģ¶ė „ (stdout/stderr)\n * - ģ»¬ė¬ ģ¶ė „ ģ§ģ\n * - ė”ź·ø ė ė²Øė³ ģ¤ķøė¦¼ ė¶ė¦¬ (warn/error/fatal ā stderr)\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/types.ts (Transport ģøķ°ķģ“ģ¤)\n * - src/logger/formatters.ts (ķ¬ė§·ķ°)\n * - src/logger/config.ts (ģ¤ģ )\n */\n\nimport type { Transport, LogMetadata, LogLevel, ConsoleTransportConfig } from '../types';\nimport { LOG_LEVEL_PRIORITY } from '../types';\nimport { formatConsole } from '../formatters';\n\n/**\n * Console Transport\n */\nexport class ConsoleTransport implements Transport\n{\n public readonly name = 'console';\n public readonly level: LogLevel;\n public readonly enabled: boolean;\n\n private colorize: boolean;\n\n constructor(config: ConsoleTransportConfig)\n {\n this.level = config.level;\n this.enabled = config.enabled;\n this.colorize = config.colorize ?? true;\n }\n\n async log(metadata: LogMetadata): Promise<void>\n {\n // Enabled ģķ 첓ķ¬\n if (!this.enabled)\n {\n return;\n }\n\n // ė”ź·ø ė 벨 첓ķ¬\n if (LOG_LEVEL_PRIORITY[metadata.level] < LOG_LEVEL_PRIORITY[this.level])\n {\n return;\n }\n\n // ķ¬ė§·ķ
\n const message = formatConsole(metadata, this.colorize);\n\n // warn/error/fatalģ stderrė”, ė머ģ§ė stdoutģ¼ė”\n if (metadata.level === 'warn' || metadata.level === 'error' || metadata.level === 'fatal')\n {\n console.error(message);\n }\n else\n {\n console.log(message);\n }\n }\n}","/**\n * File Transport\n *\n * ķģ¼ ģ¶ė „ Transport\n *\n * ā
구ķ ģė£:\n * - ė ģ§ė³ ė”ź·ø ķģ¼ ģģ±\n * - JSON ķ¬ė§· ģ ģ„\n * - ė”ź·ø ėė ķ 리 ģė ģģ±\n * - ė¹ėźø° ģ°źø° (createWriteStream)\n * - ė ģ§ ė³ź²½ ģ ģė ģ¤ķøė¦¼ źµģ²“\n *\n * ā ļø ź°ģ ķģ:\n * - ķģ¼ ķ¬źø° źø°ė° ė”ķ
ģ“ģ
\n * - ģ¤ėė ķģ¼ ģė ģģ \n *\n * š” ķ„ķ ź³ ė ¤ģ¬ķ:\n * - ģģ¶ė ė”ź·ø ģ칓ģ“ė¹\n * - ģøė¶ ģ¤ķ ė¦¬ģ§ ģ ģ” (S3 ė±)\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/types.ts (Transport ģøķ°ķģ“ģ¤)\n * - src/logger/formatters.ts (ķ¬ė§·ķ°)\n * - src/logger/config.ts (ģ¤ģ )\n */\n\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport type { WriteStream } from 'fs';\nimport { join } from 'path';\nimport type { Transport, LogMetadata, LogLevel, FileTransportConfig } from '../types';\nimport { LOG_LEVEL_PRIORITY } from '../types';\nimport { formatJSON } from '../formatters';\n\n/**\n * File Transport\n */\nexport class FileTransport implements Transport\n{\n public readonly name = 'file';\n public readonly level: LogLevel;\n public readonly enabled: boolean;\n\n private logDir: string;\n private currentStream: WriteStream | null = null;\n private currentFilename: string | null = null;\n\n constructor(config: FileTransportConfig)\n {\n this.level = config.level;\n this.enabled = config.enabled;\n this.logDir = config.logDir;\n\n // TODO: ķ„ķ ķģ¼ ė”ķ
ģ“ģ
구ķ ģ ģ¬ģ©\n // this.maxFileSize = config.maxFileSize ?? 10 * 1024 * 1024; // 10MB\n // this.maxFiles = config.maxFiles ?? 10;\n\n // ė”ź·ø ėė ķ ė¦¬ź° ģģ¼ė©“ ģģ±\n if (!existsSync(this.logDir))\n {\n mkdirSync(this.logDir, { recursive: true });\n }\n }\n\n async log(metadata: LogMetadata): Promise<void>\n {\n // Enabled ģķ 첓ķ¬\n if (!this.enabled)\n {\n return;\n }\n\n // ė”ź·ø ė 벨 첓ķ¬\n if (LOG_LEVEL_PRIORITY[metadata.level] < LOG_LEVEL_PRIORITY[this.level])\n {\n return;\n }\n\n // JSON ķ¬ė§·ģ¼ė” ė³ķ\n const message = formatJSON(metadata);\n\n // ķģ¼ėŖ
: YYYY-MM-DD.log\n const filename = this.getLogFilename(metadata.timestamp);\n\n // ė ģ§ź° ė³ź²½ėė©“ ģ¤ķøė¦¼ źµģ²“\n if (this.currentFilename !== filename)\n {\n await this.rotateStream(filename);\n }\n\n // ģ¤ķøė¦¼ģ ģ°źø°\n if (this.currentStream)\n {\n return new Promise((resolve, reject) =>\n {\n this.currentStream!.write(message + '\\n', 'utf-8', (error: Error | null | undefined) =>\n {\n if (error)\n {\n // ķģ¼ ģ°źø° ģ¤ķØ ģ stderrė” ģ¶ė „ (fallback)\n process.stderr.write(`[FileTransport] Failed to write log: ${error.message}\\n`);\n reject(error);\n }\n else\n {\n resolve();\n }\n });\n });\n }\n }\n\n /**\n * ģ¤ķøė¦¼ źµģ²“ (ė ģ§ ė³ź²½ ģ)\n */\n private async rotateStream(filename: string): Promise<void>\n {\n // 기씓 ģ¤ķøė¦¼ ė«źø°\n if (this.currentStream)\n {\n await this.closeStream();\n }\n\n // ģ ģ¤ķøė¦¼ ģģ±\n const filepath = join(this.logDir, filename);\n\n this.currentStream = createWriteStream(filepath, {\n flags: 'a', // append mode\n encoding: 'utf-8',\n });\n\n this.currentFilename = filename;\n\n // ģ¤ķøė¦¼ ģė¬ ķøė¤ė§\n this.currentStream.on('error', (error) =>\n {\n process.stderr.write(`[FileTransport] Stream error: ${error.message}\\n`);\n // ģė¬ ė°ģ ģ ģ¤ķøė¦¼ ģ“źø°ķ\n this.currentStream = null;\n this.currentFilename = null;\n });\n }\n\n /**\n * ķģ¬ ģ¤ķøė¦¼ ė«źø°\n */\n private async closeStream(): Promise<void>\n {\n if (!this.currentStream)\n {\n return;\n }\n\n return new Promise((resolve, reject) =>\n {\n this.currentStream!.end((error: Error | null | undefined) =>\n {\n if (error)\n {\n reject(error);\n }\n else\n {\n this.currentStream = null;\n this.currentFilename = null;\n resolve();\n }\n });\n });\n }\n\n /**\n * ė ģ§ė³ ė”ź·ø ķģ¼ėŖ
ģģ±\n */\n private getLogFilename(date: Date): string\n {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}.log`;\n }\n\n async close(): Promise<void>\n {\n // ģ¤ķøė¦¼ ģ 리\n await this.closeStream();\n }\n}","/**\n * Logger Configuration\n *\n * Logger configuration by environment\n *\n * ā
Implemented:\n * - Environment-specific log level configuration\n * - Console Transport configuration\n * - File Transport configuration (for self-hosted)\n * - File rotation configuration\n * - Slack Transport configuration (environment variable based)\n * - Email Transport configuration (environment variable based)\n *\n * š” Deployment scenarios:\n * - K8s: Disable file logging (Stdout only)\n * - Self-hosted: LOGGER_FILE_ENABLED=true\n *\n * š Related files:\n * - src/logger/types.ts (Type definitions)\n * - src/logger/index.ts (Main export)\n * - .env.local (Environment variables)\n */\n\nimport type {\n LogLevel,\n ConsoleTransportConfig,\n FileTransportConfig,\n SlackTransportConfig,\n EmailTransportConfig,\n} from './types';\n\n/**\n * Check if file logging is enabled (for self-hosted)\n */\nexport function isFileLoggingEnabled(): boolean\n{\n return process.env.LOGGER_FILE_ENABLED === 'true';\n}\n\n/**\n * Get default log level by environment\n */\nexport function getDefaultLogLevel(): LogLevel\n{\n const isProduction = process.env.NODE_ENV === 'production';\n const isDevelopment = process.env.NODE_ENV === 'development';\n\n if (isDevelopment)\n {\n return 'debug';\n }\n\n if (isProduction)\n {\n return 'info';\n }\n\n // Test environment\n return 'warn';\n}\n\n/**\n * Console Transport configuration\n */\nexport function getConsoleConfig(): ConsoleTransportConfig\n{\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n level: 'debug',\n enabled: true,\n colorize: !isProduction, // Dev: colored output, Production: plain text\n };\n}\n\n/**\n * File Transport configuration\n */\nexport function getFileConfig(): FileTransportConfig\n{\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n level: 'info',\n enabled: isProduction, // File logging in production only\n logDir: process.env.LOG_DIR || './logs',\n maxFileSize: 10 * 1024 * 1024, // 10MB\n maxFiles: 10,\n };\n}\n\n/**\n * Slack Transport configuration\n */\nexport function getSlackConfig(): SlackTransportConfig | null\n{\n const webhookUrl = process.env.SLACK_WEBHOOK_URL;\n\n if (!webhookUrl)\n {\n return null; // Disabled if not configured\n }\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n level: 'error', // Send error and above to Slack\n enabled: isProduction, // Enabled in production only\n webhookUrl,\n channel: process.env.SLACK_CHANNEL,\n username: process.env.SLACK_USERNAME || 'Logger Bot',\n };\n}\n\n/**\n * Email Transport configuration\n */\nexport function getEmailConfig(): EmailTransportConfig | null\n{\n const smtpHost = process.env.SMTP_HOST;\n const smtpPort = process.env.SMTP_PORT;\n const emailFrom = process.env.EMAIL_FROM;\n const emailTo = process.env.EMAIL_TO;\n\n // Disabled if required settings are missing\n if (!smtpHost || !smtpPort || !emailFrom || !emailTo)\n {\n return null;\n }\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n level: 'fatal', // Send fatal level only via email\n enabled: isProduction, // Enabled in production only\n from: emailFrom,\n to: emailTo.split(',').map(email => email.trim()),\n smtpHost,\n smtpPort: parseInt(smtpPort, 10),\n smtpUser: process.env.SMTP_USER,\n smtpPassword: process.env.SMTP_PASSWORD,\n };\n}","/**\n * Custom Logger Adapter\n *\n * ģ첓 구ķķ Logger넼 ģ¬ģ©ķė Adapter\n *\n * ā
구ķ ģė£:\n * - 기씓 Logger ķ“ėģ¤ ėķ\n * - Transport ģģ¤ķ
(Console, File)\n * - Child logger ģ§ģ\n *\n * š” ģ©ė:\n * - Pino ģģ”“ģ± ģ ź±° ķģģ\n * - 커ģ¤ķ
Transport ķģģ\n * - ģģ ķ ģ ģ“ź° ķģķ ź²½ģ°\n *\n * š ź“ė Ø ķģ¼:\n * - src/logger/logger.ts (Logger ķ“ėģ¤)\n * - src/logger/transports/ (Transport 구ķ)\n * - src/logger/adapters/types.ts (ģøķ°ķģ“ģ¤)\n */\n\nimport { Logger } from '../logger';\nimport { ConsoleTransport } from '../transports/console';\nimport { FileTransport } from '../transports/file';\nimport { getConsoleConfig, getFileConfig } from '../config';\nimport type { LoggerAdapter, AdapterConfig } from './types';\nimport type { Transport } from '../types';\n\n/**\n * Transport ģ“źø°ķ\n */\nfunction initializeTransports(): Transport[]\n{\n const transports: Transport[] = [];\n\n // Console Transport (ķģ ķģ±ķ)\n const consoleConfig = getConsoleConfig();\n transports.push(new ConsoleTransport(consoleConfig));\n\n // File Transport (ķė”ėģ
ģģė§ ķģ±ķ)\n const fileConfig = getFileConfig();\n if (fileConfig.enabled)\n {\n transports.push(new FileTransport(fileConfig));\n }\n\n return transports;\n}\n\n/**\n * Custom Logger Adapter\n */\nexport class CustomAdapter implements LoggerAdapter\n{\n private logger: Logger;\n\n constructor(config: AdapterConfig)\n {\n this.logger = new Logger({\n level: config.level,\n module: config.module,\n transports: initializeTransports(),\n });\n }\n\n child(module: string): LoggerAdapter\n {\n const adapter = new CustomAdapter({ level: this.logger.level, module });\n adapter.logger = this.logger.child(module);\n return adapter;\n }\n\n debug(message: string, context?: Record<string, unknown>): void\n {\n this.logger.debug(message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void\n {\n this.logger.info(message, context);\n }\n\n warn(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.warn(message, errorOrContext, context);\n }\n else\n {\n this.logger.warn(message, errorOrContext);\n }\n }\n\n error(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.error(message, errorOrContext, context);\n }\n else\n {\n this.logger.error(message, errorOrContext);\n }\n }\n\n fatal(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void\n {\n if (errorOrContext instanceof Error)\n {\n this.logger.fatal(message, errorOrContext, context);\n }\n else\n {\n this.logger.fatal(message, errorOrContext);\n }\n }\n\n async close(): Promise<void>\n {\n await this.logger.close();\n }\n}","/**\n * Logger Adapter Factory\n *\n * Adapter creation and initialization logic\n */\n\nimport { PinoAdapter } from './adapters/pino.js';\nimport { CustomAdapter } from './adapters/custom.js';\nimport { getDefaultLogLevel } from './config.js';\nimport type { LoggerAdapter } from './adapters/types.js';\n\n/**\n * Adapter type\n */\ntype AdapterType = 'pino' | 'custom';\n\n/**\n * Create adapter instance\n */\nfunction createAdapter(type: AdapterType): LoggerAdapter\n{\n const level = getDefaultLogLevel();\n\n switch (type)\n {\n case 'pino':\n return new PinoAdapter({ level });\n\n case 'custom':\n return new CustomAdapter({ level });\n\n default:\n return new PinoAdapter({ level });\n }\n}\n\n/**\n * Read adapter type from environment variable\n */\nfunction getAdapterType(): AdapterType\n{\n const adapterEnv = process.env.LOGGER_ADAPTER as AdapterType;\n\n if (adapterEnv === 'custom' || adapterEnv === 'pino')\n {\n return adapterEnv;\n }\n\n // Default: pino\n return 'pino';\n}\n\n/**\n * Singleton Logger instance\n */\nexport const logger: LoggerAdapter = createAdapter(getAdapterType());","/**\n * Logger Module Exports\n *\n * Entry point for logger module (Pure re-export only)\n *\n * š” Usage examples:\n * ```typescript\n * import { logger } from '@spfn/core';\n *\n * // Basic usage\n * logger.info('Application started');\n * logger.error('Connection failed', error);\n *\n * // Create module-specific logger\n * const dbLogger = logger.child('database');\n * dbLogger.debug('Connecting to database...');\n *\n * // Add context\n * logger.warn('Retry attempt', { attempt: 3, delay: 1000 });\n * ```\n *\n * š” Adapter switching:\n * - Environment variable: LOGGER_ADAPTER=pino (default) or custom\n * - Pino: High performance, production-proven\n * - Custom: Full control, no Pino dependency\n */\n\n// Logger Instance\nexport { logger } from './adapter-factory.js';\n\n// Types\nexport type { LogLevel, LoggerAdapter } from './adapters/types.js';\n","/**\n * Redis factory with automatic environment variable detection\n * Supports: Single, Master-Replica, Sentinel, Cluster\n */\n\nimport type { Redis, Cluster, RedisOptions, ClusterOptions } from 'ioredis';\nimport { logger } from '../logger';\n\nconst cacheLogger = logger.child('cache');\n\nexport interface RedisClients {\n /** Primary Redis for writes (or both read/write if no replica) */\n write?: Redis | Cluster;\n /** Replica Redis for reads (optional, falls back to write) */\n read?: Redis | Cluster;\n}\n\n/**\n * Check if any Redis configuration exists in environment\n */\nfunction hasRedisConfig(): boolean\n{\n return !!(\n process.env.REDIS_URL ||\n process.env.REDIS_WRITE_URL ||\n process.env.REDIS_READ_URL ||\n process.env.REDIS_SENTINEL_HOSTS ||\n process.env.REDIS_CLUSTER_NODES\n );\n}\n\n/**\n * Create Redis client with TLS support\n */\nfunction createClient(\n RedisClient: new (url: string, options?: RedisOptions) => Redis,\n url: string\n): Redis\n{\n const options: RedisOptions = {};\n\n // TLS support for rediss://\n if (url.startsWith('rediss://'))\n {\n options.tls = {\n rejectUnauthorized: process.env.REDIS_TLS_REJECT_UNAUTHORIZED !== 'false',\n };\n }\n\n return new RedisClient(url, options);\n}\n\n/**\n * Create Redis client(s) from environment variables\n *\n * Supported patterns (priority order):\n * 1. Single instance: REDIS_URL\n * 2. Master-Replica: REDIS_WRITE_URL + REDIS_READ_URL\n * 3. Sentinel: REDIS_SENTINEL_HOSTS + REDIS_MASTER_NAME\n * 4. Cluster: REDIS_CLUSTER_NODES\n *\n * @returns Redis client(s) or undefined if no configuration found\n *\n * @example\n * ```bash\n * # Single (most common)\n * REDIS_URL=redis://localhost:6379\n * REDIS_URL=rediss://secure.redis.com:6380 # TLS\n *\n * # Master-Replica\n * REDIS_WRITE_URL=redis://master:6379\n * REDIS_READ_URL=redis://replica:6379\n *\n * # Sentinel\n * REDIS_SENTINEL_HOSTS=sentinel1:26379,sentinel2:26379\n * REDIS_MASTER_NAME=mymaster\n * REDIS_PASSWORD=secret\n *\n * # Cluster\n * REDIS_CLUSTER_NODES=node1:6379,node2:6379,node3:6379\n * REDIS_PASSWORD=secret\n * ```\n */\nexport async function createRedisFromEnv(): Promise<RedisClients>\n{\n // Quick exit if no Redis config\n if (!hasRedisConfig())\n {\n return { write: undefined, read: undefined };\n }\n\n try\n {\n // Dynamic import to avoid bundling if not used\n const ioredis = await import('ioredis');\n const RedisClient = ioredis.default;\n\n // 1. Single instance (most common - highest priority)\n if (\n process.env.REDIS_URL &&\n !process.env.REDIS_WRITE_URL &&\n !process.env.REDIS_READ_URL &&\n !process.env.REDIS_CLUSTER_NODES\n )\n {\n const client = createClient(RedisClient, process.env.REDIS_URL);\n return { write: client, read: client };\n }\n\n // 2. Master-Replica pattern (both URLs required)\n if (process.env.REDIS_WRITE_URL && process.env.REDIS_READ_URL)\n {\n const write = createClient(RedisClient, process.env.REDIS_WRITE_URL);\n const read = createClient(RedisClient, process.env.REDIS_READ_URL);\n return { write, read };\n }\n\n // 3. Sentinel pattern\n if (process.env.REDIS_SENTINEL_HOSTS && process.env.REDIS_MASTER_NAME)\n {\n const sentinels = process.env.REDIS_SENTINEL_HOSTS.split(',').map((host) =>\n {\n const [hostname, port] = host.trim().split(':');\n return { host: hostname, port: Number(port) || 26379 };\n });\n\n const options: RedisOptions = {\n sentinels,\n name: process.env.REDIS_MASTER_NAME,\n password: process.env.REDIS_PASSWORD,\n };\n\n const client = new RedisClient(options);\n return { write: client, read: client };\n }\n\n // 4. Cluster pattern\n if (process.env.REDIS_CLUSTER_NODES)\n {\n const nodes = process.env.REDIS_CLUSTER_NODES.split(',').map((node) =>\n {\n const [host, port] = node.trim().split(':');\n return { host, port: Number(port) || 6379 };\n });\n\n const clusterOptions: ClusterOptions = {\n redisOptions: {\n password: process.env.REDIS_PASSWORD,\n },\n };\n\n const cluster = new RedisClient.Cluster(nodes, clusterOptions);\n return { write: cluster, read: cluster };\n }\n\n // 5. Fallback: Single URL with other configs present\n if (process.env.REDIS_URL)\n {\n const client = createClient(RedisClient, process.env.REDIS_URL);\n return { write: client, read: client };\n }\n\n // No valid configuration\n return { write: undefined, read: undefined };\n }\n catch (error)\n {\n if (error instanceof Error)\n {\n cacheLogger.warn(\n 'Failed to create Redis client',\n error,\n { suggestion: 'Using memory-only cache. Install ioredis: npm install ioredis' }\n );\n }\n else\n {\n cacheLogger.warn(\n 'Failed to create Redis client',\n { error: String(error), suggestion: 'Using memory-only cache. Install ioredis: npm install ioredis' }\n );\n }\n return { write: undefined, read: undefined };\n }\n}\n\n/**\n * Create single Redis client (backward compatibility)\n * Only returns write instance\n */\nexport async function createSingleRedisFromEnv(): Promise<Redis | Cluster | undefined>\n{\n const { write } = await createRedisFromEnv();\n return write;\n}","/**\n * Global Redis instance manager\n * Provides singleton access to Redis across all modules\n * Supports Master-Replica pattern with separate read/write instances\n */\n\nimport type { Redis, Cluster } from 'ioredis';\n\nimport { createRedisFromEnv } from './redis-factory.js';\nimport { logger } from '../logger';\n\nconst cacheLogger = logger.child('cache');\n\nlet writeInstance: Redis | Cluster | undefined;\nlet readInstance: Redis | Cluster | undefined;\n\n/**\n * Get global Redis write instance\n *\n * @returns Redis write instance or undefined if not initialized\n *\n * @example\n * ```typescript\n * import { getRedis } from '@spfn/core/cache';\n *\n * const redis = getRedis();\n * if (redis) {\n * await redis.set('key', 'value');\n * }\n * ```\n */\nexport function getRedis(): Redis | Cluster | undefined\n{\n return writeInstance;\n}\n\n/**\n * Get global Redis read instance (falls back to write if no replica)\n *\n * @returns Redis read instance or write instance as fallback\n *\n * @example\n * ```typescript\n * import { getRedisRead } from '@spfn/core/cache';\n *\n * const redis = getRedisRead();\n * if (redis) {\n * const value = await redis.get('key');\n * }\n * ```\n */\nexport function getRedisRead(): Redis | Cluster | undefined\n{\n return readInstance ?? writeInstance;\n}\n\n/**\n * Set global Redis instances (for testing or manual configuration)\n *\n * @param write - Redis write instance\n * @param read - Redis read instance (optional, defaults to write)\n *\n * @example\n * ```typescript\n * import { setRedis } from '@spfn/core/cache';\n * import Redis from 'ioredis';\n *\n * const write = new Redis('redis://master:6379');\n * const read = new Redis('redis://replica:6379');\n * setRedis(write, read);\n * ```\n */\nexport function setRedis(\n write: Redis | Cluster | undefined,\n read?: Redis | Cluster | undefined\n): void\n{\n writeInstance = write;\n readInstance = read ?? write;\n}\n\n/**\n * Initialize Redis from environment variables\n * Automatically called by startServer()\n *\n * Supported environment variables:\n * - REDIS_URL (single instance)\n * - REDIS_WRITE_URL + REDIS_READ_URL (master-replica)\n * - REDIS_SENTINEL_HOSTS + REDIS_MASTER_NAME (sentinel)\n * - REDIS_CLUSTER_NODES (cluster)\n * - REDIS_TLS_REJECT_UNAUTHORIZED (TLS config)\n *\n * @returns Object with write and read instances\n *\n * @example\n * ```typescript\n * import { initRedis } from '@spfn/core/cache';\n *\n * // Manual initialization (not needed if using startServer)\n * const { write, read } = await initRedis();\n * ```\n */\nexport async function initRedis(): Promise<{ write?: Redis | Cluster; read?: Redis | Cluster }>\n{\n // Already initialized\n if (writeInstance)\n {\n return { write: writeInstance, read: readInstance };\n }\n\n // Auto-detect from environment\n const { write, read } = await createRedisFromEnv();\n\n if (write)\n {\n try\n {\n // Test connection\n await write.ping();\n\n // Test read instance if different\n if (read && read !== write)\n {\n await read.ping();\n }\n\n writeInstance = write;\n readInstance = read;\n\n const hasReplica = read && read !== write;\n cacheLogger.info(\n hasReplica\n ? 'Redis connected (Master-Replica)'\n : 'Redis connected'\n );\n }\n catch (error)\n {\n cacheLogger.error(\n 'Redis connection failed',\n error instanceof Error ? error : new Error(String(error))\n );\n\n // Clean up failed connections\n try\n {\n await write.quit();\n if (read && read !== write)\n {\n await read.quit();\n }\n }\n catch\n {\n // Ignore cleanup errors\n }\n\n return { write: undefined, read: undefined };\n }\n }\n\n return { write: writeInstance, read: readInstance };\n}\n\n/**\n * Close all Redis connections and cleanup\n *\n * @example\n * ```typescript\n * import { closeRedis } from '@spfn/core/cache';\n *\n * // During graceful shutdown\n * await closeRedis();\n * ```\n */\nexport async function closeRedis(): Promise<void>\n{\n const closePromises: Promise<unknown>[] = [];\n\n if (writeInstance)\n {\n closePromises.push(\n writeInstance.quit().catch((err: Error) =>\n {\n cacheLogger.error('Error closing Redis write instance', err);\n })\n );\n }\n\n if (readInstance && readInstance !== writeInstance)\n {\n closePromises.push(\n readInstance.quit().catch((err: Error) =>\n {\n cacheLogger.error('Error closing Redis read instance', err);\n })\n );\n }\n\n await Promise.all(closePromises);\n\n writeInstance = undefined;\n readInstance = undefined;\n\n cacheLogger.info('Redis connections closed');\n}\n\n/**\n * Get Redis connection info (for debugging)\n */\nexport function getRedisInfo(): {\n hasWrite: boolean;\n hasRead: boolean;\n isReplica: boolean;\n}\n{\n return {\n hasWrite: !!writeInstance,\n hasRead: !!readInstance,\n isReplica: !!(readInstance && readInstance !== writeInstance),\n };\n}","/**\n * Redis cache infrastructure\n * Provides singleton Redis instance management for all SPFN modules\n * Supports Master-Replica pattern with separate read/write instances\n */\n\nexport { createRedisFromEnv, createSingleRedisFromEnv } from './redis-factory.js';\nexport { getRedis, getRedisRead, setRedis, initRedis, closeRedis, getRedisInfo } from './redis-manager.js';\nexport type { RedisClients } from './redis-factory.js';","/**\n * HTTP Error Classes\n *\n * Standard HTTP error classes for API responses\n * Covers common HTTP status codes beyond database errors\n */\n\n/**\n * Base HTTP Error\n *\n * Base class for all HTTP-related errors\n */\nexport class HttpError<TDetails extends Record<string, unknown> = Record<string, unknown>> extends Error\n{\n public readonly statusCode: number;\n public readonly details?: TDetails;\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n statusCode: number,\n details?: TDetails\n )\n {\n super(message);\n this.name = 'HttpError';\n this.statusCode = statusCode;\n this.details = details;\n this.timestamp = new Date();\n Error.captureStackTrace(this, this.constructor);\n }\n\n /**\n * Serialize error for API response\n */\n toJSON()\n {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n timestamp: this.timestamp.toISOString()\n };\n }\n}\n\n/**\n * Bad Request Error (400)\n *\n * Generic bad request - malformed syntax, invalid parameters, etc.\n */\nexport class BadRequestError extends HttpError\n{\n constructor(message: string = 'Bad request', details?: Record<string, any>)\n {\n super(message, 400, details);\n this.name = 'BadRequestError';\n }\n}\n\n/**\n * Unauthorized Error (401)\n *\n * Authentication required or authentication failed\n */\nexport class UnauthorizedError extends HttpError\n{\n constructor(message: string = 'Authentication required', details?: Record<string, any>)\n {\n super(message, 401, details);\n this.name = 'UnauthorizedError';\n }\n}\n\n/**\n * Forbidden Error (403)\n *\n * Authenticated but lacks permission to access resource\n */\nexport class ForbiddenError extends HttpError\n{\n constructor(message: string = 'Access forbidden', details?: Record<string, any>)\n {\n super(message, 403, details);\n this.name = 'ForbiddenError';\n }\n}\n\n/**\n * Conflict Error (409)\n *\n * Generic conflict - resource state conflict, concurrent modification, etc.\n * More general than DuplicateEntryError\n */\nexport class ConflictError extends HttpError\n{\n constructor(message: string = 'Resource conflict', details?: Record<string, any>)\n {\n super(message, 409, details);\n this.name = 'ConflictError';\n }\n}\n\n/**\n * Too Many Requests Error (429)\n *\n * Rate limit exceeded\n */\nexport class TooManyRequestsError extends HttpError\n{\n constructor(\n message: string = 'Too many requests',\n retryAfter?: number,\n details?: Record<string, any>\n )\n {\n const fullDetails = retryAfter\n ? { ...details, retryAfter }\n : details;\n\n super(message, 429, fullDetails);\n this.name = 'TooManyRequestsError';\n }\n}\n\n/**\n * Internal Server Error (500)\n *\n * Generic server error when no specific error type applies\n */\nexport class InternalServerError extends HttpError\n{\n constructor(message: string = 'Internal server error', details?: Record<string, any>)\n {\n super(message, 500, details);\n this.name = 'InternalServerError';\n }\n}\n\n/**\n * Service Unavailable Error (503)\n *\n * Service temporarily unavailable (maintenance, overload, etc.)\n */\nexport class ServiceUnavailableError extends HttpError\n{\n constructor(\n message: string = 'Service unavailable',\n retryAfter?: number,\n details?: Record<string, any>\n )\n {\n const fullDetails = retryAfter\n ? { ...details, retryAfter }\n : details;\n\n super(message, 503, fullDetails);\n this.name = 'ServiceUnavailableError';\n }\n}","/**\n * Error Utility Functions\n *\n * Generic error type checking utilities\n */\n\nimport { DatabaseError } from './database-errors.js';\nimport { HttpError } from './http-errors.js';\n\n/**\n * Check if error is a DatabaseError\n */\nexport function isDatabaseError(error: unknown): error is DatabaseError\n{\n return error instanceof DatabaseError;\n}\n\n/**\n * Check if error is an HttpError\n */\nexport function isHttpError(error: unknown): error is HttpError\n{\n return error instanceof HttpError;\n}\n\n/**\n * Check if error has a statusCode property\n */\nexport function hasStatusCode(error: unknown): error is { statusCode: number }\n{\n return (\n typeof error === 'object' &&\n error !== null &&\n 'statusCode' in error &&\n typeof (error as any).statusCode === 'number'\n );\n}\n","/**\n * Error Module Exports\n *\n * Entry point for error handling module (Pure re-export only)\n */\n\n// Database Error Classes\nexport {\n DatabaseError,\n ConnectionError,\n QueryError,\n NotFoundError,\n ValidationError,\n TransactionError,\n DeadlockError,\n DuplicateEntryError,\n} from './database-errors.js';\n\n// HTTP Error Classes\nexport {\n HttpError,\n BadRequestError,\n UnauthorizedError,\n ForbiddenError,\n ConflictError,\n TooManyRequestsError,\n InternalServerError,\n ServiceUnavailableError,\n} from './http-errors.js';\n\n// Error Utilities\nexport {\n isDatabaseError,\n isHttpError,\n hasStatusCode,\n} from './error-utils.js';\n","/**\n * PostgreSQL Error Conversion Utilities\n *\n * Converts PostgreSQL-specific error codes to custom error types\n * @see https://www.postgresql.org/docs/current/errcodes-appendix.html\n */\n\nimport {\n DatabaseError,\n ConnectionError,\n DuplicateEntryError,\n DeadlockError,\n ValidationError,\n QueryError,\n TransactionError,\n} from '../errors/database-errors.js';\n\n/**\n * Extract field and value from PostgreSQL unique violation message\n *\n * Handles various formats:\n * - Simple: Key (email)=(test@example.com)\n * - Complex: Key (user_id, tenant_id)=(123, 456)\n * - With quotes: Key (\"field\")=('value')\n */\nfunction parseUniqueViolation(message: string): { field: string; value: string } | null\n{\n // Try multiple patterns for robustness\n const patterns = [\n // Standard format: Key (field)=(value)\n /Key \\(([^)]+)\\)=\\(([^)]+)\\)/i,\n // With quotes: Key (\"field\")=('value')\n /Key \\([\"']?([^)\"']+)[\"']?\\)=\\([\"']?([^)\"']+)[\"']?\\)/i,\n // Alternative format\n /Key `([^`]+)`=`([^`]+)`/i,\n ];\n\n for (const pattern of patterns)\n {\n const match = message.match(pattern);\n if (match)\n {\n // Clean up extracted values\n const field = match[1].trim().replace(/[\"'`]/g, '');\n const value = match[2].trim().replace(/[\"'`]/g, '');\n return { field, value };\n }\n }\n\n return null;\n}\n\n/**\n * Convert PostgreSQL error to custom DatabaseError\n *\n * Maps PostgreSQL error codes to appropriate error classes with correct status codes\n *\n * @param error - PostgreSQL error object (from pg driver or Drizzle)\n * @returns Custom DatabaseError instance\n *\n * @example\n * ```typescript\n * import { fromPostgresError } from '@spfn/core/db';\n *\n * try {\n * await db.insert(users).values(data);\n * } catch (pgError) {\n * throw fromPostgresError(pgError);\n * }\n * ```\n */\nexport function fromPostgresError(error: any): DatabaseError\n{\n const code = error?.code;\n const message = error?.message || 'Database error occurred';\n\n switch (code)\n {\n // Class 08 ā Connection Exception\n case '08000': // connection_exception\n case '08001': // sqlclient_unable_to_establish_sqlconnection\n case '08003': // connection_does_not_exist\n case '08004': // sqlserver_rejected_establishment_of_sqlconnection\n case '08006': // connection_failure\n case '08007': // transaction_resolution_unknown\n case '08P01': // protocol_violation\n return new ConnectionError(message, { code });\n\n // Class 23 ā Integrity Constraint Violation\n case '23000': // integrity_constraint_violation\n case '23001': // restrict_violation\n return new ValidationError(message, { code, constraint: 'integrity' });\n\n case '23502': // not_null_violation\n return new ValidationError(message, { code, constraint: 'not_null' });\n\n case '23503': // foreign_key_violation\n return new ValidationError(message, { code, constraint: 'foreign_key' });\n\n case '23505': // unique_violation\n const parsed = parseUniqueViolation(message);\n if (parsed)\n {\n return new DuplicateEntryError(parsed.field, parsed.value);\n }\n return new DuplicateEntryError('field', 'value');\n\n case '23514': // check_violation\n return new ValidationError(message, { code, constraint: 'check' });\n\n // Class 40 ā Transaction Rollback\n case '40000': // transaction_rollback\n case '40001': // serialization_failure\n case '40002': // transaction_integrity_constraint_violation\n case '40003': // statement_completion_unknown\n return new TransactionError(message, 500, { code });\n\n case '40P01': // deadlock_detected\n return new DeadlockError(message, { code });\n\n // Class 42 ā Syntax Error or Access Rule Violation\n case '42000': // syntax_error_or_access_rule_violation\n case '42601': // syntax_error\n case '42501': // insufficient_privilege\n case '42602': // invalid_name\n case '42622': // name_too_long\n case '42701': // duplicate_column\n case '42702': // ambiguous_column\n case '42703': // undefined_column\n case '42704': // undefined_object\n case '42P01': // undefined_table\n case '42P02': // undefined_parameter\n return new QueryError(message, 400, { code });\n\n // Class 53 ā Insufficient Resources\n case '53000': // insufficient_resources\n case '53100': // disk_full\n case '53200': // out_of_memory\n case '53300': // too_many_connections\n return new ConnectionError(message, { code });\n\n // Class 57 ā Operator Intervention\n case '57000': // operator_intervention\n case '57014': // query_canceled\n case '57P01': // admin_shutdown\n case '57P02': // crash_shutdown\n case '57P03': // cannot_connect_now\n return new ConnectionError(message, { code });\n\n // Default: Unknown error\n default:\n return new QueryError(message, 500, { code });\n }\n}","/**\n * Database Connection Logic\n *\n * DB ģ°ź²° ģģ± ė° ģ¬ģė ė”ģ§\n *\n * ā
구ķ ģė£:\n * - Exponential Backoff ģ¬ģė ė”ģ§\n * - ģ°ź²° ķ
ģ¤ķø 쿼리\n * - ģģøķ ģė¬ ė”ź¹
\n * - ģ°ź²° ģ±ź³µ/ģ¤ķØ ė”ź¹
\n * - Logger ģ ģ© (console.log ė첓)\n *\n * ā ļø ź°ģ ķģ:\n * - ģė¬ ķģ
ė³ ģ²ė¦¬ (ė¤ķøģķ¬ vs ģøģ¦)\n * - Graceful Shutdown ė”ģ§\n *\n * š” ķ„ķ ź³ ė ¤ģ¬ķ:\n * - ģ°ź²° ķ ģ“ė²¤ķø ė¦¬ģ¤ė\n * - ģ°ź²° ģķ ė©ķøė¦ ģģ§\n * - ģ°ź²° ķ ėģ ģ”°ģ \n *\n * š ź“ė Ø ķģ¼:\n * - src/server/core/db/config.ts (ģ¤ģ )\n * - src/server/core/db/index.ts (ė©ģø export)\n * - src/server/core/logger/ (Logger)\n *\n * š TODO: improvements.md ģ°øź³ \n * - #7: Connection Pool ėŖØėķ°ė§ (Pool ģ“ė²¤ķø ė¦¬ģ¤ė, ķģ±/ģ ķ“ ģ°ź²° ģ¶ģ )\n * - #9: Slow Query ė”ź¹
(쿼리 ģ¤ķ ģź° ģø”ģ ė° ģź³ź° ė”ź¹
)\n * - #10: Graceful Shutdown (SIGTERM ģ²ė¦¬, ģ§ķ ģ¤ģø 쿼리 ģė£ ėźø°)\n * - #11: Read Replica ģ§ģ (ģ½źø°/ģ°źø° ė¶ė¦¬)\n */\nimport type { Sql } from 'postgres';\nimport postgres from 'postgres';\n\nimport { logger } from '../../logger';\nimport { ConnectionError } from '../../errors';\nimport { fromPostgresError } from '../postgres-errors';\nimport type { PoolConfig, RetryConfig } from './config';\n\nconst dbLogger = logger.child('database');\n\n/**\n * ģ§ģ° ķØģ\n */\nfunction delay(ms: number): Promise<void>\n{\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Exponential Backoffė” DB ģ°ź²° ģģ±\n *\n * @param connectionString - PostgreSQL ģ°ź²° 문ģģ“\n * @param poolConfig - Connection Pool ģ¤ģ \n * @param retryConfig - ģ¬ģė ģ¤ģ \n * @returns PostgreSQL ķ“ė¼ģ“ģøķø\n */\nexport async function createDatabaseConnection(\n connectionString: string,\n poolConfig: PoolConfig,\n retryConfig: RetryConfig\n)\n{\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++)\n {\n try\n {\n // PostgreSQL ķ“ė¼ģ“ģøķø ģģ±\n const client = postgres(connectionString, {\n max: poolConfig.max,\n idle_timeout: poolConfig.idleTimeout,\n });\n\n // ģ°ź²° ķ
ģ¤ķø 쿼리\n await client`SELECT 1 as test`;\n\n // ģ°ź²° ģ±ź³µ\n if (attempt > 0)\n {\n dbLogger.info(`Database connected successfully after ${attempt} retries`);\n }\n else\n {\n dbLogger.info('Database connected successfully');\n }\n\n return client;\n }\n catch (error)\n {\n lastError = fromPostgresError(error);\n\n // ė§ģ§ė§ ģėź° ģėė©“ ģ¬ģė\n if (attempt < retryConfig.maxRetries)\n {\n // Exponential Backoff ź³ģ°\n const delayMs = Math.min(\n retryConfig.initialDelay * Math.pow(retryConfig.factor, attempt),\n retryConfig.maxDelay\n );\n\n dbLogger.warn(\n `Connection failed (attempt ${attempt + 1}/${retryConfig.maxRetries + 1}), retrying in ${delayMs}ms...`,\n lastError,\n {\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1,\n delayMs,\n }\n );\n\n await delay(delayMs);\n }\n }\n }\n\n // ėŖØė ģ¬ģė ģ¤ķØ\n const errorMessage =\n `Failed to connect to database after ${retryConfig.maxRetries + 1} attempts: ${lastError?.message || 'Unknown error'}`;\n\n throw new ConnectionError(errorMessage);\n}\n\n/**\n * DB ģ°ź²° ģķ ķģø\n *\n * @param client - PostgreSQL ķ“ė¼ģ“ģøķø\n * @returns ģ°ź²° ź°ė„ ģ¬ė¶\n */\nexport async function checkConnection(client: Sql): Promise<boolean>\n{\n try\n {\n await client`SELECT 1 as health_check`;\n return true;\n }\n catch (error)\n {\n dbLogger.error('Database health check failed', error as Error);\n return false;\n }\n}","/**\n * Database Configuration\n *\n * DB ģ°ź²° ė° Connection Pool ģ¤ģ \n *\n * ā
구ķ ģė£:\n * - ķź²½ė³ Connection Pool ģ¤ģ \n * - ģ¬ģė ģ¤ģ (Exponential Backoff)\n * - ķź²½ė³ģ źø°ė° ģ¤ģ \n *\n * š ź“ė Ø ķģ¼:\n * - src/server/core/db/connection.ts (ģ°ź²° ė”ģ§)\n * - src/server/core/db/index.ts (ė©ģø export)\n */\n\n/**\n * Connection Pool ģ¤ģ \n */\nexport interface PoolConfig\n{\n max: number; // ģµė ģ°ź²° ģ\n idleTimeout: number; // ģ ķ“ ģ°ź²° ķģģģ (ģ“)\n}\n\n/**\n * ģ¬ģė ģ¤ģ \n */\nexport interface RetryConfig\n{\n maxRetries: number; // ģµė ģ¬ģė ķģ\n initialDelay: number; // ģ“źø° ėźø° ģź° (ms)\n maxDelay: number; // ģµė ėźø° ģź° (ms)\n factor: number; // ģ§ģ ģ¦ź° ė°°ģ\n}\n\n/**\n * ķź²½ė³ Connection Pool ģ¤ģ \n *\n * ģ°ģ ģģ:\n * 1. options ķė¼ėÆøķ° (ServerConfigģģ ģ ė¬)\n * 2. ķź²½ė³ģ (DB_POOL_MAX, DB_POOL_IDLE_TIMEOUT)\n * 3. źø°ė³øź° (NODE_ENVģ ė°ė¼)\n *\n * @param options - Optional pool configuration from ServerConfig\n * @returns Pool configuration\n *\n * @example\n * ```typescript\n * // 1. ServerConfig priority (highest)\n * const config = getPoolConfig({ max: 50, idleTimeout: 60 });\n *\n * // 2. Environment variable priority\n * // DB_POOL_MAX=30 DB_POOL_IDLE_TIMEOUT=45\n * const config = getPoolConfig();\n *\n * // 3. Default (lowest)\n * // Production: max=20, idleTimeout=30\n * // Development: max=10, idleTimeout=20\n * ```\n */\nexport function getPoolConfig(options?: Partial<PoolConfig>): PoolConfig\n{\n const isProduction = process.env.NODE_ENV === 'production';\n\n // Priority: options > env > default\n const max = options?.max\n ?? (parseInt(process.env.DB_POOL_MAX || '', 10) || (isProduction ? 20 : 10));\n\n const idleTimeout = options?.idleTimeout\n ?? (parseInt(process.env.DB_POOL_IDLE_TIMEOUT || '', 10) || (isProduction ? 30 : 20));\n\n return { max, idleTimeout };\n}\n\n/**\n * ķź²½ė³ ģ¬ģė ģ¤ģ \n */\nexport function getRetryConfig(): RetryConfig\n{\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n maxRetries: isProduction ? 5 : 3, // ķė”ėģ
: 5ķ, ź°ė°: 3ķ\n initialDelay: 1000, // 1ģ“\n maxDelay: 16000, // 16ģ“\n factor: 2, // 2ė°°ģ© ģ¦ź° (1s ā 2s ā 4s ā 8s ā 16s)\n };\n}","/**\n * Database factory with automatic environment variable detection\n * Supports: Single primary, Primary + Replica\n */\n\nimport { config } from 'dotenv';\nimport { drizzle } from 'drizzle-orm/postgres-js';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport type { Sql } from 'postgres';\n\nimport { createDatabaseConnection } from './connection.js';\nimport { getPoolConfig, getRetryConfig, type PoolConfig } from './config.js';\nimport { logger } from '../../logger';\n\nconst dbLogger = logger.child('database');\n\nexport interface DatabaseClients\n{\n /** Primary database for writes (or both read/write if no replica) */\n write?: PostgresJsDatabase;\n /** Replica database for reads (optional, falls back to write) */\n read?: PostgresJsDatabase;\n /** Raw postgres client for write operations (for cleanup) */\n writeClient?: Sql;\n /** Raw postgres client for read operations (for cleanup) */\n readClient?: Sql;\n}\n\n/**\n * Check if any database configuration exists in environment\n */\nfunction hasDatabaseConfig(): boolean\n{\n return !!(\n process.env.DATABASE_URL ||\n process.env.DATABASE_WRITE_URL ||\n process.env.DATABASE_READ_URL\n );\n}\n\n/**\n * Health check configuration\n */\nexport interface HealthCheckConfig\n{\n enabled: boolean;\n interval: number;\n reconnect: boolean;\n maxRetries: number;\n retryInterval: number;\n}\n\n/**\n * Query performance monitoring configuration\n */\nexport interface MonitoringConfig\n{\n enabled: boolean;\n slowThreshold: number;\n logQueries: boolean;\n}\n\n/**\n * Database initialization options\n */\nexport interface DatabaseOptions\n{\n /**\n * Connection pool configuration\n * Overrides environment variables and defaults\n */\n pool?: Partial<PoolConfig>;\n\n /**\n * Health check configuration\n * Periodic checks to ensure database connection is alive\n */\n healthCheck?: Partial<HealthCheckConfig>;\n\n /**\n * Query performance monitoring configuration\n * Tracks slow queries and logs performance metrics\n */\n monitoring?: Partial<MonitoringConfig>;\n}\n\n/**\n * Create database client(s) from environment variables\n *\n * Supported patterns (priority order):\n * 1. Single primary: DATABASE_URL\n * 2. Primary + Replica: DATABASE_WRITE_URL + DATABASE_READ_URL\n * 3. Legacy replica: DATABASE_URL + DATABASE_REPLICA_URL\n *\n * @param options - Optional database configuration (pool settings, etc.)\n * @returns Database client(s) or undefined if no configuration found\n *\n * @example\n * ```bash\n * # Single primary (most common)\n * DATABASE_URL=postgresql://localhost:5432/mydb\n *\n * # Primary + Replica\n * DATABASE_WRITE_URL=postgresql://primary:5432/mydb\n * DATABASE_READ_URL=postgresql://replica:5432/mydb\n *\n * # Legacy (backward compatibility)\n * DATABASE_URL=postgresql://primary:5432/mydb\n * DATABASE_REPLICA_URL=postgresql://replica:5432/mydb\n * ```\n *\n * @example\n * ```typescript\n * // Custom pool configuration\n * const db = await createDatabaseFromEnv({\n * pool: { max: 50, idleTimeout: 60 }\n * });\n * ```\n */\nexport async function createDatabaseFromEnv(options?: DatabaseOptions): Promise<DatabaseClients>\n{\n // Load .env.local if needed\n if (!hasDatabaseConfig())\n {\n config({ path: '.env.local' });\n }\n\n // Quick exit if no database config\n if (!hasDatabaseConfig())\n {\n return { write: undefined, read: undefined };\n }\n\n try\n {\n const poolConfig = getPoolConfig(options?.pool);\n const retryConfig = getRetryConfig();\n\n // 1. Primary + Replica pattern (explicit separation)\n if (process.env.DATABASE_WRITE_URL && process.env.DATABASE_READ_URL)\n {\n const writeClient = await createDatabaseConnection(\n process.env.DATABASE_WRITE_URL,\n poolConfig,\n retryConfig\n );\n\n const readClient = await createDatabaseConnection(\n process.env.DATABASE_READ_URL,\n poolConfig,\n retryConfig\n );\n\n return {\n write: drizzle(writeClient),\n read: drizzle(readClient),\n writeClient,\n readClient,\n };\n }\n\n // 2. Legacy replica pattern (backward compatibility)\n if (process.env.DATABASE_URL && process.env.DATABASE_REPLICA_URL)\n {\n const writeClient = await createDatabaseConnection(\n process.env.DATABASE_URL,\n poolConfig,\n retryConfig\n );\n\n const readClient = await createDatabaseConnection(\n process.env.DATABASE_REPLICA_URL,\n poolConfig,\n retryConfig\n );\n\n return {\n write: drizzle(writeClient),\n read: drizzle(readClient),\n writeClient,\n readClient,\n };\n }\n\n // 3. Single primary (most common)\n if (process.env.DATABASE_URL)\n {\n const client = await createDatabaseConnection(\n process.env.DATABASE_URL,\n poolConfig,\n retryConfig\n );\n\n const db = drizzle(client);\n return {\n write: db,\n read: db,\n writeClient: client,\n readClient: client,\n };\n }\n\n // 4. DATABASE_WRITE_URL only (no read replica)\n if (process.env.DATABASE_WRITE_URL)\n {\n const client = await createDatabaseConnection(\n process.env.DATABASE_WRITE_URL,\n poolConfig,\n retryConfig\n );\n\n const db = drizzle(client);\n return {\n write: db,\n read: db,\n writeClient: client,\n readClient: client,\n };\n }\n\n // No valid configuration\n return { write: undefined, read: undefined };\n }\n catch (error)\n {\n const message = error instanceof Error ? error.message : 'Unknown error';\n dbLogger.error('Failed to create database connection', {\n error: message,\n stage: 'initialization',\n hasWriteUrl: !!process.env.DATABASE_WRITE_URL,\n hasReadUrl: !!process.env.DATABASE_READ_URL,\n hasUrl: !!process.env.DATABASE_URL,\n hasReplicaUrl: !!process.env.DATABASE_REPLICA_URL,\n });\n return { write: undefined, read: undefined };\n }\n}","/**\n * Global Database instance manager\n * Provides singleton access to database across all modules\n * Supports Primary + Replica pattern with separate read/write instances\n */\n\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport type { Sql } from 'postgres';\n\nimport { createDatabaseFromEnv, type DatabaseOptions, type HealthCheckConfig, type MonitoringConfig } from './factory.js';\nimport { logger } from '../../logger';\n\nconst dbLogger = logger.child('database');\n\nlet writeInstance: PostgresJsDatabase | undefined;\nlet readInstance: PostgresJsDatabase | undefined;\nlet writeClient: Sql | undefined;\nlet readClient: Sql | undefined;\nlet healthCheckInterval: NodeJS.Timeout | undefined;\nlet monitoringConfig: MonitoringConfig | undefined;\n\n/**\n * DB connection type\n */\nexport type DbConnectionType = 'read' | 'write';\n\n/**\n * Get global database write instance\n *\n * @returns Database write instance or undefined if not initialized\n *\n * @example\n * ```typescript\n * import { getDatabase } from '@spfn/core/db';\n *\n * const db = getDatabase();\n * if (db) {\n * const users = await db.select().from(usersTable);\n * }\n * ```\n */\nexport function getDatabase(type?: DbConnectionType): PostgresJsDatabase | undefined\n{\n if (type === 'read')\n {\n return readInstance ?? writeInstance;\n }\n return writeInstance;\n}\n\n/**\n * Set global database instances (for testing or manual configuration)\n *\n * @param write - Database write instance\n * @param read - Database read instance (optional, defaults to write)\n *\n * @example\n * ```typescript\n * import { setDatabase } from '@spfn/core/db';\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n *\n * const writeClient = postgres('postgresql://primary:5432/mydb');\n * const readClient = postgres('postgresql://replica:5432/mydb');\n * setDatabase(drizzle(writeClient), drizzle(readClient));\n * ```\n */\nexport function setDatabase(\n write: PostgresJsDatabase | undefined,\n read?: PostgresJsDatabase | undefined\n): void\n{\n writeInstance = write;\n readInstance = read ?? write;\n}\n\n/**\n * Get health check configuration with priority resolution\n *\n * Priority: options > env > defaults\n */\nfunction getHealthCheckConfig(options?: Partial<HealthCheckConfig>): HealthCheckConfig\n{\n const parseBoolean = (value: string | undefined, defaultValue: boolean): boolean =>\n {\n if (value === undefined) return defaultValue;\n return value.toLowerCase() === 'true';\n };\n\n return {\n enabled: options?.enabled\n ?? parseBoolean(process.env.DB_HEALTH_CHECK_ENABLED, true),\n interval: options?.interval\n ?? (parseInt(process.env.DB_HEALTH_CHECK_INTERVAL || '', 10) || 60000),\n reconnect: options?.reconnect\n ?? parseBoolean(process.env.DB_HEALTH_CHECK_RECONNECT, true),\n maxRetries: options?.maxRetries\n ?? (parseInt(process.env.DB_HEALTH_CHECK_MAX_RETRIES || '', 10) || 3),\n retryInterval: options?.retryInterval\n ?? (parseInt(process.env.DB_HEALTH_CHECK_RETRY_INTERVAL || '', 10) || 5000),\n };\n}\n\n/**\n * Get monitoring configuration with priority resolution\n *\n * Priority: options > env > defaults\n */\nfunction getMonitoringConfig(options?: Partial<MonitoringConfig>): MonitoringConfig\n{\n const isDevelopment = process.env.NODE_ENV !== 'production';\n const parseBoolean = (value: string | undefined, defaultValue: boolean): boolean =>\n {\n if (value === undefined) return defaultValue;\n return value.toLowerCase() === 'true';\n };\n\n return {\n enabled: options?.enabled\n ?? parseBoolean(process.env.DB_MONITORING_ENABLED, isDevelopment),\n slowThreshold: options?.slowThreshold\n ?? (parseInt(process.env.DB_MONITORING_SLOW_THRESHOLD || '', 10) || 1000),\n logQueries: options?.logQueries\n ?? parseBoolean(process.env.DB_MONITORING_LOG_QUERIES, false),\n };\n}\n\n/**\n * Initialize database from environment variables\n * Automatically called by server startup\n *\n * Supported environment variables:\n * - DATABASE_URL (single primary)\n * - DATABASE_WRITE_URL + DATABASE_READ_URL (primary + replica)\n * - DATABASE_URL + DATABASE_REPLICA_URL (legacy replica)\n * - DB_POOL_MAX (connection pool max size)\n * - DB_POOL_IDLE_TIMEOUT (connection idle timeout in seconds)\n * - DB_HEALTH_CHECK_ENABLED (enable health checks, default: true)\n * - DB_HEALTH_CHECK_INTERVAL (health check interval in ms, default: 60000)\n * - DB_HEALTH_CHECK_RECONNECT (enable auto-reconnect, default: true)\n * - DB_HEALTH_CHECK_MAX_RETRIES (max reconnection attempts, default: 3)\n * - DB_HEALTH_CHECK_RETRY_INTERVAL (retry interval in ms, default: 5000)\n * - DB_MONITORING_ENABLED (enable query monitoring, default: true in dev, false in prod)\n * - DB_MONITORING_SLOW_THRESHOLD (slow query threshold in ms, default: 1000)\n * - DB_MONITORING_LOG_QUERIES (log actual SQL queries, default: false)\n *\n * Configuration priority:\n * 1. options parameter (ServerConfig)\n * 2. Environment variables\n * 3. Defaults (based on NODE_ENV)\n *\n * @param options - Optional database configuration (pool settings, etc.)\n * @returns Object with write and read instances\n *\n * @example\n * ```typescript\n * import { initDatabase } from '@spfn/core/db';\n *\n * // Manual initialization (not needed if using server startup)\n * const { write, read } = await initDatabase();\n * if (write) {\n * console.log('Database connected');\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Custom pool configuration\n * const { write, read } = await initDatabase({\n * pool: { max: 50, idleTimeout: 60 }\n * });\n * ```\n */\nexport async function initDatabase(options?: DatabaseOptions): Promise<{\n write?: PostgresJsDatabase;\n read?: PostgresJsDatabase;\n}>\n{\n // Already initialized\n if (writeInstance)\n {\n dbLogger.debug('Database already initialized');\n return { write: writeInstance, read: readInstance };\n }\n\n // Auto-detect from environment\n const result = await createDatabaseFromEnv(options);\n\n if (result.write)\n {\n try\n {\n // Test connection with a simple query\n await result.write.execute('SELECT 1');\n\n // Test read instance if different\n if (result.read && result.read !== result.write)\n {\n await result.read.execute('SELECT 1');\n }\n\n // Store instances\n writeInstance = result.write;\n readInstance = result.read;\n writeClient = result.writeClient;\n readClient = result.readClient;\n\n const hasReplica = result.read && result.read !== result.write;\n dbLogger.info(\n hasReplica\n ? 'Database connected (Primary + Replica)'\n : 'Database connected'\n );\n\n // Start health check (automatic)\n const healthCheckConfig = getHealthCheckConfig(options?.healthCheck);\n if (healthCheckConfig.enabled)\n {\n startHealthCheck(healthCheckConfig);\n }\n\n // Initialize monitoring configuration\n monitoringConfig = getMonitoringConfig(options?.monitoring);\n if (monitoringConfig.enabled)\n {\n dbLogger.info('Database query monitoring enabled', {\n slowThreshold: `${monitoringConfig.slowThreshold}ms`,\n logQueries: monitoringConfig.logQueries,\n });\n }\n }\n catch (error)\n {\n const message = error instanceof Error ? error.message : 'Unknown error';\n dbLogger.error('Database connection failed', { error: message });\n\n // Cleanup on failure\n await closeDatabase();\n\n return { write: undefined, read: undefined };\n }\n }\n else\n {\n dbLogger.warn('No database configuration found');\n dbLogger.warn('Set DATABASE_URL environment variable to enable database');\n }\n\n return { write: writeInstance, read: readInstance };\n}\n\n/**\n * Close all database connections and cleanup\n *\n * Properly closes postgres connection pools with timeout.\n * Should be called during graceful shutdown or after tests.\n *\n * @example\n * ```typescript\n * import { closeDatabase } from '@spfn/core/db';\n *\n * // During graceful shutdown\n * process.on('SIGTERM', async () => {\n * await closeDatabase();\n * process.exit(0);\n * });\n *\n * // In tests\n * afterAll(async () => {\n * await closeDatabase();\n * });\n * ```\n */\nexport async function closeDatabase(): Promise<void>\n{\n if (!writeInstance && !readInstance)\n {\n dbLogger.debug('No database connections to close');\n return;\n }\n\n // Stop health check\n stopHealthCheck();\n\n try\n {\n const closePromises: Promise<void>[] = [];\n\n // Close write client\n if (writeClient)\n {\n dbLogger.debug('Closing write connection...');\n closePromises.push(\n writeClient.end({ timeout: 5 })\n .then(() => dbLogger.debug('Write connection closed'))\n .catch(err => dbLogger.error('Error closing write connection', err))\n );\n }\n\n // Close read client (if different from write)\n if (readClient && readClient !== writeClient)\n {\n dbLogger.debug('Closing read connection...');\n closePromises.push(\n readClient.end({ timeout: 5 })\n .then(() => dbLogger.debug('Read connection closed'))\n .catch(err => dbLogger.error('Error closing read connection', err))\n );\n }\n\n // Wait for all connections to close\n await Promise.all(closePromises);\n\n dbLogger.info('All database connections closed');\n }\n catch (error)\n {\n dbLogger.error('Error during database cleanup', error as Error);\n throw error;\n }\n finally\n {\n // Always clear instances\n writeInstance = undefined;\n readInstance = undefined;\n writeClient = undefined;\n readClient = undefined;\n monitoringConfig = undefined;\n }\n}\n\n/**\n * Get database connection info (for debugging)\n */\nexport function getDatabaseInfo(): {\n hasWrite: boolean;\n hasRead: boolean;\n isReplica: boolean;\n}\n{\n return {\n hasWrite: !!writeInstance,\n hasRead: !!readInstance,\n isReplica: !!(readInstance && readInstance !== writeInstance),\n };\n}\n\n/**\n * Start database health check\n *\n * Periodically checks database connection health and attempts reconnection if enabled.\n * Automatically started by initDatabase() when health check is enabled.\n *\n * @param config - Health check configuration\n *\n * @example\n * ```typescript\n * import { startHealthCheck } from '@spfn/core/db';\n *\n * startHealthCheck({\n * enabled: true,\n * interval: 30000, // 30 seconds\n * reconnect: true,\n * maxRetries: 5,\n * retryInterval: 10000, // 10 seconds\n * });\n * ```\n */\nexport function startHealthCheck(config: HealthCheckConfig): void\n{\n if (healthCheckInterval)\n {\n dbLogger.debug('Health check already running');\n return;\n }\n\n dbLogger.info('Starting database health check', {\n interval: `${config.interval}ms`,\n reconnect: config.reconnect,\n });\n\n healthCheckInterval = setInterval(async () =>\n {\n try\n {\n const write = getDatabase('write');\n const read = getDatabase('read');\n\n // Check write connection\n if (write)\n {\n await write.execute('SELECT 1');\n }\n\n // Check read connection (if different)\n if (read && read !== write)\n {\n await read.execute('SELECT 1');\n }\n\n dbLogger.debug('Database health check passed');\n }\n catch (error)\n {\n const message = error instanceof Error ? error.message : 'Unknown error';\n dbLogger.error('Database health check failed', { error: message });\n\n // Attempt reconnection if enabled\n if (config.reconnect)\n {\n await attemptReconnection(config);\n }\n }\n }, config.interval);\n}\n\n/**\n * Attempt database reconnection with retry logic\n *\n * @param config - Health check configuration\n */\nasync function attemptReconnection(config: HealthCheckConfig): Promise<void>\n{\n dbLogger.warn('Attempting database reconnection', {\n maxRetries: config.maxRetries,\n retryInterval: `${config.retryInterval}ms`,\n });\n\n for (let attempt = 1; attempt <= config.maxRetries; attempt++)\n {\n try\n {\n dbLogger.debug(`Reconnection attempt ${attempt}/${config.maxRetries}`);\n\n // Close existing connections\n await closeDatabase();\n\n // Wait before retry\n await new Promise(resolve => setTimeout(resolve, config.retryInterval));\n\n // Reinitialize database\n const result = await createDatabaseFromEnv();\n\n if (result.write)\n {\n // Test connection\n await result.write.execute('SELECT 1');\n\n // Store instances\n writeInstance = result.write;\n readInstance = result.read;\n writeClient = result.writeClient;\n readClient = result.readClient;\n\n dbLogger.info('Database reconnection successful', { attempt });\n return;\n }\n }\n catch (error)\n {\n const message = error instanceof Error ? error.message : 'Unknown error';\n dbLogger.error(`Reconnection attempt ${attempt} failed`, {\n error: message,\n attempt,\n maxRetries: config.maxRetries,\n });\n\n if (attempt === config.maxRetries)\n {\n dbLogger.error('Max reconnection attempts reached, giving up');\n }\n }\n }\n}\n\n/**\n * Stop database health check\n *\n * Automatically called by closeDatabase().\n * Can also be called manually to stop health checks.\n *\n * @example\n * ```typescript\n * import { stopHealthCheck } from '@spfn/core/db';\n *\n * stopHealthCheck();\n * ```\n */\nexport function stopHealthCheck(): void\n{\n if (healthCheckInterval)\n {\n clearInterval(healthCheckInterval);\n healthCheckInterval = undefined;\n dbLogger.info('Database health check stopped');\n }\n}\n\n/**\n * Get current monitoring configuration\n *\n * Returns the monitoring configuration that was set during database initialization.\n * Used by Repository to determine if and how to monitor query performance.\n *\n * @returns Current monitoring configuration or undefined if database not initialized\n *\n * @example\n * ```typescript\n * import { getDatabaseMonitoringConfig } from '@spfn/core/db';\n *\n * const config = getDatabaseMonitoringConfig();\n * if (config?.enabled) {\n * console.log(`Slow query threshold: ${config.slowThreshold}ms`);\n * }\n * ```\n */\nexport function getDatabaseMonitoringConfig(): MonitoringConfig | undefined\n{\n return monitoringConfig;\n}","/**\n * Database Instance (Backward Compatibility Layer)\n *\n * PostgreSQL + Drizzle ORM connection - now using lazy initialization\n *\n * ā
Implemented:\n * - Lazy initialization (no top-level await)\n * - Automatic environment variable loading\n * - Read Replica support (read/write separation)\n * - Singleton pattern via db-manager\n * - Backward compatibility with existing code\n *\n * ā ļø Migration Note:\n * This file now wraps db-manager for backward compatibility.\n * New code should use:\n * - initDatabase() from db-manager\n * - getDatabase() from db-manager\n *\n * š Related files:\n * - src/db/db-factory.ts (Environment detection)\n * - src/db/db-manager.ts (Singleton management)\n * - src/db/db-context.ts (Transaction-aware access)\n */\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\nimport { getDatabase, type DbConnectionType } from './manager.js';\n\n/**\n * Default DB instance (Primary - for writes)\n *\n * ā ļø IMPORTANT: This is a lazy getter. On first access, it will:\n * 1. Auto-initialize database from environment variables\n * 2. Throw error if DATABASE_URL is not set\n *\n * For better error handling, use initDatabase() explicitly:\n * ```typescript\n * import { initDatabase } from '@spfn/core/db';\n * const { write } = await initDatabase();\n * if (!write) throw new Error('Database not configured');\n * ```\n *\n * @example\n * ```typescript\n * import { db } from '@spfn/core/db';\n * const users = await db.select().from(usersTable);\n * ```\n */\nexport const db = new Proxy({} as PostgresJsDatabase, {\n get(_target, prop)\n {\n const instance = getDatabase('write');\n if (!instance)\n {\n throw new Error(\n 'Database not initialized. ' +\n 'Set DATABASE_URL environment variable or call initDatabase() first.'\n );\n }\n return (instance as Record<string | symbol, any>)[prop];\n },\n});\n\n/**\n * Get raw Drizzle DB instance (direct use without transaction)\n *\n * ā ļø Warning: This function bypasses AsyncLocalStorage transaction context.\n * For normal cases, use `getDb()` from './db-context.js'.\n *\n * @param type - 'read' (Replica) or 'write' (Primary)\n * @returns Raw Drizzle DB instance\n *\n * @example\n * ```typescript\n * // Read-only query (uses Replica)\n * const users = await getRawDb('read').select().from(usersTable);\n *\n * // Write query (uses Primary)\n * await getRawDb('write').insert(usersTable).values({ email: 'test@example.com' });\n * ```\n */\nexport function getRawDb(type: DbConnectionType = 'write'): PostgresJsDatabase\n{\n const instance = getDatabase(type);\n if (!instance)\n {\n throw new Error(\n 'Database not initialized. ' +\n 'Set DATABASE_URL environment variable or call initDatabase() first.'\n );\n }\n return instance;\n}\n\n// Re-export type for backward compatibility\nexport type { DbConnectionType };\n","/**\n * AsyncLocalStorage-based Transaction Context\n *\n * Uses Node.js AsyncLocalStorage to propagate transactions throughout the async call chain.\n *\n * ā
Implemented:\n * - AsyncLocalStorage-based context management\n * - Transaction storage/retrieval functions\n * - Type-safe transaction propagation\n * - Transaction propagation across async chains\n *\n * ā ļø Needs improvement:\n * - Nested transaction handling (currently ignores outer transaction)\n * - Transaction timeout detection\n *\n * š” Future considerations:\n * - Add transaction ID (for debugging/tracing)\n * - Track transaction start time (for performance monitoring)\n * - Store transaction metadata (route info, user info, etc.)\n * - Savepoint support (nested transactions)\n * - Transaction isolation level configuration\n *\n * š Related files:\n * - src/utils/transaction.ts (Transactional middleware)\n * - src/db/db-context.ts (getDb helper)\n */\nimport { AsyncLocalStorage } from 'async_hooks';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\n/**\n * Transaction database type\n * Record<string, never> represents an empty schema; actual schema is determined at runtime\n */\nexport type TransactionDB = PostgresJsDatabase;\n\n/**\n * Transaction context stored in AsyncLocalStorage\n */\nexport type TransactionContext = {\n tx: TransactionDB;\n};\n\n/**\n * Global AsyncLocalStorage instance for transaction context\n */\nexport const asyncContext = new AsyncLocalStorage<TransactionContext>();\n\n/**\n * Get current transaction from AsyncLocalStorage\n *\n * @returns Transaction if available, null otherwise\n */\nexport function getTransaction(): TransactionDB | null\n{\n const context = asyncContext.getStore();\n return context?.tx ?? null;\n}\n\n/**\n * Run a function within a transaction context\n *\n * The transaction will be available to all async operations within the callback\n * via getTransaction()\n *\n * @param tx - Drizzle transaction object\n * @param callback - Function to run within transaction context\n * @returns Result of the callback\n */\nexport function runWithTransaction<T>(\n tx: TransactionDB,\n callback: () => Promise<T>\n): Promise<T>\n{\n return asyncContext.run({ tx }, callback);\n}","/**\n * Transactional Middleware\n *\n * Wraps route handlers in a database transaction.\n * Auto-commits on success, auto-rolls back on error.\n *\n * ā
Implemented:\n * - Automatic transaction start/commit/rollback\n * - Transaction propagation via AsyncLocalStorage\n * - Hono Context error detection\n * - Integration with getDb() helper\n * - Type safety improvements (TransactionDB type, no @ts-ignore)\n * - Transaction logging (start/commit/rollback)\n * - Execution time measurement and slow transaction warnings\n * - Transaction ID tracking (for debugging)\n * - Transaction timeout configuration (with TRANSACTION_TIMEOUT env var support)\n *\n * ā ļø Needs improvement:\n * - Detect and warn about nested transactions\n *\n * š” Future considerations:\n * - Transaction isolation level configuration option\n * - Read-only transaction mode\n * - Transaction retry logic (on deadlock)\n * - Transaction event hooks (beforeCommit, afterCommit, onRollback)\n *\n * š Related files:\n * - src/utils/async-context.ts (AsyncLocalStorage)\n * - src/db/db-context.ts (getDb helper)\n * - src/utils/__tests__/transaction.test.ts (tests)\n *\n * š Future improvements:\n * - Transaction isolation level setting (withTransaction({ isolationLevel: 'SERIALIZABLE' }))\n * - Nested transaction savepoint support\n */\nimport { createMiddleware } from 'hono/factory';\nimport { db } from '../index.js';\nimport { runWithTransaction, type TransactionDB } from './context.js';\nimport { logger } from '../../logger';\nimport { TransactionError } from '../../errors';\nimport { fromPostgresError } from '../postgres-errors';\n\n/**\n * Transaction middleware options\n */\nexport interface TransactionalOptions\n{\n /**\n * Slow transaction warning threshold in milliseconds\n * @default 1000 (1 second)\n */\n slowThreshold?: number;\n\n /**\n * Enable transaction logging\n * @default true\n */\n enableLogging?: boolean;\n\n /**\n * Transaction timeout in milliseconds\n *\n * If transaction exceeds this duration, it will be aborted with TransactionError.\n *\n * @default 30000 (30 seconds) or TRANSACTION_TIMEOUT environment variable\n *\n * @example\n * ```typescript\n * // Default timeout (30s or TRANSACTION_TIMEOUT env var)\n * Transactional()\n *\n * // Custom timeout for specific route (60s)\n * Transactional({ timeout: 60000 })\n *\n * // Disable timeout\n * Transactional({ timeout: 0 })\n * ```\n */\n timeout?: number;\n}\n\n/**\n * Transaction middleware for Hono routes\n *\n * Automatically wraps route handlers in a database transaction.\n * Commits on success, rolls back on error.\n *\n * @example\n * ```typescript\n * // In your route file\n * export const middlewares = [Transactional()];\n *\n * export async function POST(c: RouteContext) {\n * // All DB operations run in a transaction\n * const [user] = await db.insert(users).values(body).returning();\n * await db.insert(profiles).values({ userId: user.id });\n * // Auto-commits on success\n * return c.json(user, 201);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With custom options\n * export const middlewares = [\n * Transactional({\n * slowThreshold: 2000, // Warn if transaction takes > 2s\n * enableLogging: false, // Disable logging\n * timeout: 60000, // 60 second timeout for long operations\n * })\n * ];\n * ```\n *\n * š Transaction behavior:\n * - Success: Auto-commit\n * - Error: Auto-rollback\n * - Detects context.error to trigger rollback\n *\n * š Transaction logging:\n * - Auto-logs transaction start/commit/rollback\n * - Measures and records execution time\n * - Warns about slow transactions (default: > 1s)\n */\nexport function Transactional(options: TransactionalOptions = {})\n{\n // Get default timeout from environment variable (default: 30 seconds)\n const defaultTimeout = parseInt(process.env.TRANSACTION_TIMEOUT || '30000', 10);\n\n const {\n slowThreshold = 1000,\n enableLogging = true,\n timeout = defaultTimeout,\n } = options;\n\n const txLogger = logger.child('transaction');\n\n return createMiddleware(async (c, next) =>\n {\n // Generate transaction ID for debugging\n const txId = `tx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const startTime = Date.now();\n const route = `${c.req.method} ${c.req.path}`;\n\n if (enableLogging)\n {\n txLogger.debug('Transaction started', { txId, route });\n }\n\n try\n {\n // Create transaction promise\n const transactionPromise = db.transaction(async (tx) =>\n {\n // Store transaction in AsyncLocalStorage\n await runWithTransaction(tx as TransactionDB, async () =>\n {\n // Execute handler\n await next();\n\n // Detect if Hono caught an error and stored it in context.error\n // Context type doesn't officially define error property, so we extend it\n type ContextWithError = typeof c & { error?: Error };\n const contextWithError = c as ContextWithError;\n if (contextWithError.error)\n {\n // Throw to rollback transaction\n throw contextWithError.error;\n }\n\n // Auto-commit on success (handled by Drizzle)\n });\n });\n\n // Apply timeout if enabled (timeout > 0)\n if (timeout > 0)\n {\n const timeoutPromise = new Promise<never>((_, reject) =>\n {\n setTimeout(() =>\n {\n reject(\n new TransactionError(\n `Transaction timeout after ${timeout}ms`,\n 500,\n {\n txId,\n route,\n timeout: `${timeout}ms`,\n }\n )\n );\n }, timeout);\n });\n\n // Race between transaction and timeout\n await Promise.race([transactionPromise, timeoutPromise]);\n }\n else\n {\n // No timeout - just await transaction\n await transactionPromise;\n }\n\n // Transaction successful (committed)\n const duration = Date.now() - startTime;\n\n if (enableLogging)\n {\n if (duration >= slowThreshold)\n {\n txLogger.warn('Slow transaction committed', {\n txId,\n route,\n duration: `${duration}ms`,\n threshold: `${slowThreshold}ms`,\n });\n }\n else\n {\n txLogger.debug('Transaction committed', {\n txId,\n route,\n duration: `${duration}ms`,\n });\n }\n }\n }\n catch (error)\n {\n // Transaction failed (rolled back)\n const duration = Date.now() - startTime;\n\n // Convert PostgreSQL error to custom error (unless it's already TransactionError)\n const customError = error instanceof TransactionError\n ? error\n : fromPostgresError(error);\n\n if (enableLogging)\n {\n txLogger.error('Transaction rolled back', {\n txId,\n route,\n duration: `${duration}ms`,\n error: customError.message,\n errorType: customError.name,\n });\n }\n\n // Re-throw for Hono's error handler\n throw customError;\n }\n });\n}","/**\n * Transaction Module\n *\n * Database transaction management with AsyncLocalStorage-based propagation\n */\n\n// AsyncLocalStorage utilities\nexport { getTransaction, runWithTransaction } from './context.js';\nexport type { TransactionContext, TransactionDB } from './context.js';\n\n// Transaction middleware\nexport { Transactional } from './middleware.js';\nexport type { TransactionalOptions } from './middleware.js';","/**\n * Repository Filter Utilities\n *\n * Utilities for building Drizzle ORM WHERE, ORDER BY, and pagination conditions.\n * Moved from deprecated query module for Repository pattern usage.\n *\n * @module db/repository/filters\n */\n\nimport { and, eq, ne, gt, gte, lt, lte, like, inArray, notInArray, isNull, isNotNull, or, asc, desc, sql, SQL } from 'drizzle-orm';\n\nimport type { PgColumn, PgTable } from 'drizzle-orm/pg-core';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Filter operators\n */\nexport type FilterOperator =\n | 'eq' // equals\n | 'ne' // not equals\n | 'gt' // greater than\n | 'gte' // greater than or equal\n | 'lt' // less than\n | 'lte' // less than or equal\n | 'like' // LIKE (partial match)\n | 'in' // IN (array)\n | 'nin' // NOT IN (array)\n | 'is'; // IS NULL / IS NOT NULL\n\n/**\n * Filter value type\n */\nexport type FilterValue = string | number | boolean | null | (string | number)[];\n\n/**\n * Filter condition\n *\n * @example { email: { eq: 'john@example.com' } }\n * @example { age: { gte: 18, lte: 65 } }\n */\nexport type FilterCondition = {\n [operator in FilterOperator]?: FilterValue;\n};\n\n/**\n * Complete filters\n *\n * @example { email: { eq: 'john@example.com' }, role: { in: ['admin', 'user'] } }\n */\nexport type Filters = {\n [field: string]: FilterCondition;\n};\n\n/**\n * Filter builder result type\n */\nexport type FilterResult = SQL<unknown> | undefined;\n\n/**\n * Sort direction\n */\nexport type SortDirection = 'asc' | 'desc';\n\n/**\n * Sort condition\n *\n * @example [{ field: 'createdAt', direction: 'desc' }, { field: 'name', direction: 'asc' }]\n */\nexport type SortCondition = {\n field: string;\n direction: SortDirection;\n};\n\n/**\n * Sort builder result type\n */\nexport type SortResult = SQL<unknown>[];\n\n/**\n * Pagination parameters\n */\nexport type PaginationParams = {\n page: number;\n limit: number;\n};\n\n/**\n * Pagination metadata\n */\nexport type PaginationMeta = {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasNext: boolean;\n hasPrev: boolean;\n};\n\n/**\n * Drizzle table type (generic)\n */\nexport type DrizzleTable = PgTable<any> & Record<string, PgColumn>;\n\n// ============================================================================\n// Filter Builder\n// ============================================================================\n\n/**\n * Convert filter conditions to Drizzle SQL WHERE conditions\n *\n * @param filters - Parsed filter object\n * @param table - Drizzle table schema\n * @returns SQL WHERE condition (undefined if no filters)\n *\n * @example\n * const filters = { email: { eq: 'john@example.com' }, age: { gte: 18 } };\n * const condition = buildFilters(filters, users);\n * const data = await db.select().from(users).where(condition);\n */\nexport function buildFilters(\n filters: Filters,\n table: DrizzleTable\n): FilterResult\n{\n const conditions: SQL<unknown>[] = [];\n\n for (const [field, filterCondition] of Object.entries(filters))\n {\n const column = table[field] as PgColumn;\n\n if (!column)\n {\n console.warn(`[buildFilters] Unknown field: ${field}`);\n continue;\n }\n\n // Build condition for each operator\n for (const [operator, value] of Object.entries(filterCondition))\n {\n const condition = buildCondition(column, operator as FilterOperator, value);\n if (condition)\n {\n conditions.push(condition);\n }\n }\n }\n\n // Combine all conditions with AND\n return conditions.length > 0 ? and(...conditions) : undefined;\n}\n\n/**\n * Convert single filter condition to SQL condition\n */\nfunction buildCondition(\n column: PgColumn,\n operator: FilterOperator,\n value: FilterValue\n): SQL<unknown> | undefined\n{\n switch (operator)\n {\n case 'eq':\n return eq(column, value as string | number);\n\n case 'ne':\n return ne(column, value as string | number);\n\n case 'gt':\n return gt(column, value as string | number);\n\n case 'gte':\n return gte(column, value as string | number);\n\n case 'lt':\n return lt(column, value as string | number);\n\n case 'lte':\n return lte(column, value as string | number);\n\n case 'like':\n return like(column, `%${value}%`);\n\n case 'in':\n if (Array.isArray(value))\n {\n return inArray(column, value);\n }\n console.warn(`[buildCondition] 'in' operator requires array value`);\n return undefined;\n\n case 'nin':\n if (Array.isArray(value))\n {\n return notInArray(column, value);\n }\n console.warn(`[buildCondition] 'nin' operator requires array value`);\n return undefined;\n\n case 'is':\n if (value === 'null') return isNull(column);\n if (value === 'notnull') return isNotNull(column);\n console.warn(`[buildCondition] 'is' operator requires 'null' or 'notnull'`);\n return undefined;\n\n default:\n console.warn(`[buildCondition] Unknown operator: ${operator}`);\n return undefined;\n }\n}\n\n/**\n * Combine conditions with OR\n *\n * @example\n * const conditions = [\n * buildFilters({ status: { eq: 'active' } }, users),\n * buildFilters({ role: { eq: 'admin' } }, users)\n * ];\n * const orCondition = orFilters(...conditions);\n */\nexport function orFilters(...conditions: (FilterResult)[]): FilterResult\n{\n const validConditions = conditions.filter(c => c !== undefined) as SQL<unknown>[];\n return validConditions.length > 0 ? or(...validConditions) : undefined;\n}\n\n// ============================================================================\n// Sort Builder\n// ============================================================================\n\n/**\n * Convert sort conditions to Drizzle SQL ORDER BY conditions\n *\n * @param sortConditions - Sort condition array\n * @param table - Drizzle table schema\n * @returns SQL ORDER BY condition array\n *\n * @example\n * const sort = [\n * { field: 'createdAt', direction: 'desc' },\n * { field: 'name', direction: 'asc' }\n * ];\n * const orderBy = buildSort(sort, users);\n * const data = await db.select().from(users).orderBy(...orderBy);\n */\nexport function buildSort(\n sortConditions: SortCondition[],\n table: DrizzleTable\n): SortResult\n{\n const orderByClauses: SQL<unknown>[] = [];\n\n for (const { field, direction } of sortConditions)\n {\n const column = table[field] as PgColumn;\n\n if (!column)\n {\n console.warn(`[buildSort] Unknown field: ${field}`);\n continue;\n }\n\n const clause = direction === 'desc' ? desc(column) : asc(column);\n orderByClauses.push(clause);\n }\n\n return orderByClauses;\n}\n\n// ============================================================================\n// Pagination Utilities\n// ============================================================================\n\n/**\n * Apply pagination to Drizzle query\n *\n * @param pagination - Pagination parameters\n * @returns { offset, limit } object\n *\n * @example\n * const { offset, limit } = applyPagination({ page: 2, limit: 20 });\n * const data = await db.select().from(users).limit(limit).offset(offset);\n */\nexport function applyPagination(pagination: PaginationParams)\n{\n const { page, limit } = pagination;\n const offset = (page - 1) * limit;\n\n return { offset, limit };\n}\n\n/**\n * Create pagination metadata\n *\n * @param pagination - Pagination parameters\n * @param total - Total count\n * @returns Pagination metadata\n *\n * @example\n * const meta = createPaginationMeta({ page: 2, limit: 20 }, 156);\n * // { page: 2, limit: 20, total: 156, totalPages: 8, hasNext: true, hasPrev: true }\n */\nexport function createPaginationMeta(\n pagination: PaginationParams,\n total: number\n): PaginationMeta\n{\n const { page, limit } = pagination;\n const totalPages = Math.ceil(total / limit);\n\n return {\n page,\n limit,\n total,\n totalPages,\n hasNext: page < totalPages,\n hasPrev: page > 1,\n };\n}\n\n/**\n * Count total records (count query)\n *\n * @param db - Drizzle DB instance\n * @param table - Table schema\n * @param whereCondition - WHERE condition (optional)\n * @returns Total count\n *\n * @example\n * const total = await countTotal(db, users);\n * const total = await countTotal(db, users, eq(users.status, 'active'));\n */\nexport async function countTotal(\n db: PostgresJsDatabase<Record<string, never>>,\n table: DrizzleTable,\n whereCondition?: any\n): Promise<number>\n{\n const query = db\n .select({ count: sql<number>`count(*)::int` })\n .from(table);\n\n if (whereCondition)\n {\n query.where(whereCondition);\n }\n\n const [result] = await query;\n return result?.count || 0;\n}","/**\n * Query Builder (Fluent Interface)\n *\n * Chainable query builder for Repository pattern.\n * Provides a fluent API for building complex queries.\n *\n * @example\n * ```typescript\n * const users = await userRepo\n * .query()\n * .where({ status: 'active' })\n * .where({ role: 'admin' })\n * .orderBy('createdAt', 'desc')\n * .limit(10)\n * .findMany();\n * ```\n */\n\nimport type { PgTable } from 'drizzle-orm/pg-core';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\nimport type { Filters, SortCondition } from './filters.js';\n\nimport { buildFilters, buildSort } from './filters.js';\n\n/**\n * Query Builder class for chainable queries\n *\n * Supports method chaining for building complex queries in a fluent style.\n */\nexport class QueryBuilder<\n TTable extends PgTable,\n TSelect = TTable['$inferSelect']\n>\n{\n private db: PostgresJsDatabase<any>;\n private table: TTable;\n private filterConditions: Filters[] = [];\n private sortConditions: SortCondition[] = [];\n private limitValue?: number;\n private offsetValue?: number;\n\n constructor(db: PostgresJsDatabase<any>, table: TTable)\n {\n this.db = db;\n this.table = table;\n }\n\n /**\n * Add WHERE conditions\n *\n * Multiple where() calls are combined with AND logic.\n *\n * @param filters - Filter conditions\n * @returns QueryBuilder for chaining\n *\n * @example\n * ```typescript\n * query\n * .where({ status: 'active' })\n * .where({ role: 'admin' }) // AND condition\n * ```\n */\n where(filters: Filters): this\n {\n this.filterConditions.push(filters);\n return this;\n }\n\n /**\n * Add ORDER BY clause\n *\n * Multiple orderBy() calls create multi-column sorting.\n *\n * @param field - Field name to sort by\n * @param direction - Sort direction ('asc' or 'desc')\n * @returns QueryBuilder for chaining\n *\n * @example\n * ```typescript\n * query\n * .orderBy('isPremium', 'desc')\n * .orderBy('createdAt', 'desc')\n * ```\n */\n orderBy(field: string, direction: 'asc' | 'desc' = 'asc'): this\n {\n this.sortConditions.push({ field, direction });\n return this;\n }\n\n /**\n * Set LIMIT clause\n *\n * @param limit - Maximum number of records to return\n * @returns QueryBuilder for chaining\n *\n * @example\n * ```typescript\n * query.limit(10)\n * ```\n */\n limit(limit: number): this\n {\n this.limitValue = limit;\n return this;\n }\n\n /**\n * Set OFFSET clause\n *\n * @param offset - Number of records to skip\n * @returns QueryBuilder for chaining\n *\n * @example\n * ```typescript\n * query.offset(20)\n * ```\n */\n offset(offset: number): this\n {\n this.offsetValue = offset;\n return this;\n }\n\n /**\n * Execute query and return multiple records\n *\n * @returns Array of records\n *\n * @example\n * ```typescript\n * const users = await query\n * .where({ status: 'active' })\n * .orderBy('createdAt', 'desc')\n * .limit(10)\n * .findMany();\n * ```\n */\n async findMany(): Promise<TSelect[]>\n {\n // Merge all filter conditions with AND\n const mergedFilters = this.mergeFilters();\n const whereCondition = buildFilters(mergedFilters, this.table as any);\n const orderBy = buildSort(this.sortConditions, this.table as any);\n\n let query = this.db\n .select()\n .from(this.table as any)\n .where(whereCondition)\n .orderBy(...orderBy);\n\n if (this.limitValue !== undefined)\n {\n query = query.limit(this.limitValue) as any;\n }\n\n if (this.offsetValue !== undefined)\n {\n query = query.offset(this.offsetValue) as any;\n }\n\n return query as Promise<TSelect[]>;\n }\n\n /**\n * Execute query and return first record\n *\n * @returns First matching record or null\n *\n * @example\n * ```typescript\n * const user = await query\n * .where({ email: 'john@example.com' })\n * .findOne();\n * ```\n */\n async findOne(): Promise<TSelect | null>\n {\n const results = await this.limit(1).findMany();\n return results[0] ?? null;\n }\n\n /**\n * Execute query and return count\n *\n * @returns Number of matching records\n *\n * @example\n * ```typescript\n * const count = await query\n * .where({ status: 'active' })\n * .count();\n * ```\n */\n async count(): Promise<number>\n {\n const mergedFilters = this.mergeFilters();\n const whereCondition = buildFilters(mergedFilters, this.table as any);\n\n const { count } = await import('drizzle-orm');\n const result = await this.db\n .select({ count: count() })\n .from(this.table as any)\n .where(whereCondition);\n\n return Number(result[0]?.count ?? 0);\n }\n\n /**\n * Merge multiple filter conditions into single object\n *\n * Combines all where() calls into one filter object.\n */\n private mergeFilters(): Filters\n {\n if (this.filterConditions.length === 0)\n {\n return {};\n }\n\n // Merge all filter objects\n return this.filterConditions.reduce((merged, current) => {\n return { ...merged, ...current };\n }, {});\n }\n}","/**\n * Repository Pattern (JPA Style)\n *\n * Spring JPA-inspired Repository pattern for TypeScript/Drizzle ORM\n *\n * ā
Features:\n * - Auto Read/Write Replica routing (read methods use Replica, write methods use Primary)\n * - Type-safe CRUD operations (findById, findWhere, save, update, delete, etc.)\n * - Advanced filtering with operators (eq, gt, like, in, etc.)\n * - Pagination with metadata (findPage)\n * - Batch operations (saveMany, updateWhere, deleteWhere)\n * - Transaction-aware (automatic participation in Transactional middleware)\n */\n\nimport type { SQL } from 'drizzle-orm';\nimport type { PgTable } from 'drizzle-orm/pg-core';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\nimport type { Filters, SortCondition, PaginationParams, PaginationMeta } from './filters.js';\n\nimport { buildFilters, buildSort, applyPagination, createPaginationMeta, countTotal } from './filters.js';\nimport { getRawDb, getDatabaseMonitoringConfig } from '../manager';\nimport { getTransaction } from '../transaction';\nimport { QueryError } from '../../errors';\nimport { QueryBuilder } from './query-builder.js';\nimport { logger } from '../../logger';\n\n/**\n * Pageable interface (Spring Pageable style)\n */\nexport type Pageable = {\n filters?: Filters;\n sort?: SortCondition[];\n pagination?: PaginationParams;\n};\n\n/**\n * Page result (Spring Page style)\n */\nexport type Page<T> = {\n data: T[];\n meta: PaginationMeta;\n};\n\n/**\n * Repository class\n *\n * Provides JPA Repository-style CRUD methods with automatic transaction support\n *\n * ā
Automatic Transaction Detection:\n * - Automatically participates in active Transactional() middleware context\n * - No need to pass transaction explicitly - uses AsyncLocalStorage\n * - All operations within a transaction use the same transaction DB\n *\n * ā
Auto Read/Write Replica routing (when NOT in transaction):\n * - Read methods (findAll, findById, findOne, findPage, count) ā Uses Read Replica\n * - Write methods (save, update, delete) ā Uses Primary DB\n *\n * ā
DB Priority:\n * 1. Explicit DB (if provided in constructor)\n * 2. Transaction context (if inside Transactional middleware)\n * 3. Read Replica or Primary DB (based on operation type)\n *\n * @example\n * ```typescript\n * // Simple usage - automatically detects transaction\n * class UserService {\n * private get repo() {\n * return new Repository(users); // Auto-detects transaction\n * }\n * }\n *\n * // Route with transaction\n * app.bind(contract, Transactional(), async (c) => {\n * const service = new UserService();\n * await service.createUser(data);\n * // Automatic rollback on error!\n * });\n * ```\n */\nexport class Repository<\n TTable extends PgTable,\n TSelect = TTable['$inferSelect']\n>\n{\n protected db: PostgresJsDatabase<any>;\n protected table: TTable;\n protected useReplica: boolean;\n protected explicitDb?: PostgresJsDatabase<any>; // Track if db was explicitly provided\n protected autoUpdateField?: string; // Field name to auto-update (e.g., 'updatedAt', 'modifiedAt')\n\n constructor(\n dbOrTable: PostgresJsDatabase<any> | TTable,\n tableOrUseReplica?: TTable | boolean,\n useReplica: boolean = true\n ) {\n // Overload 1: new Repository(table) - db auto-resolved\n if ('name' in dbOrTable && typeof dbOrTable.name === 'string') {\n this.db = getRawDb('write');\n this.table = dbOrTable as TTable;\n this.useReplica = typeof tableOrUseReplica === 'boolean' ? tableOrUseReplica : true;\n this.explicitDb = undefined; // No explicit db provided\n }\n // Overload 2: new Repository(db, table, useReplica?) - explicit db provided\n else {\n this.db = dbOrTable as PostgresJsDatabase<any>;\n this.table = tableOrUseReplica as TTable;\n this.useReplica = useReplica;\n this.explicitDb = this.db; // Save explicit db\n }\n\n // Detect auto-update timestamp field from schema\n this.autoUpdateField = this.detectAutoUpdateField();\n }\n\n /**\n * Detect which field (if any) should be auto-updated\n *\n * Checks all table columns for __autoUpdate metadata flag.\n * Set by autoUpdateTimestamp() or timestamps({ autoUpdate: true }) helpers.\n *\n * @returns Field name to auto-update, or undefined if none found\n */\n private detectAutoUpdateField(): string | undefined\n {\n // Guard against undefined/null table\n if (!this.table || typeof this.table !== 'object')\n {\n return undefined;\n }\n\n const tableColumns = this.table as Record<string, any>;\n\n for (const [fieldName, column] of Object.entries(tableColumns))\n {\n // Skip non-column properties (like '_', '$inferSelect', etc.)\n if (fieldName.startsWith('_') || fieldName.startsWith('$'))\n {\n continue;\n }\n\n // Check if column has __autoUpdate flag\n if (column && typeof column === 'object' && column.__autoUpdate === true)\n {\n return fieldName;\n }\n }\n\n return undefined;\n }\n\n /**\n * Inject auto-update timestamp if configured\n *\n * Only injects if:\n * 1. Table has an auto-update field configured (via autoUpdateTimestamp() or timestamps({ autoUpdate: true }))\n * 2. The field is not already explicitly provided in the data\n *\n * @param data - Update data object\n * @returns Data with auto-update timestamp injected (if applicable)\n */\n private injectAutoUpdateTimestamp(data: any): any\n {\n // No auto-update field configured\n if (!this.autoUpdateField)\n {\n return data;\n }\n\n // Field already explicitly provided, don't override\n if (data && this.autoUpdateField in data)\n {\n return data;\n }\n\n // Inject current timestamp\n return {\n ...data,\n [this.autoUpdateField]: new Date(),\n };\n }\n\n /**\n * Get id column from table\n *\n * Helper method to reduce code duplication across methods that need id column.\n *\n * @returns The id column object\n * @throws {QueryError} If table does not have an id column\n */\n private getIdColumn()\n {\n const idColumn = (this.table as Record<string, any>).id;\n\n if (!idColumn)\n {\n throw new QueryError('Table does not have an id column');\n }\n\n return idColumn;\n }\n\n /**\n * Get read-only DB\n *\n * Automatically detects and uses transaction context if available.\n * When in transaction, uses transaction DB to ensure read consistency.\n * Priority: explicitDb > transaction > replica/primary DB\n */\n private getReadDb(): PostgresJsDatabase<any>\n {\n // If db was explicitly provided, always use it\n if (this.explicitDb) {\n return this.explicitDb;\n }\n\n // Check if we're inside a transaction context\n // Use transaction for reads too to ensure consistency\n const tx = getTransaction();\n if (tx) {\n return tx;\n }\n\n // Otherwise use getRawDb for replica routing\n return this.useReplica ? getRawDb('read') : this.db;\n }\n\n /**\n * Get write-only DB\n *\n * Automatically detects and uses transaction context if available.\n * Priority: explicitDb > transaction > primary DB\n */\n private getWriteDb(): PostgresJsDatabase<any>\n {\n // If db was explicitly provided, always use it\n if (this.explicitDb) {\n return this.explicitDb;\n }\n\n // Check if we're inside a transaction context\n const tx = getTransaction();\n if (tx) {\n return tx;\n }\n\n // Otherwise use getRawDb for write operations\n return getRawDb('write');\n }\n\n /**\n * Execute operation with performance monitoring\n *\n * Wraps database operations with timing and logging for slow queries.\n * Only logs if monitoring is enabled and query exceeds threshold.\n *\n * @param operation - Name of the operation (for logging)\n * @param fn - Async function to execute\n * @returns Result of the operation\n */\n private async executeWithMonitoring<T>(\n operation: string,\n fn: () => Promise<T>\n ): Promise<T>\n {\n const config = getDatabaseMonitoringConfig();\n\n // If monitoring is disabled, just execute the operation\n if (!config?.enabled)\n {\n return fn();\n }\n\n const startTime = performance.now();\n\n try\n {\n const result = await fn();\n const duration = performance.now() - startTime;\n\n // Log slow queries\n if (duration >= config.slowThreshold)\n {\n const dbLogger = logger.child('database');\n const logData: any = {\n operation,\n table: this.table._.name,\n duration: `${duration.toFixed(2)}ms`,\n threshold: `${config.slowThreshold}ms`,\n };\n\n dbLogger.warn('Slow query detected', logData);\n }\n\n return result;\n }\n catch (error)\n {\n const duration = performance.now() - startTime;\n const dbLogger = logger.child('database');\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n dbLogger.error('Query failed', {\n operation,\n table: this.table._.name,\n duration: `${duration.toFixed(2)}ms`,\n error: message,\n });\n\n throw error;\n }\n }\n\n /**\n * Find all records (uses Replica)\n *\n * @example\n * const users = await userRepo.findAll();\n */\n async findAll(): Promise<TSelect[]>\n {\n return this.executeWithMonitoring('findAll', async () =>\n {\n const readDb = this.getReadDb();\n // Type assertion needed: Drizzle's from() expects specific table signature\n return readDb.select().from(this.table as any) as Promise<TSelect[]>;\n });\n }\n\n /**\n * Find with pagination (uses Replica)\n *\n * @example\n * const result = await userRepo.findPage({\n * filters: { email: { like: 'john' } },\n * sort: [{ field: 'createdAt', direction: 'desc' }],\n * pagination: { page: 1, limit: 20 }\n * });\n */\n async findPage(pageable: Pageable): Promise<Page<TSelect>>\n {\n return this.executeWithMonitoring('findPage', async () =>\n {\n const { filters = {}, sort = [], pagination = { page: 1, limit: 20 } } = pageable;\n\n // Type assertions needed: Helper functions expect DrizzleTable type\n const whereCondition = buildFilters(filters, this.table as any);\n const orderBy = buildSort(sort, this.table as any);\n const { offset, limit } = applyPagination(pagination);\n\n // Fetch data from Replica\n const readDb = this.getReadDb();\n const data = await readDb\n .select()\n .from(this.table as any)\n .where(whereCondition)\n .orderBy(...orderBy)\n .limit(limit)\n .offset(offset) as TSelect[];\n\n // Count total (uses Replica)\n const total = await countTotal(readDb, this.table as any, whereCondition);\n const meta = createPaginationMeta(pagination, total);\n\n return { data, meta };\n });\n }\n\n /**\n * Find one record by ID (uses Replica)\n *\n * @example\n * const user = await userRepo.findById(1);\n */\n async findById(id: number | string): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('findById', async () =>\n {\n const idColumn = this.getIdColumn();\n\n const { eq } = await import('drizzle-orm');\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(eq(idColumn, id)) as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Find one record by condition (uses Replica)\n *\n * @example\n * const user = await userRepo.findOne(eq(users.email, 'john@example.com'));\n */\n async findOne(where: SQL<unknown>): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('findOne', async () =>\n {\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(where) as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Create a new record (uses Primary)\n *\n * @example\n * const user = await userRepo.save({ email: 'john@example.com', name: 'John' });\n */\n async save(data: any): Promise<TSelect>\n {\n return this.executeWithMonitoring('save', async () =>\n {\n const writeDb = this.getWriteDb();\n const [result] = await writeDb\n .insert(this.table)\n .values(data)\n .returning() as TSelect[];\n\n return result;\n });\n }\n\n /**\n * Update a record (uses Primary)\n *\n * Automatically injects current timestamp if table has auto-update field configured.\n *\n * @example\n * const user = await userRepo.update(1, { name: 'Jane' });\n */\n async update(id: number | string, data: any): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('update', async () =>\n {\n const idColumn = this.getIdColumn();\n\n // Auto-inject timestamp if configured and not explicitly provided\n const updateData = this.injectAutoUpdateTimestamp(data);\n\n const { eq } = await import('drizzle-orm');\n const writeDb = this.getWriteDb();\n const [result] = await writeDb\n .update(this.table)\n .set(updateData)\n .where(eq(idColumn, id))\n .returning() as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Delete a record (uses Primary)\n *\n * @example\n * const deleted = await userRepo.delete(1);\n */\n async delete(id: number | string): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('delete', async () =>\n {\n const idColumn = this.getIdColumn();\n\n const { eq } = await import('drizzle-orm');\n const writeDb = this.getWriteDb();\n const [result] = await writeDb\n .delete(this.table)\n .where(eq(idColumn, id))\n .returning() as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Count records (uses Replica)\n *\n * @example\n * const count = await userRepo.count();\n */\n async count(where?: SQL<unknown>): Promise<number>\n {\n return this.executeWithMonitoring('count', async () =>\n {\n const readDb = this.getReadDb();\n return countTotal(readDb, this.table as any, where);\n });\n }\n\n /**\n * Find records by filters (uses Replica)\n *\n * @example\n * const users = await userRepo.findWhere({ email: { like: '@gmail.com' }, status: 'active' });\n */\n async findWhere(filters: Filters): Promise<TSelect[]>\n {\n return this.executeWithMonitoring('findWhere', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const readDb = this.getReadDb();\n return readDb\n .select()\n .from(this.table as any)\n .where(whereCondition) as Promise<TSelect[]>;\n });\n }\n\n /**\n * Find one record by filters (uses Replica)\n *\n * @example\n * const user = await userRepo.findOneWhere({ email: 'john@example.com' });\n */\n async findOneWhere(filters: Filters): Promise<TSelect | null>\n {\n return this.executeWithMonitoring('findOneWhere', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(whereCondition) as TSelect[];\n\n return result ?? null;\n });\n }\n\n /**\n * Check if record exists by ID (uses Replica)\n *\n * @example\n * const exists = await userRepo.exists(1);\n */\n async exists(id: number | string): Promise<boolean>\n {\n return this.executeWithMonitoring('exists', async () =>\n {\n const idColumn = this.getIdColumn();\n\n const { eq } = await import('drizzle-orm');\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(eq(idColumn, id))\n .limit(1) as TSelect[];\n\n return !!result;\n });\n }\n\n /**\n * Check if record exists by filters (uses Replica)\n *\n * @example\n * const exists = await userRepo.existsBy({ email: 'john@example.com' });\n */\n async existsBy(filters: Filters): Promise<boolean>\n {\n return this.executeWithMonitoring('existsBy', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const readDb = this.getReadDb();\n const [result] = await readDb\n .select()\n .from(this.table as any)\n .where(whereCondition)\n .limit(1) as TSelect[];\n\n return !!result;\n });\n }\n\n /**\n * Count records by filters (uses Replica)\n *\n * @example\n * const count = await userRepo.countBy({ status: 'active' });\n */\n async countBy(filters: Filters): Promise<number>\n {\n return this.executeWithMonitoring('countBy', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const readDb = this.getReadDb();\n return countTotal(readDb, this.table as any, whereCondition);\n });\n }\n\n /**\n * Create multiple records (uses Primary)\n *\n * @example\n * const users = await userRepo.saveMany([\n * { email: 'user1@example.com', name: 'User 1' },\n * { email: 'user2@example.com', name: 'User 2' }\n * ]);\n */\n async saveMany(data: any[]): Promise<TSelect[]>\n {\n return this.executeWithMonitoring('saveMany', async () =>\n {\n const writeDb = this.getWriteDb();\n return writeDb\n .insert(this.table)\n .values(data)\n .returning() as Promise<TSelect[]>;\n });\n }\n\n /**\n * Update multiple records by filters (uses Primary)\n *\n * Automatically injects current timestamp if table has auto-update field configured.\n *\n * @example\n * const count = await userRepo.updateWhere({ status: 'inactive' }, { status: 'archived' });\n */\n async updateWhere(filters: Filters, data: any): Promise<number>\n {\n return this.executeWithMonitoring('updateWhere', async () =>\n {\n // Auto-inject timestamp if configured and not explicitly provided\n const updateData = this.injectAutoUpdateTimestamp(data);\n\n const whereCondition = buildFilters(filters, this.table as any);\n const writeDb = this.getWriteDb();\n const results = await writeDb\n .update(this.table)\n .set(updateData)\n .where(whereCondition)\n .returning() as TSelect[];\n\n return results.length;\n });\n }\n\n /**\n * Delete multiple records by filters (uses Primary)\n *\n * @example\n * const count = await userRepo.deleteWhere({ status: 'banned' });\n */\n async deleteWhere(filters: Filters): Promise<number>\n {\n return this.executeWithMonitoring('deleteWhere', async () =>\n {\n const whereCondition = buildFilters(filters, this.table as any);\n const writeDb = this.getWriteDb();\n const results = await writeDb\n .delete(this.table)\n .where(whereCondition)\n .returning() as TSelect[];\n\n return results.length;\n });\n }\n\n // ============================================================\n // Query Builder (Fluent Interface)\n // ============================================================\n\n /**\n * Start a chainable query builder (uses Replica)\n *\n * Returns a QueryBuilder instance for building complex queries with method chaining.\n *\n * @returns QueryBuilder instance for chaining\n *\n * @example\n * ```typescript\n * // Simple chaining\n * const users = await userRepo\n * .query()\n * .where({ status: 'active' })\n * .orderBy('createdAt', 'desc')\n * .limit(10)\n * .findMany();\n *\n * // Multiple conditions\n * const admins = await userRepo\n * .query()\n * .where({ role: 'admin' })\n * .where({ status: 'active' }) // AND condition\n * .findMany();\n *\n * // Reusable query\n * const activeQuery = userRepo.query().where({ status: 'active' });\n * const users = await activeQuery.findMany();\n * const count = await activeQuery.count();\n * ```\n */\n query(): QueryBuilder<TTable, TSelect>\n {\n const readDb = this.getReadDb();\n return new QueryBuilder<TTable, TSelect>(readDb, this.table);\n }\n}","/**\n * Repository Factory\n *\n * Provides singleton instances of Repository classes to prevent unnecessary instantiation\n * and ensure consistent instances across the application.\n *\n * ā
Features:\n * - Singleton pattern for both base and custom Repository classes\n * - Automatic caching based on table + constructor\n * - Type-safe with full IDE autocomplete\n * - Supports multiple services accessing the same repository\n * - Memory efficient (single instance per table/class combination)\n *\n * @example\n * ```typescript\n * // Base Repository\n * const userRepo = getRepository(users);\n * await userRepo.findById(1);\n *\n * // Custom Repository\n * class UserRepository extends Repository<typeof users> {\n * async findByEmail(email: string) {\n * return this.findOneWhere({ email });\n * }\n * }\n *\n * const userRepo = getRepository(users, UserRepository);\n * await userRepo.findByEmail('john@example.com');\n * ```\n */\n\nimport { Repository } from './repository.js';\nimport type { PgTable } from 'drizzle-orm/pg-core';\n\n/**\n * Repository instance cache\n * Key format: \"tableName:ClassName\"\n */\nconst repositoryCache = new Map<string, Repository<any>>();\n\n/**\n * Generate cache key from table and constructor\n *\n * @param table - Drizzle table definition\n * @param RepositoryClass - Optional custom Repository class\n * @returns Cache key string\n */\nfunction getCacheKey<TTable extends PgTable>(\n table: TTable,\n RepositoryClass?: new (table: TTable) => Repository<TTable>\n): string\n{\n // Get table name from Drizzle's internal symbol or fallback\n const tableName = (table as any)[Symbol.for('drizzle:Name')]\n || (table as any).name\n || table.toString();\n\n const className = RepositoryClass?.name || 'Repository';\n\n return `${tableName}:${className}`;\n}\n\n/**\n * Get or create a Repository singleton instance (Global Singleton Pattern)\n *\n * This function ensures that only one instance of each Repository is created,\n * preventing memory waste and ensuring consistency across the application.\n *\n * ā
Supports both base Repository and custom Repository classes\n * ā
Returns the same instance on subsequent calls\n * ā
Type-safe with full IDE autocomplete\n * ā
Automatically detects transaction context (via Repository internals)\n *\n * ## ā ļø Note: Global Singleton Pattern\n *\n * This uses a **global singleton cache** that persists throughout application lifecycle.\n *\n * **Tradeoffs:**\n * - ā
Simple API, no middleware required\n * - ā
Maximum memory efficiency\n * - ā ļø Requires manual `clearRepositoryCache()` in tests\n * - ā ļø Global state (harder to isolate in testing)\n *\n * **For better test isolation**, consider using **request-scoped repositories**:\n * ```typescript\n * import { getScopedRepository, RepositoryScope } from '@spfn/core/db';\n *\n * // Add middleware (once)\n * app.use(RepositoryScope());\n *\n * // Use getScopedRepository() instead - automatic per-request caching\n * const repo = getScopedRepository(users);\n * ```\n *\n * See: `request-scope.ts` for request-scoped alternative\n *\n * ## š Transaction Handling\n *\n * Repository instances are cached globally, but they automatically detect\n * and use transaction context via AsyncLocalStorage in each method call.\n * This means:\n * - **Same repository instance** can be used both inside and outside transactions\n * - **No need to create separate repository instances** per transaction\n * - **Transaction safety is guaranteed** by AsyncLocalStorage context\n *\n * The Repository internally calls `getTransaction()` on every database operation,\n * ensuring the correct DB instance (transaction or default) is always used.\n *\n * @param table - Drizzle table definition\n * @param RepositoryClass - Optional custom Repository class extending Repository\n * @returns Repository instance (cached singleton)\n *\n * @example\n * ```typescript\n * // Base Repository - simple CRUD\n * import { getRepository } from '@spfn/core/db';\n * import { users } from './entities';\n *\n * export async function getUser(id: number) {\n * const repo = getRepository(users);\n * return repo.findById(id);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Custom Repository - with custom methods\n * import { Repository, getRepository } from '@spfn/core/db';\n * import { users } from './entities';\n *\n * class UserRepository extends Repository<typeof users> {\n * async findByEmail(email: string) {\n * return this.findOneWhere({ email });\n * }\n *\n * async findActiveUsers() {\n * return this.findWhere({ status: 'active' });\n * }\n * }\n *\n * export async function getUserByEmail(email: string) {\n * const repo = getRepository(users, UserRepository);\n * return repo.findByEmail(email);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Multiple services - same instance\n * // services/users.ts\n * const repo = getRepository(users, UserRepository); // Instance A\n *\n * // services/auth.ts\n * const repo = getRepository(users, UserRepository); // Same Instance A\n * ```\n *\n * @example\n * ```typescript\n * // Transaction handling - same instance works everywhere\n * import { getRepository, Transactional } from '@spfn/core/db';\n * import { users } from './entities';\n *\n * const userRepo = getRepository(users);\n *\n * // Outside transaction - uses default DB\n * await userRepo.findById(1);\n *\n * // Inside Transactional() middleware - uses transaction automatically\n * app.use(Transactional());\n * app.post('/', async (c) => {\n * // Same instance, but now uses transaction DB\n * await userRepo.save({ email: 'test@example.com' });\n * return c.json({ success: true });\n * });\n * ```\n */\nexport function getRepository<\n TTable extends PgTable,\n TRepo extends Repository<TTable> = Repository<TTable>\n>(\n table: TTable,\n RepositoryClass?: new (table: TTable) => TRepo\n): TRepo\n{\n const cacheKey = getCacheKey(table, RepositoryClass as any);\n\n // Check cache\n let repo = repositoryCache.get(cacheKey);\n\n if (!repo)\n {\n // Create new instance\n if (RepositoryClass)\n {\n repo = new RepositoryClass(table);\n }\n else\n {\n repo = new Repository(table);\n }\n\n // Cache it\n repositoryCache.set(cacheKey, repo);\n }\n\n return repo as TRepo;\n}\n\n/**\n * Clear repository cache\n *\n * Removes all cached repository instances. Useful for testing scenarios\n * where you need fresh instances.\n *\n * ā ļø Warning: Only use this in tests. In production, cached instances\n * should persist throughout the application lifecycle.\n *\n * @example\n * ```typescript\n * import { clearRepositoryCache } from '@spfn/core/db';\n *\n * beforeEach(() => {\n * clearRepositoryCache(); // Fresh instances for each test\n * });\n * ```\n */\nexport function clearRepositoryCache(): void\n{\n repositoryCache.clear();\n}\n\n/**\n * Get cache size (for debugging/monitoring)\n *\n * @returns Number of cached repository instances\n *\n * @example\n * ```typescript\n * const size = getRepositoryCacheSize();\n * console.log(`Cached repositories: ${size}`);\n * ```\n */\nexport function getRepositoryCacheSize(): number\n{\n return repositoryCache.size;\n}","/**\n * Request-Scoped Repository Pattern\n *\n * Provides request-level repository caching using AsyncLocalStorage.\n *\n * ## Benefits:\n * - ā
**Automatic isolation**: Each request gets its own repository cache\n * - ā
**Memory efficient**: Cache cleared automatically after request ends\n * - ā
**Test-friendly**: No global state, tests are fully isolated\n * - ā
**DI-compatible**: Can inject custom repositories easily\n * - ā
**Zero overhead**: Uses existing AsyncLocalStorage infrastructure\n *\n * ## vs Global Singleton:\n *\n * | Feature | Global Singleton | Request-Scoped |\n * |---------|-----------------|----------------|\n * | Memory | Permanent cache | Request-only cache |\n * | Test isolation | Manual clearRepositoryCache() | Automatic |\n * | Thread-safety | Shared state | Isolated per request |\n * | DI support | Difficult | Easy |\n *\n * @example\n * ```typescript\n * // 1. Add middleware (routes automatically)\n * import { RepositoryScope } from '@spfn/core/db';\n *\n * app.use(RepositoryScope());\n *\n * // 2. Use in service (same request = same instance)\n * import { getScopedRepository } from '@spfn/core/db';\n *\n * export async function createPost(data) {\n * const repo = getScopedRepository(posts, PostRepository); // First call - creates\n * const existing = await repo.findBySlug(slug);\n * return repo.save(data); // Same instance\n * }\n *\n * // 3. Different request = different cache (automatic)\n * ```\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\nimport { Repository } from './repository.js';\nimport type { PgTable } from 'drizzle-orm/pg-core';\nimport type { MiddlewareHandler } from 'hono';\n\n/**\n * AsyncLocalStorage for request-scoped repository cache\n * Each request gets its own Map instance\n */\nconst repositoryStorage = new AsyncLocalStorage<Map<string, Repository<any>>>();\n\n/**\n * Generate cache key from table and repository class\n * Same logic as global singleton for consistency\n */\nfunction getCacheKey<TTable extends PgTable>(\n table: TTable,\n RepositoryClass?: new (table: TTable) => Repository<TTable>\n): string\n{\n const tableName = (table as any)[Symbol.for('drizzle:Name')]\n || (table as any).name\n || table.toString();\n\n const className = RepositoryClass?.name || 'Repository';\n\n return `${tableName}:${className}`;\n}\n\n/**\n * Execute function within a repository scope\n *\n * Creates a new request-scoped cache for the duration of the function.\n * Automatically cleaned up after function completes.\n *\n * @param fn - Async function to execute within scope\n * @returns Result of the function\n *\n * @example\n * ```typescript\n * // Middleware\n * app.use(async (c, next) => {\n * return withRepositoryScope(() => next());\n * });\n *\n * // Manual usage\n * const result = await withRepositoryScope(async () => {\n * const repo = getScopedRepository(users);\n * return repo.findAll();\n * });\n * ```\n */\nexport function withRepositoryScope<T>(fn: () => Promise<T>): Promise<T>\n{\n const cache = new Map<string, Repository<any>>();\n return repositoryStorage.run(cache, fn);\n}\n\n/**\n * Get request-scoped repository instance\n *\n * Returns cached instance within the same request, creates new instance for new requests.\n * Falls back to creating a new instance if called outside of a repository scope.\n *\n * ## Behavior:\n * - **Inside scope**: Returns cached instance (same request = same instance)\n * - **Outside scope**: Creates new instance every time (graceful degradation)\n *\n * @param table - Drizzle table definition\n * @param RepositoryClass - Optional custom Repository class\n * @returns Repository instance (cached or new)\n *\n * @example\n * ```typescript\n * // Base Repository\n * const repo = getScopedRepository(users);\n * await repo.findById(1);\n *\n * // Custom Repository\n * class UserRepository extends Repository<typeof users> {\n * async findByEmail(email: string) {\n * return this.findOneWhere({ email });\n * }\n * }\n *\n * const repo = getScopedRepository(users, UserRepository);\n * await repo.findByEmail('john@example.com');\n *\n * // Within same request - returns cached instance\n * const repo2 = getScopedRepository(users, UserRepository); // Same instance!\n * ```\n */\nexport function getScopedRepository<\n TTable extends PgTable,\n TRepo extends Repository<TTable> = Repository<TTable>\n>(\n table: TTable,\n RepositoryClass?: new (table: TTable) => TRepo\n): TRepo\n{\n const cache = repositoryStorage.getStore();\n\n // Outside scope - create new instance (graceful degradation)\n if (!cache)\n {\n return RepositoryClass\n ? new RepositoryClass(table)\n : new Repository(table) as TRepo;\n }\n\n // Inside scope - use cache\n const key = getCacheKey(table, RepositoryClass as any);\n let repo = cache.get(key);\n\n if (!repo)\n {\n repo = RepositoryClass\n ? new RepositoryClass(table)\n : new Repository(table);\n cache.set(key, repo);\n }\n\n return repo as TRepo;\n}\n\n/**\n * Hono middleware for automatic repository scope management\n *\n * Wraps each request in a repository scope, ensuring automatic cache isolation.\n * All repositories accessed via getScopedRepository() within this request will be cached.\n *\n * @returns Hono middleware handler\n *\n * @example\n * ```typescript\n * // Global middleware (recommended)\n * import { createServer } from '@spfn/core';\n * import { RepositoryScope } from '@spfn/core/db';\n *\n * const app = createServer();\n * app.use(RepositoryScope());\n *\n * // Or in server.config.ts\n * export default {\n * middlewares: [\n * { name: 'repositoryScope', handler: RepositoryScope() }\n * ]\n * };\n * ```\n */\nexport function RepositoryScope(): MiddlewareHandler\n{\n return async (_c, next) =>\n {\n return withRepositoryScope(() => next());\n };\n}\n\n/**\n * Get current repository cache size (for debugging/monitoring)\n *\n * Returns the number of cached repository instances in the current request scope.\n * Returns 0 if called outside a scope.\n *\n * @returns Number of cached repositories in current scope\n *\n * @example\n * ```typescript\n * const size = getScopedCacheSize();\n * console.log(`Cached repositories in this request: ${size}`);\n * ```\n */\nexport function getScopedCacheSize(): number\n{\n const cache = repositoryStorage.getStore();\n return cache?.size ?? 0;\n}\n\n/**\n * Check if currently inside a repository scope\n *\n * @returns true if inside scope, false otherwise\n *\n * @example\n * ```typescript\n * if (isInRepositoryScope()) {\n * console.log('Using scoped cache');\n * } else {\n * console.log('Creating new instances');\n * }\n * ```\n */\nexport function isInRepositoryScope(): boolean\n{\n return repositoryStorage.getStore() !== undefined;\n}","/**\n * Table Name Utilities\n *\n * Helper functions for extracting table names from Drizzle table objects.\n * Used by Repository for accessing db.query API with dynamic table names.\n */\n\nimport type { PgTable } from 'drizzle-orm/pg-core';\n\n/**\n * Table name cache for performance optimization\n * Prevents repeated Symbol.for lookups\n */\nconst tableNameCache = new WeakMap<PgTable, string>();\n\n/**\n * Get table name from Drizzle table object\n *\n * Uses WeakMap cache to avoid repeated Symbol lookups for better performance.\n *\n * @param table - Drizzle table schema\n * @returns Table name string\n *\n * @example\n * ```typescript\n * import { users } from './schema';\n * const name = getTableName(users); // 'users'\n * ```\n */\nexport function getTableName(table: PgTable): string\n{\n // Check cache first\n const cached = tableNameCache.get(table);\n if (cached)\n {\n return cached;\n }\n\n // Extract name from Drizzle table metadata\n // Drizzle stores table name in Symbol.for('drizzle:Name')\n const name = (table as any)[Symbol.for('drizzle:Name')] || table.constructor.name;\n\n // Cache for future lookups\n tableNameCache.set(table, name);\n\n return name;\n}","/**\n * Repository Module Exports\n */\n\n// Repository Pattern\nexport { Repository } from './repository.js';\nexport type {\n Pageable,\n Page,\n} from './repository.js';\n\n// Repository Factory (Singleton Pattern)\nexport {\n getRepository,\n clearRepositoryCache,\n getRepositoryCacheSize\n} from './factory.js';\n\n// Request-Scoped Repository (Recommended for testability)\nexport {\n getScopedRepository,\n withRepositoryScope,\n RepositoryScope,\n getScopedCacheSize,\n isInRepositoryScope\n} from './request-scope.js';\n\n// Query Builder\nexport { QueryBuilder } from './query-builder.js';\n\n// Relation Registry\nexport { getTableName } from './relation-registry.js';\n\n// Filter Utilities (formerly from query module)\nexport {\n buildFilters,\n buildSort,\n orFilters,\n applyPagination,\n createPaginationMeta,\n countTotal,\n} from './filters.js';\n\nexport type {\n FilterOperator,\n FilterValue,\n FilterCondition,\n Filters,\n FilterResult,\n SortDirection,\n SortCondition,\n SortResult,\n PaginationParams,\n PaginationMeta,\n DrizzleTable,\n} from './filters.js';","/**\n * WrappedDb - Drizzle + Repository ķØķ“ ķµķ©\n *\n * Drizzleģ ėŖØė źø°ė„ģ ģ ģ§ķė©“ģ JPA ģ¤ķģ¼ Repository ģ ź·¼ ģ ź³µ\n */\n\nimport type { PgTable } from 'drizzle-orm/pg-core';\nimport type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';\n\nimport { Repository } from '../repository';\n\n/**\n * WrappedDb ķ“ėģ¤\n *\n * Drizzle DB넼 ėķķģ¬ ģ¶ź° źø°ė„ ģ ź³µ\n */\nexport class WrappedDb\n{\n constructor(private db: PostgresJsDatabase<Record<string, never>>) {}\n\n /**\n * Repository ķØķ“ģ¼ė” ķ
ģ“ėø ģ ź·¼\n *\n * @example\n * const db = getDb();\n * const userRepo = db.for(users);\n * const result = await userRepo.findPage(pageable);\n */\n for<TTable extends PgTable<any>, TSelect = any>(table: TTable): Repository<TTable, TSelect>\n {\n return new Repository<TTable, TSelect>(this.db, table);\n }\n\n /**\n * Drizzleģ ėŖØė ė©ģė넼 ķė”ģ\n *\n * select, insert, update, delete, transaction ė± ėŖØė Drizzle ė©ģė ģ¬ģ© ź°ė„\n */\n get select()\n {\n return this.db.select.bind(this.db);\n }\n\n get insert()\n {\n return this.db.insert.bind(this.db);\n }\n\n get update()\n {\n return this.db.update.bind(this.db);\n }\n\n get delete()\n {\n return this.db.delete.bind(this.db);\n }\n\n get execute()\n {\n return this.db.execute.bind(this.db);\n }\n\n get transaction()\n {\n return this.db.transaction.bind(this.db);\n }\n\n get query()\n {\n return this.db.query;\n }\n\n get $with()\n {\n return this.db.$with.bind(this.db);\n }\n\n /**\n * Raw Drizzle DB ģ ź·¼ (ķģģ)\n */\n get raw(): PostgresJsDatabase\n {\n return this.db;\n }\n}\n","/**\n * DB Context Helper\n *\n * Automatically detects transaction context and returns the appropriate DB instance.\n *\n * ā
Implemented:\n * - AsyncLocalStorage-based transaction detection\n * - Returns default DB instance when no transaction\n * - JPA-style Repository pattern support\n * - Preserves Drizzle core features\n *\n * ā ļø TODO:\n * - Nested transaction detection and warning logs\n * - Transaction timeout checks\n *\n * š” Future considerations:\n * - Add function to force default DB usage (useDefaultDb)\n * - Auto-select Read Replica (detect read-only queries)\n * - Transaction statistics collection (success/failure/rollback count)\n * - Return transaction ID function (for debugging)\n *\n * š Related files:\n * - src/utils/async-context.ts (AsyncLocalStorage implementation)\n * - src/utils/transaction.ts (Transactional middleware)\n * - src/db/db-instance.ts (Default DB instance)\n * - src/db/wrapped-db.ts (WrappedDb implementation)\n * - src/db/repository.ts (Repository implementation)\n */\nimport { getTransaction } from '../transaction';\n\nimport { getDatabase, type DbConnectionType } from './manager.js';\nimport { WrappedDb } from './wrapped-db.js';\n\n/**\n * Get DB instance (WrappedDb)\n *\n * - If transaction context exists: Returns transaction DB\n * - Otherwise: Returns default DB or specified connection type\n * - Wraps with WrappedDb to provide both Repository pattern + Drizzle features\n *\n * Usage 1: Direct Drizzle use\n * ```typescript\n * export async function GET(c: RouteContext) {\n * const db = getDb();\n * const users = await db.select().from(users);\n * return c.json(users);\n * }\n * ```\n *\n * Usage 2: Repository pattern\n * ```typescript\n * export async function GET(c: RouteContext) {\n * const db = getDb();\n * const userRepo = db.for(users);\n * const result = await userRepo.findPage(pageable);\n * return c.json(result);\n * }\n * ```\n *\n * Usage 3: Specify connection type\n * ```typescript\n * const readDb = getDb('read'); // Use read replica\n * const writeDb = getDb('write'); // Use primary\n * ```\n *\n * @param type - Optional connection type ('read' or 'write')\n * @returns WrappedDb instance (transaction or specified DB)\n */\nexport function getDb(type?: DbConnectionType): WrappedDb\n{\n const tx = getTransaction();\n\n // If transaction exists, always use transaction DB\n if (tx)\n {\n return new WrappedDb(tx);\n }\n\n // Otherwise use specified type or default from manager\n const rawDb = getDatabase(type);\n if (!rawDb)\n {\n throw new Error(\n 'Database not initialized. ' +\n 'Set DATABASE_URL environment variable or call initDatabase() first.'\n );\n }\n\n return new WrappedDb(rawDb);\n}","/**\n * Database Manager Module Exports\n */\n\n// DB Instance & Connection (Backward Compatibility)\nexport { db, getRawDb } from './instance.js';\nexport type { DbConnectionType } from './instance.js';\n\n// DB Context\nexport { getDb } from './context.js';\n\n// Database Factory (Environment Detection)\nexport { createDatabaseFromEnv } from './factory.js';\nexport type { DatabaseClients } from './factory.js';\n\n// Database Manager (Singleton Pattern)\nexport {\n initDatabase,\n getDatabase,\n setDatabase,\n closeDatabase,\n getDatabaseInfo,\n getDatabaseMonitoringConfig,\n} from './manager.js';\n\n// Connection Functions\nexport { createDatabaseConnection, checkConnection } from './connection.js';\n\n// Configuration Types\nexport type { PoolConfig, RetryConfig } from './config.js';\n\n// Wrapped DB\nexport { WrappedDb } from './wrapped-db.js';","/**\n * Drizzle Kit configuration generator\n * Automatically generates drizzle.config.ts from environment variables\n */\n\nexport interface DrizzleConfigOptions\n{\n /** Database connection URL (defaults to process.env.DATABASE_URL) */\n databaseUrl?: string;\n\n /** Schema files glob pattern (defaults to './src/server/entities/*.ts') */\n schema?: string;\n\n /** Migration output directory (defaults to './drizzle/migrations') */\n out?: string;\n\n /** Database dialect (auto-detected from URL if not provided) */\n dialect?: 'postgresql' | 'mysql' | 'sqlite';\n}\n\n/**\n * Detect database dialect from connection URL\n */\nexport function detectDialect(url: string): 'postgresql' | 'mysql' | 'sqlite'\n{\n if (url.startsWith('postgres://') || url.startsWith('postgresql://'))\n {\n return 'postgresql';\n }\n\n if (url.startsWith('mysql://'))\n {\n return 'mysql';\n }\n\n if (url.startsWith('sqlite://') || url.includes('.db') || url.includes('.sqlite'))\n {\n return 'sqlite';\n }\n\n throw new Error(\n `Unsupported database URL format: ${url}. Supported: postgresql://, mysql://, sqlite://`\n );\n}\n\n/**\n * Generate Drizzle Kit configuration\n *\n * @param options - Configuration options\n * @returns Drizzle Kit configuration object\n *\n * @example\n * ```ts\n * // Zero-config (reads from process.env.DATABASE_URL)\n * const config = getDrizzleConfig();\n *\n * // Custom config\n * const config = getDrizzleConfig({\n * databaseUrl: 'postgresql://localhost/mydb',\n * schema: './src/db/schema/*.ts',\n * out: './migrations',\n * });\n * ```\n */\nexport function getDrizzleConfig(options: DrizzleConfigOptions = {})\n{\n const databaseUrl = options.databaseUrl ?? process.env.DATABASE_URL;\n\n if (!databaseUrl)\n {\n throw new Error(\n 'DATABASE_URL is required. Set it in .env or pass it to getDrizzleConfig()'\n );\n }\n\n const dialect = options.dialect ?? detectDialect(databaseUrl);\n const schema = options.schema ?? './src/server/entities/*.ts';\n const out = options.out ?? './drizzle/migrations';\n\n return {\n schema,\n out,\n dialect,\n dbCredentials: getDbCredentials(dialect, databaseUrl),\n };\n}\n\n/**\n * Get database credentials based on dialect\n */\nfunction getDbCredentials(dialect: string, url: string)\n{\n switch (dialect)\n {\n case 'postgresql':\n case 'mysql':\n return { url };\n\n case 'sqlite':\n // Extract file path from sqlite:// URL\n const dbPath = url.replace('sqlite://', '').replace('sqlite:', '');\n return { url: dbPath };\n\n default:\n throw new Error(`Unsupported dialect: ${dialect}`);\n }\n}\n\n/**\n * Generate drizzle.config.ts file content\n *\n * @param options - Configuration options\n * @returns File content as string\n */\nexport function generateDrizzleConfigFile(options: DrizzleConfigOptions = {}): string\n{\n const config = getDrizzleConfig(options);\n\n return `import { defineConfig } from 'drizzle-kit';\n\nexport default defineConfig({\n schema: '${config.schema}',\n out: '${config.out}',\n dialect: '${config.dialect}',\n dbCredentials: ${JSON.stringify(config.dbCredentials, null, 4)},\n});\n`;\n}","/**\n * Schema Helper Functions\n *\n * Common field patterns for Drizzle ORM entities to reduce boilerplate.\n *\n * @example\n * ```typescript\n * import { pgTable, text } from 'drizzle-orm/pg-core';\n * import { id, timestamps } from '@spfn/core';\n *\n * export const users = pgTable('users', {\n * id: id(),\n * email: text('email').unique(),\n * ...timestamps(),\n * });\n * ```\n */\n\nimport type { PgColumn } from 'drizzle-orm/pg-core';\nimport { bigserial, timestamp } from 'drizzle-orm/pg-core';\n\n/**\n * Standard auto-incrementing primary key\n *\n * @returns bigserial primary key column\n *\n * @example\n * ```typescript\n * export const users = pgTable('users', {\n * id: id(),\n * // ...\n * });\n * ```\n */\nexport function id()\n{\n return bigserial('id', { mode: 'number' }).primaryKey();\n}\n\n/**\n * Standard timestamp fields (createdAt, updatedAt)\n *\n * Both fields are timezone-aware, auto-set to current time on creation.\n * When autoUpdate is enabled, updatedAt will be automatically updated on record updates.\n *\n * @param options - Optional configuration\n * @param options.autoUpdate - Automatically update updatedAt on record updates (default: false)\n * @returns Object with createdAt and updatedAt columns\n *\n * @example\n * ```typescript\n * // Without auto-update\n * export const users = pgTable('users', {\n * id: id(),\n * email: text('email'),\n * ...timestamps(),\n * });\n *\n * // With auto-update\n * export const posts = pgTable('posts', {\n * id: id(),\n * title: text('title'),\n * ...timestamps({ autoUpdate: true }),\n * });\n * ```\n */\nexport function timestamps(options?: { autoUpdate?: boolean })\n{\n const updatedAtColumn = timestamp('updated_at', { withTimezone: true, mode: 'date' })\n .defaultNow()\n .notNull();\n\n // Mark column for auto-update if enabled\n if (options?.autoUpdate)\n {\n (updatedAtColumn as any).__autoUpdate = true;\n }\n\n return {\n createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' })\n .defaultNow()\n .notNull(),\n updatedAt: updatedAtColumn,\n };\n}\n\n/**\n * Auto-updating timestamp field (for custom timestamp fields)\n *\n * Creates a timestamp field that automatically updates on record updates.\n * Useful when you need a custom name like 'modifiedAt', 'lastUpdated', etc.\n *\n * @param fieldName - Field name in camelCase (default: 'updatedAt')\n * @returns Object with the timestamp column (converts camelCase to snake_case)\n *\n * @example\n * ```typescript\n * // Custom field name\n * export const posts = pgTable('posts', {\n * id: id(),\n * title: text('title'),\n * ...autoUpdateTimestamp('modifiedAt'), // Creates 'modified_at' column\n * });\n *\n * // Default field name\n * export const articles = pgTable('articles', {\n * id: id(),\n * ...autoUpdateTimestamp(), // Creates 'updatedAt' -> 'updated_at'\n * });\n * ```\n */\nexport function autoUpdateTimestamp(fieldName: string = 'updatedAt')\n{\n // Convert camelCase to snake_case for column name\n const columnName = fieldName.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');\n\n const column = timestamp(columnName, { withTimezone: true, mode: 'date' })\n .defaultNow()\n .notNull();\n\n // Mark column for auto-update\n (column as any).__autoUpdate = true;\n\n return {\n [fieldName]: column,\n };\n}\n\n/**\n * Foreign key reference to another table\n *\n * Creates a bigserial column with cascade delete.\n * Type-safe: ensures the reference points to a valid PostgreSQL column.\n *\n * @param name - Column name (e.g., 'author' creates 'author_id')\n * @param reference - Reference to parent table column\n * @param options - Optional foreign key options\n *\n * @example\n * ```typescript\n * import { users } from './users';\n *\n * export const posts = pgTable('posts', {\n * id: id(),\n * authorId: foreignKey('author', () => users.id),\n * ...timestamps(),\n * });\n * ```\n */\nexport function foreignKey<T extends PgColumn>(\n name: string,\n reference: () => T,\n options?: { onDelete?: 'cascade' | 'set null' | 'restrict' | 'no action' }\n)\n{\n return bigserial(`${name}_id`, { mode: 'number' })\n .notNull()\n .references(reference, { onDelete: options?.onDelete ?? 'cascade' });\n}\n\n/**\n * Optional foreign key reference (nullable)\n *\n * Type-safe: ensures the reference points to a valid PostgreSQL column.\n *\n * @param name - Column name (e.g., 'author' creates 'author_id')\n * @param reference - Reference to parent table column\n * @param options - Optional foreign key options\n *\n * @example\n * ```typescript\n * export const posts = pgTable('posts', {\n * id: id(),\n * authorId: optionalForeignKey('author', () => users.id),\n * });\n * ```\n */\nexport function optionalForeignKey<T extends PgColumn>(\n name: string,\n reference: () => T,\n options?: { onDelete?: 'cascade' | 'set null' | 'restrict' | 'no action' }\n)\n{\n return bigserial(`${name}_id`, { mode: 'number' })\n .references(reference, { onDelete: options?.onDelete ?? 'set null' });\n}","/**\n * Schema Module Exports\n */\n\n// Schema Helpers\nexport { id, timestamps, foreignKey, optionalForeignKey } from './helpers.js';","/**\n * Database Module Exports\n *\n * Entry point for DB module (Pure re-export only)\n */\n\n// Manager (DB Instance, Factory, Connection)\nexport {\n db,\n getRawDb,\n getDb,\n createDatabaseFromEnv,\n initDatabase,\n getDatabase,\n setDatabase,\n closeDatabase,\n getDatabaseInfo,\n createDatabaseConnection,\n checkConnection,\n WrappedDb,\n} from './manager';\n\nexport type {\n DbConnectionType,\n DatabaseClients,\n PoolConfig,\n RetryConfig,\n} from './manager';\n\n// Drizzle Config Generator\nexport { getDrizzleConfig, detectDialect, generateDrizzleConfigFile } from './manager/config-generator.js';\nexport type { DrizzleConfigOptions } from './manager/config-generator.js';\n\n// Repository Pattern\nexport {\n Repository,\n getRepository,\n clearRepositoryCache,\n getRepositoryCacheSize,\n getScopedRepository,\n withRepositoryScope,\n RepositoryScope,\n getScopedCacheSize,\n isInRepositoryScope,\n QueryBuilder,\n getTableName,\n} from './repository';\n\nexport type {\n Pageable,\n Page,\n} from './repository';\n\n// Schema Helpers\nexport { id, timestamps, foreignKey, optionalForeignKey } from './schema';\n\n// Transaction\nexport { Transactional, getTransaction, runWithTransaction } from './transaction';\nexport type { TransactionContext, TransactionDB, TransactionalOptions } from './transaction';\n\n// PostgreSQL Error Utilities\nexport { fromPostgresError } from './postgres-errors.js';","import { readdir, stat } from 'fs/promises';\nimport { join, relative } from 'path';\nimport type { Hono } from 'hono';\n\n/**\n * Extend Hono Context to support skipMiddlewares metadata\n */\ndeclare module 'hono' {\n interface ContextVariableMap {\n _skipMiddlewares?: string[];\n }\n}\n\n/**\n * AutoRouteLoader: Simplified File-based Routing System\n *\n * ## Features\n * - š Auto-discovery: Scans routes directory and auto-registers\n * - š Dynamic routes: [id] ā :id, [...slug] ā *\n * - š Statistics: Route registration stats for dashboard\n * - š·ļø Grouping: Natural grouping by directory structure\n *\n * ## Usage\n * ```typescript\n * const app = new Hono();\n * await loadRoutes(app);\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RouteInfo = {\n /** URL path (e.g., /users/:id) */\n path: string;\n /** File path relative to routes dir */\n file: string;\n /** Route metadata from export */\n meta?: {\n description?: string;\n tags?: string[];\n auth?: boolean;\n [key: string]: unknown;\n };\n /** Priority (1=static, 2=dynamic, 3=catch-all) */\n priority: number;\n};\n\nexport type RouteStats = {\n total: number;\n byPriority: {\n static: number;\n dynamic: number;\n catchAll: number;\n };\n byTag: Record<string, number>;\n routes: RouteInfo[];\n};\n\n// ============================================================================\n// Main Loader Class\n// ============================================================================\n\nexport class AutoRouteLoader\n{\n private routes: RouteInfo[] = [];\n private registeredRoutes = new Map<string, string>(); // normalized path ā file\n private debug: boolean;\n private readonly middlewares: Array<{ name: string; handler: any }>;\n\n constructor(\n private routesDir: string,\n debug = false,\n middlewares: Array<{ name: string; handler: any }> = []\n )\n {\n this.debug = debug;\n this.middlewares = middlewares;\n }\n\n /**\n * Load all routes from directory\n */\n async load(app: Hono): Promise<RouteStats>\n {\n const startTime = Date.now();\n\n // 1. Scan files\n const files = await this.scanFiles(this.routesDir);\n\n if (files.length === 0)\n {\n console.warn('ā ļø No route files found');\n return this.getStats();\n }\n\n // 2. Calculate priorities for all files\n const filesWithPriority = files.map(file => ({\n path: file,\n priority: this.calculatePriority(relative(this.routesDir, file)),\n }));\n\n // 3. Sort by priority (static=1, dynamic=2, catch-all=3)\n filesWithPriority.sort((a, b) => a.priority - b.priority);\n\n if (this.debug)\n {\n console.log(`\\nš Route Registration Order:`);\n console.log(` Priority 1 (Static): ${filesWithPriority.filter(f => f.priority === 1).length} routes`);\n console.log(` Priority 2 (Dynamic): ${filesWithPriority.filter(f => f.priority === 2).length} routes`);\n console.log(` Priority 3 (Catch-all): ${filesWithPriority.filter(f => f.priority === 3).length} routes\\n`);\n }\n\n // 4. Load and register routes in priority order\n let successCount = 0;\n let failureCount = 0;\n\n for (const { path } of filesWithPriority)\n {\n const success = await this.loadRoute(app, path);\n if (success)\n {\n successCount++;\n }\n else\n {\n failureCount++;\n }\n }\n\n // 5. Log stats\n const elapsed = Date.now() - startTime;\n const stats = this.getStats();\n\n if (this.debug)\n {\n this.logStats(stats, elapsed);\n }\n\n if (failureCount > 0)\n {\n console.warn(`ā ļø ${failureCount} route(s) failed to load`);\n }\n\n return stats;\n }\n\n /**\n * Get route statistics\n */\n getStats(): RouteStats\n {\n const stats: RouteStats = {\n total: this.routes.length,\n byPriority: { static: 0, dynamic: 0, catchAll: 0 },\n byTag: {},\n routes: this.routes,\n };\n\n for (const route of this.routes)\n {\n // Count by priority\n if (route.priority === 1) stats.byPriority.static++;\n else if (route.priority === 2) stats.byPriority.dynamic++;\n else if (route.priority === 3) stats.byPriority.catchAll++;\n\n // Count by tag\n if (route.meta?.tags)\n {\n for (const tag of route.meta.tags)\n {\n stats.byTag[tag] = (stats.byTag[tag] || 0) + 1;\n }\n }\n }\n\n return stats;\n }\n\n // ========================================================================\n // Private Methods\n // ========================================================================\n\n /**\n * Recursively scan directory for .ts files\n */\n private async scanFiles(dir: string, files: string[] = []): Promise<string[]>\n {\n const entries = await readdir(dir);\n\n for (const entry of entries)\n {\n const fullPath = join(dir, entry);\n const fileStat = await stat(fullPath);\n\n if (fileStat.isDirectory())\n {\n // Recurse into subdirectories\n await this.scanFiles(fullPath, files);\n }\n else if (this.isValidRouteFile(entry))\n {\n files.push(fullPath);\n }\n }\n\n return files;\n }\n\n /**\n * Check if file is a valid route file\n */\n private isValidRouteFile(fileName: string): boolean\n {\n return (\n fileName.endsWith('.ts') &&\n !fileName.endsWith('.test.ts') &&\n !fileName.endsWith('.spec.ts') &&\n !fileName.endsWith('.d.ts') &&\n fileName !== 'contract.ts'\n );\n }\n\n /**\n * Load and register a single route\n * Returns true if successful, false if failed\n */\n private async loadRoute(app: Hono, absolutePath: string): Promise<boolean>\n {\n const relativePath = relative(this.routesDir, absolutePath);\n\n try\n {\n // Import module\n const module = await import(absolutePath);\n\n if (!module.default)\n {\n console.error(`ā ${relativePath}: Must export Hono instance as default`);\n return false;\n }\n\n // Validate that it's actually a Hono instance\n if (typeof module.default.route !== 'function')\n {\n console.error(`ā ${relativePath}: Default export is not a Hono instance`);\n return false;\n }\n\n // Convert file path to URL path\n const urlPath = this.fileToPath(relativePath);\n const priority = this.calculatePriority(relativePath);\n\n // Check for route conflicts\n const normalizedPath = this.normalizePath(urlPath);\n const existingFile = this.registeredRoutes.get(normalizedPath);\n\n if (existingFile)\n {\n console.warn(`ā ļø Route conflict detected:`);\n console.warn(` Path: ${urlPath} (normalized: ${normalizedPath})`);\n console.warn(` Already registered by: ${existingFile}`);\n console.warn(` Attempted by: ${relativePath}`);\n console.warn(` ā Skipping duplicate registration`);\n return false;\n }\n\n // Track registration\n this.registeredRoutes.set(normalizedPath, relativePath);\n\n // Check if module uses contract-based routing (createApp)\n const hasContractMetas = module.default._contractMetas && module.default._contractMetas.size > 0;\n\n if (hasContractMetas)\n {\n // Contract-based routing: method-level skipMiddlewares\n // Use wildcard pattern to match all sub-paths (e.g., /test/* matches /test/public, /test/private)\n const middlewarePath = urlPath === '/' ? '/*' : `${urlPath}/*`;\n\n // 1. Register meta-setting middleware first\n app.use(middlewarePath, (c, next) =>\n {\n const method = c.req.method;\n const requestPath = new URL(c.req.url).pathname;\n\n // Calculate relative path by removing the route base path\n // E.g., if urlPath = '/test' and requestPath = '/test/public', then relativePath = '/public'\n const relativePath = requestPath.startsWith(urlPath)\n ? requestPath.slice(urlPath.length) || '/'\n : requestPath;\n\n const key = `${method} ${relativePath}`;\n const meta = module.default._contractMetas?.get(key);\n\n if (meta?.skipMiddlewares)\n {\n c.set('_skipMiddlewares', meta.skipMiddlewares);\n }\n\n return next();\n });\n\n // 2. Wrap global middlewares to check skipMiddlewares\n for (const middleware of this.middlewares)\n {\n app.use(middlewarePath, async (c, next) =>\n {\n const skipList = c.get('_skipMiddlewares') || [];\n\n if (skipList.includes(middleware.name))\n {\n return next(); // Skip this middleware\n }\n\n return middleware.handler(c, next); // Execute middleware\n });\n }\n }\n else\n {\n // File-based routing: file-level skipMiddlewares (fallback)\n const skipList = module.meta?.skipMiddlewares || [];\n const activeMiddlewares = this.middlewares\n .filter(m => !skipList.includes(m.name));\n\n for (const middleware of activeMiddlewares)\n {\n app.use(urlPath, middleware.handler);\n }\n }\n\n // Register route\n app.route(urlPath, module.default);\n\n // Store route info\n this.routes.push({\n path: urlPath,\n file: relativePath,\n meta: module.meta,\n priority,\n });\n\n if (this.debug)\n {\n const icon = priority === 1 ? 'š¹' : priority === 2 ? 'šø' : 'ā';\n console.log(` ${icon} ${urlPath.padEnd(40)} ā ${relativePath}`);\n }\n\n return true;\n }\n catch (error)\n {\n const err = error as Error;\n\n // Categorize error types and provide helpful messages\n if (err.message.includes('Cannot find module') || err.message.includes('MODULE_NOT_FOUND'))\n {\n console.error(`ā ${relativePath}: Missing dependency`);\n console.error(` ${err.message}`);\n console.error(` ā Run: npm install`);\n }\n else if (err.message.includes('SyntaxError') || err.stack?.includes('SyntaxError'))\n {\n console.error(`ā ${relativePath}: Syntax error`);\n console.error(` ${err.message}`);\n\n if (this.debug && err.stack)\n {\n console.error(` Stack trace (first 5 lines):`);\n const stackLines = err.stack.split('\\n').slice(0, 5);\n stackLines.forEach(line => console.error(` ${line}`));\n }\n }\n else if (err.message.includes('Unexpected token'))\n {\n console.error(`ā ${relativePath}: Parse error`);\n console.error(` ${err.message}`);\n console.error(` ā Check for syntax errors or invalid TypeScript`);\n }\n else\n {\n console.error(`ā ${relativePath}: ${err.message}`);\n\n if (this.debug && err.stack)\n {\n console.error(` Stack: ${err.stack}`);\n }\n }\n\n return false;\n }\n }\n\n /**\n * Convert file path to URL path\n *\n * Examples:\n * - users/index.ts ā /users\n * - users/[id].ts ā /users/:id\n * - posts/[...slug].ts ā /posts/*\n */\n private fileToPath(filePath: string): string\n {\n // Remove .ts extension\n let path = filePath.replace(/\\.ts$/, '');\n\n // Split into segments\n const segments = path.split('/');\n\n // Remove 'index' if it's the last segment\n if (segments[segments.length - 1] === 'index')\n {\n segments.pop();\n }\n\n // Transform segments: [id] ā :id, [...slug] ā *\n const transformed = segments.map(seg =>\n {\n // Catch-all: [...slug] ā *\n if (/^\\[\\.\\.\\.[\\w-]+]$/.test(seg))\n {\n return '*';\n }\n // Dynamic: [id] ā :id\n if (/^\\[[\\w-]+]$/.test(seg))\n {\n return ':' + seg.slice(1, -1);\n }\n // Skip 'index' segments (index/index.ts ā /, posts/index/index.ts ā /posts)\n if (seg === 'index')\n {\n return null;\n }\n // Static: users ā users\n return seg;\n }).filter(seg => seg !== null);\n\n // Join and ensure leading slash\n const result = '/' + transformed.join('/');\n return result.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\n }\n\n /**\n * Calculate route priority\n * 1 = static, 2 = dynamic, 3 = catch-all\n */\n private calculatePriority(path: string): number\n {\n if (/\\[\\.\\.\\.[\\w-]+]/.test(path)) return 3; // Catch-all\n if (/\\[[\\w-]+]/.test(path)) return 2; // Dynamic\n return 1; // Static\n }\n\n /**\n * Normalize path for conflict detection\n *\n * Converts dynamic parameter names to generic placeholders:\n * - /users/:id ā /users/:param\n * - /users/:userId ā /users/:param (conflict!)\n * - /posts/* ā /posts/* (unchanged)\n *\n * This allows detection of routes with different param names\n * that would match the same URL patterns.\n */\n private normalizePath(path: string): string\n {\n // Replace all dynamic params (:xxx) with :param\n // This allows us to detect conflicts like /users/:id and /users/:userId\n return path.replace(/:\\w+/g, ':param');\n }\n\n /**\n * Log statistics\n */\n private logStats(stats: RouteStats, elapsed: number): void\n {\n console.log(`\\nš Route Statistics:`);\n console.log(` Total: ${stats.total} routes`);\n console.log(\n ` Priority: ${stats.byPriority.static} static, ` +\n `${stats.byPriority.dynamic} dynamic, ` +\n `${stats.byPriority.catchAll} catch-all`\n );\n\n if (Object.keys(stats.byTag).length > 0)\n {\n const tagCounts = Object.entries(stats.byTag)\n .map(([tag, count]) => `${tag}(${count})`)\n .join(', ');\n console.log(` Tags: ${tagCounts}`);\n }\n\n console.log(`\\nā
Routes loaded in ${elapsed}ms\\n`);\n }\n}\n\n// ============================================================================\n// Convenience Function\n// ============================================================================\n\n/**\n * Load routes from default location (src/server/routes)\n */\nexport async function loadRoutes(\n app: Hono,\n options?: {\n routesDir?: string;\n debug?: boolean;\n middlewares?: Array<{ name: string; handler: any }>;\n }\n): Promise<RouteStats>\n{\n const routesDir = options?.routesDir ?? join(process.cwd(), 'src', 'server', 'routes');\n const debug = options?.debug ?? false;\n const middlewares = options?.middlewares ?? [];\n\n const loader = new AutoRouteLoader(routesDir, debug, middlewares);\n return loader.load(app);\n}","import type { Context } from 'hono';\nimport { Value } from '@sinclair/typebox/value';\nimport type { RouteContract, RouteContext, InferContract } from './types.js';\nimport { ValidationError } from '../errors/database-errors.js';\n\n/**\n * Contract-based Route Handler Wrapper\n *\n * Binds a contract to a route handler, providing automatic validation\n * and type-safe context creation.\n *\n * ## Features\n * - ā
Automatic params/query/body validation using TypeBox\n * - ā
Type-safe RouteContext with contract-based inference\n * - ā
Clean separation: bind() for validation, Hono for middleware\n *\n * ## Usage\n *\n * ```typescript\n * // Basic usage\n * export const GET = bind(contract, async (c) => {\n * return c.json({ data: 'public' });\n * });\n *\n * // For middleware, use Hono's app-level or route-level middleware:\n * // app.use('/api/*', authMiddleware);\n * // app.get('/users/:id', authMiddleware, bind(contract, handler));\n * ```\n *\n * @param contract - Route contract defining params, query, body, response schemas\n * @param handler - Route handler function\n * @returns Hono-compatible handler function\n */\nexport function bind<TContract extends RouteContract>(\n contract: TContract,\n handler: (c: RouteContext<TContract>) => Response | Promise<Response>\n)\n{\n return async (rawContext: Context) =>\n {\n // ============================================================\n // 1. Validate params\n // ============================================================\n const params = rawContext.req.param();\n if (contract.params)\n {\n const errors = [...Value.Errors(contract.params, params)];\n if (errors.length > 0)\n {\n throw new ValidationError(\n 'Invalid path parameters',\n {\n fields: errors.map(e => ({\n path: e.path,\n message: e.message,\n value: e.value,\n }))\n }\n );\n }\n }\n\n // ============================================================\n // 2. Validate query\n // ============================================================\n const url = new URL(rawContext.req.url);\n const query: Record<string, string | string[]> = {};\n url.searchParams.forEach((v, k) =>\n {\n const existing = query[k];\n if (existing)\n {\n // Convert to array or append to existing array\n query[k] = Array.isArray(existing) ? [...existing, v] : [existing, v];\n }\n else\n {\n query[k] = v;\n }\n });\n\n if (contract.query)\n {\n const errors = [...Value.Errors(contract.query, query)];\n if (errors.length > 0)\n {\n throw new ValidationError(\n 'Invalid query parameters',\n {\n fields: errors.map(e => ({\n path: e.path,\n message: e.message,\n value: e.value,\n }))\n }\n );\n }\n }\n\n // ============================================================\n // 3. Create RouteContext\n // ============================================================\n const routeContext: RouteContext<TContract> = {\n params: params as InferContract<TContract>['params'],\n query: query as InferContract<TContract>['query'],\n\n // data() - validates and returns body\n data: async () =>\n {\n const body = await rawContext.req.json();\n if (contract.body)\n {\n const errors = [...Value.Errors(contract.body, body)];\n if (errors.length > 0)\n {\n throw new ValidationError(\n 'Invalid request body',\n {\n fields: errors.map(e => ({\n path: e.path,\n message: e.message,\n value: e.value,\n }))\n }\n );\n }\n }\n return body as InferContract<TContract>['body'];\n },\n\n // json() - returns typed response\n json: (data, status, headers) =>\n {\n return rawContext.json(data, status, headers);\n },\n\n // raw Hono context for advanced usage\n raw: rawContext,\n };\n\n // ============================================================\n // 4. Execute handler\n // ============================================================\n return handler(routeContext);\n };\n}","/**\n * Error Handler Middleware\n *\n * Generic middleware that converts errors with statusCode to HTTP responses\n *\n * ā
Features:\n * - Convert any error with statusCode property to appropriate HTTP status codes\n * - Error logging (log level by status code)\n * - Environment-specific error response format (Production/Development)\n * - Stack trace inclusion (development only)\n * - Support for additional error details\n *\n * š” Design:\n * - Domain-independent (doesn't depend on specific error types)\n * - Works with any error that has a statusCode property\n * - Follows dependency inversion principle\n */\nimport type { Context } from 'hono';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { logger } from '../logger';\n\nconst errorLogger = logger.child('error-handler');\n\n/**\n * Error handler options\n */\nexport interface ErrorHandlerOptions\n{\n /**\n * Include stack trace in response\n * @default process.env.NODE_ENV !== 'production'\n */\n includeStack?: boolean;\n\n /**\n * Enable error logging\n * @default true\n */\n enableLogging?: boolean;\n}\n\n/**\n * Error response format\n */\ninterface ErrorResponse\n{\n error: {\n message: string;\n type: string;\n statusCode: number;\n stack?: string;\n };\n}\n\n/**\n * Error handler middleware\n *\n * Used in Hono's onError hook\n *\n * @example\n * ```typescript\n * const app = new Hono();\n * app.onError(ErrorHandler());\n * ```\n */\nexport function ErrorHandler(options: ErrorHandlerOptions = {}): (err: Error, c: Context) => Response | Promise<Response>\n{\n const {\n includeStack = process.env.NODE_ENV !== 'production',\n enableLogging = true,\n } = options;\n\n return (err: Error, c: Context) =>\n {\n // Generic error handling: check for statusCode property\n const statusCode = (err as any).statusCode || 500;\n const errorType = err.name || 'Error';\n\n if (enableLogging)\n {\n // 4xx: warn, 5xx: error\n const logLevel = statusCode >= 500 ? 'error' : 'warn';\n\n errorLogger[logLevel]('Error occurred', {\n type: errorType,\n message: err.message,\n statusCode,\n path: c.req.path,\n method: c.req.method,\n });\n }\n\n const response: ErrorResponse = {\n error: {\n message: err.message || 'Internal Server Error',\n type: errorType,\n statusCode,\n },\n };\n\n // Include additional error details if available\n if ((err as any).details)\n {\n (response.error as any).details = (err as any).details;\n }\n\n if (includeStack)\n {\n response.error.stack = err.stack;\n }\n\n return c.json(response, statusCode as ContentfulStatusCode);\n };\n}","/**\n * Request Logger Middleware\n *\n * Automatic API request/response logging middleware\n *\n * ā
Features:\n * - Automatic request start/completion logging\n * - Response time measurement\n * - Automatic error logging\n * - Request ID generation (distributed tracing)\n * - Sensitive data masking\n * - Exclude path configuration (health checks, etc.)\n *\n * š” Benefits:\n * - Automatic monitoring of all API requests\n * - Identify performance bottlenecks\n * - Easy error tracking\n *\n * š” Usage:\n * ```typescript\n * import { RequestLogger } from '@spfn/core';\n *\n * app.use(RequestLogger());\n * ```\n *\n * š Related files:\n * - src/logger/ (Logger)\n * - src/index.ts (Export)\n */\n\nimport type { Context, Next } from 'hono';\nimport { randomBytes } from 'crypto';\nimport { logger } from '../logger';\n\n/**\n * Request Logger configuration\n */\nexport interface RequestLoggerConfig\n{\n /**\n * Paths to exclude from logging (health checks, etc.)\n */\n excludePaths?: string[];\n\n /**\n * Field names to mask for sensitive data\n */\n sensitiveFields?: string[];\n\n /**\n * Slow request threshold (ms)\n */\n slowRequestThreshold?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<RequestLoggerConfig> = {\n excludePaths: ['/health', '/ping', '/favicon.ico'],\n sensitiveFields: ['password', 'token', 'apiKey', 'secret', 'authorization'],\n slowRequestThreshold: 1000, // 1 second\n};\n\n/**\n * Generate cryptographically secure request ID\n *\n * Format: req_<timestamp>_<random-hex>\n * Example: req_1759541628730_a3f9c2d8e1b4\n *\n * Collision probability: ~2^-48 (extremely low)\n */\nfunction generateRequestId(): string\n{\n const timestamp = Date.now();\n const randomPart = randomBytes(6).toString('hex'); // 12 hex chars\n return `req_${timestamp}_${randomPart}`;\n}\n\n/**\n * Mask sensitive data with circular reference handling\n *\n * Optimizations:\n * - Pre-computes lowercase fields to avoid repeated toLowerCase() calls\n * - Handles circular references with WeakSet\n */\nexport function maskSensitiveData(\n obj: any,\n sensitiveFields: string[],\n seen = new WeakSet()\n): any\n{\n if (!obj || typeof obj !== 'object') return obj;\n\n // Prevent circular references\n if (seen.has(obj)) return '[Circular]';\n seen.add(obj);\n\n // Pre-compute lowercase fields (optimization)\n const lowerFields = sensitiveFields.map(f => f.toLowerCase());\n\n const masked = Array.isArray(obj) ? [...obj] : { ...obj };\n\n for (const key in masked)\n {\n const lowerKey = key.toLowerCase();\n\n // Check if sensitive (optimized)\n if (lowerFields.some(field => lowerKey.includes(field)))\n {\n masked[key] = '***MASKED***';\n }\n // Recursively mask nested objects\n else if (typeof masked[key] === 'object' && masked[key] !== null)\n {\n masked[key] = maskSensitiveData(masked[key], sensitiveFields, seen);\n }\n }\n\n return masked;\n}\n\n/**\n * Request Logger middleware\n */\nexport function RequestLogger(config?: RequestLoggerConfig)\n{\n const cfg = { ...DEFAULT_CONFIG, ...config };\n const apiLogger = logger.child('api');\n\n return async (c: Context, next: Next) =>\n {\n const path = new URL(c.req.url).pathname;\n\n // Check excluded paths\n if (cfg.excludePaths.includes(path))\n {\n return next();\n }\n\n // Generate Request ID and store in context\n const requestId = generateRequestId();\n c.set('requestId', requestId);\n\n // Collect request information\n const method = c.req.method;\n const userAgent = c.req.header('user-agent');\n const ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip') || 'unknown';\n\n // Log request start\n const startTime = Date.now();\n\n apiLogger.info('Request received', {\n requestId,\n method,\n path,\n ip,\n userAgent,\n });\n\n try\n {\n // Process request\n await next();\n\n // Response completed\n const duration = Date.now() - startTime;\n const status = c.res.status;\n\n // Log response completion\n const logLevel = status >= 400 ? 'warn' : 'info';\n const isSlowRequest = duration >= cfg.slowRequestThreshold;\n\n // Build log data (only include 'slow' when true)\n const logData: Record<string, any> = {\n requestId,\n method,\n path,\n status,\n duration,\n };\n\n if (isSlowRequest)\n {\n logData.slow = true;\n }\n\n apiLogger[logLevel]('Request completed', logData);\n\n // Warn for slow requests\n if (isSlowRequest)\n {\n apiLogger.warn('Slow request detected', {\n requestId,\n method,\n path,\n duration,\n threshold: cfg.slowRequestThreshold,\n });\n }\n }\n catch (error)\n {\n // Error occurred\n const duration = Date.now() - startTime;\n\n apiLogger.error('Request failed', error as Error, {\n requestId,\n method,\n path,\n duration,\n });\n\n // Re-throw error for error handler to process\n throw error;\n }\n };\n}","import { Hono } from 'hono';\nimport { serve } from '@hono/node-server';\nimport { cors } from 'hono/cors';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport type { Server } from 'http';\n\nimport { loadRoutes } from '../route';\nimport { ErrorHandler } from '../middleware';\nimport { RequestLogger } from '../middleware';\nimport { initRedis, closeRedis } from '../cache';\nimport { initDatabase, closeDatabase } from '../db';\nimport { logger } from '../logger';\n\nimport type { ServerConfig, AppFactory, ServerInstance } from './types.js';\n\nconst serverLogger = logger.child('server');\n\n/**\n * Create Hono app with automatic configuration\n *\n * Levels:\n * 1. No app.ts -> Full auto config\n * 2. server.config.ts -> Partial customization\n * 3. app.ts -> Full control (no auto config)\n */\nexport async function createServer(config?: ServerConfig): Promise<Hono>\n{\n const cwd = process.cwd();\n const appPath = join(cwd, 'src', 'server', 'app.ts');\n const appJsPath = join(cwd, 'src', 'server', 'app.js');\n\n // Level 3: Full control with app.ts\n if (existsSync(appPath) || existsSync(appJsPath))\n {\n const appModule = await import(existsSync(appPath) ? appPath : appJsPath);\n const appFactory: AppFactory = appModule.default;\n\n if (!appFactory)\n {\n throw new Error('app.ts must export a default function that returns a Hono app');\n }\n\n const app = await appFactory();\n\n // Only load routes, everything else is user's responsibility\n const debug = config?.debug ?? process.env.NODE_ENV === 'development';\n await loadRoutes(app, { routesDir: config?.routesPath, debug });\n\n return app;\n }\n\n // Level 1 & 2: Auto config\n const app = new Hono();\n\n const middlewareConfig = config?.middleware ?? {};\n const enableLogger = middlewareConfig.logger !== false;\n const enableCors = middlewareConfig.cors !== false;\n const enableErrorHandler = middlewareConfig.errorHandler !== false;\n\n // 1. Default middleware (can be disabled)\n if (enableLogger)\n {\n app.use('*', RequestLogger());\n }\n\n if (enableCors && config?.cors !== false)\n {\n app.use('*', cors(config?.cors));\n }\n\n // 2. Custom middleware from config\n config?.use?.forEach(mw => app.use('*', mw));\n\n // 3. Health check endpoint (before routes)\n const healthCheckConfig = config?.healthCheck ?? {};\n const healthCheckEnabled = healthCheckConfig.enabled !== false;\n const healthCheckPath = healthCheckConfig.path ?? '/health';\n const healthCheckDetailed = healthCheckConfig.detailed\n ?? process.env.NODE_ENV === 'development';\n\n if (healthCheckEnabled)\n {\n app.get(healthCheckPath, async (c) =>\n {\n const response: any = {\n status: 'ok',\n timestamp: new Date().toISOString(),\n };\n\n if (healthCheckDetailed)\n {\n const { getDatabase } = await import('../db/index.js');\n const { getRedis } = await import('../cache/index.js');\n\n // Check database\n const db = getDatabase();\n let dbStatus = 'disconnected';\n if (db)\n {\n try\n {\n await db.execute('SELECT 1');\n dbStatus = 'connected';\n }\n catch\n {\n dbStatus = 'error';\n }\n }\n\n // Check Redis\n const redis = getRedis();\n let redisStatus = 'disconnected';\n if (redis)\n {\n try\n {\n await redis.ping();\n redisStatus = 'connected';\n }\n catch\n {\n redisStatus = 'error';\n }\n }\n\n response.services = {\n database: dbStatus,\n redis: redisStatus,\n };\n }\n\n return c.json(response);\n });\n\n serverLogger.debug(`Health check endpoint enabled at ${healthCheckPath}`);\n }\n\n // 4. beforeRoutes hook\n await config?.beforeRoutes?.(app);\n\n // 4. Load routes\n const debug = config?.debug ?? process.env.NODE_ENV === 'development';\n await loadRoutes(app, {\n routesDir: config?.routesPath,\n debug,\n middlewares: config?.middlewares\n });\n\n // 5. afterRoutes hook\n await config?.afterRoutes?.(app);\n\n // 6. Error handler (last)\n if (enableErrorHandler)\n {\n app.onError(ErrorHandler());\n }\n\n return app;\n}\n\n/**\n * Start SPFN server\n *\n * Automatically loads server.config.ts if exists\n * Automatically initializes Database and Redis from environment\n * Sets up graceful shutdown handlers for SIGTERM and SIGINT\n *\n * @returns ServerInstance with server, app, config, and close() method\n */\nexport async function startServer(config?: ServerConfig): Promise<ServerInstance>\n{\n const cwd = process.cwd();\n const configPath = join(cwd, 'src', 'server', 'server.config.ts');\n const configJsPath = join(cwd, 'src', 'server', 'server.config.js');\n\n // Load server.config.ts if exists\n let fileConfig: ServerConfig = {};\n if (existsSync(configPath) || existsSync(configJsPath))\n {\n const configModule = await import(existsSync(configPath) ? configPath : configJsPath);\n fileConfig = configModule.default ?? {};\n }\n\n // Merge config (runtime > file > env > defaults)\n const finalConfig: ServerConfig =\n {\n ...fileConfig,\n ...config,\n port: config?.port ?? fileConfig?.port ?? (parseInt(process.env.PORT || '', 10) || 4000),\n host: config?.host ?? fileConfig?.host ?? (process.env.HOST || 'localhost'),\n };\n\n const { host, port, debug } = finalConfig;\n\n try\n {\n // Initialize infrastructure (Database and Redis) with config\n serverLogger.debug('Initializing database...');\n await initDatabase(finalConfig.database);\n\n serverLogger.debug('Initializing Redis...');\n await initRedis();\n\n // Create app\n serverLogger.debug('Creating Hono app...');\n const app = await createServer(finalConfig);\n\n // Start server\n serverLogger.debug(`Starting server on ${host}:${port}...`);\n\n const server = serve(\n {\n fetch: app.fetch,\n port: port!,\n hostname: host,\n });\n\n // Configure server timeouts\n const timeoutConfig = finalConfig.timeout ?? {};\n\n const requestTimeout = timeoutConfig.request\n ?? (parseInt(process.env.SERVER_TIMEOUT || '', 10) || 120000); // 2 minutes default\n\n const keepAliveTimeout = timeoutConfig.keepAlive\n ?? (parseInt(process.env.SERVER_KEEPALIVE_TIMEOUT || '', 10) || 65000); // 65 seconds (longer than typical LB timeout)\n\n const headersTimeout = timeoutConfig.headers\n ?? (parseInt(process.env.SERVER_HEADERS_TIMEOUT || '', 10) || 60000); // 60 seconds\n\n // Apply timeouts to Node.js HTTP server\n // The serve() function returns ServerType (Server | Http2Server | Http2SecureServer)\n // All these types support timeout properties\n if ('timeout' in server)\n {\n (server as Server).timeout = requestTimeout;\n (server as Server).keepAliveTimeout = keepAliveTimeout;\n (server as Server).headersTimeout = headersTimeout;\n }\n\n serverLogger.info('Server timeouts configured', {\n request: `${requestTimeout}ms`,\n keepAlive: `${keepAliveTimeout}ms`,\n headers: `${headersTimeout}ms`,\n });\n\n // Clean output similar to Next.js\n console.log(` ā² SPFN ${debug ? 'dev' : 'production'}`);\n console.log(` - Local: http://${host}:${port}`);\n console.log('');\n\n // Core shutdown logic (without process.exit)\n const shutdownServer = async () =>\n {\n serverLogger.debug('Closing HTTP server...');\n await new Promise<void>((resolve) =>\n {\n server.close(() =>\n {\n serverLogger.info('HTTP server closed');\n resolve();\n });\n });\n\n serverLogger.debug('Closing database connections...');\n await closeDatabase();\n\n serverLogger.debug('Closing Redis connections...');\n await closeRedis();\n\n serverLogger.info('Server shutdown completed');\n };\n\n // Graceful shutdown handler (with process.exit and timeout)\n const shutdown = async (signal: string) =>\n {\n serverLogger.info(`${signal} received, starting graceful shutdown...`);\n\n // Get shutdown timeout from config\n const shutdownTimeout = finalConfig.shutdown?.timeout\n ?? (parseInt(process.env.SHUTDOWN_TIMEOUT || '', 10) || 30000);\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) =>\n {\n setTimeout(() =>\n {\n reject(new Error(`Graceful shutdown timeout after ${shutdownTimeout}ms`));\n }, shutdownTimeout);\n });\n\n try\n {\n // Race between graceful shutdown and timeout\n await Promise.race([\n shutdownServer(),\n timeoutPromise,\n ]);\n\n serverLogger.info('Graceful shutdown completed successfully');\n process.exit(0);\n }\n catch (error)\n {\n const err = error as Error;\n\n if (err.message && err.message.includes('timeout'))\n {\n serverLogger.error('Graceful shutdown timeout, forcing exit', err);\n }\n else\n {\n serverLogger.error('Error during graceful shutdown', err);\n }\n\n process.exit(1);\n }\n };\n\n // Manual close method (without process.exit, for tests)\n const close = async () =>\n {\n serverLogger.info('Manual server shutdown requested');\n await shutdownServer();\n };\n\n // Register shutdown handlers\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Handle uncaught exceptions\n process.on('uncaughtException', (error) =>\n {\n serverLogger.error('Uncaught exception', error);\n shutdown('UNCAUGHT_EXCEPTION');\n });\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason, promise) =>\n {\n serverLogger.error('Unhandled promise rejection', {\n reason,\n promise,\n });\n shutdown('UNHANDLED_REJECTION');\n });\n\n // Return server instance\n return {\n server,\n app,\n config: finalConfig,\n close,\n };\n }\n catch (error)\n {\n const err = error as Error;\n serverLogger.error('Server initialization failed', err);\n\n // Cleanup on failure\n try\n {\n serverLogger.debug('Cleaning up after initialization failure...');\n await closeDatabase();\n await closeRedis();\n serverLogger.debug('Cleanup completed');\n }\n catch (cleanupError)\n {\n serverLogger.error('Cleanup failed', cleanupError as Error);\n }\n\n throw error;\n }\n}"]}
|