All files / server/services/sandbox/execution-phases timeout-phase.ts

100% Statements 7/7
100% Branches 5/5
100% Functions 4/4
100% Lines 7/7

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64                                                          6x                       4x 4x   4x                         5x   5x 2x      
// execution-phases/timeout-phase.ts
// Verantwortlichkeit: Timeout nach Start der Ausführung
// - Timeout planen
// - Laufende Ausführung abbrechen
// - Timeout-Notification ausgeben
// - Optionalen Docker-Container aufräumen
 
import type { Logger } from "@shared/logger";
import type { ProcessExecution } from "../../process-execution-port";
import type { ExecutionState } from "../execution-manager";
import { cleanupDockerContainer } from "./cleanup-phase";
 
interface TimeoutScheduler {
  schedule(timeoutMs: number | null, callback: () => void): void;
}
 
interface TimeoutCallbacks {
  onOutput: (line: string, isComplete?: boolean) => void;
}
 
export interface TimeoutDependencies {
  processExecutor: ProcessExecution;
  logger: Logger;
}
 
/**
 * Bricht die laufende Ausführung ab.
 */
export function abortExecution(state: ExecutionState, signal: NodeJS.Signals = "SIGKILL"): void {
  state.processController.kill(signal);
}
 
/**
 * Behandelt einen abgelaufenen Execution-Timeout.
 */
export function handleExecutionTimeout(
  executionTimeout: number | undefined,
  state: ExecutionState,
  callbacks: TimeoutCallbacks,
  deps: TimeoutDependencies,
): void {
  abortExecution(state);
  callbacks.onOutput(`--- Simulation timeout (${executionTimeout}s) ---`, true);
 
  void cleanupDockerContainer(state.currentContainerName, deps);
}
 
/**
 * Plant den Execution-Timeout über den TimeoutManager.
 */
export function scheduleExecutionTimeout(
  timeoutManager: TimeoutScheduler,
  executionTimeout: number | undefined,
  state: ExecutionState,
  callbacks: TimeoutCallbacks,
  deps: TimeoutDependencies,
): void {
  const timeoutMs = executionTimeout && executionTimeout > 0 ? executionTimeout * 1000 : null;
 
  timeoutManager.schedule(timeoutMs, () => {
    handleExecutionTimeout(executionTimeout, state, callbacks, deps);
  });
}