@lyxa.ai/core 1.0.313 → 1.0.314
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/libraries/mongo/models/embedded/customer-support-batches.model.d.ts +2 -2
- package/dist/libraries/mongo/models/embedded/customer-support-batches.model.js +8 -8
- package/dist/libraries/mongo/models/embedded/customer-support-batches.model.js.map +1 -1
- package/dist/libraries/mongo/models/zone.model.js +1 -1
- package/dist/libraries/mongo/models/zone.model.js.map +1 -1
- package/dist/types/README.md +1 -1
- package/dist/types/package.json +1 -1
- package/dist/utilities/error-handler.js +1 -1
- package/dist/utilities/error-handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,16 +12,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.CustomerSupportBatchesSettings = void 0;
|
|
13
13
|
const typegoose_1 = require("@typegoose/typegoose");
|
|
14
14
|
class CustomerSupportBatchesSettings {
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
phoneNumber;
|
|
16
|
+
whatsAppNumber;
|
|
17
17
|
}
|
|
18
18
|
exports.CustomerSupportBatchesSettings = CustomerSupportBatchesSettings;
|
|
19
19
|
__decorate([
|
|
20
|
-
(0, typegoose_1.prop)({ type:
|
|
21
|
-
__metadata("design:type",
|
|
22
|
-
], CustomerSupportBatchesSettings.prototype, "
|
|
20
|
+
(0, typegoose_1.prop)({ type: String }),
|
|
21
|
+
__metadata("design:type", String)
|
|
22
|
+
], CustomerSupportBatchesSettings.prototype, "phoneNumber", void 0);
|
|
23
23
|
__decorate([
|
|
24
|
-
(0, typegoose_1.prop)({ type:
|
|
25
|
-
__metadata("design:type",
|
|
26
|
-
], CustomerSupportBatchesSettings.prototype, "
|
|
24
|
+
(0, typegoose_1.prop)({ type: String }),
|
|
25
|
+
__metadata("design:type", String)
|
|
26
|
+
], CustomerSupportBatchesSettings.prototype, "whatsAppNumber", void 0);
|
|
27
27
|
//# sourceMappingURL=customer-support-batches.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customer-support-batches.model.js","sourceRoot":"/","sources":["libraries/mongo/models/embedded/customer-support-batches.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA4C;AAE5C,MAAa,8BAA8B;
|
|
1
|
+
{"version":3,"file":"customer-support-batches.model.js","sourceRoot":"/","sources":["libraries/mongo/models/embedded/customer-support-batches.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA4C;AAE5C,MAAa,8BAA8B;IAEnC,WAAW,CAAU;IAGrB,cAAc,CAAU;CAC/B;AAND,wEAMC;AAJO;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mEACK;AAGrB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sEACQ","sourcesContent":["import { prop } from '@typegoose/typegoose';\n\nexport class CustomerSupportBatchesSettings {\n\t@prop({ type: String })\n\tpublic phoneNumber?: string;\n\n\t@prop({ type: String })\n\tpublic whatsAppNumber?: string;\n}\n"]}
|
|
@@ -28,7 +28,7 @@ let Zone = class Zone extends defaultClasses_1.TimeStamps {
|
|
|
28
28
|
};
|
|
29
29
|
exports.Zone = Zone;
|
|
30
30
|
__decorate([
|
|
31
|
-
(0, typegoose_1.prop)({ required: true, type: String }),
|
|
31
|
+
(0, typegoose_1.prop)({ required: true, unique: true, type: String }),
|
|
32
32
|
__metadata("design:type", String)
|
|
33
33
|
], Zone.prototype, "name", void 0);
|
|
34
34
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zone.model.js","sourceRoot":"/","sources":["libraries/mongo/models/zone.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAiE;AACjE,4EAAqE;AACrE,kDAAqD;AACrD,sEAA6D;AAItD,IAAM,IAAI,GAAV,MAAM,IAAK,SAAQ,2BAAU;IAE5B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,QAAQ,CAAgB;IAGxB,MAAM,CAAc;IAGpB,SAAS,CAAU;IAGnB,eAAe,CAAU;IAIzB,iBAAiB,CAAU;IAG3B,iBAAiB,CAAU;IAG3B,QAAQ,CAAU;IAIlB,gBAAgB,CAAW;CAClC,CAAA;AAhCY,oBAAI;AAET;IADN,IAAA,gBAAI,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;
|
|
1
|
+
{"version":3,"file":"zone.model.js","sourceRoot":"/","sources":["libraries/mongo/models/zone.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAiE;AACjE,4EAAqE;AACrE,kDAAqD;AACrD,sEAA6D;AAItD,IAAM,IAAI,GAAV,MAAM,IAAK,SAAQ,2BAAU;IAE5B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,QAAQ,CAAgB;IAGxB,MAAM,CAAc;IAGpB,SAAS,CAAU;IAGnB,eAAe,CAAU;IAIzB,iBAAiB,CAAU;IAG3B,iBAAiB,CAAU;IAG3B,QAAQ,CAAU;IAIlB,gBAAgB,CAAW;CAClC,CAAA;AAhCY,oBAAI;AAET;IADN,IAAA,gBAAI,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kCAChC;AAGd;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kCACF;AAGd;IADN,IAAA,gBAAI,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,iCAAY,EAAE,CAAC;8BAC3B,iCAAY;sCAAC;AAGxB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAU,EAAE,OAAO,EAAE,iBAAU,CAAC,MAAM,EAAE,CAAC;;oCAC1C;AAGpB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;uCACG;AAGnB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6CACS;AAIzB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;+CACR;AAG3B;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;+CACD;AAG3B;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCACd;AAIlB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;8CACL;eA/BtB,IAAI;IAFhB,IAAA,wBAAY,EAAC,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IACxD,IAAA,iBAAK,EAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;GACnB,IAAI,CAgChB","sourcesContent":["import { Index, modelOptions, prop } from '@typegoose/typegoose';\nimport { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';\nimport { ZoneStatus } from '../../../utilities/enum';\nimport { ZoneGeometry } from './embedded/zone-geometry.mode';\n\n@modelOptions({ schemaOptions: { collection: 'zones' } })\n@Index({ geometry: '2dsphere' })\nexport class Zone extends TimeStamps {\n\t@prop({ required: true, unique: true, type: String })\n\tpublic name!: string;\n\n\t@prop({ type: String })\n\tpublic area?: string;\n\n\t@prop({ required: true, type: ZoneGeometry })\n\tpublic geometry!: ZoneGeometry;\n\n\t@prop({ type: String, enum: ZoneStatus, default: ZoneStatus.ACTIVE })\n\tpublic status?: ZoneStatus;\n\n\t@prop({ type: String })\n\tpublic busyTitle?: string;\n\n\t@prop({ type: String })\n\tpublic busyDescription?: string;\n\n\t// Rider reward feature when he reached the target\n\t@prop({ type: Number, default: Infinity })\n\tpublic riderWeeklyTarget?: number;\n\n\t@prop({ type: Number, default: 0 })\n\tpublic riderWeeklyReward?: number;\n\n\t@prop({ type: Number, required: true })\n\tpublic areaSqKm!: number;\n\n\t// Rider reward are not be applied when isIncludedRewared false\n\t@prop({ type: Boolean, default: true })\n\tpublic isIncludedReward?: boolean;\n}\n"]}
|
package/dist/types/README.md
CHANGED
package/dist/types/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"/","sources":["utilities/error-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Error handling utility for TRPC and MongoDB operations.\n * Provides centralized error handling, logging, and retry mechanisms.\n */\n\nimport { TRPCError } from '@trpc/server';\nimport { MongoServerError, MongoError, MongoNetworkError } from 'mongodb';\nimport { ZodError } from 'zod';\n\n/**\n * A utility class for handling various types of errors in a TRPC-MongoDB application.\n * Provides error transformation, logging, and retry mechanisms.\n */\nexport class ErrorHandler {\n\t/**\n\t * Configuration options for error handling behavior\n\t * @private\n\t */\n\tprivate static readonly CONFIG = {\n\t\t/** Whether to log errors to console */\n\t\tshouldLogErrors: true,\n\t\t/** Maximum number of stack trace lines to include in logs */\n\t\tmaxStackTraceLines: 10,\n\t\t/** Set of error codes that are considered retryable */\n\t\tretryableErrors: new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'EPIPE']),\n\t};\n\n\t/**\n\t * Mapping of MongoDB error codes to TRPC error types and messages\n\t * @private\n\t */\n\tprivate static readonly MONGO_ERROR_CODES: Record<\n\t\tnumber,\n\t\t{\n\t\t\tcode: TRPCError['code'];\n\t\t\tmessage: string;\n\t\t}\n\t> = {\n\t\t11000: { code: 'CONFLICT', message: 'A record with this value already exists.' },\n\t\t11001: { code: 'CONFLICT', message: 'Duplicate key error on index update.' },\n\t\t121: { code: 'BAD_REQUEST', message: 'Document validation failed.' },\n\t\t7: { code: 'INTERNAL_SERVER_ERROR', message: 'Not primary - database is in recovery mode.' },\n\t\t89: { code: 'FORBIDDEN', message: 'Unauthorized operation attempted.' },\n\t\t91: { code: 'TIMEOUT', message: 'Operation timeout exceeded.' },\n\t\t189: { code: 'BAD_REQUEST', message: 'Invalid modification - document would exceed size limit.' },\n\t\t50: { code: 'INTERNAL_SERVER_ERROR', message: 'Database execution error.' },\n\t};\n\n\t/**\n\t * Logs error information with metadata and stack trace\n\t * @private\n\t * @param error - The error to log\n\t * @param context - Additional context information for the error\n\t */\n\tprivate static logError(error: unknown, context: Record<string, unknown> = {}): void {\n\t\tif (!this.CONFIG.shouldLogErrors) return;\n\n\t\tconst errorMeta = this.extractErrorMetadata(error);\n\t\tconst timestamp = new Date().toISOString();\n\n\t\tconst logData = {\n\t\t\ttimestamp,\n\t\t\ttype: errorMeta.type,\n\t\t\tmessage: error instanceof Error ? error.message : 'Unknown error',\n\t\t\tstack:\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.stack?.split('\\n').slice(0, this.CONFIG.maxStackTraceLines).join('\\n')\n\t\t\t\t\t: undefined,\n\t\t\tcontext,\n\t\t\tmetadata: errorMeta,\n\t\t};\n\n\t\tconsole.error('[ErrorHandler]:', JSON.stringify(logData, null, 2));\n\t}\n\n\t/**\n\t * Main error handling method that transforms various error types into TRPC errors\n\t * @param error - The error to handle\n\t * @param customMessage - Optional custom error message\n\t * @param context - Additional context information\n\t * @throws {TRPCError} Transformed error with appropriate error code and message\n\t */\n\tpublic static handleError(\n\t\terror: unknown,\n\t\tcustomMessage = 'An unexpected error occurred',\n\t\tcontext: Record<string, unknown> = {}\n\t): never {\n\t\tthis.logError(error, context);\n\n\t\tif (error instanceof TRPCError) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (error instanceof ZodError) {\n\t\t\ttry {\n\t\t\t\tconsole.log('ZodError:', error.flatten());\n\t\t\t\tconst formatted = error.errors.map(e => ({\n\t\t\t\t\tfield: e.path.join('.'),\n\t\t\t\t\tmessage: e.message,\n\t\t\t\t}));\n\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'BAD_REQUEST',\n\t\t\t\t\tmessage: 'Validation error',\n\t\t\t\t\tcause: formatted,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\t// Handle any issues with flattening or logging\n\t\t\t\tconsole.error('Error while processing ZodError:', err);\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\tmessage: 'Error processing validation error',\n\t\t\t\t\tcause: err,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (error instanceof MongoNetworkError) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Database connection error',\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\n\t\tif (this.isMongoError(error)) {\n\t\t\tthrow this.createMongoTRPCError(error);\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: this.mapNodeErrorCode(error),\n\t\t\t\tmessage: error.message || customMessage,\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\n\t\tthrow new TRPCError({\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\tmessage: customMessage,\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\t/**\n\t * Type guard to check if an error is a MongoDB error\n\t * @private\n\t * @param error - The error to check\n\t * @returns True if the error is a MongoDB error\n\t */\n\tprivate static isMongoError(error: unknown): error is MongoServerError {\n\t\treturn (\n\t\t\terror instanceof MongoServerError ||\n\t\t\terror instanceof MongoError ||\n\t\t\t(typeof error === 'object' &&\n\t\t\t\terror !== null &&\n\t\t\t\t'code' in error &&\n\t\t\t\t'name' in error &&\n\t\t\t\t((error as MongoServerError).name === 'MongoServerError' ||\n\t\t\t\t\t(error as MongoServerError).name === 'MongoError'))\n\t\t);\n\t}\n\n\t/**\n\t * Creates a TRPC error from a MongoDB error\n\t * @private\n\t * @param error - MongoDB error to transform\n\t * @returns Transformed TRPC error\n\t */\n\tprivate static createMongoTRPCError(error: MongoServerError): TRPCError {\n\t\tconst errorCode = typeof error.code === 'number' ? error.code : 0;\n\t\tconst errorInfo = this.MONGO_ERROR_CODES[errorCode] || {\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\tmessage: `Database error occurred. Code: ${errorCode}`,\n\t\t};\n\n\t\treturn new TRPCError({\n\t\t\tcode: errorInfo.code,\n\t\t\tmessage: errorInfo.message,\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\t/**\n\t * Maps Node.js error codes to TRPC error codes\n\t * @private\n\t * @param error - Node.js error to map\n\t * @returns Appropriate TRPC error code\n\t */\n\tprivate static mapNodeErrorCode(error: Error): TRPCError['code'] {\n\t\tconst nodeErrorMap: Record<string, TRPCError['code']> = {\n\t\t\tENOENT: 'NOT_FOUND',\n\t\t\tEACCES: 'FORBIDDEN',\n\t\t\tECONNREFUSED: 'INTERNAL_SERVER_ERROR',\n\t\t\tECONNRESET: 'INTERNAL_SERVER_ERROR',\n\t\t\tETIMEDOUT: 'TIMEOUT',\n\t\t\tEPIPE: 'INTERNAL_SERVER_ERROR',\n\t\t\tENOTFOUND: 'NOT_FOUND',\n\t\t\tEINVAL: 'BAD_REQUEST',\n\t\t\tEMFILE: 'INTERNAL_SERVER_ERROR',\n\t\t\tEPERM: 'FORBIDDEN',\n\t\t};\n\n\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\treturn code ? nodeErrorMap[code] || 'INTERNAL_SERVER_ERROR' : 'INTERNAL_SERVER_ERROR';\n\t}\n\n\t/**\n\t * Wraps an async function with error handling\n\t * @param fn - Async function to wrap\n\t * @param context - Additional context information\n\t * @returns Promise resolving to the function's return type\n\t * @throws {TRPCError} If the function throws an error\n\t */\n\tpublic static async wrapAsync<T>(fn: () => Promise<T>, context: Record<string, unknown> = {}): Promise<T> {\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} catch (error) {\n\t\t\tthis.handleError(error, undefined, context);\n\t\t}\n\t}\n\n\t/**\n\t * Executes an async function with retry mechanism for transient errors\n\t * @param fn - Async function to execute\n\t * @param options - Retry configuration options\n\t * @returns Promise resolving to the function's return type\n\t * @throws {TRPCError} If all retry attempts fail\n\t */\n\tpublic static async withRetry<T>(\n\t\tfn: () => Promise<T>,\n\t\toptions: {\n\t\t\tmaxAttempts?: number;\n\t\t\tdelayMs?: number;\n\t\t\tbackoffFactor?: number;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t} = {}\n\t): Promise<T> {\n\t\tconst { maxAttempts = 3, delayMs = 1000, backoffFactor = 2, context = {} } = options;\n\n\t\tlet lastError: unknown;\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await fn();\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error;\n\n\t\t\t\tconst isRetryable = this.isRetryableError(error);\n\t\t\t\tconst isLastAttempt = attempt === maxAttempts;\n\n\t\t\t\tif (!isRetryable || isLastAttempt) {\n\t\t\t\t\tthis.handleError(error, undefined, { ...context, attempt });\n\t\t\t\t}\n\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, delayMs * Math.pow(backoffFactor, attempt - 1)));\n\t\t\t}\n\t\t}\n\n\t\tthrow lastError;\n\t}\n\n\t/**\n\t * Determines if an error is retryable\n\t * @private\n\t * @param error - The error to check\n\t * @returns True if the error is retryable\n\t */\n\tprivate static isRetryableError(error: unknown): boolean {\n\t\tif (error instanceof MongoNetworkError) return true;\n\t\tif (error instanceof Error) {\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\t\treturn code ? this.CONFIG.retryableErrors.has(code) : false;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extracts metadata from an error for logging and analysis\n\t * @param error - The error to extract metadata from\n\t * @returns Object containing error type, original error, and additional details\n\t */\n\tpublic static extractErrorMetadata(error: unknown): {\n\t\ttype: string;\n\t\toriginalError: unknown;\n\t\tdetails?: Record<string, unknown>;\n\t} {\n\t\tif (error instanceof TRPCError) {\n\t\t\treturn {\n\t\t\t\ttype: 'TRPCError',\n\t\t\t\toriginalError: error.cause ?? error,\n\t\t\t\tdetails: {\n\t\t\t\t\tcode: error.code,\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof ZodError) {\n\t\t\treturn {\n\t\t\t\ttype: 'ZodError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: error.flatten(),\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof MongoNetworkError) {\n\t\t\treturn {\n\t\t\t\ttype: 'MongoNetworkError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\tisRetryable: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (this.isMongoError(error)) {\n\t\t\treturn {\n\t\t\t\ttype: 'MongoError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tcode: (error as MongoServerError).code,\n\t\t\t\t\tcodeName: (error as MongoServerError).codeName,\n\t\t\t\t\tkeyPattern: (error as MongoServerError).keyPattern,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\treturn {\n\t\t\t\ttype: 'NodeError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tname: error.name,\n\t\t\t\t\tcode: (error as NodeJS.ErrnoException).code,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn { type: 'UnknownError', originalError: error };\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"/","sources":["utilities/error-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Error handling utility for TRPC and MongoDB operations.\n * Provides centralized error handling, logging, and retry mechanisms.\n */\n\nimport { TRPCError } from '@trpc/server';\nimport { MongoServerError, MongoError, MongoNetworkError } from 'mongodb';\nimport { ZodError } from 'zod';\n\n/**\n * A utility class for handling various types of errors in a TRPC-MongoDB application.\n * Provides error transformation, logging, and retry mechanisms.\n */\nexport class ErrorHandler {\n\t/**\n\t * Configuration options for error handling behavior\n\t * @private\n\t */\n\tprivate static readonly CONFIG = {\n\t\t/** Whether to log errors to console */\n\t\tshouldLogErrors: true,\n\t\t/** Maximum number of stack trace lines to include in logs */\n\t\tmaxStackTraceLines: 10,\n\t\t/** Set of error codes that are considered retryable */\n\t\tretryableErrors: new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'EPIPE']),\n\t};\n\n\t/**\n\t * Mapping of MongoDB error codes to TRPC error types and messages\n\t * @private\n\t */\n\tprivate static readonly MONGO_ERROR_CODES: Record<\n\t\tnumber,\n\t\t{\n\t\t\tcode: TRPCError['code'];\n\t\t\tmessage: string;\n\t\t}\n\t> = {\n\t\t11000: { code: 'CONFLICT', message: 'A record with this value already exists.' },\n\t\t11001: { code: 'CONFLICT', message: 'Duplicate key error on index update.' },\n\t\t121: { code: 'BAD_REQUEST', message: 'Document validation failed.' },\n\t\t7: { code: 'INTERNAL_SERVER_ERROR', message: 'Not primary - database is in recovery mode.' },\n\t\t89: { code: 'FORBIDDEN', message: 'Unauthorized operation attempted.' },\n\t\t91: { code: 'TIMEOUT', message: 'Operation timeout exceeded.' },\n\t\t189: { code: 'BAD_REQUEST', message: 'Invalid modification - document would exceed size limit.' },\n\t\t50: { code: 'INTERNAL_SERVER_ERROR', message: 'Database execution error.' },\n\t};\n\n\t/**\n\t * Logs error information with metadata and stack trace\n\t * @private\n\t * @param error - The error to log\n\t * @param context - Additional context information for the error\n\t */\n\tprivate static logError(error: unknown, context: Record<string, unknown> = {}): void {\n\t\tif (!this.CONFIG.shouldLogErrors) return;\n\n\t\tconst errorMeta = this.extractErrorMetadata(error);\n\t\tconst timestamp = new Date().toISOString();\n\n\t\tconst logData = {\n\t\t\ttimestamp,\n\t\t\ttype: errorMeta.type,\n\t\t\tmessage: error instanceof Error ? error.message : 'Unknown error',\n\t\t\tstack:\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.stack?.split('\\n').slice(0, this.CONFIG.maxStackTraceLines).join('\\n')\n\t\t\t\t\t: undefined,\n\t\t\tcontext,\n\t\t\tmetadata: errorMeta,\n\t\t};\n\n\t\tconsole.error('[ErrorHandler]:', JSON.stringify(logData, null, 2));\n\t}\n\n\t/**\n\t * Main error handling method that transforms various error types into TRPC errors\n\t * @param error - The error to handle\n\t * @param customMessage - Optional custom error message\n\t * @param context - Additional context information\n\t * @throws {TRPCError} Transformed error with appropriate error code and message\n\t */\n\tpublic static handleError(\n\t\terror: unknown,\n\t\tcustomMessage = 'An unexpected error occurred',\n\t\tcontext: Record<string, unknown> = {}\n\t): never {\n\t\tthis.logError(error, context);\n\n\t\tif (error instanceof TRPCError) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (error instanceof ZodError) {\n\t\t\ttry {\n\t\t\t\tconsole.log('ZodError:', error.flatten());\n\t\t\t\tconst formatted = error.errors.map(e => ({\n\t\t\t\t\tfield: e.path.join('.'),\n\t\t\t\t\tmessage: e.message,\n\t\t\t\t}));\n\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'BAD_REQUEST',\n\t\t\t\t\tmessage: 'Validation error',\n\t\t\t\t\tcause: formatted,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\t// Handle any issues with flattening or logging\n\t\t\t\tconsole.error('Error while processing ZodError:', err);\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\tmessage: 'Error processing validation error',\n\t\t\t\t\tcause: err,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (error instanceof MongoNetworkError) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Database connection error',\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\n\t\tif (this.isMongoError(error)) {\n\t\t\tthrow this.createMongoTRPCError(error);\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: this.mapNodeErrorCode(error),\n\t\t\t\tmessage: error.message || customMessage,\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\n\t\tthrow new TRPCError({\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\tmessage: customMessage,\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\t/**\n\t * Type guard to check if an error is a MongoDB error\n\t * @private\n\t * @param error - The error to check\n\t * @returns True if the error is a MongoDB error\n\t */\n\tprivate static isMongoError(error: unknown): error is MongoServerError {\n\t\treturn (\n\t\t\terror instanceof MongoServerError ||\n\t\t\terror instanceof MongoError ||\n\t\t\t(typeof error === 'object' &&\n\t\t\t\terror !== null &&\n\t\t\t\t'code' in error &&\n\t\t\t\t'name' in error &&\n\t\t\t\t((error as MongoServerError).name === 'MongoServerError' ||\n\t\t\t\t\t(error as MongoServerError).name === 'MongoError'))\n\t\t);\n\t}\n\n\t/**\n\t * Creates a TRPC error from a MongoDB error\n\t * @private\n\t * @param error - MongoDB error to transform\n\t * @returns Transformed TRPC error\n\t */\n\tprivate static createMongoTRPCError(error: MongoServerError): TRPCError {\n\t\tconst errorCode = typeof error.code === 'number' ? error.code : 0;\n\t\tconst errorInfo = this.MONGO_ERROR_CODES[errorCode] || {\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\tmessage: `Database error occurred. Code: ${errorCode}`,\n\t\t};\n\n\t\treturn new TRPCError({\n\t\t\tcode: errorInfo.code,\n\t\t\tmessage: errorInfo.message,\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\t/**\n\t * Maps Node.js error codes to TRPC error codes\n\t * @private\n\t * @param error - Node.js error to map\n\t * @returns Appropriate TRPC error code\n\t */\n\tprivate static mapNodeErrorCode(error: Error): TRPCError['code'] {\n\t\tconst nodeErrorMap: Record<string, TRPCError['code']> = {\n\t\t\tENOENT: 'NOT_FOUND',\n\t\t\tEACCES: 'FORBIDDEN',\n\t\t\tECONNREFUSED: 'INTERNAL_SERVER_ERROR',\n\t\t\tECONNRESET: 'INTERNAL_SERVER_ERROR',\n\t\t\tETIMEDOUT: 'TIMEOUT',\n\t\t\tEPIPE: 'INTERNAL_SERVER_ERROR',\n\t\t\tENOTFOUND: 'NOT_FOUND',\n\t\t\tEINVAL: 'BAD_REQUEST',\n\t\t\tEMFILE: 'INTERNAL_SERVER_ERROR',\n\t\t\tEPERM: 'FORBIDDEN',\n\t\t};\n\n\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\treturn code ? nodeErrorMap[code] || 'INTERNAL_SERVER_ERROR' : 'INTERNAL_SERVER_ERROR';\n\t}\n\n\t/**\n\t * Wraps an async function with error handling\n\t * @param fn - Async function to wrap\n\t * @param context - Additional context information\n\t * @returns Promise resolving to the function's return type\n\t * @throws {TRPCError} If the function throws an error\n\t */\n\tpublic static async wrapAsync<T>(fn: () => Promise<T>, context: Record<string, unknown> = {}): Promise<T> {\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} catch (error) {\n\t\t\tthrow this.handleError(error, undefined, context);\n\t\t}\n\t}\n\n\t/**\n\t * Executes an async function with retry mechanism for transient errors\n\t * @param fn - Async function to execute\n\t * @param options - Retry configuration options\n\t * @returns Promise resolving to the function's return type\n\t * @throws {TRPCError} If all retry attempts fail\n\t */\n\tpublic static async withRetry<T>(\n\t\tfn: () => Promise<T>,\n\t\toptions: {\n\t\t\tmaxAttempts?: number;\n\t\t\tdelayMs?: number;\n\t\t\tbackoffFactor?: number;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t} = {}\n\t): Promise<T> {\n\t\tconst { maxAttempts = 3, delayMs = 1000, backoffFactor = 2, context = {} } = options;\n\n\t\tlet lastError: unknown;\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await fn();\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error;\n\n\t\t\t\tconst isRetryable = this.isRetryableError(error);\n\t\t\t\tconst isLastAttempt = attempt === maxAttempts;\n\n\t\t\t\tif (!isRetryable || isLastAttempt) {\n\t\t\t\t\tthis.handleError(error, undefined, { ...context, attempt });\n\t\t\t\t}\n\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, delayMs * Math.pow(backoffFactor, attempt - 1)));\n\t\t\t}\n\t\t}\n\n\t\tthrow lastError;\n\t}\n\n\t/**\n\t * Determines if an error is retryable\n\t * @private\n\t * @param error - The error to check\n\t * @returns True if the error is retryable\n\t */\n\tprivate static isRetryableError(error: unknown): boolean {\n\t\tif (error instanceof MongoNetworkError) return true;\n\t\tif (error instanceof Error) {\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\t\treturn code ? this.CONFIG.retryableErrors.has(code) : false;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extracts metadata from an error for logging and analysis\n\t * @param error - The error to extract metadata from\n\t * @returns Object containing error type, original error, and additional details\n\t */\n\tpublic static extractErrorMetadata(error: unknown): {\n\t\ttype: string;\n\t\toriginalError: unknown;\n\t\tdetails?: Record<string, unknown>;\n\t} {\n\t\tif (error instanceof TRPCError) {\n\t\t\treturn {\n\t\t\t\ttype: 'TRPCError',\n\t\t\t\toriginalError: error.cause ?? error,\n\t\t\t\tdetails: {\n\t\t\t\t\tcode: error.code,\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof ZodError) {\n\t\t\treturn {\n\t\t\t\ttype: 'ZodError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: error.flatten(),\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof MongoNetworkError) {\n\t\t\treturn {\n\t\t\t\ttype: 'MongoNetworkError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\tisRetryable: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (this.isMongoError(error)) {\n\t\t\treturn {\n\t\t\t\ttype: 'MongoError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tcode: (error as MongoServerError).code,\n\t\t\t\t\tcodeName: (error as MongoServerError).codeName,\n\t\t\t\t\tkeyPattern: (error as MongoServerError).keyPattern,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\treturn {\n\t\t\t\ttype: 'NodeError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tname: error.name,\n\t\t\t\t\tcode: (error as NodeJS.ErrnoException).code,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn { type: 'UnknownError', originalError: error };\n\t}\n}\n"]}
|