@scpxl/nodejs-framework 1.0.22 → 1.0.25
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/README.md +264 -26
- package/dist/api-requester/api-requester.d.ts +32 -0
- package/dist/api-requester/api-requester.d.ts.map +1 -0
- package/dist/api-requester/api-requester.js +2 -1
- package/dist/api-requester/api-requester.js.map +2 -2
- package/dist/api-requester/index.d.ts +3 -0
- package/dist/api-requester/index.d.ts.map +1 -0
- package/dist/application/base-application.d.ts +106 -0
- package/dist/application/base-application.d.ts.map +1 -0
- package/dist/application/base-application.interface.d.ts +162 -0
- package/dist/application/base-application.interface.d.ts.map +1 -0
- package/dist/application/base-application.js +7 -3
- package/dist/application/base-application.js.map +2 -2
- package/dist/application/command-application.d.ts +18 -0
- package/dist/application/command-application.d.ts.map +1 -0
- package/dist/application/command-application.interface.d.ts +26 -0
- package/dist/application/command-application.interface.d.ts.map +1 -0
- package/dist/application/index.d.ts +5 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/web-application.d.ts +43 -0
- package/dist/application/web-application.d.ts.map +1 -0
- package/dist/application/web-application.interface.d.ts +21 -0
- package/dist/application/web-application.interface.d.ts.map +1 -0
- package/dist/application/web-application.js +1 -0
- package/dist/application/web-application.js.map +2 -2
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/jwt.d.ts +25 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/manager.d.ts +107 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/manager.js +2 -1
- package/dist/cache/manager.js.map +2 -2
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +12591 -0
- package/dist/cli/index.js.map +7 -0
- package/dist/cluster/cluster-manager.d.ts +18 -0
- package/dist/cluster/cluster-manager.d.ts.map +1 -0
- package/dist/cluster/cluster-manager.interface.d.ts +23 -0
- package/dist/cluster/cluster-manager.interface.d.ts.map +1 -0
- package/dist/cluster/cluster-manager.js +45 -8
- package/dist/cluster/cluster-manager.js.map +2 -2
- package/dist/cluster/index.d.ts +2 -0
- package/dist/cluster/index.d.ts.map +1 -0
- package/dist/command/command-manager.d.ts +19 -0
- package/dist/command/command-manager.d.ts.map +1 -0
- package/dist/command/command.d.ts +27 -0
- package/dist/command/command.d.ts.map +1 -0
- package/dist/command/command.interface.d.ts +11 -0
- package/dist/command/command.interface.d.ts.map +1 -0
- package/dist/command/index.d.ts +3 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/config/env.d.ts +11 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/schema.d.ts +432 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/database/dynamic-entity-form-decorators.d.ts +31 -0
- package/dist/database/dynamic-entity-form-decorators.d.ts.map +1 -0
- package/dist/database/dynamic-entity-form-decorators.js.map +1 -1
- package/dist/database/dynamic-entity.d.ts +18 -0
- package/dist/database/dynamic-entity.d.ts.map +1 -0
- package/dist/database/dynamic-entity.js +11 -1
- package/dist/database/dynamic-entity.js.map +2 -2
- package/dist/database/index.d.ts +5 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/instance.d.ts +36 -0
- package/dist/database/instance.d.ts.map +1 -0
- package/dist/database/instance.interface.d.ts +5 -0
- package/dist/database/instance.interface.d.ts.map +1 -0
- package/dist/database/manager.d.ts +27 -0
- package/dist/database/manager.d.ts.map +1 -0
- package/dist/database/manager.interface.d.ts +18 -0
- package/dist/database/manager.interface.d.ts.map +1 -0
- package/dist/database/manager.js +3 -2
- package/dist/database/manager.js.map +2 -2
- package/dist/error/error-reporter.d.ts +109 -0
- package/dist/error/error-reporter.d.ts.map +1 -0
- package/dist/error/error-reporter.js +32 -29
- package/dist/error/error-reporter.js.map +2 -2
- package/dist/error/error.interface.d.ts +126 -0
- package/dist/error/error.interface.d.ts.map +1 -0
- package/dist/error/framework-errors.d.ts +113 -0
- package/dist/error/framework-errors.d.ts.map +1 -0
- package/dist/error/index.d.ts +6 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +3 -2
- package/dist/error/index.js.map +2 -2
- package/dist/event/controller/base.d.ts +23 -0
- package/dist/event/controller/base.d.ts.map +1 -0
- package/dist/event/controller/base.interface.d.ts +11 -0
- package/dist/event/controller/base.interface.d.ts.map +1 -0
- package/dist/event/controller/base.js +2 -1
- package/dist/event/controller/base.js.map +2 -2
- package/dist/event/index.d.ts +5 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/manager.d.ts +21 -0
- package/dist/event/manager.d.ts.map +1 -0
- package/dist/event/manager.interface.d.ts +137 -0
- package/dist/event/manager.interface.d.ts.map +1 -0
- package/dist/event/manager.js +5 -4
- package/dist/event/manager.js.map +2 -2
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/lifecycle/exit.d.ts +11 -0
- package/dist/lifecycle/exit.d.ts.map +1 -0
- package/dist/lifecycle/exit.js.map +2 -2
- package/dist/lifecycle/index.d.ts +7 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/lifecycle-manager.d.ts +66 -0
- package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -0
- package/dist/lifecycle/lifecycle-manager.js +6 -11
- package/dist/lifecycle/lifecycle-manager.js.map +2 -2
- package/dist/lifecycle/shutdown-controller.d.ts +15 -0
- package/dist/lifecycle/shutdown-controller.d.ts.map +1 -0
- package/dist/lifecycle/types.d.ts +28 -0
- package/dist/lifecycle/types.d.ts.map +1 -0
- package/dist/logger/index.d.ts +2 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/logger.d.ts +59 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.interface.d.ts +2 -0
- package/dist/logger/logger.interface.d.ts.map +1 -0
- package/dist/logger/logger.js +11 -3
- package/dist/logger/logger.js.map +2 -2
- package/dist/performance/cache-performance.d.ts +64 -0
- package/dist/performance/cache-performance.d.ts.map +1 -0
- package/dist/performance/database-performance.d.ts +40 -0
- package/dist/performance/database-performance.d.ts.map +1 -0
- package/dist/performance/index.d.ts +8 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/performance-monitor.d.ts +68 -0
- package/dist/performance/performance-monitor.d.ts.map +1 -0
- package/dist/performance/performance-monitor.js +10 -3
- package/dist/performance/performance-monitor.js.map +2 -2
- package/dist/performance/performance-monitor.plugin.d.ts +24 -0
- package/dist/performance/performance-monitor.plugin.d.ts.map +1 -0
- package/dist/performance/queue-performance.d.ts +46 -0
- package/dist/performance/queue-performance.d.ts.map +1 -0
- package/dist/performance/webserver-performance.d.ts +69 -0
- package/dist/performance/webserver-performance.d.ts.map +1 -0
- package/dist/performance/websocket-performance.d.ts +44 -0
- package/dist/performance/websocket-performance.d.ts.map +1 -0
- package/dist/queue/index.d.ts +6 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.interface.d.ts +10 -0
- package/dist/queue/index.interface.d.ts.map +1 -0
- package/dist/queue/job.interface.d.ts +43 -0
- package/dist/queue/job.interface.d.ts.map +1 -0
- package/dist/queue/manager.d.ts +44 -0
- package/dist/queue/manager.d.ts.map +1 -0
- package/dist/queue/manager.interface.d.ts +18 -0
- package/dist/queue/manager.interface.d.ts.map +1 -0
- package/dist/queue/processor/base.d.ts +29 -0
- package/dist/queue/processor/base.d.ts.map +1 -0
- package/dist/queue/processor/base.js +2 -1
- package/dist/queue/processor/base.js.map +2 -2
- package/dist/queue/processor/processor.interface.d.ts +16 -0
- package/dist/queue/processor/processor.interface.d.ts.map +1 -0
- package/dist/queue/worker.d.ts +14 -0
- package/dist/queue/worker.d.ts.map +1 -0
- package/dist/queue/worker.interface.d.ts +13 -0
- package/dist/queue/worker.interface.d.ts.map +1 -0
- package/dist/redis/index.d.ts +3 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/instance.d.ts +32 -0
- package/dist/redis/instance.d.ts.map +1 -0
- package/dist/redis/instance.interface.d.ts +9 -0
- package/dist/redis/instance.interface.d.ts.map +1 -0
- package/dist/redis/manager.d.ts +15 -0
- package/dist/redis/manager.d.ts.map +1 -0
- package/dist/redis/manager.interface.d.ts +8 -0
- package/dist/redis/manager.interface.d.ts.map +1 -0
- package/dist/redis/manager.js +16 -16
- package/dist/redis/manager.js.map +2 -2
- package/dist/request-context/index.d.ts +3 -0
- package/dist/request-context/index.d.ts.map +1 -0
- package/dist/request-context/request-context.d.ts +108 -0
- package/dist/request-context/request-context.d.ts.map +1 -0
- package/dist/request-context/request-context.interface.d.ts +46 -0
- package/dist/request-context/request-context.interface.d.ts.map +1 -0
- package/dist/schemas/common.d.ts +197 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +108 -0
- package/dist/schemas/common.js.map +7 -0
- package/dist/schemas/index.d.ts +6 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +2 -0
- package/dist/schemas/index.js.map +7 -0
- package/dist/services/aws/index.d.ts +2 -0
- package/dist/services/aws/index.d.ts.map +1 -0
- package/dist/services/aws/s3.d.ts +54 -0
- package/dist/services/aws/s3.d.ts.map +1 -0
- package/dist/services/aws/s3.interface.d.ts +14 -0
- package/dist/services/aws/s3.interface.d.ts.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/util/file.d.ts +58 -0
- package/dist/util/file.d.ts.map +1 -0
- package/dist/util/helper.d.ts +51 -0
- package/dist/util/helper.d.ts.map +1 -0
- package/dist/util/helper.js +72 -10
- package/dist/util/helper.js.map +2 -2
- package/dist/util/image.d.ts +12 -0
- package/dist/util/image.d.ts.map +1 -0
- package/dist/util/index.d.ts +11 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/loader.d.ts +21 -0
- package/dist/util/loader.d.ts.map +1 -0
- package/dist/util/loader.js +5 -2
- package/dist/util/loader.js.map +2 -2
- package/dist/util/num.d.ts +13 -0
- package/dist/util/num.d.ts.map +1 -0
- package/dist/util/os.d.ts +6 -0
- package/dist/util/os.d.ts.map +1 -0
- package/dist/util/str.d.ts +39 -0
- package/dist/util/str.d.ts.map +1 -0
- package/dist/util/time.d.ts +19 -0
- package/dist/util/time.d.ts.map +1 -0
- package/dist/util/time.interface.d.ts +12 -0
- package/dist/util/time.interface.d.ts.map +1 -0
- package/dist/util/timing.d.ts +36 -0
- package/dist/util/timing.d.ts.map +1 -0
- package/dist/util/timing.interface.d.ts +47 -0
- package/dist/util/timing.interface.d.ts.map +1 -0
- package/dist/util/url.d.ts +7 -0
- package/dist/util/url.d.ts.map +1 -0
- package/dist/webserver/controller/auth-middleware.d.ts +21 -0
- package/dist/webserver/controller/auth-middleware.d.ts.map +1 -0
- package/dist/webserver/controller/base.d.ts +41 -0
- package/dist/webserver/controller/base.d.ts.map +1 -0
- package/dist/webserver/controller/base.interface.d.ts +50 -0
- package/dist/webserver/controller/base.interface.d.ts.map +1 -0
- package/dist/webserver/controller/base.js +4 -4
- package/dist/webserver/controller/base.js.map +2 -2
- package/dist/webserver/controller/entity.d.ts +94 -0
- package/dist/webserver/controller/entity.d.ts.map +1 -0
- package/dist/webserver/controller/entity.js.map +2 -2
- package/dist/webserver/controller/example-auth.d.ts +12 -0
- package/dist/webserver/controller/example-auth.d.ts.map +1 -0
- package/dist/webserver/controller/health.d.ts +13 -0
- package/dist/webserver/controller/health.d.ts.map +1 -0
- package/dist/webserver/controller/health.js +0 -14
- package/dist/webserver/controller/health.js.map +2 -2
- package/dist/webserver/define-action.d.ts +26 -0
- package/dist/webserver/define-action.d.ts.map +1 -0
- package/dist/webserver/define-action.js +16 -0
- package/dist/webserver/define-action.js.map +7 -0
- package/dist/webserver/define-route.d.ts +53 -0
- package/dist/webserver/define-route.d.ts.map +1 -0
- package/dist/webserver/define-route.js +11 -6
- package/dist/webserver/define-route.js.map +2 -2
- package/dist/webserver/index.d.ts +14 -0
- package/dist/webserver/index.d.ts.map +1 -0
- package/dist/webserver/index.js +2 -0
- package/dist/webserver/index.js.map +2 -2
- package/dist/webserver/util.d.ts +10 -0
- package/dist/webserver/util.d.ts.map +1 -0
- package/dist/webserver/util.js +5 -2
- package/dist/webserver/util.js.map +2 -2
- package/dist/webserver/webserver.d.ts +93 -0
- package/dist/webserver/webserver.d.ts.map +1 -0
- package/dist/webserver/webserver.interface.d.ts +181 -0
- package/dist/webserver/webserver.interface.d.ts.map +1 -0
- package/dist/webserver/webserver.interface.js.map +1 -1
- package/dist/webserver/webserver.js +30 -33
- package/dist/webserver/webserver.js.map +2 -2
- package/dist/websocket/controller/client/base.d.ts +12 -0
- package/dist/websocket/controller/client/base.d.ts.map +1 -0
- package/dist/websocket/controller/client/base.interface.d.ts +12 -0
- package/dist/websocket/controller/client/base.interface.d.ts.map +1 -0
- package/dist/websocket/controller/server/base.d.ts +13 -0
- package/dist/websocket/controller/server/base.d.ts.map +1 -0
- package/dist/websocket/controller/server/base.interface.d.ts +13 -0
- package/dist/websocket/controller/server/base.interface.d.ts.map +1 -0
- package/dist/websocket/controllers/client/system.d.ts +6 -0
- package/dist/websocket/controllers/client/system.d.ts.map +1 -0
- package/dist/websocket/controllers/server/system.d.ts +7 -0
- package/dist/websocket/controllers/server/system.d.ts.map +1 -0
- package/dist/websocket/index.d.ts +9 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +2 -0
- package/dist/websocket/index.js.map +2 -2
- package/dist/websocket/routes/client/system.d.ts +3 -0
- package/dist/websocket/routes/client/system.d.ts.map +1 -0
- package/dist/websocket/routes/server/system.d.ts +3 -0
- package/dist/websocket/routes/server/system.d.ts.map +1 -0
- package/dist/websocket/utils.d.ts +9 -0
- package/dist/websocket/utils.d.ts.map +1 -0
- package/dist/websocket/websocket-auth.d.ts +17 -0
- package/dist/websocket/websocket-auth.d.ts.map +1 -0
- package/dist/websocket/websocket-auth.js +46 -0
- package/dist/websocket/websocket-auth.js.map +7 -0
- package/dist/websocket/websocket-base.d.ts +19 -0
- package/dist/websocket/websocket-base.d.ts.map +1 -0
- package/dist/websocket/websocket-client-manager.d.ts +53 -0
- package/dist/websocket/websocket-client-manager.d.ts.map +1 -0
- package/dist/websocket/websocket-client-manager.interface.d.ts +8 -0
- package/dist/websocket/websocket-client-manager.interface.d.ts.map +1 -0
- package/dist/websocket/websocket-client-manager.js +6 -5
- package/dist/websocket/websocket-client-manager.js.map +2 -2
- package/dist/websocket/websocket-client.d.ts +64 -0
- package/dist/websocket/websocket-client.d.ts.map +1 -0
- package/dist/websocket/websocket-client.interface.d.ts +14 -0
- package/dist/websocket/websocket-client.interface.d.ts.map +1 -0
- package/dist/websocket/websocket-client.js +97 -3
- package/dist/websocket/websocket-client.js.map +2 -2
- package/dist/websocket/websocket-room-manager.d.ts +32 -0
- package/dist/websocket/websocket-room-manager.d.ts.map +1 -0
- package/dist/websocket/websocket-server.d.ts +102 -0
- package/dist/websocket/websocket-server.d.ts.map +1 -0
- package/dist/websocket/websocket-server.interface.d.ts +16 -0
- package/dist/websocket/websocket-server.interface.d.ts.map +1 -0
- package/dist/websocket/websocket-server.js +62 -50
- package/dist/websocket/websocket-server.js.map +2 -2
- package/dist/websocket/websocket-service.d.ts +44 -0
- package/dist/websocket/websocket-service.d.ts.map +1 -0
- package/dist/websocket/websocket.interface.d.ts +137 -0
- package/dist/websocket/websocket.interface.d.ts.map +1 -0
- package/dist/websocket/websocket.interface.js.map +2 -2
- package/package.json +21 -24
- package/pxl.js +0 -4
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import DatabaseInstance from './instance.js';
|
|
2
|
+
import type { ApplicationDatabaseOptions } from './manager.interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* Database manager
|
|
5
|
+
*/
|
|
6
|
+
export default class DatabaseManager {
|
|
7
|
+
private logger;
|
|
8
|
+
private readonly options;
|
|
9
|
+
private instances;
|
|
10
|
+
/**
|
|
11
|
+
* Database manager constructor
|
|
12
|
+
*/
|
|
13
|
+
constructor(options: ApplicationDatabaseOptions);
|
|
14
|
+
/**
|
|
15
|
+
* Connect to database
|
|
16
|
+
*/
|
|
17
|
+
connect(): Promise<DatabaseInstance>;
|
|
18
|
+
/**
|
|
19
|
+
* Disconnect from database
|
|
20
|
+
*/
|
|
21
|
+
disconnect(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Log database message
|
|
24
|
+
*/
|
|
25
|
+
log(message: string, meta?: Record<string, unknown>): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/database/manager.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAKzE;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,OAAO,CAAC,MAAM,CAAyB;IAEvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,SAAS,CAA0B;IAE3C;;OAEG;gBACS,OAAO,EAAE,0BAA0B;IAI/C;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAiDjD;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2CxC;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAGlE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ApplicationConfig } from '../application/base-application.interface.js';
|
|
2
|
+
export interface ApplicationDatabaseOptions {
|
|
3
|
+
/** Application config */
|
|
4
|
+
applicationConfig: ApplicationConfig;
|
|
5
|
+
/** Database host */
|
|
6
|
+
host: string;
|
|
7
|
+
/** Database port */
|
|
8
|
+
port: number;
|
|
9
|
+
/** Database username */
|
|
10
|
+
username: string;
|
|
11
|
+
/** Database password */
|
|
12
|
+
password: string;
|
|
13
|
+
/** Database name */
|
|
14
|
+
databaseName: string;
|
|
15
|
+
/** Entities directory */
|
|
16
|
+
entitiesDirectory: string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=manager.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.interface.d.ts","sourceRoot":"","sources":["../../src/database/manager.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAEtF,MAAM,WAAW,0BAA0B;IACzC,yBAAyB;IACzB,iBAAiB,EAAE,iBAAiB,CAAC;IAErC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IAEb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IAEjB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IAEjB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,yBAAyB;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B"}
|
package/dist/database/manager.js
CHANGED
|
@@ -4,6 +4,7 @@ import { MikroORM } from "@mikro-orm/postgresql";
|
|
|
4
4
|
import DatabaseInstance from "./instance.js";
|
|
5
5
|
import { Logger } from "../logger/index.js";
|
|
6
6
|
import { DatabasePerformanceWrapper } from "../performance/index.js";
|
|
7
|
+
import { safeSerializeError } from "../error/error-reporter.js";
|
|
7
8
|
class DatabaseManager {
|
|
8
9
|
static {
|
|
9
10
|
__name(this, "DatabaseManager");
|
|
@@ -48,7 +49,7 @@ class DatabaseManager {
|
|
|
48
49
|
} catch (error) {
|
|
49
50
|
const duration = performance.now() - startTime;
|
|
50
51
|
this.logger.error({
|
|
51
|
-
error: error instanceof Error ? error : new Error(
|
|
52
|
+
error: error instanceof Error ? error : new Error(safeSerializeError(error)),
|
|
52
53
|
message: "Database connection failed",
|
|
53
54
|
meta: {
|
|
54
55
|
Host: this.options.host,
|
|
@@ -86,7 +87,7 @@ class DatabaseManager {
|
|
|
86
87
|
} catch (error) {
|
|
87
88
|
const duration = performance.now() - startTime;
|
|
88
89
|
this.logger.error({
|
|
89
|
-
error: error instanceof Error ? error : new Error(
|
|
90
|
+
error: error instanceof Error ? error : new Error(safeSerializeError(error)),
|
|
90
91
|
message: "Database disconnection failed",
|
|
91
92
|
meta: {
|
|
92
93
|
Host: this.options.host,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/database/manager.ts"],
|
|
4
|
-
"sourcesContent": ["import { MikroORM } from '@mikro-orm/postgresql';\nimport DatabaseInstance from './instance.js';\nimport type { ApplicationDatabaseOptions } from './manager.interface.js';\nimport { Logger } from '../logger/index.js';\nimport { DatabasePerformanceWrapper } from '../performance/index.js';\n\n/**\n * Database manager\n */\nexport default class DatabaseManager {\n private logger: typeof Logger = Logger;\n\n private readonly options: ApplicationDatabaseOptions;\n\n private instances: DatabaseInstance[] = [];\n\n /**\n * Database manager constructor\n */\n constructor(options: ApplicationDatabaseOptions) {\n this.options = options;\n }\n\n /**\n * Connect to database\n */\n public async connect(): Promise<DatabaseInstance> {\n return DatabasePerformanceWrapper.monitorConnection('connect', async () => {\n const startTime = performance.now();\n\n try {\n const orm = await MikroORM.init();\n\n const databaseInstance = new DatabaseInstance({\n databaseManager: this,\n applicationConfig: this.options.applicationConfig,\n orm,\n });\n\n this.instances.push(databaseInstance);\n\n const duration = performance.now() - startTime;\n const ormConfig = typeof orm.config?.getAll === 'function' ? orm.config.getAll() : undefined;\n const logMeta = {\n Host: ormConfig?.host ?? this.options.host,\n User: ormConfig?.user ?? this.options.username,\n Database: ormConfig?.dbName ?? this.options.databaseName,\n Duration: `${duration.toFixed(2)}ms`,\n };\n\n if (this.options.applicationConfig.log?.startUp) {\n this.log('Connected', logMeta);\n } else {\n this.logger.debug({ message: 'Database connected', meta: logMeta });\n }\n\n return databaseInstance;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n this.logger.error({\n error: error instanceof Error ? error : new Error(
|
|
5
|
-
"mappings": ";;AAAA,SAAS,gBAAgB;AACzB,OAAO,sBAAsB;AAE7B,SAAS,cAAc;AACvB,SAAS,kCAAkC;
|
|
4
|
+
"sourcesContent": ["import { MikroORM } from '@mikro-orm/postgresql';\nimport DatabaseInstance from './instance.js';\nimport type { ApplicationDatabaseOptions } from './manager.interface.js';\nimport { Logger } from '../logger/index.js';\nimport { DatabasePerformanceWrapper } from '../performance/index.js';\nimport { safeSerializeError } from '../error/error-reporter.js';\n\n/**\n * Database manager\n */\nexport default class DatabaseManager {\n private logger: typeof Logger = Logger;\n\n private readonly options: ApplicationDatabaseOptions;\n\n private instances: DatabaseInstance[] = [];\n\n /**\n * Database manager constructor\n */\n constructor(options: ApplicationDatabaseOptions) {\n this.options = options;\n }\n\n /**\n * Connect to database\n */\n public async connect(): Promise<DatabaseInstance> {\n return DatabasePerformanceWrapper.monitorConnection('connect', async () => {\n const startTime = performance.now();\n\n try {\n const orm = await MikroORM.init();\n\n const databaseInstance = new DatabaseInstance({\n databaseManager: this,\n applicationConfig: this.options.applicationConfig,\n orm,\n });\n\n this.instances.push(databaseInstance);\n\n const duration = performance.now() - startTime;\n const ormConfig = typeof orm.config?.getAll === 'function' ? orm.config.getAll() : undefined;\n const logMeta = {\n Host: ormConfig?.host ?? this.options.host,\n User: ormConfig?.user ?? this.options.username,\n Database: ormConfig?.dbName ?? this.options.databaseName,\n Duration: `${duration.toFixed(2)}ms`,\n };\n\n if (this.options.applicationConfig.log?.startUp) {\n this.log('Connected', logMeta);\n } else {\n this.logger.debug({ message: 'Database connected', meta: logMeta });\n }\n\n return databaseInstance;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n this.logger.error({\n error: error instanceof Error ? error : new Error(safeSerializeError(error)),\n message: 'Database connection failed',\n meta: {\n Host: this.options.host,\n Database: this.options.databaseName,\n Duration: `${duration.toFixed(2)}ms`,\n },\n });\n\n throw error;\n }\n });\n }\n\n /**\n * Disconnect from database\n */\n public async disconnect(): Promise<void> {\n await DatabasePerformanceWrapper.monitorConnection('disconnect', async () => {\n const startTime = performance.now();\n const instanceCount = this.instances.length;\n\n try {\n await Promise.all(this.instances.map(instance => instance.disconnect()));\n\n const duration = performance.now() - startTime;\n\n if (instanceCount > 0) {\n const meta = {\n Host: this.options.host,\n Instances: instanceCount,\n Duration: `${duration.toFixed(2)}ms`,\n };\n\n if (this.options.applicationConfig.log?.startUp) {\n this.log('Disconnected all database instances', meta);\n } else {\n this.logger.debug({ message: 'Database instances disconnected', meta });\n }\n }\n\n this.instances = [];\n } catch (error) {\n const duration = performance.now() - startTime;\n\n this.logger.error({\n error: error instanceof Error ? error : new Error(safeSerializeError(error)),\n message: 'Database disconnection failed',\n meta: {\n Host: this.options.host,\n Duration: `${duration.toFixed(2)}ms`,\n Instances: instanceCount,\n },\n });\n\n throw error;\n }\n });\n }\n\n /**\n * Log database message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({ level: 'database', message, meta });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { type ErrorEnvelope, type ErrorReportOptions } from './error.interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Safely serialize any error to a string, handling circular references gracefully
|
|
4
|
+
*
|
|
5
|
+
* This utility handles MikroORM errors and other complex error objects that may
|
|
6
|
+
* contain circular references which would cause String(error) or JSON.stringify
|
|
7
|
+
* to fail.
|
|
8
|
+
*
|
|
9
|
+
* @param error - The error to serialize
|
|
10
|
+
* @returns String representation of the error
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // Safe for MikroORM errors with circular entity metadata
|
|
15
|
+
* const message = safeSerializeError(mikroOrmError);
|
|
16
|
+
*
|
|
17
|
+
* // Works with any error type
|
|
18
|
+
* const message = safeSerializeError(unknownError);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function safeSerializeError(error: unknown): string;
|
|
22
|
+
/**
|
|
23
|
+
* Centralized error reporter for the framework
|
|
24
|
+
*
|
|
25
|
+
* Provides a unified interface for error reporting, normalization, logging,
|
|
26
|
+
* and external error tracking (Sentry). Eliminates inconsistent error handling
|
|
27
|
+
* and ensures all errors are properly structured and correlated.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const errorReporter = ErrorReporter.getInstance();
|
|
32
|
+
*
|
|
33
|
+
* // Report an error
|
|
34
|
+
* errorReporter.report(error, {
|
|
35
|
+
* context: { userId: '123', operation: 'fetchUser' },
|
|
36
|
+
* severity: ErrorSeverity.CRITICAL
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* // Report with custom code
|
|
40
|
+
* errorReporter.report(
|
|
41
|
+
* new Error('Database connection lost'),
|
|
42
|
+
* {
|
|
43
|
+
* code: ErrorCode.DATABASE_CONNECTION_FAILED,
|
|
44
|
+
* captureInSentry: true
|
|
45
|
+
* }
|
|
46
|
+
* );
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare class ErrorReporter {
|
|
50
|
+
private static instance;
|
|
51
|
+
private constructor();
|
|
52
|
+
/**
|
|
53
|
+
* Get the singleton instance
|
|
54
|
+
*/
|
|
55
|
+
static getInstance(): ErrorReporter;
|
|
56
|
+
/**
|
|
57
|
+
* Report an error through the centralized error pipeline
|
|
58
|
+
*
|
|
59
|
+
* This method:
|
|
60
|
+
* 1. Normalizes the error into a standard envelope
|
|
61
|
+
* 2. Logs the error with appropriate severity
|
|
62
|
+
* 3. Optionally captures the error in Sentry
|
|
63
|
+
* 4. Adds request correlation if available
|
|
64
|
+
*
|
|
65
|
+
* @param error - The error to report (Error, string, or unknown)
|
|
66
|
+
* @param options - Reporting options (context, severity, etc.)
|
|
67
|
+
* @returns Normalized error envelope
|
|
68
|
+
*/
|
|
69
|
+
report(error: Error | unknown, options?: ErrorReportOptions): ErrorEnvelope;
|
|
70
|
+
/**
|
|
71
|
+
* Normalize any error into a standardized ErrorEnvelope
|
|
72
|
+
*
|
|
73
|
+
* @param error - The error to normalize
|
|
74
|
+
* @param options - Optional configuration
|
|
75
|
+
* @returns Normalized error envelope
|
|
76
|
+
*/
|
|
77
|
+
private normalizeError;
|
|
78
|
+
/**
|
|
79
|
+
* Log the error with appropriate severity
|
|
80
|
+
*
|
|
81
|
+
* @param envelope - Normalized error envelope
|
|
82
|
+
*/
|
|
83
|
+
private logError;
|
|
84
|
+
/**
|
|
85
|
+
* Determine if error should be captured in Sentry
|
|
86
|
+
*
|
|
87
|
+
* @param envelope - Normalized error envelope
|
|
88
|
+
* @param options - Reporting options
|
|
89
|
+
* @returns Whether to capture in Sentry
|
|
90
|
+
*/
|
|
91
|
+
private shouldCaptureInSentry;
|
|
92
|
+
/**
|
|
93
|
+
* Capture error in Sentry with enriched context
|
|
94
|
+
*
|
|
95
|
+
* @param error - Original error
|
|
96
|
+
* @param envelope - Normalized error envelope
|
|
97
|
+
*/
|
|
98
|
+
private captureInSentry;
|
|
99
|
+
/**
|
|
100
|
+
* Map framework error severity to Sentry severity level
|
|
101
|
+
*
|
|
102
|
+
* @param severity - Framework error severity
|
|
103
|
+
* @returns Sentry severity level
|
|
104
|
+
*/
|
|
105
|
+
private mapSeverityToSentryLevel;
|
|
106
|
+
}
|
|
107
|
+
declare const _default: ErrorReporter;
|
|
108
|
+
export default _default;
|
|
109
|
+
//# sourceMappingURL=error-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-reporter.d.ts","sourceRoot":"","sources":["../../src/error/error-reporter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAiB,MAAM,sBAAsB,CAAC;AAG7G;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAiCzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IAEvC,OAAO;IAIP;;OAEG;WACW,WAAW,IAAI,aAAa;IAO1C;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,aAAa;IAiBlF;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAyDtB;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IA8BhB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IA+BvB;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;CAgBjC;;AAGD,wBAA2C"}
|
|
@@ -5,6 +5,35 @@ import { getRequestId } from "../request-context/index.js";
|
|
|
5
5
|
import Logger from "../logger/logger.js";
|
|
6
6
|
import { ErrorCode, ErrorSeverity } from "./error.interface.js";
|
|
7
7
|
import { FrameworkError } from "./framework-errors.js";
|
|
8
|
+
function safeSerializeError(error) {
|
|
9
|
+
try {
|
|
10
|
+
if (error === null) return "null";
|
|
11
|
+
if (error === void 0) return "undefined";
|
|
12
|
+
if (typeof error === "object") {
|
|
13
|
+
if ("message" in error && typeof error.message === "string") {
|
|
14
|
+
return error.message;
|
|
15
|
+
}
|
|
16
|
+
if ("toString" in error && typeof error.toString === "function") {
|
|
17
|
+
try {
|
|
18
|
+
const str = error.toString();
|
|
19
|
+
if (str !== "[object Object]") {
|
|
20
|
+
return str;
|
|
21
|
+
}
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return JSON.stringify(error);
|
|
27
|
+
} catch {
|
|
28
|
+
return "[object Object] (circular reference detected)";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return String(error);
|
|
32
|
+
} catch {
|
|
33
|
+
return "Unknown error (serialization failed)";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
__name(safeSerializeError, "safeSerializeError");
|
|
8
37
|
class ErrorReporter {
|
|
9
38
|
static {
|
|
10
39
|
__name(this, "ErrorReporter");
|
|
@@ -90,7 +119,7 @@ class ErrorReporter {
|
|
|
90
119
|
};
|
|
91
120
|
}
|
|
92
121
|
return {
|
|
93
|
-
message:
|
|
122
|
+
message: safeSerializeError(error),
|
|
94
123
|
code: options?.code ?? ErrorCode.UNKNOWN,
|
|
95
124
|
severity: options?.severity ?? ErrorSeverity.ERROR,
|
|
96
125
|
requestId,
|
|
@@ -192,37 +221,11 @@ class ErrorReporter {
|
|
|
192
221
|
return "error";
|
|
193
222
|
}
|
|
194
223
|
}
|
|
195
|
-
/**
|
|
196
|
-
* Serialize unknown error types to string
|
|
197
|
-
*
|
|
198
|
-
* @param error - Unknown error
|
|
199
|
-
* @returns String representation
|
|
200
|
-
*/
|
|
201
|
-
serializeUnknownError(error) {
|
|
202
|
-
try {
|
|
203
|
-
if (error === null) return "null";
|
|
204
|
-
if (error === void 0) return "undefined";
|
|
205
|
-
if (typeof error === "object") {
|
|
206
|
-
if ("message" in error && typeof error.message === "string") {
|
|
207
|
-
return error.message;
|
|
208
|
-
}
|
|
209
|
-
if ("toString" in error && typeof error.toString === "function") {
|
|
210
|
-
const str = error.toString();
|
|
211
|
-
if (str !== "[object Object]") {
|
|
212
|
-
return str;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return JSON.stringify(error);
|
|
216
|
-
}
|
|
217
|
-
return String(error);
|
|
218
|
-
} catch {
|
|
219
|
-
return "Unknown error (serialization failed)";
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
224
|
}
|
|
223
225
|
var error_reporter_default = ErrorReporter.getInstance();
|
|
224
226
|
export {
|
|
225
227
|
ErrorReporter,
|
|
226
|
-
error_reporter_default as default
|
|
228
|
+
error_reporter_default as default,
|
|
229
|
+
safeSerializeError
|
|
227
230
|
};
|
|
228
231
|
//# sourceMappingURL=error-reporter.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/error/error-reporter.ts"],
|
|
4
|
-
"sourcesContent": ["import * as Sentry from '@sentry/node';\nimport { getRequestId } from '../request-context/index.js';\nimport Logger from '../logger/logger.js';\nimport { ErrorCode, type ErrorEnvelope, type ErrorReportOptions, ErrorSeverity } from './error.interface.js';\nimport { FrameworkError } from './framework-errors.js';\n\n/**\n * Centralized error reporter for the framework\n *\n * Provides a unified interface for error reporting, normalization, logging,\n * and external error tracking (Sentry). Eliminates inconsistent error handling\n * and ensures all errors are properly structured and correlated.\n *\n * @example\n * ```typescript\n * const errorReporter = ErrorReporter.getInstance();\n *\n * // Report an error\n * errorReporter.report(error, {\n * context: { userId: '123', operation: 'fetchUser' },\n * severity: ErrorSeverity.CRITICAL\n * });\n *\n * // Report with custom code\n * errorReporter.report(\n * new Error('Database connection lost'),\n * {\n * code: ErrorCode.DATABASE_CONNECTION_FAILED,\n * captureInSentry: true\n * }\n * );\n * ```\n */\nexport class ErrorReporter {\n private static instance: ErrorReporter;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get the singleton instance\n */\n public static getInstance(): ErrorReporter {\n if (!ErrorReporter.instance) {\n ErrorReporter.instance = new ErrorReporter();\n }\n return ErrorReporter.instance;\n }\n\n /**\n * Report an error through the centralized error pipeline\n *\n * This method:\n * 1. Normalizes the error into a standard envelope\n * 2. Logs the error with appropriate severity\n * 3. Optionally captures the error in Sentry\n * 4. Adds request correlation if available\n *\n * @param error - The error to report (Error, string, or unknown)\n * @param options - Reporting options (context, severity, etc.)\n * @returns Normalized error envelope\n */\n public report(error: Error | unknown, options?: ErrorReportOptions): ErrorEnvelope {\n // Normalize the error into an envelope\n const envelope = this.normalizeError(error, options);\n\n // Log the error (unless explicitly disabled)\n if (options?.log !== false) {\n this.logError(envelope);\n }\n\n // Capture in Sentry (if enabled and error is significant enough)\n if (this.shouldCaptureInSentry(envelope, options)) {\n this.captureInSentry(error, envelope);\n }\n\n return envelope;\n }\n\n /**\n * Normalize any error into a standardized ErrorEnvelope\n *\n * @param error - The error to normalize\n * @param options - Optional configuration\n * @returns Normalized error envelope\n */\n private normalizeError(error: Error | unknown, options?: ErrorReportOptions): ErrorEnvelope {\n // Extract request ID from context (if available)\n const requestId = getRequestId();\n\n // Handle FrameworkError instances\n if (error instanceof FrameworkError) {\n return {\n message: error.message,\n code: options?.code ?? error.code,\n severity: options?.severity ?? error.severity,\n stack: error.stack,\n requestId,\n context: { ...error.context, ...options?.context },\n cause: error.cause,\n timestamp: error.timestamp,\n name: error.name,\n };\n }\n\n // Handle standard Error instances\n if (error instanceof Error) {\n return {\n message: error.message,\n code: options?.code ?? ErrorCode.UNKNOWN,\n severity: options?.severity ?? ErrorSeverity.ERROR,\n stack: error.stack,\n requestId,\n context: options?.context,\n cause: error.cause,\n timestamp: new Date(),\n name: error.name,\n };\n }\n\n // Handle string errors\n if (typeof error === 'string') {\n return {\n message: error,\n code: options?.code ?? ErrorCode.UNKNOWN,\n severity: options?.severity ?? ErrorSeverity.ERROR,\n requestId,\n context: options?.context,\n timestamp: new Date(),\n };\n }\n\n // Handle unknown error types\n return {\n message:
|
|
5
|
-
"mappings": ";;AAAA,YAAY,YAAY;AACxB,SAAS,oBAAoB;AAC7B,OAAO,YAAY;AACnB,SAAS,WAAwD,qBAAqB;AACtF,SAAS,sBAAsB;
|
|
4
|
+
"sourcesContent": ["import * as Sentry from '@sentry/node';\nimport { getRequestId } from '../request-context/index.js';\nimport Logger from '../logger/logger.js';\nimport { ErrorCode, type ErrorEnvelope, type ErrorReportOptions, ErrorSeverity } from './error.interface.js';\nimport { FrameworkError } from './framework-errors.js';\n\n/**\n * Safely serialize any error to a string, handling circular references gracefully\n *\n * This utility handles MikroORM errors and other complex error objects that may\n * contain circular references which would cause String(error) or JSON.stringify\n * to fail.\n *\n * @param error - The error to serialize\n * @returns String representation of the error\n *\n * @example\n * ```typescript\n * // Safe for MikroORM errors with circular entity metadata\n * const message = safeSerializeError(mikroOrmError);\n *\n * // Works with any error type\n * const message = safeSerializeError(unknownError);\n * ```\n */\nexport function safeSerializeError(error: unknown): string {\n try {\n if (error === null) return 'null';\n if (error === undefined) return 'undefined';\n\n if (typeof error === 'object') {\n // Try to extract meaningful properties\n if ('message' in error && typeof error.message === 'string') {\n return error.message;\n }\n if ('toString' in error && typeof error.toString === 'function') {\n try {\n const str = error.toString();\n if (str !== '[object Object]') {\n return str;\n }\n } catch {\n // toString() itself may throw\n }\n }\n // Fallback to JSON stringification with circular reference handling\n try {\n return JSON.stringify(error);\n } catch {\n // JSON.stringify can fail on circular references\n return '[object Object] (circular reference detected)';\n }\n }\n\n return String(error);\n } catch {\n return 'Unknown error (serialization failed)';\n }\n}\n\n/**\n * Centralized error reporter for the framework\n *\n * Provides a unified interface for error reporting, normalization, logging,\n * and external error tracking (Sentry). Eliminates inconsistent error handling\n * and ensures all errors are properly structured and correlated.\n *\n * @example\n * ```typescript\n * const errorReporter = ErrorReporter.getInstance();\n *\n * // Report an error\n * errorReporter.report(error, {\n * context: { userId: '123', operation: 'fetchUser' },\n * severity: ErrorSeverity.CRITICAL\n * });\n *\n * // Report with custom code\n * errorReporter.report(\n * new Error('Database connection lost'),\n * {\n * code: ErrorCode.DATABASE_CONNECTION_FAILED,\n * captureInSentry: true\n * }\n * );\n * ```\n */\nexport class ErrorReporter {\n private static instance: ErrorReporter;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get the singleton instance\n */\n public static getInstance(): ErrorReporter {\n if (!ErrorReporter.instance) {\n ErrorReporter.instance = new ErrorReporter();\n }\n return ErrorReporter.instance;\n }\n\n /**\n * Report an error through the centralized error pipeline\n *\n * This method:\n * 1. Normalizes the error into a standard envelope\n * 2. Logs the error with appropriate severity\n * 3. Optionally captures the error in Sentry\n * 4. Adds request correlation if available\n *\n * @param error - The error to report (Error, string, or unknown)\n * @param options - Reporting options (context, severity, etc.)\n * @returns Normalized error envelope\n */\n public report(error: Error | unknown, options?: ErrorReportOptions): ErrorEnvelope {\n // Normalize the error into an envelope\n const envelope = this.normalizeError(error, options);\n\n // Log the error (unless explicitly disabled)\n if (options?.log !== false) {\n this.logError(envelope);\n }\n\n // Capture in Sentry (if enabled and error is significant enough)\n if (this.shouldCaptureInSentry(envelope, options)) {\n this.captureInSentry(error, envelope);\n }\n\n return envelope;\n }\n\n /**\n * Normalize any error into a standardized ErrorEnvelope\n *\n * @param error - The error to normalize\n * @param options - Optional configuration\n * @returns Normalized error envelope\n */\n private normalizeError(error: Error | unknown, options?: ErrorReportOptions): ErrorEnvelope {\n // Extract request ID from context (if available)\n const requestId = getRequestId();\n\n // Handle FrameworkError instances\n if (error instanceof FrameworkError) {\n return {\n message: error.message,\n code: options?.code ?? error.code,\n severity: options?.severity ?? error.severity,\n stack: error.stack,\n requestId,\n context: { ...error.context, ...options?.context },\n cause: error.cause,\n timestamp: error.timestamp,\n name: error.name,\n };\n }\n\n // Handle standard Error instances\n if (error instanceof Error) {\n return {\n message: error.message,\n code: options?.code ?? ErrorCode.UNKNOWN,\n severity: options?.severity ?? ErrorSeverity.ERROR,\n stack: error.stack,\n requestId,\n context: options?.context,\n cause: error.cause,\n timestamp: new Date(),\n name: error.name,\n };\n }\n\n // Handle string errors\n if (typeof error === 'string') {\n return {\n message: error,\n code: options?.code ?? ErrorCode.UNKNOWN,\n severity: options?.severity ?? ErrorSeverity.ERROR,\n requestId,\n context: options?.context,\n timestamp: new Date(),\n };\n }\n\n // Handle unknown error types\n return {\n message: safeSerializeError(error),\n code: options?.code ?? ErrorCode.UNKNOWN,\n severity: options?.severity ?? ErrorSeverity.ERROR,\n requestId,\n context: { ...options?.context, originalError: error },\n timestamp: new Date(),\n };\n }\n\n /**\n * Log the error with appropriate severity\n *\n * @param envelope - Normalized error envelope\n */\n private logError(envelope: ErrorEnvelope): void {\n const meta: Record<string, unknown> = {\n code: envelope.code,\n severity: envelope.severity,\n };\n\n if (envelope.requestId) {\n meta.requestId = envelope.requestId;\n }\n\n if (envelope.context) {\n Object.assign(meta, envelope.context);\n }\n\n // Map severity to logger level\n switch (envelope.severity) {\n case ErrorSeverity.FATAL:\n case ErrorSeverity.CRITICAL:\n case ErrorSeverity.ERROR:\n Logger.error({ error: envelope.message, meta });\n break;\n case ErrorSeverity.WARNING:\n Logger.warn({ message: envelope.message, meta });\n break;\n case ErrorSeverity.INFO:\n Logger.info({ message: envelope.message, meta });\n break;\n }\n }\n\n /**\n * Determine if error should be captured in Sentry\n *\n * @param envelope - Normalized error envelope\n * @param options - Reporting options\n * @returns Whether to capture in Sentry\n */\n private shouldCaptureInSentry(envelope: ErrorEnvelope, options?: ErrorReportOptions): boolean {\n // Explicitly disabled\n if (options?.captureInSentry === false) {\n return false;\n }\n\n // Explicitly enabled\n if (options?.captureInSentry === true) {\n return true;\n }\n\n // Auto-capture for errors and above (not warnings/info)\n return (\n envelope.severity === ErrorSeverity.FATAL ||\n envelope.severity === ErrorSeverity.CRITICAL ||\n envelope.severity === ErrorSeverity.ERROR\n );\n }\n\n /**\n * Capture error in Sentry with enriched context\n *\n * @param error - Original error\n * @param envelope - Normalized error envelope\n */\n private captureInSentry(error: Error | unknown, envelope: ErrorEnvelope): void {\n // Only capture if Sentry is initialized\n if (!Logger.isSentryInitialized) {\n return;\n }\n\n // Prepare Sentry scope with enriched context\n Sentry.withScope(scope => {\n // Add severity\n scope.setLevel(this.mapSeverityToSentryLevel(envelope.severity));\n\n // Add tags\n scope.setTag('error_code', envelope.code);\n if (envelope.requestId) {\n scope.setTag('request_id', envelope.requestId);\n }\n\n // Add context\n if (envelope.context) {\n scope.setContext('error_context', envelope.context);\n }\n\n // Capture the error\n if (error instanceof Error) {\n Sentry.captureException(error);\n } else {\n Sentry.captureMessage(envelope.message, 'error');\n }\n });\n }\n\n /**\n * Map framework error severity to Sentry severity level\n *\n * @param severity - Framework error severity\n * @returns Sentry severity level\n */\n private mapSeverityToSentryLevel(severity: ErrorSeverity): Sentry.SeverityLevel {\n switch (severity) {\n case ErrorSeverity.FATAL:\n return 'fatal';\n case ErrorSeverity.CRITICAL:\n return 'error';\n case ErrorSeverity.ERROR:\n return 'error';\n case ErrorSeverity.WARNING:\n return 'warning';\n case ErrorSeverity.INFO:\n return 'info';\n default:\n return 'error';\n }\n }\n}\n\n// Export singleton instance for convenience\nexport default ErrorReporter.getInstance();\n"],
|
|
5
|
+
"mappings": ";;AAAA,YAAY,YAAY;AACxB,SAAS,oBAAoB;AAC7B,OAAO,YAAY;AACnB,SAAS,WAAwD,qBAAqB;AACtF,SAAS,sBAAsB;AAqBxB,SAAS,mBAAmB,OAAwB;AACzD,MAAI;AACF,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,UAAU,OAAW,QAAO;AAEhC,QAAI,OAAO,UAAU,UAAU;AAE7B,UAAI,aAAa,SAAS,OAAO,MAAM,YAAY,UAAU;AAC3D,eAAO,MAAM;AAAA,MACf;AACA,UAAI,cAAc,SAAS,OAAO,MAAM,aAAa,YAAY;AAC/D,YAAI;AACF,gBAAM,MAAM,MAAM,SAAS;AAC3B,cAAI,QAAQ,mBAAmB;AAC7B,mBAAO;AAAA,UACT;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,UAAI;AACF,eAAO,KAAK,UAAU,KAAK;AAAA,MAC7B,QAAQ;AAEN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,OAAO,KAAK;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAjCgB;AA8DT,MAAM,cAAc;AAAA,EAvF3B,OAuF2B;AAAA;AAAA;AAAA,EACzB,OAAe;AAAA,EAEP,cAAc;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,cAA6B;AACzC,QAAI,CAAC,cAAc,UAAU;AAC3B,oBAAc,WAAW,IAAI,cAAc;AAAA,IAC7C;AACA,WAAO,cAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeO,OAAO,OAAwB,SAA6C;AAEjF,UAAM,WAAW,KAAK,eAAe,OAAO,OAAO;AAGnD,QAAI,SAAS,QAAQ,OAAO;AAC1B,WAAK,SAAS,QAAQ;AAAA,IACxB;AAGA,QAAI,KAAK,sBAAsB,UAAU,OAAO,GAAG;AACjD,WAAK,gBAAgB,OAAO,QAAQ;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAe,OAAwB,SAA6C;AAE1F,UAAM,YAAY,aAAa;AAG/B,QAAI,iBAAiB,gBAAgB;AACnC,aAAO;AAAA,QACL,SAAS,MAAM;AAAA,QACf,MAAM,SAAS,QAAQ,MAAM;AAAA,QAC7B,UAAU,SAAS,YAAY,MAAM;AAAA,QACrC,OAAO,MAAM;AAAA,QACb;AAAA,QACA,SAAS,EAAE,GAAG,MAAM,SAAS,GAAG,SAAS,QAAQ;AAAA,QACjD,OAAO,MAAM;AAAA,QACb,WAAW,MAAM;AAAA,QACjB,MAAM,MAAM;AAAA,MACd;AAAA,IACF;AAGA,QAAI,iBAAiB,OAAO;AAC1B,aAAO;AAAA,QACL,SAAS,MAAM;AAAA,QACf,MAAM,SAAS,QAAQ,UAAU;AAAA,QACjC,UAAU,SAAS,YAAY,cAAc;AAAA,QAC7C,OAAO,MAAM;AAAA,QACb;AAAA,QACA,SAAS,SAAS;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,WAAW,oBAAI,KAAK;AAAA,QACpB,MAAM,MAAM;AAAA,MACd;AAAA,IACF;AAGA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,SAAS,QAAQ,UAAU;AAAA,QACjC,UAAU,SAAS,YAAY,cAAc;AAAA,QAC7C;AAAA,QACA,SAAS,SAAS;AAAA,QAClB,WAAW,oBAAI,KAAK;AAAA,MACtB;AAAA,IACF;AAGA,WAAO;AAAA,MACL,SAAS,mBAAmB,KAAK;AAAA,MACjC,MAAM,SAAS,QAAQ,UAAU;AAAA,MACjC,UAAU,SAAS,YAAY,cAAc;AAAA,MAC7C;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,SAAS,eAAe,MAAM;AAAA,MACrD,WAAW,oBAAI,KAAK;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,SAAS,UAA+B;AAC9C,UAAM,OAAgC;AAAA,MACpC,MAAM,SAAS;AAAA,MACf,UAAU,SAAS;AAAA,IACrB;AAEA,QAAI,SAAS,WAAW;AACtB,WAAK,YAAY,SAAS;AAAA,IAC5B;AAEA,QAAI,SAAS,SAAS;AACpB,aAAO,OAAO,MAAM,SAAS,OAAO;AAAA,IACtC;AAGA,YAAQ,SAAS,UAAU;AAAA,MACzB,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AACjB,eAAO,MAAM,EAAE,OAAO,SAAS,SAAS,KAAK,CAAC;AAC9C;AAAA,MACF,KAAK,cAAc;AACjB,eAAO,KAAK,EAAE,SAAS,SAAS,SAAS,KAAK,CAAC;AAC/C;AAAA,MACF,KAAK,cAAc;AACjB,eAAO,KAAK,EAAE,SAAS,SAAS,SAAS,KAAK,CAAC;AAC/C;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,sBAAsB,UAAyB,SAAuC;AAE5F,QAAI,SAAS,oBAAoB,OAAO;AACtC,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,oBAAoB,MAAM;AACrC,aAAO;AAAA,IACT;AAGA,WACE,SAAS,aAAa,cAAc,SACpC,SAAS,aAAa,cAAc,YACpC,SAAS,aAAa,cAAc;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBAAgB,OAAwB,UAA+B;AAE7E,QAAI,CAAC,OAAO,qBAAqB;AAC/B;AAAA,IACF;AAGA,WAAO,UAAU,WAAS;AAExB,YAAM,SAAS,KAAK,yBAAyB,SAAS,QAAQ,CAAC;AAG/D,YAAM,OAAO,cAAc,SAAS,IAAI;AACxC,UAAI,SAAS,WAAW;AACtB,cAAM,OAAO,cAAc,SAAS,SAAS;AAAA,MAC/C;AAGA,UAAI,SAAS,SAAS;AACpB,cAAM,WAAW,iBAAiB,SAAS,OAAO;AAAA,MACpD;AAGA,UAAI,iBAAiB,OAAO;AAC1B,eAAO,iBAAiB,KAAK;AAAA,MAC/B,OAAO;AACL,eAAO,eAAe,SAAS,SAAS,OAAO;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,yBAAyB,UAA+C;AAC9E,YAAQ,UAAU;AAAA,MAChB,KAAK,cAAc;AACjB,eAAO;AAAA,MACT,KAAK,cAAc;AACjB,eAAO;AAAA,MACT,KAAK,cAAc;AACjB,eAAO;AAAA,MACT,KAAK,cAAc;AACjB,eAAO;AAAA,MACT,KAAK,cAAc;AACjB,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACF;AAGA,IAAO,yBAAQ,cAAc,YAAY;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error severity levels for classification and handling
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ErrorSeverity {
|
|
5
|
+
/**
|
|
6
|
+
* Fatal errors that require immediate attention and may cause application failure
|
|
7
|
+
*/
|
|
8
|
+
FATAL = "fatal",
|
|
9
|
+
/**
|
|
10
|
+
* Critical errors that significantly impact functionality
|
|
11
|
+
*/
|
|
12
|
+
CRITICAL = "critical",
|
|
13
|
+
/**
|
|
14
|
+
* Major errors that affect features but don't crash the application
|
|
15
|
+
*/
|
|
16
|
+
ERROR = "error",
|
|
17
|
+
/**
|
|
18
|
+
* Warnings about potential issues
|
|
19
|
+
*/
|
|
20
|
+
WARNING = "warning",
|
|
21
|
+
/**
|
|
22
|
+
* Informational messages about error conditions
|
|
23
|
+
*/
|
|
24
|
+
INFO = "info"
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Standard error codes for framework errors
|
|
28
|
+
*/
|
|
29
|
+
export declare enum ErrorCode {
|
|
30
|
+
INVALID_CONFIG = "ERR_INVALID_CONFIG",
|
|
31
|
+
MISSING_CONFIG = "ERR_MISSING_CONFIG",
|
|
32
|
+
CONFIG_VALIDATION_FAILED = "ERR_CONFIG_VALIDATION_FAILED",
|
|
33
|
+
LIFECYCLE_INIT_FAILED = "ERR_LIFECYCLE_INIT_FAILED",
|
|
34
|
+
LIFECYCLE_START_FAILED = "ERR_LIFECYCLE_START_FAILED",
|
|
35
|
+
LIFECYCLE_SHUTDOWN_FAILED = "ERR_LIFECYCLE_SHUTDOWN_FAILED",
|
|
36
|
+
LIFECYCLE_TIMEOUT = "ERR_LIFECYCLE_TIMEOUT",
|
|
37
|
+
DATABASE_CONNECTION_FAILED = "ERR_DATABASE_CONNECTION_FAILED",
|
|
38
|
+
DATABASE_QUERY_FAILED = "ERR_DATABASE_QUERY_FAILED",
|
|
39
|
+
DATABASE_MIGRATION_FAILED = "ERR_DATABASE_MIGRATION_FAILED",
|
|
40
|
+
REDIS_CONNECTION_FAILED = "ERR_REDIS_CONNECTION_FAILED",
|
|
41
|
+
REDIS_COMMAND_FAILED = "ERR_REDIS_COMMAND_FAILED",
|
|
42
|
+
QUEUE_JOB_FAILED = "ERR_QUEUE_JOB_FAILED",
|
|
43
|
+
QUEUE_CONNECTION_FAILED = "ERR_QUEUE_CONNECTION_FAILED",
|
|
44
|
+
QUEUE_PROCESSOR_NOT_FOUND = "ERR_QUEUE_PROCESSOR_NOT_FOUND",
|
|
45
|
+
WEB_SERVER_START_FAILED = "ERR_WEB_SERVER_START_FAILED",
|
|
46
|
+
WEB_SERVER_REQUEST_FAILED = "ERR_WEB_SERVER_REQUEST_FAILED",
|
|
47
|
+
WEB_CONTROLLER_NOT_FOUND = "ERR_WEB_CONTROLLER_NOT_FOUND",
|
|
48
|
+
WEB_ACTION_NOT_FOUND = "ERR_WEB_ACTION_NOT_FOUND",
|
|
49
|
+
WEBSOCKET_CONNECTION_FAILED = "ERR_WEBSOCKET_CONNECTION_FAILED",
|
|
50
|
+
WEBSOCKET_MESSAGE_FAILED = "ERR_WEBSOCKET_MESSAGE_FAILED",
|
|
51
|
+
VALIDATION_FAILED = "ERR_VALIDATION_FAILED",
|
|
52
|
+
INVALID_INPUT = "ERR_INVALID_INPUT",
|
|
53
|
+
RESOURCE_NOT_FOUND = "ERR_RESOURCE_NOT_FOUND",
|
|
54
|
+
RESOURCE_ALREADY_EXISTS = "ERR_RESOURCE_ALREADY_EXISTS",
|
|
55
|
+
RESOURCE_LOCKED = "ERR_RESOURCE_LOCKED",
|
|
56
|
+
UNKNOWN = "ERR_UNKNOWN",
|
|
57
|
+
INTERNAL = "ERR_INTERNAL",
|
|
58
|
+
NOT_IMPLEMENTED = "ERR_NOT_IMPLEMENTED"
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Normalized error envelope for consistent error handling
|
|
62
|
+
*/
|
|
63
|
+
export interface ErrorEnvelope {
|
|
64
|
+
/**
|
|
65
|
+
* Error message (human-readable)
|
|
66
|
+
*/
|
|
67
|
+
message: string;
|
|
68
|
+
/**
|
|
69
|
+
* Error code (machine-readable)
|
|
70
|
+
*/
|
|
71
|
+
code: ErrorCode | string;
|
|
72
|
+
/**
|
|
73
|
+
* Error severity level
|
|
74
|
+
*/
|
|
75
|
+
severity: ErrorSeverity;
|
|
76
|
+
/**
|
|
77
|
+
* Original error stack trace
|
|
78
|
+
*/
|
|
79
|
+
stack?: string;
|
|
80
|
+
/**
|
|
81
|
+
* Request ID for correlation (if available)
|
|
82
|
+
*/
|
|
83
|
+
requestId?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Additional context about the error
|
|
86
|
+
*/
|
|
87
|
+
context?: Record<string, unknown>;
|
|
88
|
+
/**
|
|
89
|
+
* Underlying cause (if error was wrapped)
|
|
90
|
+
*/
|
|
91
|
+
cause?: unknown;
|
|
92
|
+
/**
|
|
93
|
+
* Timestamp when error occurred
|
|
94
|
+
*/
|
|
95
|
+
timestamp: Date;
|
|
96
|
+
/**
|
|
97
|
+
* Error name/type
|
|
98
|
+
*/
|
|
99
|
+
name?: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Options for error reporting
|
|
103
|
+
*/
|
|
104
|
+
export interface ErrorReportOptions {
|
|
105
|
+
/**
|
|
106
|
+
* Additional context to include with the error
|
|
107
|
+
*/
|
|
108
|
+
context?: Record<string, unknown>;
|
|
109
|
+
/**
|
|
110
|
+
* Override error severity
|
|
111
|
+
*/
|
|
112
|
+
severity?: ErrorSeverity;
|
|
113
|
+
/**
|
|
114
|
+
* Override error code
|
|
115
|
+
*/
|
|
116
|
+
code?: ErrorCode | string;
|
|
117
|
+
/**
|
|
118
|
+
* Whether to capture this error in Sentry
|
|
119
|
+
*/
|
|
120
|
+
captureInSentry?: boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Whether to log this error
|
|
123
|
+
*/
|
|
124
|
+
log?: boolean;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=error.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.interface.d.ts","sourceRoot":"","sources":["../../src/error/error.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,aAAa;IACvB;;OAEG;IACH,KAAK,UAAU;IAEf;;OAEG;IACH,QAAQ,aAAa;IAErB;;OAEG;IACH,KAAK,UAAU;IAEf;;OAEG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,IAAI,SAAS;CACd;AAED;;GAEG;AACH,oBAAY,SAAS;IAEnB,cAAc,uBAAuB;IACrC,cAAc,uBAAuB;IACrC,wBAAwB,iCAAiC;IAGzD,qBAAqB,8BAA8B;IACnD,sBAAsB,+BAA+B;IACrD,yBAAyB,kCAAkC;IAC3D,iBAAiB,0BAA0B;IAG3C,0BAA0B,mCAAmC;IAC7D,qBAAqB,8BAA8B;IACnD,yBAAyB,kCAAkC;IAG3D,uBAAuB,gCAAgC;IACvD,oBAAoB,6BAA6B;IAGjD,gBAAgB,yBAAyB;IACzC,uBAAuB,gCAAgC;IACvD,yBAAyB,kCAAkC;IAG3D,uBAAuB,gCAAgC;IACvD,yBAAyB,kCAAkC;IAC3D,wBAAwB,iCAAiC;IACzD,oBAAoB,6BAA6B;IAGjD,2BAA2B,oCAAoC;IAC/D,wBAAwB,iCAAiC;IAGzD,iBAAiB,0BAA0B;IAC3C,aAAa,sBAAsB;IAGnC,kBAAkB,2BAA2B;IAC7C,uBAAuB,gCAAgC;IACvD,eAAe,wBAAwB;IAGvC,OAAO,gBAAgB;IACvB,QAAQ,iBAAiB;IACzB,eAAe,wBAAwB;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC;IAEzB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAE1B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;CACf"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { ErrorCode, ErrorSeverity } from './error.interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Base framework error class
|
|
4
|
+
*
|
|
5
|
+
* All framework-specific errors extend this class for consistent error handling
|
|
6
|
+
*/
|
|
7
|
+
export declare class FrameworkError extends Error {
|
|
8
|
+
readonly code: ErrorCode | string;
|
|
9
|
+
readonly severity: ErrorSeverity;
|
|
10
|
+
readonly context?: Record<string, unknown>;
|
|
11
|
+
readonly timestamp: Date;
|
|
12
|
+
constructor(message: string, options?: {
|
|
13
|
+
code?: ErrorCode | string;
|
|
14
|
+
severity?: ErrorSeverity;
|
|
15
|
+
context?: Record<string, unknown>;
|
|
16
|
+
cause?: unknown;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Configuration error
|
|
21
|
+
*/
|
|
22
|
+
export declare class ConfigurationError extends FrameworkError {
|
|
23
|
+
constructor(message: string, options?: {
|
|
24
|
+
context?: Record<string, unknown>;
|
|
25
|
+
cause?: unknown;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validation error
|
|
30
|
+
*/
|
|
31
|
+
export declare class ValidationError extends FrameworkError {
|
|
32
|
+
constructor(message: string, options?: {
|
|
33
|
+
context?: Record<string, unknown>;
|
|
34
|
+
cause?: unknown;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Database error
|
|
39
|
+
*/
|
|
40
|
+
export declare class DatabaseError extends FrameworkError {
|
|
41
|
+
constructor(message: string, options?: {
|
|
42
|
+
code?: ErrorCode;
|
|
43
|
+
context?: Record<string, unknown>;
|
|
44
|
+
cause?: unknown;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Redis error
|
|
49
|
+
*/
|
|
50
|
+
export declare class RedisError extends FrameworkError {
|
|
51
|
+
constructor(message: string, options?: {
|
|
52
|
+
code?: ErrorCode;
|
|
53
|
+
context?: Record<string, unknown>;
|
|
54
|
+
cause?: unknown;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Queue error
|
|
59
|
+
*/
|
|
60
|
+
export declare class QueueError extends FrameworkError {
|
|
61
|
+
constructor(message: string, options?: {
|
|
62
|
+
code?: ErrorCode;
|
|
63
|
+
context?: Record<string, unknown>;
|
|
64
|
+
cause?: unknown;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Web server error
|
|
69
|
+
*/
|
|
70
|
+
export declare class WebServerError extends FrameworkError {
|
|
71
|
+
constructor(message: string, options?: {
|
|
72
|
+
code?: ErrorCode;
|
|
73
|
+
context?: Record<string, unknown>;
|
|
74
|
+
cause?: unknown;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* WebSocket error
|
|
79
|
+
*/
|
|
80
|
+
export declare class WebSocketError extends FrameworkError {
|
|
81
|
+
constructor(message: string, options?: {
|
|
82
|
+
code?: ErrorCode;
|
|
83
|
+
context?: Record<string, unknown>;
|
|
84
|
+
cause?: unknown;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Lifecycle error
|
|
89
|
+
*/
|
|
90
|
+
export declare class LifecycleError extends FrameworkError {
|
|
91
|
+
constructor(message: string, options?: {
|
|
92
|
+
code?: ErrorCode;
|
|
93
|
+
context?: Record<string, unknown>;
|
|
94
|
+
cause?: unknown;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Resource not found error
|
|
99
|
+
*/
|
|
100
|
+
export declare class ResourceNotFoundError extends FrameworkError {
|
|
101
|
+
constructor(message: string, options?: {
|
|
102
|
+
context?: Record<string, unknown>;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Not implemented error
|
|
107
|
+
*/
|
|
108
|
+
export declare class NotImplementedError extends FrameworkError {
|
|
109
|
+
constructor(message: string, options?: {
|
|
110
|
+
context?: Record<string, unknown>;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=framework-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-errors.d.ts","sourceRoot":"","sources":["../../src/error/framework-errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { ErrorEnvelope, ErrorReportOptions } from './error.interface.js';
|
|
2
|
+
export { ErrorCode, ErrorSeverity } from './error.interface.js';
|
|
3
|
+
export { ErrorReporter, safeSerializeError } from './error-reporter.js';
|
|
4
|
+
export { FrameworkError, ConfigurationError, ValidationError, DatabaseError, RedisError, QueueError, WebServerError, WebSocketError, LifecycleError, ResourceNotFoundError, NotImplementedError, } from './framework-errors.js';
|
|
5
|
+
export { default as errorReporter } from './error-reporter.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/error/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|