@dumanarge/xssrv-shared-lib 1.0.1 → 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.
- package/dist/auth/tenant.middleware.d.ts +6 -1
- package/dist/auth/tenant.middleware.js +10 -3
- package/dist/auth/tenant.middleware.js.map +1 -1
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.js +11 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/observability-context.d.ts +23 -0
- package/dist/context/observability-context.js +71 -0
- package/dist/context/observability-context.js.map +1 -0
- package/dist/context/observability.interceptor.d.ts +5 -0
- package/dist/context/observability.interceptor.js +72 -0
- package/dist/context/observability.interceptor.js.map +1 -0
- package/dist/context/observability.middleware.d.ts +5 -0
- package/dist/context/observability.middleware.js +36 -0
- package/dist/context/observability.middleware.js.map +1 -0
- package/dist/errors/app-error.d.ts +22 -0
- package/dist/errors/app-error.js +94 -0
- package/dist/errors/app-error.js.map +1 -0
- package/dist/errors/app-error.types.d.ts +44 -0
- package/dist/errors/app-error.types.js +3 -0
- package/dist/errors/app-error.types.js.map +1 -0
- package/dist/errors/error-category.d.ts +22 -0
- package/dist/errors/error-category.js +42 -0
- package/dist/errors/error-category.js.map +1 -0
- package/dist/errors/error-registry.d.ts +5 -0
- package/dist/errors/error-registry.js +26 -0
- package/dist/errors/error-registry.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.js +14 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/filters/grpc-app-exception.filter.d.ts +11 -0
- package/dist/filters/grpc-app-exception.filter.js +177 -0
- package/dist/filters/grpc-app-exception.filter.js.map +1 -0
- package/dist/filters/http-app-exception.filter.d.ts +7 -0
- package/dist/filters/http-app-exception.filter.js +196 -0
- package/dist/filters/http-app-exception.filter.js.map +1 -0
- package/dist/filters/index.d.ts +3 -0
- package/dist/filters/index.js +13 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/filters/severity.d.ts +7 -0
- package/dist/filters/severity.js +51 -0
- package/dist/filters/severity.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/dist/logging/http-exception.filter.d.ts +1 -0
- package/dist/logging/http-exception.filter.js +6 -0
- package/dist/logging/http-exception.filter.js.map +1 -0
- package/dist/logging/logging.module.d.ts +22 -5
- package/dist/logging/logging.module.js +39 -10
- package/dist/logging/logging.module.js.map +1 -1
- package/dist/logging/request-logging.interceptor.d.ts +5 -0
- package/dist/logging/request-logging.interceptor.js +59 -0
- package/dist/logging/request-logging.interceptor.js.map +1 -0
- package/dist/metrics/index.d.ts +1 -0
- package/dist/metrics/index.js +9 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics.d.ts +17 -0
- package/dist/metrics/metrics.js +31 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/observability/error-observability.d.ts +31 -0
- package/dist/observability/error-observability.js +141 -0
- package/dist/observability/error-observability.js.map +1 -0
- package/dist/observability/otel-log-emitter.d.ts +10 -0
- package/dist/observability/otel-log-emitter.js +47 -0
- package/dist/observability/otel-log-emitter.js.map +1 -0
- package/dist/observability/request-context.d.ts +12 -0
- package/dist/observability/request-context.js +49 -0
- package/dist/observability/request-context.js.map +1 -0
- package/dist/tracing/tracing.js +22 -0
- package/dist/tracing/tracing.js.map +1 -1
- package/package.json +35 -70
|
@@ -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:
|
|
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:
|
|
125
|
-
userId:
|
|
126
|
-
roles: (
|
|
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":";;;;;;;;;;;;;AAuGA,oEA+CC;AAGD,
|
|
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,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 @@
|
|
|
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"}
|