hazo_logs 1.1.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -4
- package/config/hazo_logs_config.ini.sample +2 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/alert-triggers.d.ts +54 -0
- package/dist/lib/alert-triggers.d.ts.map +1 -0
- package/dist/lib/alert-triggers.js +96 -0
- package/dist/lib/alert-triggers.js.map +1 -0
- package/dist/lib/config_loader.d.ts.map +1 -1
- package/dist/lib/config_loader.js +1 -7
- package/dist/lib/config_loader.js.map +1 -1
- package/dist/lib/console-logger.d.ts +17 -1
- package/dist/lib/console-logger.d.ts.map +1 -1
- package/dist/lib/console-logger.js +47 -4
- package/dist/lib/console-logger.js.map +1 -1
- package/dist/lib/context/log-context.d.ts.map +1 -1
- package/dist/lib/context/log-context.js +4 -0
- package/dist/lib/context/log-context.js.map +1 -1
- package/dist/lib/eslint_plugin/index.d.ts +109 -0
- package/dist/lib/eslint_plugin/index.d.ts.map +1 -0
- package/dist/lib/eslint_plugin/index.js +168 -0
- package/dist/lib/eslint_plugin/index.js.map +1 -0
- package/dist/lib/global-error-handlers.d.ts +23 -0
- package/dist/lib/global-error-handlers.d.ts.map +1 -0
- package/dist/lib/global-error-handlers.js +46 -0
- package/dist/lib/global-error-handlers.js.map +1 -0
- package/dist/lib/hazo_logger.d.ts +9 -0
- package/dist/lib/hazo_logger.d.ts.map +1 -1
- package/dist/lib/hazo_logger.js +32 -0
- package/dist/lib/hazo_logger.js.map +1 -1
- package/dist/lib/level_resolver.d.ts +26 -0
- package/dist/lib/level_resolver.d.ts.map +1 -0
- package/dist/lib/level_resolver.js +65 -0
- package/dist/lib/level_resolver.js.map +1 -0
- package/dist/lib/log-reader.d.ts.map +1 -1
- package/dist/lib/log-reader.js +6 -4
- package/dist/lib/log-reader.js.map +1 -1
- package/dist/lib/package_logger.d.ts +47 -3
- package/dist/lib/package_logger.d.ts.map +1 -1
- package/dist/lib/package_logger.js +196 -10
- package/dist/lib/package_logger.js.map +1 -1
- package/dist/lib/ring_buffer.d.ts +51 -0
- package/dist/lib/ring_buffer.d.ts.map +1 -0
- package/dist/lib/ring_buffer.js +107 -0
- package/dist/lib/ring_buffer.js.map +1 -0
- package/dist/lib/types.d.ts +57 -24
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/universal-logger.d.ts.map +1 -1
- package/dist/lib/universal-logger.js +18 -0
- package/dist/lib/universal-logger.js.map +1 -1
- package/dist/lib/utils/caller_info.d.ts +25 -1
- package/dist/lib/utils/caller_info.d.ts.map +1 -1
- package/dist/lib/utils/caller_info.js +62 -1
- package/dist/lib/utils/caller_info.js.map +1 -1
- package/dist/lib/with-error-handler.d.ts +19 -0
- package/dist/lib/with-error-handler.d.ts.map +1 -0
- package/dist/lib/with-error-handler.js +77 -0
- package/dist/lib/with-error-handler.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -0
- package/dist/server.js.map +1 -1
- package/dist/ui/components/ErrorBoundary.d.ts +44 -0
- package/dist/ui/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/ui/components/ErrorBoundary.js +57 -0
- package/dist/ui/components/ErrorBoundary.js.map +1 -0
- package/dist/ui/components/LogLevelBadge.d.ts.map +1 -1
- package/dist/ui/components/LogLevelBadge.js +1 -0
- package/dist/ui/components/LogLevelBadge.js.map +1 -1
- package/dist/ui/hooks/useErrorReporter.d.ts +16 -0
- package/dist/ui/hooks/useErrorReporter.d.ts.map +1 -0
- package/dist/ui/hooks/useErrorReporter.js +56 -0
- package/dist/ui/hooks/useErrorReporter.js.map +1 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -1
- package/package.json +19 -7
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,28 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Type definitions for hazo_logs
|
|
3
3
|
*/
|
|
4
|
+
/** All log levels including fatal (above error) */
|
|
5
|
+
export type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';
|
|
4
6
|
/**
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
export type LogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
8
|
-
/**
|
|
9
|
-
* Additional data that can be attached to log entries
|
|
7
|
+
* Levels valid for config min-level setting.
|
|
8
|
+
* 'fatal' excluded — configuring min-level as fatal would silence everything else.
|
|
10
9
|
*/
|
|
10
|
+
export type ConfigLogLevel = Exclude<LogLevel, 'fatal'>;
|
|
11
|
+
/** Additional data that can be attached to log entries */
|
|
11
12
|
export type LogData = Record<string, unknown>;
|
|
12
|
-
/**
|
|
13
|
-
* Log source - where the log originated from
|
|
14
|
-
*/
|
|
13
|
+
/** Log source — where the log originated from */
|
|
15
14
|
export type LogSource = 'server' | 'client';
|
|
16
15
|
/**
|
|
17
|
-
* Log origin
|
|
16
|
+
* Log origin — distinguishes how the log was generated
|
|
18
17
|
* - 'server': normal server-side logging
|
|
19
18
|
* - 'client': browser client logger (createClientLogger)
|
|
20
19
|
* - 'hazo_debug_console': entries from hazo_debug's dual-write feature
|
|
21
20
|
*/
|
|
22
21
|
export type LogOrigin = 'server' | 'client' | 'hazo_debug_console';
|
|
23
|
-
/**
|
|
24
|
-
* Log entry structure written to JSON files
|
|
25
|
-
*/
|
|
22
|
+
/** Log entry structure written to JSON files */
|
|
26
23
|
export interface LogEntry {
|
|
27
24
|
timestamp: string;
|
|
28
25
|
level: LogLevel;
|
|
@@ -35,26 +32,62 @@ export interface LogEntry {
|
|
|
35
32
|
reference?: string;
|
|
36
33
|
depth?: number;
|
|
37
34
|
data?: LogData;
|
|
35
|
+
/** Fine-grained operation scope, e.g. "payment.checkout.refund" */
|
|
36
|
+
scope?: string;
|
|
37
|
+
/** User ID from ALS context (populated by middleware) */
|
|
38
|
+
userId?: string;
|
|
38
39
|
/** Source of the log entry (server or client) */
|
|
39
40
|
source?: LogSource;
|
|
40
|
-
/** Origin of the log entry
|
|
41
|
+
/** Origin of the log entry — how it was generated */
|
|
41
42
|
origin?: LogOrigin;
|
|
42
43
|
}
|
|
43
44
|
/**
|
|
44
|
-
*
|
|
45
|
+
* Duck-typed error shape recognised by withErrorHandler.
|
|
46
|
+
* Throw any object with `code` + `statusCode` to get a typed response.
|
|
47
|
+
* - `message` is internal-only (goes to logs, never sent to client).
|
|
48
|
+
* - `userMessage` is client-safe (sent in the response body).
|
|
45
49
|
*/
|
|
50
|
+
export interface HandledError {
|
|
51
|
+
code: string;
|
|
52
|
+
statusCode: number;
|
|
53
|
+
message?: string;
|
|
54
|
+
userMessage?: string;
|
|
55
|
+
}
|
|
56
|
+
/** Ring buffer entry — a captured TRACE/DEBUG entry stored for error context dumps */
|
|
57
|
+
export interface RingBufferEntry {
|
|
58
|
+
level: LogLevel;
|
|
59
|
+
msg: string;
|
|
60
|
+
fields?: Record<string, unknown>;
|
|
61
|
+
ts: string;
|
|
62
|
+
}
|
|
63
|
+
/** Logger interface — the public API for logging */
|
|
46
64
|
export interface Logger {
|
|
65
|
+
fatal(message: string, data?: LogData): void;
|
|
47
66
|
error(message: string, data?: LogData): void;
|
|
48
67
|
warn(message: string, data?: LogData): void;
|
|
49
68
|
info(message: string, data?: LogData): void;
|
|
50
69
|
debug(message: string, data?: LogData): void;
|
|
70
|
+
trace(message: string, data?: LogData): void;
|
|
71
|
+
heartbeat(name: string, fields: {
|
|
72
|
+
status: string;
|
|
73
|
+
[key: string]: unknown;
|
|
74
|
+
}, opts?: {
|
|
75
|
+
trigger?: (prev: Record<string, unknown>, curr: Record<string, unknown>) => boolean;
|
|
76
|
+
}): void;
|
|
77
|
+
sampled(level: 'trace' | 'debug' | 'info' | 'warn', msg: string, fields?: Record<string, unknown>, opts?: {
|
|
78
|
+
sample: number;
|
|
79
|
+
}): void;
|
|
80
|
+
dedupe(level: 'trace' | 'debug' | 'info' | 'warn', msg: string, fields?: Record<string, unknown>, opts?: {
|
|
81
|
+
window: string;
|
|
82
|
+
key?: string;
|
|
83
|
+
}): void;
|
|
84
|
+
/** Access the ring buffer for a correlation ID (optional — not all implementations support it) */
|
|
85
|
+
getRingBuffer?: (correlationId: string, n?: number) => RingBufferEntry[];
|
|
51
86
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Configuration options loaded from hazo_logs_config.ini
|
|
54
|
-
*/
|
|
87
|
+
/** Configuration options loaded from hazo_logs_config.ini */
|
|
55
88
|
export interface HazoLogConfig {
|
|
56
89
|
log_directory: string;
|
|
57
|
-
log_level:
|
|
90
|
+
log_level: ConfigLogLevel;
|
|
58
91
|
enable_console: boolean;
|
|
59
92
|
enable_file: boolean;
|
|
60
93
|
max_file_size: string;
|
|
@@ -64,18 +97,18 @@ export interface HazoLogConfig {
|
|
|
64
97
|
log_viewer_page_size: number;
|
|
65
98
|
log_viewer_max_results: number;
|
|
66
99
|
}
|
|
67
|
-
/**
|
|
68
|
-
* Options for creating a package logger
|
|
69
|
-
*/
|
|
100
|
+
/** Options for creating a package logger */
|
|
70
101
|
export interface PackageLoggerOptions {
|
|
71
102
|
packageName: string;
|
|
72
103
|
}
|
|
73
|
-
/**
|
|
74
|
-
* Log context for session and reference tracking
|
|
75
|
-
*/
|
|
104
|
+
/** Log context for session and reference tracking via AsyncLocalStorage */
|
|
76
105
|
export interface LogContext {
|
|
77
106
|
sessionId?: string;
|
|
78
107
|
reference?: string;
|
|
79
108
|
depth?: number;
|
|
109
|
+
/** User ID — set by auth middleware, read by logger and useErrorReporter */
|
|
110
|
+
userId?: string;
|
|
111
|
+
/** Fine-grained operation scope — e.g. "payment.checkout" */
|
|
112
|
+
scope?: string;
|
|
80
113
|
}
|
|
81
114
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal-logger.d.ts","sourceRoot":"","sources":["../../src/lib/universal-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"universal-logger.d.ts","sourceRoot":"","sources":["../../src/lib/universal-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAA4B,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiGpD;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAYzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB5E;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -40,6 +40,9 @@ class DeferredServerLogger {
|
|
|
40
40
|
// Keep using ConsoleLogger
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
fatal(message, data) {
|
|
44
|
+
this.innerLogger.fatal(message, data);
|
|
45
|
+
}
|
|
43
46
|
error(message, data) {
|
|
44
47
|
this.innerLogger.error(message, data);
|
|
45
48
|
}
|
|
@@ -52,6 +55,21 @@ class DeferredServerLogger {
|
|
|
52
55
|
debug(message, data) {
|
|
53
56
|
this.innerLogger.debug(message, data);
|
|
54
57
|
}
|
|
58
|
+
trace(message, data) {
|
|
59
|
+
this.innerLogger.trace(message, data);
|
|
60
|
+
}
|
|
61
|
+
heartbeat(name, fields, opts) {
|
|
62
|
+
this.innerLogger.heartbeat(name, fields, opts);
|
|
63
|
+
}
|
|
64
|
+
sampled(level, msg, fields, opts) {
|
|
65
|
+
this.innerLogger.sampled(level, msg, fields, opts);
|
|
66
|
+
}
|
|
67
|
+
dedupe(level, msg, fields, opts) {
|
|
68
|
+
this.innerLogger.dedupe(level, msg, fields, opts);
|
|
69
|
+
}
|
|
70
|
+
getRingBuffer(correlationId, n) {
|
|
71
|
+
return this.innerLogger.getRingBuffer?.(correlationId, n) ?? [];
|
|
72
|
+
}
|
|
55
73
|
}
|
|
56
74
|
// Cache for pre-loaded server loggers
|
|
57
75
|
const serverLoggerCache = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal-logger.js","sourceRoot":"","sources":["../../src/lib/universal-logger.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"universal-logger.js","sourceRoot":"","sources":["../../src/lib/universal-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Utility to extract filename and line number from call stack
|
|
2
|
+
* Utility to extract filename and line number from call stack.
|
|
3
|
+
*
|
|
4
|
+
* Exports:
|
|
5
|
+
* getCallerInfo() — richer API used by hazo_logs internals (walks past logger frames)
|
|
6
|
+
* get_filename() — simple stack-scraping helper for API route logging
|
|
7
|
+
* get_line_number() — simple stack-scraping helper for API route logging
|
|
8
|
+
*
|
|
9
|
+
* get_filename / get_line_number were originally in hazo_auth/src/lib/utils/api_route_helpers.ts.
|
|
10
|
+
* Canonical location moved here in hazo_logs (see hazo_auth for re-export shim).
|
|
3
11
|
*/
|
|
4
12
|
export interface CallerInfo {
|
|
5
13
|
filename: string;
|
|
@@ -10,4 +18,20 @@ export interface CallerInfo {
|
|
|
10
18
|
* Walks up the stack to find the actual calling code (not the logger internals)
|
|
11
19
|
*/
|
|
12
20
|
export declare function getCallerInfo(): CallerInfo;
|
|
21
|
+
/**
|
|
22
|
+
* Gets the filename of the caller from the call stack.
|
|
23
|
+
* Simpler alternative to getCallerInfo() — does not skip internal frames,
|
|
24
|
+
* suitable for use directly in API route handlers.
|
|
25
|
+
*
|
|
26
|
+
* @returns Filename (basename only) or "route.ts" as default
|
|
27
|
+
*/
|
|
28
|
+
export declare function get_filename(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Gets the line number of the caller from the call stack.
|
|
31
|
+
* Simpler alternative to getCallerInfo() — does not skip internal frames,
|
|
32
|
+
* suitable for use directly in API route handlers.
|
|
33
|
+
*
|
|
34
|
+
* @returns Line number or 0
|
|
35
|
+
*/
|
|
36
|
+
export declare function get_line_number(): number;
|
|
13
37
|
//# sourceMappingURL=caller_info.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caller_info.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/caller_info.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"caller_info.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/caller_info.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,UAAU,CA+B1C;AAwCD;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAerC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAexC"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Utility to extract filename and line number from call stack
|
|
2
|
+
* Utility to extract filename and line number from call stack.
|
|
3
|
+
*
|
|
4
|
+
* Exports:
|
|
5
|
+
* getCallerInfo() — richer API used by hazo_logs internals (walks past logger frames)
|
|
6
|
+
* get_filename() — simple stack-scraping helper for API route logging
|
|
7
|
+
* get_line_number() — simple stack-scraping helper for API route logging
|
|
8
|
+
*
|
|
9
|
+
* get_filename / get_line_number were originally in hazo_auth/src/lib/utils/api_route_helpers.ts.
|
|
10
|
+
* Canonical location moved here in hazo_logs (see hazo_auth for re-export shim).
|
|
3
11
|
*/
|
|
4
12
|
/**
|
|
5
13
|
* Get the filename and line number of the caller
|
|
@@ -62,4 +70,57 @@ function extractFilename(fullPath) {
|
|
|
62
70
|
const parts = fullPath.split(/[/\\]/);
|
|
63
71
|
return parts[parts.length - 1] || fullPath;
|
|
64
72
|
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Simple stack-scraping helpers (ported from hazo_auth/api_route_helpers)
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Gets the filename of the caller from the call stack.
|
|
78
|
+
* Simpler alternative to getCallerInfo() — does not skip internal frames,
|
|
79
|
+
* suitable for use directly in API route handlers.
|
|
80
|
+
*
|
|
81
|
+
* @returns Filename (basename only) or "route.ts" as default
|
|
82
|
+
*/
|
|
83
|
+
export function get_filename() {
|
|
84
|
+
try {
|
|
85
|
+
const stack = new Error().stack;
|
|
86
|
+
if (!stack)
|
|
87
|
+
return 'route.ts';
|
|
88
|
+
const lines = stack.split('\n');
|
|
89
|
+
// Skip "Error" line and the get_filename() frame itself
|
|
90
|
+
for (let i = 2; i < lines.length; i++) {
|
|
91
|
+
const match = lines[i].match(/([^/\\]+\.tsx?):(\d+):(\d+)/);
|
|
92
|
+
if (match)
|
|
93
|
+
return match[1];
|
|
94
|
+
}
|
|
95
|
+
return 'route.ts';
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return 'route.ts';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Gets the line number of the caller from the call stack.
|
|
103
|
+
* Simpler alternative to getCallerInfo() — does not skip internal frames,
|
|
104
|
+
* suitable for use directly in API route handlers.
|
|
105
|
+
*
|
|
106
|
+
* @returns Line number or 0
|
|
107
|
+
*/
|
|
108
|
+
export function get_line_number() {
|
|
109
|
+
try {
|
|
110
|
+
const stack = new Error().stack;
|
|
111
|
+
if (!stack)
|
|
112
|
+
return 0;
|
|
113
|
+
const lines = stack.split('\n');
|
|
114
|
+
// Skip "Error" line and the get_line_number() frame itself
|
|
115
|
+
for (let i = 2; i < lines.length; i++) {
|
|
116
|
+
const match = lines[i].match(/([^/\\]+\.tsx?):(\d+):(\d+)/);
|
|
117
|
+
if (match)
|
|
118
|
+
return parseInt(match[2], 10) || 0;
|
|
119
|
+
}
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
65
126
|
//# sourceMappingURL=caller_info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caller_info.js","sourceRoot":"","sources":["../../../src/lib/utils/caller_info.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"caller_info.js","sourceRoot":"","sources":["../../../src/lib/utils/caller_info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* withErrorHandler — wraps a Next.js App Router handler function.
|
|
3
|
+
*
|
|
4
|
+
* On throw:
|
|
5
|
+
* - Generates a correlationId
|
|
6
|
+
* - Sets X-Correlation-Id response header
|
|
7
|
+
* - Logs at a level derived from statusCode (none→fatal, 5xx→error, 4xx→warn)
|
|
8
|
+
* - Returns { error, code, correlationId } JSON — internal message never reaches client
|
|
9
|
+
*
|
|
10
|
+
* Duck-typed HandledError fields:
|
|
11
|
+
* - code → response body `code`
|
|
12
|
+
* - statusCode → HTTP status
|
|
13
|
+
* - userMessage → client-facing message (falls back to "Internal server error")
|
|
14
|
+
* - message → logs only, never sent to client
|
|
15
|
+
*/
|
|
16
|
+
type AppRouterHandler = (request: Request) => Promise<Response>;
|
|
17
|
+
export declare function withErrorHandler(handler: AppRouterHandler): AppRouterHandler;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=with-error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-error-handler.d.ts","sourceRoot":"","sources":["../../src/lib/with-error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,KAAK,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAiBhE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,CAqD5E"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* withErrorHandler — wraps a Next.js App Router handler function.
|
|
3
|
+
*
|
|
4
|
+
* On throw:
|
|
5
|
+
* - Generates a correlationId
|
|
6
|
+
* - Sets X-Correlation-Id response header
|
|
7
|
+
* - Logs at a level derived from statusCode (none→fatal, 5xx→error, 4xx→warn)
|
|
8
|
+
* - Returns { error, code, correlationId } JSON — internal message never reaches client
|
|
9
|
+
*
|
|
10
|
+
* Duck-typed HandledError fields:
|
|
11
|
+
* - code → response body `code`
|
|
12
|
+
* - statusCode → HTTP status
|
|
13
|
+
* - userMessage → client-facing message (falls back to "Internal server error")
|
|
14
|
+
* - message → logs only, never sent to client
|
|
15
|
+
*/
|
|
16
|
+
import { generateRequestId } from 'hazo_core';
|
|
17
|
+
import { createLogger } from './package_logger.js';
|
|
18
|
+
const logger = createLogger('hazo_logs.withErrorHandler');
|
|
19
|
+
function isHandledError(err) {
|
|
20
|
+
return (typeof err === 'object' &&
|
|
21
|
+
err !== null &&
|
|
22
|
+
typeof err.code === 'string' &&
|
|
23
|
+
typeof err.statusCode === 'number');
|
|
24
|
+
}
|
|
25
|
+
function levelForStatus(statusCode) {
|
|
26
|
+
if (statusCode >= 500)
|
|
27
|
+
return 'error';
|
|
28
|
+
if (statusCode >= 400)
|
|
29
|
+
return 'warn';
|
|
30
|
+
return 'fatal'; // shouldn't happen, but guard it
|
|
31
|
+
}
|
|
32
|
+
export function withErrorHandler(handler) {
|
|
33
|
+
return async (request) => {
|
|
34
|
+
try {
|
|
35
|
+
return await handler(request);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const correlationId = generateRequestId();
|
|
39
|
+
if (isHandledError(err)) {
|
|
40
|
+
const level = levelForStatus(err.statusCode);
|
|
41
|
+
const logMessage = `[${err.code}] ${err.message ?? err.userMessage ?? 'handled error'}`;
|
|
42
|
+
logger[level](logMessage, {
|
|
43
|
+
correlationId,
|
|
44
|
+
code: err.code,
|
|
45
|
+
statusCode: err.statusCode,
|
|
46
|
+
path: new URL(request.url).pathname,
|
|
47
|
+
});
|
|
48
|
+
return Response.json({
|
|
49
|
+
error: err.userMessage ?? 'Request failed',
|
|
50
|
+
code: err.code,
|
|
51
|
+
correlationId,
|
|
52
|
+
}, {
|
|
53
|
+
status: err.statusCode,
|
|
54
|
+
headers: { 'X-Correlation-Id': correlationId },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Unknown / generic Error — log at fatal, never expose message
|
|
58
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
59
|
+
const stack = err instanceof Error ? err.stack : undefined;
|
|
60
|
+
logger.fatal('Unhandled route exception', {
|
|
61
|
+
correlationId,
|
|
62
|
+
message,
|
|
63
|
+
stack,
|
|
64
|
+
path: new URL(request.url).pathname,
|
|
65
|
+
});
|
|
66
|
+
return Response.json({
|
|
67
|
+
error: 'Internal server error',
|
|
68
|
+
code: 'internal_error',
|
|
69
|
+
correlationId,
|
|
70
|
+
}, {
|
|
71
|
+
status: 500,
|
|
72
|
+
headers: { 'X-Correlation-Id': correlationId },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=with-error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-error-handler.js","sourceRoot":"","sources":["../../src/lib/with-error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,MAAM,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC;AAI1D,SAAS,cAAc,CAAC,GAAY;IAClC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAQ,GAA+B,CAAC,IAAI,KAAK,QAAQ;QACzD,OAAQ,GAA+B,CAAC,UAAU,KAAK,QAAQ,CAChE,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,OAAO,CAAC;IACtC,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,OAAO,CAAC,CAAC,iCAAiC;AACnD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACxD,OAAO,KAAK,EAAE,OAAgB,EAAqB,EAAE;QACnD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;YAE1C,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,WAAW,IAAI,eAAe,EAAE,CAAC;gBACxF,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE;oBACxB,aAAa;oBACb,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ;iBACpC,CAAC,CAAC;gBAEH,OAAO,QAAQ,CAAC,IAAI,CAClB;oBACE,KAAK,EAAE,GAAG,CAAC,WAAW,IAAI,gBAAgB;oBAC1C,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,aAAa;iBACd,EACD;oBACE,MAAM,EAAE,GAAG,CAAC,UAAU;oBACtB,OAAO,EAAE,EAAE,kBAAkB,EAAE,aAAa,EAAE;iBAC/C,CACF,CAAC;YACJ,CAAC;YAED,+DAA+D;YAC/D,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;gBACxC,aAAa;gBACb,OAAO;gBACP,KAAK;gBACL,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ;aACpC,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAClB;gBACE,KAAK,EAAE,uBAAuB;gBAC9B,IAAI,EAAE,gBAAgB;gBACtB,aAAa;aACd,EACD;gBACE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,kBAAkB,EAAE,aAAa,EAAE;aAC/C,CACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -17,10 +17,19 @@ import 'server-only';
|
|
|
17
17
|
export { HazoLogger } from './lib/hazo_logger.js';
|
|
18
18
|
export { PackageLogger, createLogger } from './lib/package_logger.js';
|
|
19
19
|
export { loadConfig } from './lib/config_loader.js';
|
|
20
|
+
export { getRingBuffer, ringBufferRegistry, RingBuffer, RingBufferRegistry } from './lib/ring_buffer.js';
|
|
21
|
+
export { LevelResolver } from './lib/level_resolver.js';
|
|
22
|
+
export type { OverrideMap } from './lib/level_resolver.js';
|
|
20
23
|
export { generateSessionId, startSession, startSessionAsync, runWithLogContext, runWithLogContextAsync, getLogContext, withSession, withContext, } from './lib/context/log-context.js';
|
|
21
24
|
export { readLogs, getAvailableLogDates, getUniquePackages, getUniqueExecutionIds, getUniqueSessionIds, getUniqueReferences, } from './lib/log-reader.js';
|
|
22
25
|
export type { Logger, LogLevel, LogData, LogEntry, LogContext, HazoLogConfig, PackageLoggerOptions, LogOrigin, } from './lib/types.js';
|
|
23
26
|
export type { ReadLogsOptions, LogQueryResult } from './lib/log-reader.js';
|
|
24
27
|
export { tailLogs } from "./lib/log-tail.js";
|
|
25
28
|
export type { TailOptions } from "./lib/log-tail.js";
|
|
29
|
+
export { withErrorHandler } from './lib/with-error-handler.js';
|
|
30
|
+
export { installGlobalErrorHandlers } from './lib/global-error-handlers.js';
|
|
31
|
+
export type { GlobalErrorHandlerOptions } from './lib/global-error-handlers.js';
|
|
32
|
+
export { registerAlertTrigger } from './lib/alert-triggers.js';
|
|
33
|
+
export type { AlertTriggerConfig, AlertTriggerMatch, AlertTriggerNotify } from './lib/alert-triggers.js';
|
|
34
|
+
export type { HandledError, ConfigLogLevel, RingBufferEntry } from './lib/types.js';
|
|
26
35
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,WAAW,EACX,WAAW,GACZ,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,MAAM,EACN,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,WAAW,EACX,WAAW,GACZ,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,MAAM,EACN,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,YAAY,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGzG,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -18,9 +18,16 @@ import 'server-only';
|
|
|
18
18
|
export { HazoLogger } from './lib/hazo_logger.js';
|
|
19
19
|
export { PackageLogger, createLogger } from './lib/package_logger.js';
|
|
20
20
|
export { loadConfig } from './lib/config_loader.js';
|
|
21
|
+
// Log quality — ring buffer, level resolver
|
|
22
|
+
export { getRingBuffer, ringBufferRegistry, RingBuffer, RingBufferRegistry } from './lib/ring_buffer.js';
|
|
23
|
+
export { LevelResolver } from './lib/level_resolver.js';
|
|
21
24
|
// Log context (uses AsyncLocalStorage)
|
|
22
25
|
export { generateSessionId, startSession, startSessionAsync, runWithLogContext, runWithLogContextAsync, getLogContext, withSession, withContext, } from './lib/context/log-context.js';
|
|
23
26
|
// Log reader (uses fs, readline)
|
|
24
27
|
export { readLogs, getAvailableLogDates, getUniquePackages, getUniqueExecutionIds, getUniqueSessionIds, getUniqueReferences, } from './lib/log-reader.js';
|
|
25
28
|
export { tailLogs } from "./lib/log-tail.js";
|
|
29
|
+
// Error handling (R1, R2, R3)
|
|
30
|
+
export { withErrorHandler } from './lib/with-error-handler.js';
|
|
31
|
+
export { installGlobalErrorHandlers } from './lib/global-error-handlers.js';
|
|
32
|
+
export { registerAlertTrigger } from './lib/alert-triggers.js';
|
|
26
33
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,uCAAuC;AACvC,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,WAAW,EACX,WAAW,GACZ,MAAM,8BAA8B,CAAC;AAEtC,iCAAiC;AACjC,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAgB7B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,4CAA4C;AAC5C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,uCAAuC;AACvC,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,WAAW,EACX,WAAW,GACZ,MAAM,8BAA8B,CAAC;AAEtC,iCAAiC;AACjC,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAgB7B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,8BAA8B;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ErrorBoundary — catches React render errors and logs them via the client logger pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Distinct from hazo_debug's DebugErrorBoundary (which feeds the debug panel).
|
|
5
|
+
* This boundary is for production error capture with correlationId tracking.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* <ErrorBoundary fallback={({ error, correlationId, retry }) => (
|
|
9
|
+
* <div>Something went wrong. Reference: {correlationId}</div>
|
|
10
|
+
* )}>
|
|
11
|
+
* {children}
|
|
12
|
+
* </ErrorBoundary>
|
|
13
|
+
*/
|
|
14
|
+
import React from 'react';
|
|
15
|
+
export interface ErrorBoundaryFallbackProps {
|
|
16
|
+
error: Error;
|
|
17
|
+
correlationId: string;
|
|
18
|
+
retry: () => void;
|
|
19
|
+
}
|
|
20
|
+
export interface ErrorBoundaryProps {
|
|
21
|
+
children: React.ReactNode;
|
|
22
|
+
/** Render prop called when an error is caught */
|
|
23
|
+
fallback: (props: ErrorBoundaryFallbackProps) => React.ReactNode;
|
|
24
|
+
/** Optional callback for consumer-side error reporting */
|
|
25
|
+
onError?: (error: Error, info: React.ErrorInfo) => void;
|
|
26
|
+
/** API base path for the log ingest endpoint (default: '/api/logs') */
|
|
27
|
+
apiBasePath?: string;
|
|
28
|
+
/** Package name tag for log entries (default: 'hazo_logs.ErrorBoundary') */
|
|
29
|
+
packageName?: string;
|
|
30
|
+
}
|
|
31
|
+
interface ErrorBoundaryState {
|
|
32
|
+
error: Error | null;
|
|
33
|
+
correlationId: string | null;
|
|
34
|
+
}
|
|
35
|
+
export declare class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
36
|
+
private logger;
|
|
37
|
+
constructor(props: ErrorBoundaryProps);
|
|
38
|
+
static getDerivedStateFromError(error: Error): ErrorBoundaryState;
|
|
39
|
+
componentDidCatch(error: Error, info: React.ErrorInfo): void;
|
|
40
|
+
retry(): void;
|
|
41
|
+
render(): React.ReactNode;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=ErrorBoundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,KAAK,CAAC,SAAS,CAAC;IACjE,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IACxD,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,qBAAa,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IACxF,OAAO,CAAC,MAAM,CAA6B;gBAE/B,KAAK,EAAE,kBAAkB;IAMrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB;IAOjE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI;IAmB5D,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,KAAK,CAAC,SAAS;CAO1B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* ErrorBoundary — catches React render errors and logs them via the client logger pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Distinct from hazo_debug's DebugErrorBoundary (which feeds the debug panel).
|
|
6
|
+
* This boundary is for production error capture with correlationId tracking.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* <ErrorBoundary fallback={({ error, correlationId, retry }) => (
|
|
10
|
+
* <div>Something went wrong. Reference: {correlationId}</div>
|
|
11
|
+
* )}>
|
|
12
|
+
* {children}
|
|
13
|
+
* </ErrorBoundary>
|
|
14
|
+
*/
|
|
15
|
+
import React from 'react';
|
|
16
|
+
import { generateRequestId } from 'hazo_core';
|
|
17
|
+
import { createClientLogger } from '../client-logger.js';
|
|
18
|
+
export class ErrorBoundary extends React.Component {
|
|
19
|
+
logger = null;
|
|
20
|
+
constructor(props) {
|
|
21
|
+
super(props);
|
|
22
|
+
this.state = { error: null, correlationId: null };
|
|
23
|
+
this.retry = this.retry.bind(this);
|
|
24
|
+
}
|
|
25
|
+
static getDerivedStateFromError(error) {
|
|
26
|
+
return {
|
|
27
|
+
error,
|
|
28
|
+
correlationId: generateRequestId(),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
componentDidCatch(error, info) {
|
|
32
|
+
const correlationId = this.state.correlationId ?? generateRequestId();
|
|
33
|
+
if (!this.logger) {
|
|
34
|
+
this.logger = createClientLogger({
|
|
35
|
+
apiBasePath: this.props.apiBasePath,
|
|
36
|
+
packageName: this.props.packageName ?? 'hazo_logs.ErrorBoundary',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
this.logger.error(`Render error: ${error.message}`, {
|
|
40
|
+
correlationId,
|
|
41
|
+
error_name: error.name,
|
|
42
|
+
component_stack: info.componentStack ?? undefined,
|
|
43
|
+
});
|
|
44
|
+
this.props.onError?.(error, info);
|
|
45
|
+
}
|
|
46
|
+
retry() {
|
|
47
|
+
this.setState({ error: null, correlationId: null });
|
|
48
|
+
}
|
|
49
|
+
render() {
|
|
50
|
+
const { error, correlationId } = this.state;
|
|
51
|
+
if (error && correlationId) {
|
|
52
|
+
return this.props.fallback({ error, correlationId, retry: this.retry });
|
|
53
|
+
}
|
|
54
|
+
return this.props.children;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../../src/ui/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AA0BzD,MAAM,OAAO,aAAc,SAAQ,KAAK,CAAC,SAAiD;IAChF,MAAM,GAAwB,IAAI,CAAC;IAE3C,YAAY,KAAyB;QACnC,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO;YACL,KAAK;YACL,aAAa,EAAE,iBAAiB,EAAE;SACnC,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,KAAY,EAAE,IAAqB;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,iBAAiB,EAAE,CAAC;QAEtE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC;gBAC/B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;gBACnC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,yBAAyB;aACjE,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,EAAE;YAClD,aAAa;YACb,UAAU,EAAE,KAAK,CAAC,IAAI;YACtB,eAAe,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;SAClD,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM;QACJ,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5C,IAAI,KAAK,IAAI,aAAa,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogLevelBadge.d.ts","sourceRoot":"","sources":["../../../src/ui/components/LogLevelBadge.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"LogLevelBadge.d.ts","sourceRoot":"","sources":["../../../src/ui/components/LogLevelBadge.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAUtD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,SAAc,EAAE,EAAE,kBAAkB,2CAU1E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
const LEVEL_STYLES = {
|
|
4
|
+
fatal: 'bg-red-700 text-white border-red-800',
|
|
4
5
|
error: 'bg-red-100 text-red-700 border-red-200',
|
|
5
6
|
warn: 'bg-yellow-100 text-yellow-700 border-yellow-200',
|
|
6
7
|
info: 'bg-blue-100 text-blue-700 border-blue-200',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogLevelBadge.js","sourceRoot":"","sources":["../../../src/ui/components/LogLevelBadge.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAKb,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,wCAAwC;IAC/C,IAAI,EAAE,iDAAiD;IACvD,IAAI,EAAE,2CAA2C;IACjD,KAAK,EAAE,2CAA2C;CAC1C,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAsB;IACzE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;IAExD,OAAO,CACL,eACE,SAAS,EAAE,2EAA2E,MAAM,IAAI,SAAS,EAAE,YAE1G,KAAK,CAAC,WAAW,EAAE,GACf,CACR,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"LogLevelBadge.js","sourceRoot":"","sources":["../../../src/ui/components/LogLevelBadge.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAKb,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,sCAAsC;IAC7C,KAAK,EAAE,wCAAwC;IAC/C,IAAI,EAAE,iDAAiD;IACvD,IAAI,EAAE,2CAA2C;IACjD,KAAK,EAAE,2CAA2C;CAC1C,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAsB;IACzE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;IAExD,OAAO,CACL,eACE,SAAS,EAAE,2EAA2E,MAAM,IAAI,SAAS,EAAE,YAE1G,KAAK,CAAC,WAAW,EAAE,GACf,CACR,CAAC;AACJ,CAAC"}
|