glasswork 0.9.2 → 0.10.0
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/core/bootstrap.d.ts +2 -1
- package/dist/core/bootstrap.d.ts.map +1 -1
- package/dist/core/bootstrap.js +121 -44
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/core/types.d.ts +53 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/http/error-handler.d.ts +28 -3
- package/dist/http/error-handler.d.ts.map +1 -1
- package/dist/http/error-handler.js +97 -22
- package/dist/http/error-handler.js.map +1 -1
- package/dist/http/errors.d.ts +52 -22
- package/dist/http/errors.d.ts.map +1 -1
- package/dist/http/errors.js +62 -42
- package/dist/http/errors.js.map +1 -1
- package/dist/http/route-helpers.d.ts +13 -0
- package/dist/http/route-helpers.d.ts.map +1 -1
- package/dist/http/route-helpers.js +15 -3
- package/dist/http/route-helpers.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/list-query/builder.d.ts +5 -0
- package/dist/list-query/builder.d.ts.map +1 -1
- package/dist/list-query/builder.js +34 -1
- package/dist/list-query/builder.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +28 -18
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/observability/exception-tracking.d.ts +214 -0
- package/dist/observability/exception-tracking.d.ts.map +1 -0
- package/dist/observability/exception-tracking.js +238 -0
- package/dist/observability/exception-tracking.js.map +1 -0
- package/dist/observability/pino-logger.d.ts +108 -0
- package/dist/observability/pino-logger.d.ts.map +1 -0
- package/dist/observability/pino-logger.js +158 -0
- package/dist/observability/pino-logger.js.map +1 -0
- package/dist/observability/request-context.d.ts +105 -0
- package/dist/observability/request-context.d.ts.map +1 -0
- package/dist/observability/request-context.js +115 -0
- package/dist/observability/request-context.js.map +1 -0
- package/dist/openapi/openapi.d.ts.map +1 -1
- package/dist/openapi/openapi.js +3 -1
- package/dist/openapi/openapi.js.map +1 -1
- package/dist/utils/environment.d.ts +2 -1
- package/dist/utils/environment.d.ts.map +1 -1
- package/dist/utils/environment.js +11 -2
- package/dist/utils/environment.js.map +1 -1
- package/dist/utils/logger.d.ts +43 -9
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +60 -16
- package/dist/utils/logger.js.map +1 -1
- package/package.json +6 -1
- package/dist/authorization/ability-middleware.d.ts +0 -61
- package/dist/authorization/ability-middleware.d.ts.map +0 -1
- package/dist/authorization/ability-middleware.js +0 -74
- package/dist/authorization/ability-middleware.js.map +0 -1
- package/dist/authorization/index.d.ts +0 -46
- package/dist/authorization/index.d.ts.map +0 -1
- package/dist/authorization/index.js +0 -46
- package/dist/authorization/index.js.map +0 -1
- package/dist/authorization/route-helpers.d.ts +0 -106
- package/dist/authorization/route-helpers.d.ts.map +0 -1
- package/dist/authorization/route-helpers.js +0 -136
- package/dist/authorization/route-helpers.js.map +0 -1
- package/dist/authorization/service-proxy.d.ts +0 -59
- package/dist/authorization/service-proxy.d.ts.map +0 -1
- package/dist/authorization/service-proxy.js +0 -110
- package/dist/authorization/service-proxy.js.map +0 -1
- package/dist/authorization/types.d.ts +0 -58
- package/dist/authorization/types.d.ts.map +0 -1
- package/dist/authorization/types.js +0 -7
- package/dist/authorization/types.js.map +0 -1
- package/dist/hooks/authorization-hook.d.ts +0 -100
- package/dist/hooks/authorization-hook.d.ts.map +0 -1
- package/dist/hooks/authorization-hook.js +0 -93
- package/dist/hooks/authorization-hook.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -54
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -55
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/service-hooks.d.ts +0 -82
- package/dist/hooks/service-hooks.d.ts.map +0 -1
- package/dist/hooks/service-hooks.js +0 -158
- package/dist/hooks/service-hooks.js.map +0 -1
- package/dist/hooks/types.d.ts +0 -151
- package/dist/hooks/types.d.ts.map +0 -1
- package/dist/hooks/types.js +0 -2
- package/dist/hooks/types.js.map +0 -1
- package/dist/openapi/hooks.d.ts +0 -14
- package/dist/openapi/hooks.d.ts.map +0 -1
- package/dist/openapi/hooks.js +0 -83
- package/dist/openapi/hooks.js.map +0 -1
- package/dist/openapi/openapi-transformer.d.ts +0 -13
- package/dist/openapi/openapi-transformer.d.ts.map +0 -1
- package/dist/openapi/openapi-transformer.js +0 -87
- package/dist/openapi/openapi-transformer.js.map +0 -1
- package/dist/utils/pagination.d.ts +0 -48
- package/dist/utils/pagination.d.ts.map +0 -1
- package/dist/utils/pagination.js +0 -42
- package/dist/utils/pagination.js.map +0 -1
- package/dist/utils/serialize-dates.d.ts +0 -27
- package/dist/utils/serialize-dates.d.ts.map +0 -1
- package/dist/utils/serialize-dates.js +0 -39
- package/dist/utils/serialize-dates.js.map +0 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { HTTPException } from 'hono/http-exception';
|
|
2
|
-
import { createLogger } from '../utils/logger.js';
|
|
2
|
+
import { createLogger, getDefaultLogLevel } from '../utils/logger.js';
|
|
3
3
|
import { DomainException, getStatusCodeFromErrorCode } from './errors.js';
|
|
4
|
-
const logger = createLogger('Glasswork:ErrorHandler', true);
|
|
5
4
|
/**
|
|
6
5
|
* Default response handler - returns JSON error
|
|
7
6
|
*/
|
|
@@ -10,6 +9,83 @@ function defaultResponseHandler(error, context) {
|
|
|
10
9
|
error: error.message,
|
|
11
10
|
}, error.statusCode);
|
|
12
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Track exception if configured and criteria are met.
|
|
14
|
+
* Centralizes exception tracking logic to avoid duplication.
|
|
15
|
+
*/
|
|
16
|
+
function trackException(error, statusCode, context, tracker, trackingConfig, options = {}) {
|
|
17
|
+
if (!tracker)
|
|
18
|
+
return;
|
|
19
|
+
const { explicitTrack, errorCode, unexpected } = options;
|
|
20
|
+
// Determine if we should track:
|
|
21
|
+
// - Explicit flag takes precedence
|
|
22
|
+
// - Otherwise use status code rules or track unexpected errors
|
|
23
|
+
let shouldTrack;
|
|
24
|
+
if (explicitTrack !== undefined) {
|
|
25
|
+
shouldTrack = explicitTrack;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
shouldTrack = trackingConfig.trackStatusCodes(statusCode) || !!unexpected;
|
|
29
|
+
}
|
|
30
|
+
if (!shouldTrack)
|
|
31
|
+
return;
|
|
32
|
+
tracker.captureException(error, {
|
|
33
|
+
requestId: context.get('requestId'),
|
|
34
|
+
path: context.req.path,
|
|
35
|
+
method: context.req.method,
|
|
36
|
+
statusCode,
|
|
37
|
+
...(errorCode && { errorCode }),
|
|
38
|
+
...(unexpected && { unexpected: true }),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handle DomainException errors.
|
|
43
|
+
*/
|
|
44
|
+
function handleDomainException(err, context, logLevel, exceptionTracker, trackingConfig, logger) {
|
|
45
|
+
const statusCode = getStatusCodeFromErrorCode(err.code);
|
|
46
|
+
const error = {
|
|
47
|
+
message: err.message,
|
|
48
|
+
statusCode: statusCode,
|
|
49
|
+
};
|
|
50
|
+
// Log 5xx errors with stack trace (if log level allows)
|
|
51
|
+
if (logLevel !== 'silent' && statusCode >= 500) {
|
|
52
|
+
logger.error(`${err.code}: ${err.message}${err.stack ? `\n${err.stack}` : ''}`);
|
|
53
|
+
}
|
|
54
|
+
trackException(err, statusCode, context, exceptionTracker, trackingConfig, {
|
|
55
|
+
explicitTrack: err.track,
|
|
56
|
+
errorCode: err.code,
|
|
57
|
+
});
|
|
58
|
+
return error;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Handle HTTPException errors.
|
|
62
|
+
*/
|
|
63
|
+
function handleHTTPException(err, context, logLevel, exceptionTracker, trackingConfig, logger) {
|
|
64
|
+
const error = {
|
|
65
|
+
message: err.message,
|
|
66
|
+
statusCode: err.status,
|
|
67
|
+
};
|
|
68
|
+
// Log 5xx HTTP errors (if log level allows)
|
|
69
|
+
if (logLevel !== 'silent' && err.status >= 500) {
|
|
70
|
+
logger.error(`HTTPException ${err.status}: ${err.message}`);
|
|
71
|
+
}
|
|
72
|
+
trackException(err, err.status, context, exceptionTracker, trackingConfig);
|
|
73
|
+
return error;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Handle unexpected errors.
|
|
77
|
+
*/
|
|
78
|
+
function handleUnexpectedError(err, context, logLevel, exceptionTracker, trackingConfig, logger) {
|
|
79
|
+
// Unexpected errors - log if level allows
|
|
80
|
+
if (logLevel !== 'silent') {
|
|
81
|
+
logger.error('Unhandled error:', err);
|
|
82
|
+
}
|
|
83
|
+
const normalizedError = err instanceof Error ? err : new Error(String(err));
|
|
84
|
+
trackException(normalizedError, 500, context, exceptionTracker, trackingConfig, {
|
|
85
|
+
unexpected: true,
|
|
86
|
+
});
|
|
87
|
+
return { message: 'Internal server error', statusCode: 500 };
|
|
88
|
+
}
|
|
13
89
|
/**
|
|
14
90
|
* Create an error handler middleware for Hono
|
|
15
91
|
*
|
|
@@ -18,32 +94,31 @@ function defaultResponseHandler(error, context) {
|
|
|
18
94
|
* - HTTPException (Hono's built-in HTTP exceptions)
|
|
19
95
|
* - Validation errors (returns 422)
|
|
20
96
|
* - Generic errors (returns 500)
|
|
97
|
+
* - Exception tracking (optional, via exceptionTracker option)
|
|
21
98
|
*/
|
|
22
99
|
export function createErrorHandler(options = {}) {
|
|
23
|
-
const {
|
|
100
|
+
const { logLevel = getDefaultLogLevel(), responseHandler = defaultResponseHandler, exceptionTracker, trackingConfig = { trackStatusCodes: (status) => status >= 500 }, } = options;
|
|
101
|
+
// Create logger with the specified log level so it actually logs when level allows
|
|
102
|
+
const logger = createLogger('Glasswork:ErrorHandler', logLevel);
|
|
24
103
|
return (err, context) => {
|
|
25
104
|
let error;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (logErrors && statusCode === 500) {
|
|
30
|
-
logger.error('DomainException with unknown code:', err);
|
|
105
|
+
try {
|
|
106
|
+
if (err instanceof DomainException) {
|
|
107
|
+
error = handleDomainException(err, context, logLevel, exceptionTracker, trackingConfig, logger);
|
|
31
108
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
error = {
|
|
35
|
-
message: err.message,
|
|
36
|
-
statusCode: err.status,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
if (logErrors) {
|
|
41
|
-
logger.error('Unhandled error:', err);
|
|
109
|
+
else if (err instanceof HTTPException) {
|
|
110
|
+
error = handleHTTPException(err, context, logLevel, exceptionTracker, trackingConfig, logger);
|
|
42
111
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
112
|
+
else {
|
|
113
|
+
error = handleUnexpectedError(err, context, logLevel, exceptionTracker, trackingConfig, logger);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (handlerErr) {
|
|
117
|
+
// Error handler itself threw - log and return generic error
|
|
118
|
+
// Use error level logger for this critical error
|
|
119
|
+
const errorLogger = createLogger('Glasswork:ErrorHandler', 'error');
|
|
120
|
+
errorLogger.error('Error in error handler:', handlerErr);
|
|
121
|
+
error = { message: 'Internal server error', statusCode: 500 };
|
|
47
122
|
}
|
|
48
123
|
return responseHandler(error, context);
|
|
49
124
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/http/errors.d.ts
CHANGED
|
@@ -1,72 +1,102 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Options for configuring exception behavior
|
|
3
|
+
*/
|
|
4
|
+
export interface DomainExceptionOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Whether to track this exception in exception tracking services (Sentry, AppSignal, etc.)
|
|
7
|
+
* If undefined, tracking is determined by status code rules (default: 5xx only)
|
|
8
|
+
* Set to true to force tracking, false to never track
|
|
9
|
+
*/
|
|
10
|
+
track?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Base domain exception class for business logic errors.
|
|
14
|
+
*
|
|
15
|
+
* Supports optional exception tracking configuration via the `track` option.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Normal exception - tracking determined by status code rules
|
|
20
|
+
* throw new NotFoundException('User not found');
|
|
21
|
+
*
|
|
22
|
+
* // Explicitly track this 404
|
|
23
|
+
* throw new NotFoundException('Critical user lookup failed', { track: true });
|
|
24
|
+
*
|
|
25
|
+
* // Never track this 500
|
|
26
|
+
* throw new InternalServerErrorException('Known cache issue', { track: false });
|
|
27
|
+
* ```
|
|
3
28
|
*/
|
|
4
29
|
export declare class DomainException extends Error {
|
|
5
30
|
readonly code: string;
|
|
6
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Explicit tracking flag.
|
|
33
|
+
* If set, overrides default tracking rules based on status codes.
|
|
34
|
+
*/
|
|
35
|
+
readonly track?: boolean;
|
|
36
|
+
constructor(message: string, code: string, options?: DomainExceptionOptions);
|
|
7
37
|
}
|
|
8
38
|
/**
|
|
9
39
|
* Standard HTTP exception classes
|
|
10
40
|
*/
|
|
11
41
|
export declare class ValidationException extends DomainException {
|
|
12
|
-
constructor(message?: string);
|
|
42
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
13
43
|
}
|
|
14
44
|
export declare class UnauthorizedException extends DomainException {
|
|
15
|
-
constructor(message?: string);
|
|
45
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
16
46
|
}
|
|
17
47
|
export declare class NotFoundException extends DomainException {
|
|
18
|
-
constructor(message?: string);
|
|
48
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
19
49
|
}
|
|
20
50
|
export declare class ConflictException extends DomainException {
|
|
21
|
-
constructor(message?: string);
|
|
51
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
22
52
|
}
|
|
23
53
|
export declare class ForbiddenException extends DomainException {
|
|
24
|
-
constructor(message?: string);
|
|
54
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
25
55
|
}
|
|
26
56
|
export declare class BadRequestException extends DomainException {
|
|
27
|
-
constructor(message?: string);
|
|
57
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
28
58
|
}
|
|
29
59
|
export declare class TooManyRequestsException extends DomainException {
|
|
30
|
-
constructor(message?: string);
|
|
60
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
31
61
|
}
|
|
32
62
|
export declare class MethodNotAllowedException extends DomainException {
|
|
33
|
-
constructor(message?: string);
|
|
63
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
34
64
|
}
|
|
35
65
|
export declare class RequestTimeoutException extends DomainException {
|
|
36
|
-
constructor(message?: string);
|
|
66
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
37
67
|
}
|
|
38
68
|
export declare class GoneException extends DomainException {
|
|
39
|
-
constructor(message?: string);
|
|
69
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
40
70
|
}
|
|
41
71
|
export declare class PayloadTooLargeException extends DomainException {
|
|
42
|
-
constructor(message?: string);
|
|
72
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
43
73
|
}
|
|
44
74
|
export declare class UnsupportedMediaTypeException extends DomainException {
|
|
45
|
-
constructor(message?: string);
|
|
75
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
46
76
|
}
|
|
47
77
|
export declare class UnprocessableEntityException extends DomainException {
|
|
48
|
-
constructor(message?: string);
|
|
78
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
49
79
|
}
|
|
50
80
|
export declare class LockedException extends DomainException {
|
|
51
|
-
constructor(message?: string);
|
|
81
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
52
82
|
}
|
|
53
83
|
export declare class PreconditionFailedException extends DomainException {
|
|
54
|
-
constructor(message?: string);
|
|
84
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
55
85
|
}
|
|
56
86
|
export declare class InternalServerErrorException extends DomainException {
|
|
57
|
-
constructor(message?: string);
|
|
87
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
58
88
|
}
|
|
59
89
|
export declare class NotImplementedException extends DomainException {
|
|
60
|
-
constructor(message?: string);
|
|
90
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
61
91
|
}
|
|
62
92
|
export declare class BadGatewayException extends DomainException {
|
|
63
|
-
constructor(message?: string);
|
|
93
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
64
94
|
}
|
|
65
95
|
export declare class ServiceUnavailableException extends DomainException {
|
|
66
|
-
constructor(message?: string);
|
|
96
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
67
97
|
}
|
|
68
98
|
export declare class GatewayTimeoutException extends DomainException {
|
|
69
|
-
constructor(message?: string);
|
|
99
|
+
constructor(message?: string, options?: DomainExceptionOptions);
|
|
70
100
|
}
|
|
71
101
|
/**
|
|
72
102
|
* Map error codes to HTTP status codes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAStB,IAAI,EAAE,MAAM;IAR9B;;;OAGG;IACH,SAAgB,KAAK,CAAC,EAAE,OAAO,CAAC;gBAG9B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,sBAAsB;CAMnC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;gBAC1C,OAAO,SAAqB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG3E;AAED,qBAAa,qBAAsB,SAAQ,eAAe;gBAC5C,OAAO,SAAiB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGvE;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGpE;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,OAAO,SAAa,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGnE;AAED,qBAAa,kBAAmB,SAAQ,eAAe;gBACzC,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGpE;AAED,qBAAa,mBAAoB,SAAQ,eAAe;gBAC1C,OAAO,SAAgB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGtE;AAED,qBAAa,wBAAyB,SAAQ,eAAe;gBAC/C,OAAO,SAAsB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG5E;AAED,qBAAa,yBAA0B,SAAQ,eAAe;gBAChD,OAAO,SAAuB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG7E;AAED,qBAAa,uBAAwB,SAAQ,eAAe;gBAC9C,OAAO,SAAoB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG1E;AAED,qBAAa,aAAc,SAAQ,eAAe;gBACpC,OAAO,SAAS,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG/D;AAED,qBAAa,wBAAyB,SAAQ,eAAe;gBAC/C,OAAO,SAAsB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG5E;AAED,qBAAa,6BAA8B,SAAQ,eAAe;gBACpD,OAAO,SAA2B,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGjF;AAED,qBAAa,4BAA6B,SAAQ,eAAe;gBACnD,OAAO,SAAyB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG/E;AAED,qBAAa,eAAgB,SAAQ,eAAe;gBACtC,OAAO,SAAW,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGjE;AAED,qBAAa,2BAA4B,SAAQ,eAAe;gBAClD,OAAO,SAAwB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG9E;AAED,qBAAa,4BAA6B,SAAQ,eAAe;gBACnD,OAAO,SAA0B,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGhF;AAED,qBAAa,uBAAwB,SAAQ,eAAe;gBAC9C,OAAO,SAAoB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG1E;AAED,qBAAa,mBAAoB,SAAQ,eAAe;gBAC1C,OAAO,SAAgB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAGtE;AAED,qBAAa,2BAA4B,SAAQ,eAAe;gBAClD,OAAO,SAAwB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG9E;AAED,qBAAa,uBAAwB,SAAQ,eAAe;gBAC9C,OAAO,SAAoB,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAG1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyB/D"}
|
package/dist/http/errors.js
CHANGED
|
@@ -1,115 +1,135 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Base domain exception class for business logic errors
|
|
2
|
+
* Base domain exception class for business logic errors.
|
|
3
|
+
*
|
|
4
|
+
* Supports optional exception tracking configuration via the `track` option.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // Normal exception - tracking determined by status code rules
|
|
9
|
+
* throw new NotFoundException('User not found');
|
|
10
|
+
*
|
|
11
|
+
* // Explicitly track this 404
|
|
12
|
+
* throw new NotFoundException('Critical user lookup failed', { track: true });
|
|
13
|
+
*
|
|
14
|
+
* // Never track this 500
|
|
15
|
+
* throw new InternalServerErrorException('Known cache issue', { track: false });
|
|
16
|
+
* ```
|
|
3
17
|
*/
|
|
4
18
|
export class DomainException extends Error {
|
|
5
19
|
code;
|
|
6
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Explicit tracking flag.
|
|
22
|
+
* If set, overrides default tracking rules based on status codes.
|
|
23
|
+
*/
|
|
24
|
+
track;
|
|
25
|
+
constructor(message, code, options) {
|
|
7
26
|
super(message);
|
|
8
27
|
this.code = code;
|
|
9
28
|
this.name = this.constructor.name;
|
|
29
|
+
this.track = options?.track;
|
|
10
30
|
}
|
|
11
31
|
}
|
|
12
32
|
/**
|
|
13
33
|
* Standard HTTP exception classes
|
|
14
34
|
*/
|
|
15
35
|
export class ValidationException extends DomainException {
|
|
16
|
-
constructor(message = 'Validation error') {
|
|
17
|
-
super(message, 'VALIDATION_ERROR');
|
|
36
|
+
constructor(message = 'Validation error', options) {
|
|
37
|
+
super(message, 'VALIDATION_ERROR', options);
|
|
18
38
|
}
|
|
19
39
|
}
|
|
20
40
|
export class UnauthorizedException extends DomainException {
|
|
21
|
-
constructor(message = 'Unauthorized') {
|
|
22
|
-
super(message, 'UNAUTHORIZED');
|
|
41
|
+
constructor(message = 'Unauthorized', options) {
|
|
42
|
+
super(message, 'UNAUTHORIZED', options);
|
|
23
43
|
}
|
|
24
44
|
}
|
|
25
45
|
export class NotFoundException extends DomainException {
|
|
26
|
-
constructor(message = 'Not found') {
|
|
27
|
-
super(message, 'NOT_FOUND');
|
|
46
|
+
constructor(message = 'Not found', options) {
|
|
47
|
+
super(message, 'NOT_FOUND', options);
|
|
28
48
|
}
|
|
29
49
|
}
|
|
30
50
|
export class ConflictException extends DomainException {
|
|
31
|
-
constructor(message = 'Conflict') {
|
|
32
|
-
super(message, 'CONFLICT');
|
|
51
|
+
constructor(message = 'Conflict', options) {
|
|
52
|
+
super(message, 'CONFLICT', options);
|
|
33
53
|
}
|
|
34
54
|
}
|
|
35
55
|
export class ForbiddenException extends DomainException {
|
|
36
|
-
constructor(message = 'Forbidden') {
|
|
37
|
-
super(message, 'FORBIDDEN');
|
|
56
|
+
constructor(message = 'Forbidden', options) {
|
|
57
|
+
super(message, 'FORBIDDEN', options);
|
|
38
58
|
}
|
|
39
59
|
}
|
|
40
60
|
export class BadRequestException extends DomainException {
|
|
41
|
-
constructor(message = 'Bad request') {
|
|
42
|
-
super(message, 'BAD_REQUEST');
|
|
61
|
+
constructor(message = 'Bad request', options) {
|
|
62
|
+
super(message, 'BAD_REQUEST', options);
|
|
43
63
|
}
|
|
44
64
|
}
|
|
45
65
|
export class TooManyRequestsException extends DomainException {
|
|
46
|
-
constructor(message = 'Too many requests') {
|
|
47
|
-
super(message, 'TOO_MANY_REQUESTS');
|
|
66
|
+
constructor(message = 'Too many requests', options) {
|
|
67
|
+
super(message, 'TOO_MANY_REQUESTS', options);
|
|
48
68
|
}
|
|
49
69
|
}
|
|
50
70
|
export class MethodNotAllowedException extends DomainException {
|
|
51
|
-
constructor(message = 'Method not allowed') {
|
|
52
|
-
super(message, 'METHOD_NOT_ALLOWED');
|
|
71
|
+
constructor(message = 'Method not allowed', options) {
|
|
72
|
+
super(message, 'METHOD_NOT_ALLOWED', options);
|
|
53
73
|
}
|
|
54
74
|
}
|
|
55
75
|
export class RequestTimeoutException extends DomainException {
|
|
56
|
-
constructor(message = 'Request timeout') {
|
|
57
|
-
super(message, 'REQUEST_TIMEOUT');
|
|
76
|
+
constructor(message = 'Request timeout', options) {
|
|
77
|
+
super(message, 'REQUEST_TIMEOUT', options);
|
|
58
78
|
}
|
|
59
79
|
}
|
|
60
80
|
export class GoneException extends DomainException {
|
|
61
|
-
constructor(message = 'Gone') {
|
|
62
|
-
super(message, 'GONE');
|
|
81
|
+
constructor(message = 'Gone', options) {
|
|
82
|
+
super(message, 'GONE', options);
|
|
63
83
|
}
|
|
64
84
|
}
|
|
65
85
|
export class PayloadTooLargeException extends DomainException {
|
|
66
|
-
constructor(message = 'Payload too large') {
|
|
67
|
-
super(message, 'PAYLOAD_TOO_LARGE');
|
|
86
|
+
constructor(message = 'Payload too large', options) {
|
|
87
|
+
super(message, 'PAYLOAD_TOO_LARGE', options);
|
|
68
88
|
}
|
|
69
89
|
}
|
|
70
90
|
export class UnsupportedMediaTypeException extends DomainException {
|
|
71
|
-
constructor(message = 'Unsupported media type') {
|
|
72
|
-
super(message, 'UNSUPPORTED_MEDIA_TYPE');
|
|
91
|
+
constructor(message = 'Unsupported media type', options) {
|
|
92
|
+
super(message, 'UNSUPPORTED_MEDIA_TYPE', options);
|
|
73
93
|
}
|
|
74
94
|
}
|
|
75
95
|
export class UnprocessableEntityException extends DomainException {
|
|
76
|
-
constructor(message = 'Unprocessable entity') {
|
|
77
|
-
super(message, 'UNPROCESSABLE_ENTITY');
|
|
96
|
+
constructor(message = 'Unprocessable entity', options) {
|
|
97
|
+
super(message, 'UNPROCESSABLE_ENTITY', options);
|
|
78
98
|
}
|
|
79
99
|
}
|
|
80
100
|
export class LockedException extends DomainException {
|
|
81
|
-
constructor(message = 'Locked') {
|
|
82
|
-
super(message, 'LOCKED');
|
|
101
|
+
constructor(message = 'Locked', options) {
|
|
102
|
+
super(message, 'LOCKED', options);
|
|
83
103
|
}
|
|
84
104
|
}
|
|
85
105
|
export class PreconditionFailedException extends DomainException {
|
|
86
|
-
constructor(message = 'Precondition failed') {
|
|
87
|
-
super(message, 'PRECONDITION_FAILED');
|
|
106
|
+
constructor(message = 'Precondition failed', options) {
|
|
107
|
+
super(message, 'PRECONDITION_FAILED', options);
|
|
88
108
|
}
|
|
89
109
|
}
|
|
90
110
|
export class InternalServerErrorException extends DomainException {
|
|
91
|
-
constructor(message = 'Internal server error') {
|
|
92
|
-
super(message, 'INTERNAL_SERVER_ERROR');
|
|
111
|
+
constructor(message = 'Internal server error', options) {
|
|
112
|
+
super(message, 'INTERNAL_SERVER_ERROR', options);
|
|
93
113
|
}
|
|
94
114
|
}
|
|
95
115
|
export class NotImplementedException extends DomainException {
|
|
96
|
-
constructor(message = 'Not implemented') {
|
|
97
|
-
super(message, 'NOT_IMPLEMENTED');
|
|
116
|
+
constructor(message = 'Not implemented', options) {
|
|
117
|
+
super(message, 'NOT_IMPLEMENTED', options);
|
|
98
118
|
}
|
|
99
119
|
}
|
|
100
120
|
export class BadGatewayException extends DomainException {
|
|
101
|
-
constructor(message = 'Bad gateway') {
|
|
102
|
-
super(message, 'BAD_GATEWAY');
|
|
121
|
+
constructor(message = 'Bad gateway', options) {
|
|
122
|
+
super(message, 'BAD_GATEWAY', options);
|
|
103
123
|
}
|
|
104
124
|
}
|
|
105
125
|
export class ServiceUnavailableException extends DomainException {
|
|
106
|
-
constructor(message = 'Service unavailable') {
|
|
107
|
-
super(message, 'SERVICE_UNAVAILABLE');
|
|
126
|
+
constructor(message = 'Service unavailable', options) {
|
|
127
|
+
super(message, 'SERVICE_UNAVAILABLE', options);
|
|
108
128
|
}
|
|
109
129
|
}
|
|
110
130
|
export class GatewayTimeoutException extends DomainException {
|
|
111
|
-
constructor(message = 'Gateway timeout') {
|
|
112
|
-
super(message, 'GATEWAY_TIMEOUT');
|
|
131
|
+
constructor(message = 'Gateway timeout', options) {
|
|
132
|
+
super(message, 'GATEWAY_TIMEOUT', options);
|
|
113
133
|
}
|
|
114
134
|
}
|
|
115
135
|
/**
|
package/dist/http/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ import type { Context, Hono, MiddlewareHandler } from 'hono';
|
|
|
2
2
|
import { type DescribeRouteOptions } from 'hono-openapi';
|
|
3
3
|
import type { BaseIssue, BaseSchema, BaseSchemaAsync, InferOutput } from 'valibot';
|
|
4
4
|
import type { OpenAPIResponseProcessor, RouteConfigExtensions } from '../core/types.js';
|
|
5
|
+
import { type PinoLogger } from '../observability/pino-logger.js';
|
|
6
|
+
import { type Logger } from '../utils/logger.js';
|
|
5
7
|
import { type AcceptPrismaTypes, type SerializationConfig } from '../utils/serialize-prisma-types.js';
|
|
6
8
|
/**
|
|
7
9
|
* OpenAPI context stored in Hono app context.
|
|
@@ -10,6 +12,11 @@ import { type AcceptPrismaTypes, type SerializationConfig } from '../utils/seria
|
|
|
10
12
|
export interface OpenAPIContext {
|
|
11
13
|
processors: OpenAPIResponseProcessor[];
|
|
12
14
|
securitySchemes: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Pino logger instance for creating context-aware loggers in route handlers.
|
|
17
|
+
* When set, enables `logger` property in RouteContext.
|
|
18
|
+
*/
|
|
19
|
+
pino?: PinoLogger;
|
|
13
20
|
}
|
|
14
21
|
/**
|
|
15
22
|
* Set the OpenAPI context for a Hono app instance.
|
|
@@ -304,6 +311,12 @@ export interface RouteContext<TBody = never, TSessionRequired extends boolean =
|
|
|
304
311
|
* User agent string from request headers
|
|
305
312
|
*/
|
|
306
313
|
userAgent: string | undefined;
|
|
314
|
+
/**
|
|
315
|
+
* Context-aware logger with automatic requestId correlation.
|
|
316
|
+
* Uses the route's first tag as the service name.
|
|
317
|
+
* Requires pino logger configured in bootstrap options.
|
|
318
|
+
*/
|
|
319
|
+
logger: Logger;
|
|
307
320
|
/**
|
|
308
321
|
* Original Hono context (for advanced use cases)
|
|
309
322
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE7D,OAAO,EACL,KAAK,oBAAoB,EAI1B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEnF,OAAO,KAAK,EAGV,wBAAwB,EACxB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describeRoute as honoDescribeRoute, resolver, validator, } from 'hono-openapi';
|
|
2
2
|
import { safeParseAsync } from 'valibot';
|
|
3
|
+
import { createContextAwarePinoLogger } from '../observability/pino-logger.js';
|
|
3
4
|
import { applyProcessors } from '../openapi/openapi-processors.js';
|
|
4
5
|
import { getClientIp } from '../utils/get-client-ip.js';
|
|
5
6
|
import { createLogger } from '../utils/logger.js';
|
|
@@ -28,7 +29,7 @@ export function setOpenAPIContext(app, context) {
|
|
|
28
29
|
* @internal
|
|
29
30
|
*/
|
|
30
31
|
export function getOpenAPIContext(app) {
|
|
31
|
-
return openAPIContextMap.get(app) ?? { processors: [], securitySchemes: [] };
|
|
32
|
+
return openAPIContextMap.get(app) ?? { processors: [], securitySchemes: [], pino: undefined };
|
|
32
33
|
}
|
|
33
34
|
/**
|
|
34
35
|
* HTTP status codes with descriptions
|
|
@@ -204,7 +205,7 @@ export function route(router, config) {
|
|
|
204
205
|
}
|
|
205
206
|
// Add handler wrapper
|
|
206
207
|
middlewares.push(async (c) => {
|
|
207
|
-
const routeContext = buildRouteContext(c, config);
|
|
208
|
+
const routeContext = buildRouteContext(c, config, openAPIContext);
|
|
208
209
|
const result = await config.handler(routeContext);
|
|
209
210
|
return handleResponse(result, config.responses, config.serialization, config.strictTypes, config.summary, c);
|
|
210
211
|
});
|
|
@@ -420,8 +421,18 @@ function buildOpenAPIResponses(config, openAPIContext, hasPagination) {
|
|
|
420
421
|
}
|
|
421
422
|
return responses;
|
|
422
423
|
}
|
|
423
|
-
|
|
424
|
+
/**
|
|
425
|
+
* Build the route context for a handler.
|
|
426
|
+
* Creates a context-aware logger using the route's first tag or operationId as the service name.
|
|
427
|
+
*/
|
|
428
|
+
function buildRouteContext(c, config, openAPIContext) {
|
|
424
429
|
const req = c.req;
|
|
430
|
+
// Create a context-aware logger for this route
|
|
431
|
+
// Use first tag, operationId, or 'Route' as the service name
|
|
432
|
+
const serviceName = config.tags?.[0] || config.operationId || 'Route';
|
|
433
|
+
const routeLogger = openAPIContext.pino
|
|
434
|
+
? createContextAwarePinoLogger({ pino: openAPIContext.pino, service: serviceName })
|
|
435
|
+
: createLogger(serviceName); // Uses default level (silent in test mode when no pino configured)
|
|
425
436
|
// Spread all context variables (from ContextVariableMap)
|
|
426
437
|
// This includes session, ability, role, and any other middleware-added variables
|
|
427
438
|
// Return with TSessionRequired=false to allow undefined session
|
|
@@ -435,6 +446,7 @@ function buildRouteContext(c, config) {
|
|
|
435
446
|
session: c.get('session'),
|
|
436
447
|
ip: getClientIp(c),
|
|
437
448
|
userAgent: c.req.header('user-agent'),
|
|
449
|
+
logger: routeLogger,
|
|
438
450
|
context: c,
|
|
439
451
|
};
|
|
440
452
|
}
|