90dc-core 1.16.16 → 1.16.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/classes/Database.d.ts +2 -0
- package/dist/lib/classes/Database.d.ts.map +1 -1
- package/dist/lib/classes/Database.js +80 -8
- package/dist/lib/classes/Database.js.map +1 -1
- package/dist/lib/testing/testFixtures.d.ts +429 -0
- package/dist/lib/testing/testFixtures.d.ts.map +1 -0
- package/dist/lib/testing/testFixtures.js +520 -0
- package/dist/lib/testing/testFixtures.js.map +1 -0
- package/dist/lib/testing/testHelpers.d.ts.map +1 -1
- package/dist/lib/testing/testHelpers.js +3 -2
- package/dist/lib/testing/testHelpers.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export { Log } from "./lib/utils/Logger.js";
|
|
|
16
16
|
export { SecretManager } from "./lib/utils/SecretManager.js";
|
|
17
17
|
export { initializeSentry, isSentryEnabled, scrubObject, captureRequestBody, extractUserContext, buildRequestContext, buildResponseContext, reportErrorToSentry, reportMessageToSentry, type ErrorReportOptions, type SeverityLevel, } from "./lib/utils/SentryUtil.js";
|
|
18
18
|
export { createMockContext, createMockUser, createAuthenticatedContext, mockDatabase, flushPromises, assertions, executeRoute, type BaseContext, type AuthenticatedContext, type RouterContext, type RouterMiddleware, type RouterLayer, type RouterLike, type SequelizeModelMethods, } from "./lib/testing/testHelpers.js";
|
|
19
|
+
export { TEST_UUIDS, TEST_DATES, TEST_DATA, isValidUUID, generateTestEmail, createTestUser, createTestCoach, createTestHeadCoach, createTestFinanceUser, createTestAdmin, createTestClient, wait, freezeTime, testAssertions, mockResponses, isObject, isArray, } from "./lib/testing/testFixtures.js";
|
|
19
20
|
export { ConfigValidator, BaseConfigSchema, CommonSchemas, createConfig, ConfigurationError, type BaseConfig } from "./lib/config/ConfigValidator.js";
|
|
20
21
|
export { AppError, ValidationError, AuthenticationError, ForbiddenError, NotFoundError, ConflictError, UnprocessableEntityError, RateLimitError, InternalServerError, ServiceUnavailableError, DatabaseError, ExternalAPIError, isAppError, isOperationalError, toAppError } from "./lib/Errors/AppError.js";
|
|
21
22
|
export { ErrorMiddleware, } from "./lib/middlewares/ErrorMiddleware.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yBAAyB,CAAA;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AAChF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAA;AAChG,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,GACd,MAAM,8BAA8B,CAAA;AACrC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAGlF,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,qBAAqB,GAC3B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAG5F,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAGvF,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,cAAc,EAAE,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yBAAyB,CAAA;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AAChF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAA;AAChG,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,GACd,MAAM,8BAA8B,CAAA;AACrC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAGlF,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,qBAAqB,GAC3B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,IAAI,EACJ,UAAU,EACV,cAAc,EACd,aAAa,EACb,QAAQ,EACR,OAAO,GACR,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAG5F,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAGvF,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,cAAc,EAAE,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,8 @@ export { SecretManager } from "./lib/utils/SecretManager.js";
|
|
|
19
19
|
export { initializeSentry, isSentryEnabled, scrubObject, captureRequestBody, extractUserContext, buildRequestContext, buildResponseContext, reportErrorToSentry, reportMessageToSentry } from "./lib/utils/SentryUtil.js";
|
|
20
20
|
//Testing Utilities
|
|
21
21
|
export { createMockContext, createMockUser, createAuthenticatedContext, mockDatabase, flushPromises, assertions, executeRoute } from "./lib/testing/testHelpers.js";
|
|
22
|
+
// Testing Fixtures
|
|
23
|
+
export { TEST_UUIDS, TEST_DATES, TEST_DATA, isValidUUID, generateTestEmail, createTestUser, createTestCoach, createTestHeadCoach, createTestFinanceUser, createTestAdmin, createTestClient, wait, freezeTime, testAssertions, mockResponses, isObject, isArray } from "./lib/testing/testFixtures.js";
|
|
22
24
|
//Config
|
|
23
25
|
export { ConfigValidator, BaseConfigSchema, CommonSchemas, createConfig, ConfigurationError } from "./lib/config/ConfigValidator.js";
|
|
24
26
|
//Errors
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["//Interfaces\nexport * from \"./lib/models/ProgramInterfaces.js\";\nexport * from \"./lib/models/ExerciseInterfaces.js\";\nexport * from \"./lib/models/WorkoutInterfaces.js\";\nexport * from \"./lib/models/UserInterfaces.js\";\nexport * from \"./lib/models/NotificationInterfaces.js\";\n\n//DB Models - Export all models and model arrays\nexport * from \"./lib/dbmodels/index.js\"\n\n//Clients\nexport { EmailClient } from \"./lib/clients/EmailClient.js\"\nexport { PushNotificationClient } from \"./lib/clients/PushNotificationClient.js\"\nexport { FirebasePushNotificationClient } from \"./lib/clients/FirebasePushNotificationClient.js\"\nexport type {\n SendTemplateEmailRequest,\n BatchTemplateEmailRequest,\n EmailResponse,\n} from \"./lib/clients/EmailClient.js\"\nexport type { NotificationPayload } from \"./lib/clients/PushNotificationClient.js\"\n\n//Utils\nexport {AuthenticationUtil} from \"./lib/utils/AuthenticationUtil.js\"\nexport {NotificationsUtil} from \"./lib/utils/NotificationsUtil.js\"\nexport {NotificationClient} from \"./lib/utils/NotificationClient.js\"\nexport {Log} from \"./lib/utils/Logger.js\"\nexport {SecretManager} from \"./lib/utils/SecretManager.js\"\nexport {\n initializeSentry,\n isSentryEnabled,\n scrubObject,\n captureRequestBody,\n extractUserContext,\n buildRequestContext,\n buildResponseContext,\n reportErrorToSentry,\n reportMessageToSentry,\n type ErrorReportOptions,\n type SeverityLevel,\n} from \"./lib/utils/SentryUtil.js\"\n\n//Testing Utilities\nexport {\n createMockContext,\n createMockUser,\n createAuthenticatedContext,\n mockDatabase,\n flushPromises,\n assertions,\n executeRoute,\n type BaseContext,\n type AuthenticatedContext,\n type RouterContext,\n type RouterMiddleware,\n type RouterLayer,\n type RouterLike,\n type SequelizeModelMethods,\n} from \"./lib/testing/testHelpers.js\"\n\n//Config\nexport {\n ConfigValidator,\n BaseConfigSchema,\n CommonSchemas,\n createConfig,\n ConfigurationError,\n type BaseConfig\n} from \"./lib/config/ConfigValidator.js\"\n\n//Errors\nexport {\n AppError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n UnprocessableEntityError,\n RateLimitError,\n InternalServerError,\n ServiceUnavailableError,\n DatabaseError,\n ExternalAPIError,\n isAppError,\n isOperationalError,\n toAppError\n} from \"./lib/Errors/AppError.js\"\n\n//Middlewares\nexport {\n ErrorMiddleware,\n} from \"./lib/middlewares/ErrorMiddleware.js\"\nexport { validate, type ValidationConfig } from \"./lib/middlewares/ValidationMiddleware.js\";\n\n//Controllers\nexport { BaseController, type RouteConfig } from \"./lib/controllers/BaseController.js\";\n\n\nexport {RedisClient} from \"./lib/classes/Redis.js\"\nexport {DatabaseClient, type DatabaseConfig} from \"./lib/classes/Database.js\""],"names":["EmailClient","PushNotificationClient","FirebasePushNotificationClient","AuthenticationUtil","NotificationsUtil","NotificationClient","Log","SecretManager","initializeSentry","isSentryEnabled","scrubObject","captureRequestBody","extractUserContext","buildRequestContext","buildResponseContext","reportErrorToSentry","reportMessageToSentry","createMockContext","createMockUser","createAuthenticatedContext","mockDatabase","flushPromises","assertions","executeRoute","ConfigValidator","BaseConfigSchema","CommonSchemas","createConfig","ConfigurationError","AppError","ValidationError","AuthenticationError","ForbiddenError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","ServiceUnavailableError","DatabaseError","ExternalAPIError","isAppError","isOperationalError","toAppError","ErrorMiddleware","validate","BaseController","RedisClient","DatabaseClient"],"mappings":"AAAA,YAAY;AACZ,cAAc,oCAAoC;AAClD,cAAc,qCAAqC;AACnD,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC;AAEvD,gDAAgD;AAChD,cAAc,iBAAyB;AAEvC,SAAS;AACT,SAASA,WAAW,QAAQ,+BAA8B;AAC1D,SAASC,sBAAsB,QAAQ,0CAAyC;AAChF,SAASC,8BAA8B,QAAQ,kDAAiD;AAQhG,OAAO;AACP,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,iBAAiB,QAAO,mCAAkC;AAClE,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,GAAG,QAAO,wBAAuB;AACzC,SAAQC,aAAa,QAAO,+BAA8B;AAC1D,SACEC,gBAAgB,EAChBC,eAAe,EACfC,WAAW,EACXC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,EACnBC,oBAAoB,EACpBC,mBAAmB,EACnBC,qBAAqB,QAGhB,4BAA2B;AAElC,mBAAmB;AACnB,SACEC,iBAAiB,EACjBC,cAAc,EACdC,0BAA0B,EAC1BC,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,YAAY,QAQP,+BAA8B;AAErC,QAAQ;AACR,SACEC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,QAEb,kCAAiC;AAExC,QAAQ;AACR,SACEC,QAAQ,EACRC,eAAe,EACfC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,uBAAuB,EACvBC,aAAa,EACbC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,UAAU,QACL,2BAA0B;AAEjC,aAAa;AACb,SACEC,eAAe,QACV,uCAAsC;AAC7C,SAASC,QAAQ,QAA+B,4CAA4C;AAE5F,aAAa;AACb,SAASC,cAAc,QAA0B,sCAAsC;AAGvF,SAAQC,WAAW,QAAO,yBAAwB;AAClD,SAAQC,cAAc,QAA4B,4BAA2B"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["//Interfaces\nexport * from \"./lib/models/ProgramInterfaces.js\";\nexport * from \"./lib/models/ExerciseInterfaces.js\";\nexport * from \"./lib/models/WorkoutInterfaces.js\";\nexport * from \"./lib/models/UserInterfaces.js\";\nexport * from \"./lib/models/NotificationInterfaces.js\";\n\n//DB Models - Export all models and model arrays\nexport * from \"./lib/dbmodels/index.js\"\n\n//Clients\nexport { EmailClient } from \"./lib/clients/EmailClient.js\"\nexport { PushNotificationClient } from \"./lib/clients/PushNotificationClient.js\"\nexport { FirebasePushNotificationClient } from \"./lib/clients/FirebasePushNotificationClient.js\"\nexport type {\n SendTemplateEmailRequest,\n BatchTemplateEmailRequest,\n EmailResponse,\n} from \"./lib/clients/EmailClient.js\"\nexport type { NotificationPayload } from \"./lib/clients/PushNotificationClient.js\"\n\n//Utils\nexport {AuthenticationUtil} from \"./lib/utils/AuthenticationUtil.js\"\nexport {NotificationsUtil} from \"./lib/utils/NotificationsUtil.js\"\nexport {NotificationClient} from \"./lib/utils/NotificationClient.js\"\nexport {Log} from \"./lib/utils/Logger.js\"\nexport {SecretManager} from \"./lib/utils/SecretManager.js\"\nexport {\n initializeSentry,\n isSentryEnabled,\n scrubObject,\n captureRequestBody,\n extractUserContext,\n buildRequestContext,\n buildResponseContext,\n reportErrorToSentry,\n reportMessageToSentry,\n type ErrorReportOptions,\n type SeverityLevel,\n} from \"./lib/utils/SentryUtil.js\"\n\n//Testing Utilities\nexport {\n createMockContext,\n createMockUser,\n createAuthenticatedContext,\n mockDatabase,\n flushPromises,\n assertions,\n executeRoute,\n type BaseContext,\n type AuthenticatedContext,\n type RouterContext,\n type RouterMiddleware,\n type RouterLayer,\n type RouterLike,\n type SequelizeModelMethods,\n} from \"./lib/testing/testHelpers.js\"\n\n// Testing Fixtures\nexport {\n TEST_UUIDS,\n TEST_DATES,\n TEST_DATA,\n isValidUUID,\n generateTestEmail,\n createTestUser,\n createTestCoach,\n createTestHeadCoach,\n createTestFinanceUser,\n createTestAdmin,\n createTestClient,\n wait,\n freezeTime,\n testAssertions,\n mockResponses,\n isObject,\n isArray,\n} from \"./lib/testing/testFixtures.js\"\n\n//Config\nexport {\n ConfigValidator,\n BaseConfigSchema,\n CommonSchemas,\n createConfig,\n ConfigurationError,\n type BaseConfig\n} from \"./lib/config/ConfigValidator.js\"\n\n//Errors\nexport {\n AppError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n UnprocessableEntityError,\n RateLimitError,\n InternalServerError,\n ServiceUnavailableError,\n DatabaseError,\n ExternalAPIError,\n isAppError,\n isOperationalError,\n toAppError\n} from \"./lib/Errors/AppError.js\"\n\n//Middlewares\nexport {\n ErrorMiddleware,\n} from \"./lib/middlewares/ErrorMiddleware.js\"\nexport { validate, type ValidationConfig } from \"./lib/middlewares/ValidationMiddleware.js\";\n\n//Controllers\nexport { BaseController, type RouteConfig } from \"./lib/controllers/BaseController.js\";\n\n\nexport {RedisClient} from \"./lib/classes/Redis.js\"\nexport {DatabaseClient, type DatabaseConfig} from \"./lib/classes/Database.js\""],"names":["EmailClient","PushNotificationClient","FirebasePushNotificationClient","AuthenticationUtil","NotificationsUtil","NotificationClient","Log","SecretManager","initializeSentry","isSentryEnabled","scrubObject","captureRequestBody","extractUserContext","buildRequestContext","buildResponseContext","reportErrorToSentry","reportMessageToSentry","createMockContext","createMockUser","createAuthenticatedContext","mockDatabase","flushPromises","assertions","executeRoute","TEST_UUIDS","TEST_DATES","TEST_DATA","isValidUUID","generateTestEmail","createTestUser","createTestCoach","createTestHeadCoach","createTestFinanceUser","createTestAdmin","createTestClient","wait","freezeTime","testAssertions","mockResponses","isObject","isArray","ConfigValidator","BaseConfigSchema","CommonSchemas","createConfig","ConfigurationError","AppError","ValidationError","AuthenticationError","ForbiddenError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","ServiceUnavailableError","DatabaseError","ExternalAPIError","isAppError","isOperationalError","toAppError","ErrorMiddleware","validate","BaseController","RedisClient","DatabaseClient"],"mappings":"AAAA,YAAY;AACZ,cAAc,oCAAoC;AAClD,cAAc,qCAAqC;AACnD,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC;AAEvD,gDAAgD;AAChD,cAAc,iBAAyB;AAEvC,SAAS;AACT,SAASA,WAAW,QAAQ,+BAA8B;AAC1D,SAASC,sBAAsB,QAAQ,0CAAyC;AAChF,SAASC,8BAA8B,QAAQ,kDAAiD;AAQhG,OAAO;AACP,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,iBAAiB,QAAO,mCAAkC;AAClE,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,GAAG,QAAO,wBAAuB;AACzC,SAAQC,aAAa,QAAO,+BAA8B;AAC1D,SACEC,gBAAgB,EAChBC,eAAe,EACfC,WAAW,EACXC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,EACnBC,oBAAoB,EACpBC,mBAAmB,EACnBC,qBAAqB,QAGhB,4BAA2B;AAElC,mBAAmB;AACnB,SACEC,iBAAiB,EACjBC,cAAc,EACdC,0BAA0B,EAC1BC,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,YAAY,QAQP,+BAA8B;AAErC,mBAAmB;AACnB,SACEC,UAAU,EACVC,UAAU,EACVC,SAAS,EACTC,WAAW,EACXC,iBAAiB,EACjBC,cAAc,EACdC,eAAe,EACfC,mBAAmB,EACnBC,qBAAqB,EACrBC,eAAe,EACfC,gBAAgB,EAChBC,IAAI,EACJC,UAAU,EACVC,cAAc,EACdC,aAAa,EACbC,QAAQ,EACRC,OAAO,QACF,gCAA+B;AAEtC,QAAQ;AACR,SACEC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,QAEb,kCAAiC;AAExC,QAAQ;AACR,SACEC,QAAQ,EACRC,eAAe,EACfC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,uBAAuB,EACvBC,aAAa,EACbC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,UAAU,QACL,2BAA0B;AAEjC,aAAa;AACb,SACEC,eAAe,QACV,uCAAsC;AAC7C,SAASC,QAAQ,QAA+B,4CAA4C;AAE5F,aAAa;AACb,SAASC,cAAc,QAA0B,sCAAsC;AAGvF,SAAQC,WAAW,QAAO,yBAAwB;AAClD,SAAQC,cAAc,QAA4B,4BAA2B"}
|
|
@@ -5,6 +5,7 @@ export interface DatabaseConfig {
|
|
|
5
5
|
DB_POOL_MIN?: number;
|
|
6
6
|
DB_ACQUIRE_TIMEOUT?: number;
|
|
7
7
|
DB_IDLE_TIMEOUT?: number;
|
|
8
|
+
DB_EVICT_INTERVAL?: number;
|
|
8
9
|
logging?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export declare class DatabaseClient {
|
|
@@ -19,5 +20,6 @@ export declare class DatabaseClient {
|
|
|
19
20
|
}): Promise<void>;
|
|
20
21
|
static isConnectedToDatabase(): boolean;
|
|
21
22
|
static getSequelizeInstance(): Sequelize;
|
|
23
|
+
private static setupPoolMonitoring;
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=Database.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/lib/classes/Database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkB;IAE5C,MAAM,CAAC,WAAW,CACd,MAAM,CAAC,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,SAAS,EAAE,GACrB,SAAS;
|
|
1
|
+
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/lib/classes/Database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkB;IAE5C,MAAM,CAAC,WAAW,CACd,MAAM,CAAC,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,SAAS,EAAE,GACrB,SAAS;WA4CC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;WA2C7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;WAStB,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhF,MAAM,CAAC,qBAAqB,IAAI,OAAO;IAKvC,MAAM,CAAC,oBAAoB,IAAI,SAAS;IASxC,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAkDrC"}
|
|
@@ -9,17 +9,19 @@ export class DatabaseClient {
|
|
|
9
9
|
if (!config) {
|
|
10
10
|
throw new Error("DatabaseClient: config is required for first initialization");
|
|
11
11
|
}
|
|
12
|
+
const poolConfig = {
|
|
13
|
+
max: config.DB_POOL_MAX || 10,
|
|
14
|
+
min: config.DB_POOL_MIN || 0,
|
|
15
|
+
acquire: config.DB_ACQUIRE_TIMEOUT || 60000,
|
|
16
|
+
idle: config.DB_IDLE_TIMEOUT || 10000,
|
|
17
|
+
evict: config.DB_EVICT_INTERVAL || 5000
|
|
18
|
+
};
|
|
12
19
|
const options = {
|
|
13
20
|
dialect: "postgres",
|
|
14
21
|
dialectOptions: {
|
|
15
22
|
socketPath: new URL(config.DATABASE_URL).hostname
|
|
16
23
|
},
|
|
17
|
-
pool:
|
|
18
|
-
max: config.DB_POOL_MAX || 10,
|
|
19
|
-
min: config.DB_POOL_MIN || 0,
|
|
20
|
-
acquire: config.DB_ACQUIRE_TIMEOUT || 60000,
|
|
21
|
-
idle: config.DB_IDLE_TIMEOUT || 10000
|
|
22
|
-
},
|
|
24
|
+
pool: poolConfig,
|
|
23
25
|
logging: config.logging !== false ? (msg)=>logger.debug(msg) : false,
|
|
24
26
|
models: models || [],
|
|
25
27
|
define: {
|
|
@@ -27,7 +29,11 @@ export class DatabaseClient {
|
|
|
27
29
|
}
|
|
28
30
|
};
|
|
29
31
|
DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);
|
|
30
|
-
logger.info("DatabaseClient: Sequelize instance created"
|
|
32
|
+
logger.info("DatabaseClient: Sequelize instance created", {
|
|
33
|
+
poolConfig
|
|
34
|
+
});
|
|
35
|
+
// Set up connection pool monitoring
|
|
36
|
+
DatabaseClient.setupPoolMonitoring();
|
|
31
37
|
} else if (models && models.length > 0) {
|
|
32
38
|
DatabaseClient.instance.addModels(models);
|
|
33
39
|
logger.info(`DatabaseClient: Added ${models.length} additional models`);
|
|
@@ -44,7 +50,29 @@ export class DatabaseClient {
|
|
|
44
50
|
logger.info("DatabaseClient: Connection authenticated successfully");
|
|
45
51
|
} catch (error) {
|
|
46
52
|
DatabaseClient.isConnected = false;
|
|
47
|
-
|
|
53
|
+
// Enhanced error handling for common connection issues
|
|
54
|
+
if (error instanceof Error) {
|
|
55
|
+
if (error.message.includes("too many clients")) {
|
|
56
|
+
logger.error("DatabaseClient: PostgreSQL connection pool exhausted", {
|
|
57
|
+
error: error.message,
|
|
58
|
+
recommendation: "Increase DB_POOL_MAX or check for connection leaks"
|
|
59
|
+
});
|
|
60
|
+
} else if (error.message.includes("timeout")) {
|
|
61
|
+
logger.error("DatabaseClient: Connection timeout", {
|
|
62
|
+
error: error.message,
|
|
63
|
+
recommendation: "Check network connectivity or increase DB_ACQUIRE_TIMEOUT"
|
|
64
|
+
});
|
|
65
|
+
} else if (error.message.includes("authentication failed")) {
|
|
66
|
+
logger.error("DatabaseClient: Authentication failed", {
|
|
67
|
+
error: error.message,
|
|
68
|
+
recommendation: "Verify DB credentials in environment variables"
|
|
69
|
+
});
|
|
70
|
+
} else {
|
|
71
|
+
logger.error("DatabaseClient: Unable to connect to database", error);
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
logger.error("DatabaseClient: Unable to connect to database", error);
|
|
75
|
+
}
|
|
48
76
|
throw error;
|
|
49
77
|
}
|
|
50
78
|
}
|
|
@@ -77,6 +105,50 @@ export class DatabaseClient {
|
|
|
77
105
|
}
|
|
78
106
|
return DatabaseClient.instance;
|
|
79
107
|
}
|
|
108
|
+
static setupPoolMonitoring() {
|
|
109
|
+
if (!DatabaseClient.instance) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const pool = DatabaseClient.instance.connectionManager?.pool;
|
|
113
|
+
if (!pool) {
|
|
114
|
+
logger.warn("DatabaseClient: Connection pool not available for monitoring");
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Log pool stats every 60 seconds in production
|
|
118
|
+
if (process.env.NODE_ENV === "production") {
|
|
119
|
+
setInterval(()=>{
|
|
120
|
+
try {
|
|
121
|
+
const stats = {
|
|
122
|
+
size: pool.size,
|
|
123
|
+
available: pool.available,
|
|
124
|
+
using: pool.using,
|
|
125
|
+
waiting: pool.waiting
|
|
126
|
+
};
|
|
127
|
+
// Only log if pool is being used or has waiting requests
|
|
128
|
+
if (stats.using > 0 || stats.waiting > 0) {
|
|
129
|
+
logger.info("DatabaseClient: Pool stats", stats);
|
|
130
|
+
}
|
|
131
|
+
// Warn if pool is near capacity
|
|
132
|
+
if (stats.using >= pool.max * 0.8) {
|
|
133
|
+
logger.warn("DatabaseClient: Pool usage high", {
|
|
134
|
+
...stats,
|
|
135
|
+
capacityPercent: Math.round(stats.using / pool.max * 100)
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// Alert if requests are waiting
|
|
139
|
+
if (stats.waiting > 0) {
|
|
140
|
+
logger.error("DatabaseClient: Connections waiting for pool", {
|
|
141
|
+
...stats,
|
|
142
|
+
message: "Consider increasing DB_POOL_MAX"
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
} catch (error) {
|
|
146
|
+
logger.debug("DatabaseClient: Error reading pool stats", error);
|
|
147
|
+
}
|
|
148
|
+
}, 60000); // Every 60 seconds
|
|
149
|
+
}
|
|
150
|
+
logger.info("DatabaseClient: Pool monitoring enabled");
|
|
151
|
+
}
|
|
80
152
|
}
|
|
81
153
|
|
|
82
154
|
//# sourceMappingURL=Database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/classes/Database.ts"],"sourcesContent":["import { Sequelize, type SequelizeOptions, type ModelCtor } from \"sequelize-typescript\";\nimport { Log } from \"../utils/Logger.js\";\n\nconst logger = Log.getInstance();\n\nexport interface DatabaseConfig {\n DATABASE_URL: string;\n DB_POOL_MAX?: number;\n DB_POOL_MIN?: number;\n DB_ACQUIRE_TIMEOUT?: number;\n DB_IDLE_TIMEOUT?: number;\n logging?: boolean;\n}\n\nexport class DatabaseClient {\n private static instance: Sequelize | null = null;\n private static isConnected: boolean = false;\n\n static getInstance(\n config?: DatabaseConfig,\n models?: ModelCtor[],\n ): Sequelize {\n if (!DatabaseClient.instance) {\n if (!config) {\n throw new Error(\n \"DatabaseClient: config is required for first initialization\",\n );\n }\n\n const options: SequelizeOptions = {\n dialect: \"postgres\",\n dialectOptions: {\n socketPath: new URL(config.DATABASE_URL).hostname,\n },\n pool: {\n max: config.DB_POOL_MAX || 10,\n min: config.DB_POOL_MIN || 0,\n acquire: config.DB_ACQUIRE_TIMEOUT || 60000,\n idle: config.DB_IDLE_TIMEOUT || 10000,\n },\n logging: config.logging !== false ? (msg: string) => logger.debug(msg) : false,\n models: models || [],\n define: {\n timestamps: false\n }\n };\n\n DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);\n logger.info(\"DatabaseClient: Sequelize instance created\");\n } else if (models && models.length > 0) {\n DatabaseClient.instance.addModels(models);\n logger.info(`DatabaseClient: Added ${models.length} additional models`);\n }\n\n return DatabaseClient.instance;\n }\n\n static async authenticate(): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before authenticate()\",\n );\n }\n\n try {\n await DatabaseClient.instance.authenticate();\n DatabaseClient.isConnected = true;\n logger.info(\"DatabaseClient: Connection authenticated successfully\");\n } catch (error) {\n DatabaseClient.isConnected = false;\n logger.error(\"DatabaseClient: Unable to connect to database\", error);\n throw error;\n }\n }\n\n\n static async close(): Promise<void> {\n if (DatabaseClient.instance) {\n await DatabaseClient.instance.close();\n DatabaseClient.instance = null;\n DatabaseClient.isConnected = false;\n logger.info(\"DatabaseClient: Connection closed\");\n }\n }\n\n static async sync(options?: { force?: boolean; alter?: boolean }): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before sync()\",\n );\n }\n\n try {\n await DatabaseClient.instance.sync(options);\n logger.info(\"DatabaseClient: Models synced with database\", options);\n } catch (error) {\n logger.error(\"DatabaseClient: Failed to sync models\", error);\n throw error;\n }\n }\n\n\n static isConnectedToDatabase(): boolean {\n return DatabaseClient.isConnected;\n }\n\n\n static getSequelizeInstance(): Sequelize {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before getSequelizeInstance()\",\n );\n }\n return DatabaseClient.instance;\n }\n}\n"],"names":["Sequelize","Log","logger","getInstance","DatabaseClient","instance","isConnected","config","models","Error","options","dialect","dialectOptions","socketPath","URL","DATABASE_URL","hostname","pool","max","DB_POOL_MAX","min","DB_POOL_MIN","acquire","DB_ACQUIRE_TIMEOUT","idle","DB_IDLE_TIMEOUT","logging","msg","debug","define","timestamps","info","length","addModels","authenticate","error","close","sync","isConnectedToDatabase","getSequelizeInstance"],"mappings":"AAAA,SAASA,SAAS,QAA+C,uBAAuB;AACxF,SAASC,GAAG,QAAQ,qBAAqB;AAEzC,MAAMC,SAASD,IAAIE,WAAW;AAW9B,OAAO,MAAMC;IACT,OAAeC,WAA6B,KAAK;IACjD,OAAeC,cAAuB,MAAM;IAE5C,OAAOH,YACHI,MAAuB,EACvBC,MAAoB,EACX;QACT,IAAI,CAACJ,eAAeC,QAAQ,EAAE;YAC1B,IAAI,CAACE,QAAQ;gBACT,MAAM,IAAIE,MACN;YAER;YAEA,MAAMC,UAA4B;gBAC9BC,SAAS;gBACTC,gBAAgB;oBACZC,YAAY,IAAIC,IAAIP,OAAOQ,YAAY,EAAEC,QAAQ;gBACrD;gBACAC,MAAM;oBACFC,KAAKX,OAAOY,WAAW,IAAI;oBAC3BC,KAAKb,OAAOc,WAAW,IAAI;oBAC3BC,SAASf,OAAOgB,kBAAkB,IAAI;oBACtCC,MAAMjB,OAAOkB,eAAe,IAAI;gBACpC;gBACAC,SAASnB,OAAOmB,OAAO,KAAK,QAAQ,CAACC,MAAgBzB,OAAO0B,KAAK,CAACD,OAAO;gBACzEnB,QAAQA,UAAU,EAAE;gBACpBqB,QAAQ;oBACJC,YAAY;gBAChB;YACJ;YAEA1B,eAAeC,QAAQ,GAAG,IAAIL,UAAUO,OAAOQ,YAAY,EAAEL;YAC7DR,OAAO6B,IAAI,CAAC;QAChB,OAAO,IAAIvB,UAAUA,OAAOwB,MAAM,GAAG,GAAG;YACpC5B,eAAeC,QAAQ,CAAC4B,SAAS,CAACzB;YAClCN,OAAO6B,IAAI,CAAC,CAAC,sBAAsB,EAAEvB,OAAOwB,MAAM,CAAC,kBAAkB,CAAC;QAC1E;QAEA,OAAO5B,eAAeC,QAAQ;IAClC;IAEA,aAAa6B,eAA8B;QACvC,IAAI,CAAC9B,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QAEA,IAAI;YACA,MAAML,eAAeC,QAAQ,CAAC6B,YAAY;YAC1C9B,eAAeE,WAAW,GAAG;YAC7BJ,OAAO6B,IAAI,CAAC;QAChB,EAAE,OAAOI,OAAO;YACZ/B,eAAeE,WAAW,GAAG;YAC7BJ,OAAOiC,KAAK,CAAC,iDAAiDA;YAC9D,MAAMA;QACV;IACJ;IAGA,aAAaC,QAAuB;QAChC,IAAIhC,eAAeC,QAAQ,EAAE;YACzB,MAAMD,eAAeC,QAAQ,CAAC+B,KAAK;YACnChC,eAAeC,QAAQ,GAAG;YAC1BD,eAAeE,WAAW,GAAG;YAC7BJ,OAAO6B,IAAI,CAAC;QAChB;IACJ;IAEA,aAAaM,KAAK3B,OAA8C,EAAiB;QAC7E,IAAI,CAACN,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QAEA,IAAI;YACA,MAAML,eAAeC,QAAQ,CAACgC,IAAI,CAAC3B;YACnCR,OAAO6B,IAAI,CAAC,+CAA+CrB;QAC/D,EAAE,OAAOyB,OAAO;YACZjC,OAAOiC,KAAK,CAAC,yCAAyCA;YACtD,MAAMA;QACV;IACJ;IAGA,OAAOG,wBAAiC;QACpC,OAAOlC,eAAeE,WAAW;IACrC;IAGA,OAAOiC,uBAAkC;QACrC,IAAI,CAACnC,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QACA,OAAOL,eAAeC,QAAQ;IAClC;AACJ"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/classes/Database.ts"],"sourcesContent":["import { Sequelize, type SequelizeOptions, type ModelCtor } from \"sequelize-typescript\";\nimport { Log } from \"../utils/Logger.js\";\n\nconst logger = Log.getInstance();\n\nexport interface DatabaseConfig {\n DATABASE_URL: string;\n DB_POOL_MAX?: number;\n DB_POOL_MIN?: number;\n DB_ACQUIRE_TIMEOUT?: number;\n DB_IDLE_TIMEOUT?: number;\n DB_EVICT_INTERVAL?: number;\n logging?: boolean;\n}\n\nexport class DatabaseClient {\n private static instance: Sequelize | null = null;\n private static isConnected: boolean = false;\n\n static getInstance(\n config?: DatabaseConfig,\n models?: ModelCtor[],\n ): Sequelize {\n if (!DatabaseClient.instance) {\n if (!config) {\n throw new Error(\n \"DatabaseClient: config is required for first initialization\",\n );\n }\n\n const poolConfig = {\n max: config.DB_POOL_MAX || 10,\n min: config.DB_POOL_MIN || 0,\n acquire: config.DB_ACQUIRE_TIMEOUT || 60000,\n idle: config.DB_IDLE_TIMEOUT || 10000,\n evict: config.DB_EVICT_INTERVAL || 5000,\n };\n\n const options: SequelizeOptions = {\n dialect: \"postgres\",\n dialectOptions: {\n socketPath: new URL(config.DATABASE_URL).hostname,\n },\n pool: poolConfig,\n logging: config.logging !== false ? (msg: string) => logger.debug(msg) : false,\n models: models || [],\n define: {\n timestamps: false\n }\n };\n\n DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);\n logger.info(\"DatabaseClient: Sequelize instance created\", {\n poolConfig,\n });\n\n // Set up connection pool monitoring\n DatabaseClient.setupPoolMonitoring();\n } else if (models && models.length > 0) {\n DatabaseClient.instance.addModels(models);\n logger.info(`DatabaseClient: Added ${models.length} additional models`);\n }\n\n return DatabaseClient.instance;\n }\n\n static async authenticate(): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before authenticate()\",\n );\n }\n\n try {\n await DatabaseClient.instance.authenticate();\n DatabaseClient.isConnected = true;\n logger.info(\"DatabaseClient: Connection authenticated successfully\");\n } catch (error) {\n DatabaseClient.isConnected = false;\n\n // Enhanced error handling for common connection issues\n if (error instanceof Error) {\n if (error.message.includes(\"too many clients\")) {\n logger.error(\"DatabaseClient: PostgreSQL connection pool exhausted\", {\n error: error.message,\n recommendation: \"Increase DB_POOL_MAX or check for connection leaks\",\n });\n } else if (error.message.includes(\"timeout\")) {\n logger.error(\"DatabaseClient: Connection timeout\", {\n error: error.message,\n recommendation: \"Check network connectivity or increase DB_ACQUIRE_TIMEOUT\",\n });\n } else if (error.message.includes(\"authentication failed\")) {\n logger.error(\"DatabaseClient: Authentication failed\", {\n error: error.message,\n recommendation: \"Verify DB credentials in environment variables\",\n });\n } else {\n logger.error(\"DatabaseClient: Unable to connect to database\", error);\n }\n } else {\n logger.error(\"DatabaseClient: Unable to connect to database\", error);\n }\n\n throw error;\n }\n }\n\n\n static async close(): Promise<void> {\n if (DatabaseClient.instance) {\n await DatabaseClient.instance.close();\n DatabaseClient.instance = null;\n DatabaseClient.isConnected = false;\n logger.info(\"DatabaseClient: Connection closed\");\n }\n }\n\n static async sync(options?: { force?: boolean; alter?: boolean }): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before sync()\",\n );\n }\n\n try {\n await DatabaseClient.instance.sync(options);\n logger.info(\"DatabaseClient: Models synced with database\", options);\n } catch (error) {\n logger.error(\"DatabaseClient: Failed to sync models\", error);\n throw error;\n }\n }\n\n\n static isConnectedToDatabase(): boolean {\n return DatabaseClient.isConnected;\n }\n\n\n static getSequelizeInstance(): Sequelize {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before getSequelizeInstance()\",\n );\n }\n return DatabaseClient.instance;\n }\n\n private static setupPoolMonitoring(): void {\n if (!DatabaseClient.instance) {\n return;\n }\n\n const pool = (DatabaseClient.instance as any).connectionManager?.pool;\n if (!pool) {\n logger.warn(\"DatabaseClient: Connection pool not available for monitoring\");\n return;\n }\n\n // Log pool stats every 60 seconds in production\n if (process.env.NODE_ENV === \"production\") {\n setInterval(() => {\n try {\n const stats = {\n size: pool.size,\n available: pool.available,\n using: pool.using,\n waiting: pool.waiting,\n };\n\n // Only log if pool is being used or has waiting requests\n if (stats.using > 0 || stats.waiting > 0) {\n logger.info(\"DatabaseClient: Pool stats\", stats);\n }\n\n // Warn if pool is near capacity\n if (stats.using >= pool.max * 0.8) {\n logger.warn(\"DatabaseClient: Pool usage high\", {\n ...stats,\n capacityPercent: Math.round((stats.using / pool.max) * 100),\n });\n }\n\n // Alert if requests are waiting\n if (stats.waiting > 0) {\n logger.error(\"DatabaseClient: Connections waiting for pool\", {\n ...stats,\n message: \"Consider increasing DB_POOL_MAX\",\n });\n }\n } catch (error) {\n logger.debug(\"DatabaseClient: Error reading pool stats\", error);\n }\n }, 60000); // Every 60 seconds\n }\n\n logger.info(\"DatabaseClient: Pool monitoring enabled\");\n }\n}\n"],"names":["Sequelize","Log","logger","getInstance","DatabaseClient","instance","isConnected","config","models","Error","poolConfig","max","DB_POOL_MAX","min","DB_POOL_MIN","acquire","DB_ACQUIRE_TIMEOUT","idle","DB_IDLE_TIMEOUT","evict","DB_EVICT_INTERVAL","options","dialect","dialectOptions","socketPath","URL","DATABASE_URL","hostname","pool","logging","msg","debug","define","timestamps","info","setupPoolMonitoring","length","addModels","authenticate","error","message","includes","recommendation","close","sync","isConnectedToDatabase","getSequelizeInstance","connectionManager","warn","process","env","NODE_ENV","setInterval","stats","size","available","using","waiting","capacityPercent","Math","round"],"mappings":"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"}
|