64 lines
2.6 KiB
TypeScript
64 lines
2.6 KiB
TypeScript
import { AnalysisError } from "../../domain/analysisErrorBase.js";
|
|
import type {
|
|
PartialProcessCaptureObservation,
|
|
ProcessCaptureCleanupReport,
|
|
} from "../../domain/process/processCapture.js";
|
|
|
|
interface ProcessCaptureErrorOptions extends ErrorOptions {
|
|
readonly userMessage?: string;
|
|
readonly userCategory?: "cancelled";
|
|
readonly reason?: "capture_failed" | "cleanup_incomplete" | "cancelled";
|
|
readonly cleanupResources?: readonly string[];
|
|
readonly executionFailure?: string;
|
|
readonly partialObservation?: PartialProcessCaptureObservation;
|
|
readonly cleanupReport?: ProcessCaptureCleanupReport;
|
|
}
|
|
|
|
/** Typed application failure produced by controlled process capture. */
|
|
export class ProcessCaptureError extends AnalysisError {
|
|
readonly _tag = "ProcessCaptureError";
|
|
|
|
override readonly userMessage: string | undefined;
|
|
override readonly userCategory: "cancelled" | undefined;
|
|
readonly reason: NonNullable<ProcessCaptureErrorOptions["reason"]>;
|
|
override readonly cleanupIncomplete: boolean;
|
|
override readonly cleanupResources: readonly string[];
|
|
override readonly executionFailure: string | undefined;
|
|
override readonly partialObservation:
|
|
| PartialProcessCaptureObservation
|
|
| undefined;
|
|
override readonly cleanupReport: ProcessCaptureCleanupReport | undefined;
|
|
|
|
constructor(message: string, options?: ProcessCaptureErrorOptions) {
|
|
super(message, options);
|
|
this.userMessage = options?.userMessage;
|
|
this.userCategory = options?.userCategory;
|
|
this.reason =
|
|
options?.reason ??
|
|
(options?.userCategory === "cancelled" ? "cancelled" : "capture_failed");
|
|
this.cleanupIncomplete = this.reason === "cleanup_incomplete";
|
|
this.cleanupResources = options?.cleanupResources ?? [];
|
|
this.executionFailure = options?.executionFailure;
|
|
this.partialObservation = options?.partialObservation;
|
|
this.cleanupReport = options?.cleanupReport;
|
|
}
|
|
}
|
|
|
|
/** Return one non-recursive, domain-neutral summary of an execution failure. */
|
|
export const describeProcessCaptureExecutionFailure = (
|
|
failure: unknown,
|
|
): string | undefined => {
|
|
if (failure instanceof Error) return failure.message || failure.name;
|
|
if (typeof failure === "string") return failure;
|
|
if (failure === undefined) return undefined;
|
|
return "Process capture failed with a non-error rejection.";
|
|
};
|
|
|
|
/** Caller-visible cancellation without exposing capture implementation state. */
|
|
export const processCaptureCancelled = (): ProcessCaptureError =>
|
|
new ProcessCaptureError("process capture was cancelled", {
|
|
userCategory: "cancelled",
|
|
reason: "cancelled",
|
|
userMessage: "Process capture was cancelled. Start it again when ready.",
|
|
});
|