@dumanarge/xssrv-shared-lib 1.0.3 → 1.0.4

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.
Files changed (72) hide show
  1. package/dist/auth/tenant.middleware.d.ts +6 -1
  2. package/dist/auth/tenant.middleware.js +10 -3
  3. package/dist/auth/tenant.middleware.js.map +1 -1
  4. package/dist/context/index.d.ts +3 -0
  5. package/dist/context/index.js +11 -0
  6. package/dist/context/index.js.map +1 -0
  7. package/dist/context/observability-context.d.ts +23 -0
  8. package/dist/context/observability-context.js +71 -0
  9. package/dist/context/observability-context.js.map +1 -0
  10. package/dist/context/observability.interceptor.d.ts +5 -0
  11. package/dist/context/observability.interceptor.js +72 -0
  12. package/dist/context/observability.interceptor.js.map +1 -0
  13. package/dist/context/observability.middleware.d.ts +5 -0
  14. package/dist/context/observability.middleware.js +36 -0
  15. package/dist/context/observability.middleware.js.map +1 -0
  16. package/dist/errors/app-error.d.ts +22 -0
  17. package/dist/errors/app-error.js +94 -0
  18. package/dist/errors/app-error.js.map +1 -0
  19. package/dist/errors/app-error.types.d.ts +44 -0
  20. package/dist/errors/app-error.types.js +3 -0
  21. package/dist/errors/app-error.types.js.map +1 -0
  22. package/dist/errors/error-category.d.ts +22 -0
  23. package/dist/errors/error-category.js +42 -0
  24. package/dist/errors/error-category.js.map +1 -0
  25. package/dist/errors/error-registry.d.ts +5 -0
  26. package/dist/errors/error-registry.js +26 -0
  27. package/dist/errors/error-registry.js.map +1 -0
  28. package/dist/errors/index.d.ts +4 -0
  29. package/dist/errors/index.js +14 -0
  30. package/dist/errors/index.js.map +1 -0
  31. package/dist/filters/grpc-app-exception.filter.d.ts +11 -0
  32. package/dist/filters/grpc-app-exception.filter.js +177 -0
  33. package/dist/filters/grpc-app-exception.filter.js.map +1 -0
  34. package/dist/filters/http-app-exception.filter.d.ts +7 -0
  35. package/dist/filters/http-app-exception.filter.js +196 -0
  36. package/dist/filters/http-app-exception.filter.js.map +1 -0
  37. package/dist/filters/index.d.ts +3 -0
  38. package/dist/filters/index.js +13 -0
  39. package/dist/filters/index.js.map +1 -0
  40. package/dist/filters/severity.d.ts +7 -0
  41. package/dist/filters/severity.js +51 -0
  42. package/dist/filters/severity.js.map +1 -0
  43. package/dist/index.d.ts +8 -0
  44. package/dist/index.js +28 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/logging/http-exception.filter.d.ts +1 -0
  47. package/dist/logging/http-exception.filter.js +6 -0
  48. package/dist/logging/http-exception.filter.js.map +1 -0
  49. package/dist/logging/logging.module.d.ts +22 -5
  50. package/dist/logging/logging.module.js +39 -10
  51. package/dist/logging/logging.module.js.map +1 -1
  52. package/dist/logging/request-logging.interceptor.d.ts +5 -0
  53. package/dist/logging/request-logging.interceptor.js +59 -0
  54. package/dist/logging/request-logging.interceptor.js.map +1 -0
  55. package/dist/metrics/index.d.ts +1 -0
  56. package/dist/metrics/index.js +9 -0
  57. package/dist/metrics/index.js.map +1 -0
  58. package/dist/metrics/metrics.d.ts +17 -0
  59. package/dist/metrics/metrics.js +31 -0
  60. package/dist/metrics/metrics.js.map +1 -0
  61. package/dist/observability/error-observability.d.ts +31 -0
  62. package/dist/observability/error-observability.js +141 -0
  63. package/dist/observability/error-observability.js.map +1 -0
  64. package/dist/observability/otel-log-emitter.d.ts +10 -0
  65. package/dist/observability/otel-log-emitter.js +47 -0
  66. package/dist/observability/otel-log-emitter.js.map +1 -0
  67. package/dist/observability/request-context.d.ts +12 -0
  68. package/dist/observability/request-context.js +49 -0
  69. package/dist/observability/request-context.js.map +1 -0
  70. package/dist/tracing/tracing.js +22 -0
  71. package/dist/tracing/tracing.js.map +1 -1
  72. package/package.json +24 -1
