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
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
|
|
});
|
|
}
|