You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.8 KiB
142 lines
3.8 KiB
import {
|
|
LogLevel,
|
|
createCatalogDiagnostics,
|
|
type DiagnosticCatalog,
|
|
type DiagnosticEvent,
|
|
type Diagnostics
|
|
} from '$libs/logr';
|
|
import {
|
|
CONN_DIAGNOSTIC_EVENTS,
|
|
CONN_EVENT_MESSAGE,
|
|
CONN_MODULE,
|
|
CONN_LOG_MSG_AUTH_FAILED,
|
|
CONN_LOG_MSG_BROWSER_RECONNECT,
|
|
CONN_LOG_MSG_CONNECT_FAILED,
|
|
CONN_LOG_MSG_FRAME_DECODE_FAILED,
|
|
CONN_LOG_MSG_FRAME_ENCODE_FAILED,
|
|
CONN_LOG_MSG_HEARTBEAT_TIMEOUT,
|
|
CONN_LOG_MSG_REAUTH_FAILED,
|
|
CONN_LOG_MSG_RECONNECT_EXHAUSTED,
|
|
CONN_LOG_MSG_SEND_FAILED,
|
|
CONN_LOG_MSG_SESSION_CHANGED,
|
|
CONN_LOG_MSG_SESSION_EXPIRED,
|
|
CONN_LOG_MSG_SESSION_REFRESHED,
|
|
CONN_LOG_MSG_SESSION_REVOKED,
|
|
CONN_LOG_MSG_TRANSPORT_ERROR
|
|
} from './consts.ts';
|
|
import { listenerThrewMessage } from './helpers.ts';
|
|
import type { Logger } from '$libs/logr';
|
|
|
|
export type ConnectionDiagnosticType =
|
|
(typeof CONN_DIAGNOSTIC_EVENTS)[keyof typeof CONN_DIAGNOSTIC_EVENTS];
|
|
|
|
export type ConnectionDiagnosticEvent = DiagnosticEvent<ConnectionDiagnosticType>;
|
|
export type ConnectionDiagnostics = Diagnostics<ConnectionDiagnosticEvent>;
|
|
|
|
const CONN_DIAGNOSTIC_LOGS: DiagnosticCatalog<ConnectionDiagnosticEvent> = {
|
|
[CONN_DIAGNOSTIC_EVENTS.AUTH_FAILED]: {
|
|
level: LogLevel.WARN,
|
|
message: CONN_LOG_MSG_AUTH_FAILED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.BROWSER_RECONNECT]: {
|
|
level: LogLevel.DEBUG,
|
|
message: CONN_LOG_MSG_BROWSER_RECONNECT
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.CONNECT_FAILED]: {
|
|
level: LogLevel.ERROR,
|
|
message: CONN_LOG_MSG_CONNECT_FAILED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.FRAME_DECODE_FAILED]: {
|
|
level: LogLevel.ERROR,
|
|
message: CONN_LOG_MSG_FRAME_DECODE_FAILED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.FRAME_ENCODE_FAILED]: {
|
|
level: LogLevel.ERROR,
|
|
message: CONN_LOG_MSG_FRAME_ENCODE_FAILED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.HEARTBEAT_TIMEOUT]: {
|
|
level: LogLevel.WARN,
|
|
message: CONN_LOG_MSG_HEARTBEAT_TIMEOUT
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.LISTENER_THREW]: (event) => ({
|
|
level: LogLevel.ERROR,
|
|
message: listenerThrewMessage(listenerEventName(event.meta))
|
|
}),
|
|
[CONN_DIAGNOSTIC_EVENTS.REAUTH_FAILED]: {
|
|
level: LogLevel.WARN,
|
|
message: CONN_LOG_MSG_REAUTH_FAILED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.RECONNECT_EXHAUSTED]: {
|
|
level: LogLevel.WARN,
|
|
message: CONN_LOG_MSG_RECONNECT_EXHAUSTED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.SEND_FAILED]: {
|
|
level: LogLevel.ERROR,
|
|
message: CONN_LOG_MSG_SEND_FAILED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.SESS_CHANGED]: {
|
|
level: LogLevel.DEBUG,
|
|
message: CONN_LOG_MSG_SESSION_CHANGED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.SESS_EXPIRED]: {
|
|
level: LogLevel.WARN,
|
|
message: CONN_LOG_MSG_SESSION_EXPIRED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.SESS_REFRESHED]: {
|
|
level: LogLevel.DEBUG,
|
|
message: CONN_LOG_MSG_SESSION_REFRESHED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.SESS_REVOKED]: {
|
|
level: LogLevel.WARN,
|
|
message: CONN_LOG_MSG_SESSION_REVOKED
|
|
},
|
|
[CONN_DIAGNOSTIC_EVENTS.TRANSPORT_ERROR]: {
|
|
level: LogLevel.ERROR,
|
|
message: CONN_LOG_MSG_TRANSPORT_ERROR
|
|
}
|
|
};
|
|
|
|
function listenerEventName(meta: unknown): string {
|
|
if (typeof meta !== 'object' || meta === null) return CONN_EVENT_MESSAGE;
|
|
if (!('event' in meta)) return CONN_EVENT_MESSAGE;
|
|
const event = meta.event;
|
|
return typeof event === 'string' && event.length > 0 ? event : CONN_EVENT_MESSAGE;
|
|
}
|
|
|
|
export function createConnectionDiagnostics(input: {
|
|
readonly logger?: Logger;
|
|
readonly scope: string;
|
|
}): ConnectionDiagnostics {
|
|
return createCatalogDiagnostics({
|
|
logger: input.logger,
|
|
defaultCategory: input.scope,
|
|
catalog: CONN_DIAGNOSTIC_LOGS
|
|
});
|
|
}
|
|
|
|
export function emitConnectionDiagnostic(
|
|
diagnostics: ConnectionDiagnostics,
|
|
type: ConnectionDiagnosticType,
|
|
meta?: unknown
|
|
): void {
|
|
diagnostics.emit({
|
|
artifact: CONN_MODULE,
|
|
type,
|
|
meta
|
|
});
|
|
}
|
|
|
|
export function emitScopedConnectionDiagnostic(
|
|
diagnostics: ConnectionDiagnostics,
|
|
scope: string,
|
|
type: ConnectionDiagnosticType,
|
|
meta?: unknown
|
|
): void {
|
|
diagnostics.emit({
|
|
artifact: CONN_MODULE,
|
|
scope,
|
|
type,
|
|
meta
|
|
});
|
|
}
|