@@ -21,8 +21,13 @@ export declare class TenantGuard implements CanActivate {
21
21
  canActivate(context: ExecutionContext): boolean;
22
22
  }
23
23
  export declare function createPrismaTenantMiddleware(getTenantId: () => string): (params: any, next: (params: any) => Promise<any>) => Promise<any>;
24
- export declare function extractTenantFromGrpcMetadata(metadata: any): {
24
+ export declare function extractTenantFromGrpcMetadata(metadata: {
25
+ get: (key: string) => unknown[] | undefined;
26
+ }): {
25
27
  tenantId: string;
26
28
  userId: string | null;
27
29
  roles: string[];
30
+ accountId?: string;
31
+ email?: string;
32
+ requestId?: string;
28
33
  };
@@ -120,10 +120,17 @@ function createPrismaTenantMiddleware(getTenantId) {
120
120
  };
121
121
  }
122
122
  function extractTenantFromGrpcMetadata(metadata) {
123
+ const first = (key) => {
124
+ const raw = metadata.get(key)?.[0];
125
+ return raw != null && raw !== '' ? String(raw) : undefined;
126
+ };
123
127
  return {
124
- tenantId: metadata.get('x-tenant-id')?.[0] || '',
125
- userId: metadata.get('x-user-id')?.[0] || null,
126
- roles: (metadata.get('x-roles')?.[0] || '').split(',').filter(Boolean),
128
+ tenantId: first('x-tenant-id') ?? '',
129
+ userId: first('x-user-id') ?? null,
130
+ roles: (first('x-roles') ?? '').split(',').filter(Boolean),
131
+ accountId: first('x-account-id'),
132
+ email: first('x-user-email') ?? first('x-email'),
133
+ requestId: first('x-request-id'),
127
134
  };
128
135
  }
129
136
  //# sourceMappingURL=tenant.middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenant.middleware.js","sourceRoot":"","sources":["../../src/auth/tenant.middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tenant.middleware.js","sourceRoot":"","sources":["../../src/auth/tenant.middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ObservabilityContext, createHttpObservabilityContext, type ObservabilityContextData, } from './observability-context';
