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.

76 lines
1.8 KiB

import {
LogLevel,
createCatalogDiagnostics,
type DiagnosticCatalog,
type DiagnosticEvent,
type Diagnostics
} from '$libs/logger';
import type { PermCheckInput, PermDecision } from '$libs/perm';
import {
PERM_MODULE,
PERM_DIAGNOSTIC_EVENTS,
PERM_LOG_MSG_AUDIT_FAILED,
PERM_LOG_MSG_DECISION,
PERM_LOG_MSG_DENIED,
PERM_LOG_MSG_INDETERMINATE
} from './consts.ts';
import type { EnginePermsOptions } from './types.ts';
export type PermDiagnosticType =
(typeof PERM_DIAGNOSTIC_EVENTS)[keyof typeof PERM_DIAGNOSTIC_EVENTS];
export interface PermDiagnosticMeta {
readonly action: PermCheckInput['action'];
readonly resource: PermCheckInput['resource'];
readonly decision: PermDecision;
/** Set on `AUDIT_FAILED`: error thrown by the host's `onDecision` sink. */
readonly error?: unknown;
}
export type PermDiagnosticEvent = DiagnosticEvent<
PermDiagnosticType,
PermDiagnosticMeta
>;
export type PermDiagnostics = Diagnostics<PermDiagnosticEvent>;
const PERM_DIAGNOSTIC_LOGS: DiagnosticCatalog<PermDiagnosticEvent> = {
[PERM_DIAGNOSTIC_EVENTS.DECISION]: {
level: LogLevel.DEBUG,
message: PERM_LOG_MSG_DECISION
},
[PERM_DIAGNOSTIC_EVENTS.DENIED]: {
level: LogLevel.WARN,
message: PERM_LOG_MSG_DENIED
},
[PERM_DIAGNOSTIC_EVENTS.INDETERMINATE]: {
level: LogLevel.WARN,
message: PERM_LOG_MSG_INDETERMINATE
},
[PERM_DIAGNOSTIC_EVENTS.AUDIT_FAILED]: {
level: LogLevel.ERROR,
message: PERM_LOG_MSG_AUDIT_FAILED
}
};
export function createPermDiagnostics(
logger?: EnginePermsOptions['logger']
): PermDiagnostics {
return createCatalogDiagnostics({
logger,
defaultCategory: PERM_MODULE,
catalog: PERM_DIAGNOSTIC_LOGS
});
}
export function emitPermDiagnostic(
diagnostics: PermDiagnostics,
type: PermDiagnosticType,
meta: PermDiagnosticMeta
): void {
diagnostics.emit({
artifact: PERM_MODULE,
type,
meta
});
}

Powered by TurnKey Linux.