2
+ export { ObservabilityMiddleware } from './observability.middleware';
3
+ export { ObservabilityGrpcInterceptor } from './observability.interceptor';
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObservabilityGrpcInterceptor = exports.ObservabilityMiddleware = exports.createHttpObservabilityContext = exports.ObservabilityContext = void 0;
4
+ var observability_context_1 = require("./observability-context");
5
+ Object.defineProperty(exports, "ObservabilityContext", { enumerable: true, get: function () { return observability_context_1.ObservabilityContext; } });
6
+ Object.defineProperty(exports, "createHttpObservabilityContext", { enumerable: true, get: function () { return observability_context_1.createHttpObservabilityContext; } });
7
+ var observability_middleware_1 = require("./observability.middleware");
8
+ Object.defineProperty(exports, "ObservabilityMiddleware", { enumerable: true, get: function () { return observability_middleware_1.ObservabilityMiddleware; } });
9
+ var observability_interceptor_1 = require("./observability.interceptor");
10
+ Object.defineProperty(exports, "ObservabilityGrpcInterceptor", { enumerable: true, get: function () { return observability_interceptor_1.ObservabilityGrpcInterceptor; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":";;;AAAA,iEAIiC;AAH/B,6HAAA,oBAAoB,OAAA;AACpB,uIAAA,8BAA8B,OAAA;AAGhC,uEAAqE;AAA5D,mIAAA,uBAAuB,OAAA;AAChC,yEAA2E;AAAlE,yIAAA,4BAA4B,OAAA"}
@@ -0,0 +1,23 @@
1
+ export interface ObservabilityContextData {
2
+ requestId: string;
3
+ correlationId: string;
4
+ traceId?: string;
5
+ spanId?: string;
6
+ tenantId?: string;
7
+ userId?: string;
8
+ accountId?: string;
9
+ userEmail?: string;
10
+ userRoles?: string[];
11
+ origin?: 'http' | 'grpc' | 'rabbitmq' | 'cron' | 'system';
12
+ operation?: string;
13
+ }
14
+ export declare const ObservabilityContext: {
15
+ run<T>(data: ObservabilityContextData, fn: () => T): T;
16
+ get(): ObservabilityContextData | undefined;
17
+ set(patch: Partial<ObservabilityContextData>): void;
18
+ toLogMeta(): Record<string, unknown>;
19
+ };
20
+ export declare function createHttpObservabilityContext(req: {
21
+ headers?: Record<string, unknown>;
22
+ id?: string | number;
23
+ }): ObservabilityContextData;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObservabilityContext = void 0;
4
+ exports.createHttpObservabilityContext = createHttpObservabilityContext;
5
+ const async_hooks_1 = require("async_hooks");
6
+ const crypto_1 = require("crypto");
7
+ const storage = new async_hooks_1.AsyncLocalStorage();
8
+ function readHeader(headers, key) {
9
+ const raw = headers?.[key];
10
+ if (Array.isArray(raw)) {
11
+ return raw[0] ? String(raw[0]) : undefined;
12
+ }
13
+ if (typeof raw === 'string') {
14
+ return raw;
15
+ }
16
+ return undefined;
17
+ }
18
+ function readRoles(raw) {
19
+ if (!raw) {
20
+ return undefined;
21
+ }
22
+ return raw
23
+ .split(',')
24
+ .map((value) => value.trim())
25
+ .filter(Boolean);
26
+ }
27
+ exports.ObservabilityContext = {
28
+ run(data, fn) {
29
+ return storage.run(data, fn);
30
+ },
31
+ get() {
32
+ return storage.getStore();
33
+ },
34
+ set(patch) {
35
+ const current = storage.getStore();
36
+ if (!current) {
37
+ return;
38
+ }
39
+ Object.assign(current, patch);
40
+ },
41
+ toLogMeta() {
42
+ const context = storage.getStore();
43
+ return {
44
+ requestId: context?.requestId,
45
+ correlationId: context?.correlationId,
46
+ traceId: context?.traceId,
47
+ spanId: context?.spanId,
48
+ tenantId: context?.tenantId,
49
+ userId: context?.userId,
50
+ accountId: context?.accountId,
51
+ userEmail: context?.userEmail,
52
+ origin: context?.origin,
53
+ operation: context?.operation,
54
+ };
55
+ },
56
+ };
57
+ function createHttpObservabilityContext(req) {
58
+ const requestId = readHeader(req.headers, 'x-request-id') ?? (req.id ? String(req.id) : (0, crypto_1.randomUUID)());
59
+ const correlationId = readHeader(req.headers, 'x-correlation-id') ?? requestId;
60
+ return {
61
+ requestId,
62
+ correlationId,
63
+ tenantId: readHeader(req.headers, 'x-tenant-id'),
64
+ userId: readHeader(req.headers, 'x-user-id'),
65
+ accountId: readHeader(req.headers, 'x-account-id'),
66
+ userEmail: readHeader(req.headers, 'x-user-email') ?? readHeader(req.headers, 'x-email'),
67
+ userRoles: readRoles(readHeader(req.headers, 'x-roles')),
68
+ origin: 'http',
69
+ };
70
+ }
71
+ //# sourceMappingURL=observability-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-context.js","sourceRoot":"","sources":["../../src/context/observability-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ export declare class ObservabilityGrpcInterceptor implements NestInterceptor {
4
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
5
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ObservabilityGrpcInterceptor = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const rxjs_1 = require("rxjs");
12
+ const crypto_1 = require("crypto");
13
+ const observability_context_1 = require("./observability-context");
14
+ function metadataValue(metadata, key) {
15
+ const values = metadata.get(key);
16
+ if (!values?.length) {
17
+ return undefined;
18
+ }
19
+ const value = values[0];
20
+ if (typeof value === 'string') {
21
+ return value;
22
+ }
23
+ if (value instanceof Uint8Array) {
24
+ return Buffer.from(value).toString('utf8');
25
+ }
26
+ return undefined;
27
+ }
28
+ let ObservabilityGrpcInterceptor = class ObservabilityGrpcInterceptor {
29
+ intercept(context, next) {
30
+ if (context.getType() !== 'rpc') {
31
+ return next.handle();
32
+ }
33
+ const rpcContext = context
34
+ .switchToRpc()
35
+ .getContext();
36
+ const metadata = rpcContext && typeof rpcContext.get === 'function'
37
+ ? rpcContext
38
+ : rpcContext?.metadata;
39
+ if (!metadata) {
40
+ return next.handle();
41
+ }
42
+ const requestId = metadataValue(metadata, 'x-request-id') ?? (0, crypto_1.randomUUID)();
43
+ const correlationId = metadataValue(metadata, 'x-correlation-id') ?? requestId;
44
+ const contextData = {
45
+ requestId,
46
+ correlationId,
47
+ tenantId: metadataValue(metadata, 'x-tenant-id'),
48
+ userId: metadataValue(metadata, 'x-user-id'),
49
+ accountId: metadataValue(metadata, 'x-account-id'),
50
+ userEmail: metadataValue(metadata, 'x-user-email'),
51
+ userRoles: (metadataValue(metadata, 'x-roles') ?? '')
52
+ .split(',')
53
+ .map((role) => role.trim())
54
+ .filter(Boolean),
55
+ origin: 'grpc',
56
+ };
57
+ return new rxjs_1.Observable((subscriber) => {
58
+ observability_context_1.ObservabilityContext.run(contextData, () => {
59
+ next.handle().subscribe({
60
+ next: (value) => subscriber.next(value),
61
+ error: (error) => subscriber.error(error),
62
+ complete: () => subscriber.complete(),
63
+ });
64
+ });
65
+ });
66
+ }
67
+ };
68
+ exports.ObservabilityGrpcInterceptor = ObservabilityGrpcInterceptor;
69
+ exports.ObservabilityGrpcInterceptor = ObservabilityGrpcInterceptor = __decorate([
70
+ (0, common_1.Injectable)()
71
+ ], ObservabilityGrpcInterceptor);
72
+ //# sourceMappingURL=observability.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.interceptor.js","sourceRoot":"","sources":["../../src/context/observability.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAKwB;AACxB,+BAAkC;AAClC,mCAAoC;AACpC,mEAA8F;AAM9F,SAAS,aAAa,CAAC,QAA0B,EAAE,GAAW;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAGM,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;IACvC,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,KAAK,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,UAAU,GAAG,OAAO;aACvB,WAAW,EAAE;aACb,UAAU,EAAsD,CAAC;QACpE,MAAM,QAAQ,GACZ,UAAU,IAAI,OAAQ,UAA+B,CAAC,GAAG,KAAK,UAAU;YACtE,CAAC,CAAE,UAA+B;YAClC,CAAC,CAAE,UAA8C,EAAE,QAAQ,CAAC;QAEhE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,IAAA,mBAAU,GAAE,CAAC;QAC1E,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,SAAS,CAAC;QAC/E,MAAM,WAAW,GAA6B;YAC5C,SAAS;YACT,aAAa;YACb,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;YAChD,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC5C,SAAS,EAAE,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC;YAClD,SAAS,EAAE,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC;YAClD,SAAS,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;iBAClD,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1B,MAAM,CAAC,OAAO,CAAC;YAClB,MAAM,EAAE,MAAM;SACf,CAAC;QAEF,OAAO,IAAI,iBAAU,CAAC,CAAC,UAAU,EAAE,EAAE;YACnC,4CAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE;gBACzC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC;oBACtB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;oBACvC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;oBACzC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;iBACtC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AA5CY,oEAA4B;uCAA5B,4BAA4B;IADxC,IAAA,mBAAU,GAAE;GACA,4BAA4B,CA4CxC"}
@@ -0,0 +1,5 @@
1
+ import { NestMiddleware } from '@nestjs/common';
2
+ import { NextFunction, Request, Response } from 'express';
3
+ export declare class ObservabilityMiddleware implements NestMiddleware {
4
+ use(req: Request, res: Response, next: NextFunction): void;
5
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ObservabilityMiddleware = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const crypto_1 = require("crypto");
12
+ const observability_context_1 = require("./observability-context");
13
+ let ObservabilityMiddleware = class ObservabilityMiddleware {
14
+ use(req, res, next) {
15
+ const context = (0, observability_context_1.createHttpObservabilityContext)({
16
+ headers: req.headers,
17
+ id: req.id ? String(req.id) : undefined,
18
+ });
19
+ if (!context.requestId) {
20
+ context.requestId = (0, crypto_1.randomUUID)();
21
+ }
22
+ if (!context.correlationId) {
23
+ context.correlationId = context.requestId;
24
+ }
25
+ req.headers['x-request-id'] = context.requestId;
26
+ req.headers['x-correlation-id'] = context.correlationId;
27
+ res.setHeader('x-request-id', context.requestId);
28
+ res.setHeader('x-correlation-id', context.correlationId);
29
+ observability_context_1.ObservabilityContext.run(context, next);
30
+ }
31
+ };
32
+ exports.ObservabilityMiddleware = ObservabilityMiddleware;
33
+ exports.ObservabilityMiddleware = ObservabilityMiddleware = __decorate([
34
+ (0, common_1.Injectable)()
35
+ ], ObservabilityMiddleware);
36
+ //# sourceMappingURL=observability.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.middleware.js","sourceRoot":"","sources":["../../src/context/observability.middleware.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4D;AAC5D,mCAAoC;AAEpC,mEAGiC;AAG1B,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAClC,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;QACjD,MAAM,OAAO,GAAG,IAAA,sDAA8B,EAAC;YAC7C,OAAO,EAAE,GAAG,CAAC,OAAkC;YAC/C,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SACxC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,SAAS,GAAG,IAAA,mBAAU,GAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;QAC5C,CAAC;QAED,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;QAChD,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;QAExD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAEzD,4CAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF,CAAA;AAvBY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;GACA,uBAAuB,CAuBnC"}
@@ -0,0 +1,22 @@
1
+ import { AppErrorDefinition, AppErrorOptions, AppErrorPayload, AppErrorStatus, AppFieldError } from './app-error.types';
2
+ import { ErrorCategory } from './error-category';
3
+ import { ErrorSeverity } from './error-category';
4
+ export declare class AppError extends Error {
5
+ readonly code: string;
6
+ readonly messageKey?: string;
7
+ readonly category: ErrorCategory;
8
+ readonly severity?: ErrorSeverity;
9
+ readonly retryable: boolean;
10
+ readonly status: AppErrorStatus;
11
+ readonly requestId?: string;
12
+ readonly correlationId?: string;
13
+ readonly details?: Record<string, unknown>;
14
+ readonly fields?: AppFieldError[];
15
+ readonly timestamp: string;
16
+ readonly service?: string;
17
+ constructor(definition: AppErrorDefinition, options?: AppErrorOptions);
18
+ toPayload(): AppErrorPayload;
19
+ static fromDefinition(definition: AppErrorDefinition, options?: AppErrorOptions): AppError;
20
+ static fromKey(code: string, options?: AppErrorOptions): AppError;
21
+ static internal(options?: AppErrorOptions): AppError;
22
+ }
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppError = void 0;
4
+ const error_category_1 = require("./error-category");
5
+ const error_registry_1 = require("./error-registry");
6
+ const DEFAULT_INTERNAL_STATUS = {
7
+ http: 500,
8
+ grpc: 13,
9
+ };
10
+ function normalizeCause(cause) {
11
+ if (!cause) {
12
+ return undefined;
13
+ }
14
+ if (cause instanceof Error) {
15
+ return cause;
16
+ }
17
+ return new Error(typeof cause === 'string' ? cause : 'Unknown cause');
18
+ }
19
+ class AppError extends Error {
20
+ code;
21
+ messageKey;
22
+ category;
23
+ severity;
24
+ retryable;
25
+ status;
26
+ requestId;
27
+ correlationId;
28
+ details;
29
+ fields;
30
+ timestamp;
31
+ service;
32
+ constructor(definition, options = {}) {
33
+ super(definition.message, { cause: normalizeCause(options.cause) });
34
+ this.name = 'AppError';
35
+ this.code = definition.code;
36
+ this.messageKey = definition.messageKey;
37
+ this.category = definition.category;
38
+ this.severity = definition.severity;
39
+ this.retryable = Boolean(definition.retryable);
40
+ this.status = definition.status;
41
+ this.requestId = options.requestId;
42
+ this.correlationId = options.correlationId;
43
+ this.details = options.details;
44
+ this.fields = options.fields;
45
+ this.timestamp = options.timestamp ?? new Date().toISOString();
46
+ this.service = options.service;
47
+ }
48
+ toPayload() {
49
+ return {
50
+ code: this.code,
51
+ message: this.message,
52
+ messageKey: this.messageKey,
53
+ category: this.category,
54
+ severity: this.severity,
55
+ retryable: this.retryable,
56
+ status: this.status,
57
+ requestId: this.requestId,
58
+ correlationId: this.correlationId,
59
+ details: this.details,
60
+ fields: this.fields,
61
+ timestamp: this.timestamp,
62
+ service: this.service,
63
+ };
64
+ }
65
+ static fromDefinition(definition, options = {}) {
66
+ return new AppError(definition, options);
67
+ }
68
+ static fromKey(code, options = {}) {
69
+ const definition = (0, error_registry_1.resolveAppErrorDefinition)(code);
70
+ if (!definition) {
71
+ return AppError.internal({
72
+ ...options,
73
+ details: {
74
+ ...(options.details ?? {}),
75
+ missingErrorCode: code,
76
+ },
77
+ });
78
+ }
79
+ return new AppError(definition, options);
80
+ }
81
+ static internal(options = {}) {
82
+ return new AppError({
83
+ code: 'COMMON.INTERNAL',
84
+ category: error_category_1.ERROR_CATEGORIES.INTERNAL,
85
+ message: 'Internal server error',
86
+ messageKey: 'errors.common.internal',
87
+ severity: 'error',
88
+ retryable: false,
89
+ status: DEFAULT_INTERNAL_STATUS,
90
+ }, options);
91
+ }
92
+ }
93
+ exports.AppError = AppError;
94
+ //# sourceMappingURL=app-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../src/errors/app-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { ErrorCategory } from './error-category';
2
+ import { ErrorSeverity } from './error-category';
3
+ export interface AppFieldError {
4
+ field: string;
5
+ code?: string;
6
+ message?: string;
7
+ }
8
+ export interface AppErrorStatus {
9
+ http: number;
10
+ grpc?: number;
11
+ }
12
+ export interface AppErrorDefinition {
13
+ code: string;
14
+ category: ErrorCategory;
15
+ message: string;
16
+ messageKey?: string;
17
+ severity?: ErrorSeverity;
18
+ retryable?: boolean;
19
+ status: AppErrorStatus;
20
+ }
21
+ export interface AppErrorPayload {
22
+ code: string;
23
+ message: string;
24
+ messageKey?: string;
25
+ category: ErrorCategory;
26
+ severity?: ErrorSeverity;
27
+ retryable: boolean;
28
+ status: AppErrorStatus;
29
+ requestId?: string;
30
+ correlationId?: string;
31
+ details?: Record<string, unknown>;
32
+ fields?: AppFieldError[];
33
+ timestamp: string;
34
+ service?: string;
35
+ }
36
+ export interface AppErrorOptions {
37
+ service?: string;
38
+ requestId?: string;
39
+ correlationId?: string;
40
+ details?: Record<string, unknown>;
41
+ fields?: AppFieldError[];
42
+ cause?: unknown;
43
+ timestamp?: string;
44
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=app-error.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-error.types.js","sourceRoot":"","sources":["../../src/errors/app-error.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ export declare const ERROR_CATEGORIES: {
2
+ readonly VALIDATION: "VALIDATION";
3
+ readonly AUTH: "AUTH";
4
+ readonly FORBIDDEN: "FORBIDDEN";
5
+ readonly NOT_FOUND: "NOT_FOUND";
6
+ readonly CONFLICT: "CONFLICT";
7
+ readonly RATE_LIMIT: "RATE_LIMIT";
8
+ readonly TIMEOUT: "TIMEOUT";
9
+ readonly UNAVAILABLE: "UNAVAILABLE";
10
+ readonly DEPENDENCY: "DEPENDENCY";
11
+ readonly ROLE: "ROLE";
12
+ readonly SPACE: "SPACE";
13
+ readonly ACCOUNT: "ACCOUNT";
14
+ readonly DEVICE: "DEVICE";
15
+ readonly NOTIFICATION: "NOTIFICATION";
16
+ readonly INTEGRATION: "INTEGRATION";
17
+ readonly INFRASTRUCTURE: "INFRASTRUCTURE";
18
+ readonly INTERNAL: "INTERNAL";
19
+ };
20
+ export type ErrorCategory = (typeof ERROR_CATEGORIES)[keyof typeof ERROR_CATEGORIES];
21
+ export type ErrorSeverity = 'info' | 'warn' | 'error' | 'fatal';
22
+ export declare const categorySeverityMap: Record<ErrorCategory, ErrorSeverity>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.categorySeverityMap = exports.ERROR_CATEGORIES = void 0;
4
+ exports.ERROR_CATEGORIES = {
5
+ VALIDATION: 'VALIDATION',
6
+ AUTH: 'AUTH',
7
+ FORBIDDEN: 'FORBIDDEN',
8
+ NOT_FOUND: 'NOT_FOUND',
9
+ CONFLICT: 'CONFLICT',
10
+ RATE_LIMIT: 'RATE_LIMIT',
11
+ TIMEOUT: 'TIMEOUT',
12
+ UNAVAILABLE: 'UNAVAILABLE',
13
+ DEPENDENCY: 'DEPENDENCY',
14
+ ROLE: 'ROLE',
15
+ SPACE: 'SPACE',
16
+ ACCOUNT: 'ACCOUNT',
17
+ DEVICE: 'DEVICE',
18
+ NOTIFICATION: 'NOTIFICATION',
19
+ INTEGRATION: 'INTEGRATION',
20
+ INFRASTRUCTURE: 'INFRASTRUCTURE',
21
+ INTERNAL: 'INTERNAL',
22
+ };
23
+ exports.categorySeverityMap = {
24
+ VALIDATION: 'info',
25
+ AUTH: 'warn',
26
+ FORBIDDEN: 'warn',
27
+ NOT_FOUND: 'info',
28
+ CONFLICT: 'warn',
29
+ RATE_LIMIT: 'warn',
30
+ TIMEOUT: 'warn',
31
+ UNAVAILABLE: 'error',
32
+ DEPENDENCY: 'error',
33
+ ROLE: 'warn',
34
+ SPACE: 'warn',
35
+ ACCOUNT: 'error',
36
+ DEVICE: 'error',
37
+ NOTIFICATION: 'error',
38
+ INTEGRATION: 'error',
39
+ INFRASTRUCTURE: 'error',
40
+ INTERNAL: 'error',
41
+ };
42
+ //# sourceMappingURL=error-category.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-category.js","sourceRoot":"","sources":["../../src/errors/error-category.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG;IAC9B,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,aAAa;IAC1B,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,QAAQ,EAAE,UAAU;CACZ,CAAC;AAKE,QAAA,mBAAmB,GAAyC;IACvE,UAAU,EAAE,MAAM;IAClB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,OAAO;IACpB,UAAU,EAAE,OAAO;IACnB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,OAAO;IACf,YAAY,EAAE,OAAO;IACrB,WAAW,EAAE,OAAO;IACpB,cAAc,EAAE,OAAO;IACvB,QAAQ,EAAE,OAAO;CAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { AppErrorDefinition } from './app-error.types';
2
+ export declare function registerErrorDefinitions(definitions: Record<string, AppErrorDefinition> | AppErrorDefinition[]): void;
3
+ export declare function resolveAppErrorDefinition(code: string): AppErrorDefinition | undefined;
4
+ export declare function getRegisteredErrorDefinitions(): AppErrorDefinition[];
5
+ export declare function clearErrorDefinitions(): void;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerErrorDefinitions = registerErrorDefinitions;
4
+ exports.resolveAppErrorDefinition = resolveAppErrorDefinition;
5
+ exports.getRegisteredErrorDefinitions = getRegisteredErrorDefinitions;
6
+ exports.clearErrorDefinitions = clearErrorDefinitions;
7
+ const registry = new Map();
8
+ function registerErrorDefinitions(definitions) {
9
+ const entries = Array.isArray(definitions)
10
+ ? definitions.map((item) => [item.code, item])
11
+ : Object.entries(definitions).map(([key, value]) => [key, value]);
12
+ for (const [key, value] of entries) {
13
+ const normalized = value.code ? value : { ...value, code: key };
14
+ registry.set(normalized.code, normalized);
15
+ }
16
+ }
17
+ function resolveAppErrorDefinition(code) {
18
+ return registry.get(code);
19
+ }
20
+ function getRegisteredErrorDefinitions() {
21
+ return Array.from(registry.values());
22
+ }
23
+ function clearErrorDefinitions() {
24
+ registry.clear();
25
+ }
26
+ //# sourceMappingURL=error-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-registry.js","sourceRoot":"","sources":["../../src/errors/error-registry.ts"],"names":[],"mappings":";;AAMA,4DAWC;AAED,8DAEC;AAED,sEAEC;AAED,sDAEC;AAzBD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEvD,SAAgB,wBAAwB,CACtC,WAAsE;IAEtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QACxC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAU,CAAC;QACvD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAU,CAAC,CAAC;IAE7E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAChE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAgB,yBAAyB,CAAC,IAAY;IACpD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,6BAA6B;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAgB,qBAAqB;IACnC,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ERROR_CATEGORIES, categorySeverityMap, type ErrorCategory, type ErrorSeverity, } from './error-category';
2
+ export { type AppFieldError, type AppErrorStatus, type AppErrorDefinition, type AppErrorPayload, type AppErrorOptions, } from './app-error.types';
3
+ export { AppError } from './app-error';
4
+ export { registerErrorDefinitions, resolveAppErrorDefinition, getRegisteredErrorDefinitions, clearErrorDefinitions, } from './error-registry';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearErrorDefinitions = exports.getRegisteredErrorDefinitions = exports.resolveAppErrorDefinition = exports.registerErrorDefinitions = exports.AppError = exports.categorySeverityMap = exports.ERROR_CATEGORIES = void 0;
4
+ var error_category_1 = require("./error-category");
5
+ Object.defineProperty(exports, "ERROR_CATEGORIES", { enumerable: true, get: function () { return error_category_1.ERROR_CATEGORIES; } });
6
+ Object.defineProperty(exports, "categorySeverityMap", { enumerable: true, get: function () { return error_category_1.categorySeverityMap; } });
7
+ var app_error_1 = require("./app-error");
8
+ Object.defineProperty(exports, "AppError", { enumerable: true, get: function () { return app_error_1.AppError; } });
9
+ var error_registry_1 = require("./error-registry");
10
+ Object.defineProperty(exports, "registerErrorDefinitions", { enumerable: true, get: function () { return error_registry_1.registerErrorDefinitions; } });
11
+ Object.defineProperty(exports, "resolveAppErrorDefinition", { enumerable: true, get: function () { return error_registry_1.resolveAppErrorDefinition; } });
12
+ Object.defineProperty(exports, "getRegisteredErrorDefinitions", { enumerable: true, get: function () { return error_registry_1.getRegisteredErrorDefinitions; } });
13
+ Object.defineProperty(exports, "clearErrorDefinitions", { enumerable: true, get: function () { return error_registry_1.clearErrorDefinitions; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":";;;AAAA,mDAK0B;AAJxB,kHAAA,gBAAgB,OAAA;AAChB,qHAAA,mBAAmB,OAAA;AAWrB,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,mDAK0B;AAJxB,0HAAA,wBAAwB,OAAA;AACxB,2HAAA,yBAAyB,OAAA;AACzB,+HAAA,6BAA6B,OAAA;AAC7B,uHAAA,qBAAqB,OAAA"}