refactor(native): use canonical deadline defaults

This commit is contained in:
morluto committed 2026-10-22 09:52:40 +08:00
1 parent 183b4d4e7e
commit db87917daa
7 files changed
+19 -32

No files matched your search

+3 -8
View File
@@ -19,11 +19,6 @@ import type {
import { boundedUtf8Text } from "../process/boundedUtf8Text.js";
import { DEFAULT_NATIVE_COMMAND_TIMEOUT_MS } from "../domain/native/nativeDeadlines.js";
/**
* Omitted `native_command_timeout_ms`. Distinct from objdump/rizin
* `command_timeout_ms`, which is a separate 120000 ms one-shot budget.
*/
export const NATIVE_COMMAND_TIMEOUT_MS = DEFAULT_NATIVE_COMMAND_TIMEOUT_MS;
/** Retain complete command output up to a bounded aggregate size. */
export const NATIVE_COMMAND_OUTPUT_BUDGET_BYTES = 64 * 1024 * 1024;
/**
@@ -131,7 +126,7 @@ export interface NativeCommandFailureCapture {
export interface NativeCommandOptions {
readonly signal?: AbortSignal;
readonly acceptNonZero?: boolean;
/** Selected wall clock; omitted uses `NATIVE_COMMAND_TIMEOUT_MS`. */
/** Selected wall clock; omitted uses `DEFAULT_NATIVE_COMMAND_TIMEOUT_MS`. */
readonly timeoutMs?: number;
}
@@ -155,7 +150,7 @@ export type NativeToolResolver = (
tool: string,
signal?: AbortSignal,
launcher?: NativeCommandLauncher,
/** Selected command deadline. Omitted uses `NATIVE_COMMAND_TIMEOUT_MS`. */
/** Selected command deadline. Omitted uses `DEFAULT_NATIVE_COMMAND_TIMEOUT_MS`. */
timeoutMs?: number,
) => Promise<Result<ResolvedTool, NativeCommandFailure>>;
@@ -533,7 +528,7 @@ const captureProcess = async (
...(options.signal === undefined ? {} : { signal: options.signal }),
},
{
timeoutMs: options.timeoutMs ?? NATIVE_COMMAND_TIMEOUT_MS,
timeoutMs: options.timeoutMs ?? DEFAULT_NATIVE_COMMAND_TIMEOUT_MS,
diagnosticBytes: NATIVE_COMMAND_OUTPUT_BUDGET_BYTES,
acceptNonZeroExit: options.acceptNonZero === true,
},
+3 -5
View File
@@ -14,10 +14,8 @@ import type {
NativeCommandOptions,
NativeCommandRunner,
} from "./CommandRunner.js";
import {
NATIVE_COMMAND_TIMEOUT_MS,
XcrunCommandRunner,
} from "./CommandRunner.js";
import { XcrunCommandRunner } from "./CommandRunner.js";
import { DEFAULT_NATIVE_COMMAND_TIMEOUT_MS } from "../domain/native/nativeDeadlines.js";
import { NativeMacOSProvider } from "./NativeMacOSProvider.js";
vi.mock("../process/OwnedCommand.js", async (original) => ({
@@ -59,7 +57,7 @@ describe("native_command_timeout_ms", () => {
const result = await execute(runner, {});
expect(result.ok, JSON.stringify(result)).toBe(true);
expect(runner.timeouts.every((timeout) => timeout === 60_000)).toBe(true);
expect(NATIVE_COMMAND_TIMEOUT_MS).toBe(60_000);
expect(DEFAULT_NATIVE_COMMAND_TIMEOUT_MS).toBe(60_000);
expect(runner.timeouts.length).toBeGreaterThan(0);
});
+5 -5
View File
@@ -59,6 +59,7 @@ import {
AnalysisTimeoutError,
} from "../domain/analysisErrorCore.js";
import {
DEFAULT_NATIVE_COMMAND_TIMEOUT_MS,
DEFAULT_NATIVE_UI_DEADLINE_MS,
MAX_NATIVE_TIMER_MS,
fixedNativeAllowance,
@@ -95,7 +96,6 @@ import {
} from "../domain/native/nativeInspection.js";
import { err, ok, type Result } from "../domain/result.js";
import {
NATIVE_COMMAND_TIMEOUT_MS,
NATIVE_COMMAND_OUTPUT_BUDGET_BYTES,
NATIVE_FAILURE_DIAGNOSTIC_BYTES,
NativeCommandFailure,
@@ -603,7 +603,7 @@ class NativeMacOSClient implements AnalysisClient {
): Promise<Result<NativeObservation, AnalysisError>> {
const timeout = readNativeDeadline(
parameters.native_command_timeout_ms,
NATIVE_COMMAND_TIMEOUT_MS,
DEFAULT_NATIVE_COMMAND_TIMEOUT_MS,
);
if (!timeout.ok)
return Promise.resolve(
@@ -1295,7 +1295,7 @@ const isNativeOperation = (
const translateCommandFailure = (
operation: NativeToolName,
failure: NativeCommandFailure,
timeoutMs = NATIVE_COMMAND_TIMEOUT_MS,
timeoutMs = DEFAULT_NATIVE_COMMAND_TIMEOUT_MS,
): AnalysisError => {
const cleanupOwners = [
...failure.cleanupFailures,
@@ -1367,7 +1367,7 @@ const translateCommandFailure = (
timeoutMs,
setting: "native_command_timeout_ms",
cliFlag: "--native-command-timeout-ms",
defaultMs: NATIVE_COMMAND_TIMEOUT_MS,
defaultMs: DEFAULT_NATIVE_COMMAND_TIMEOUT_MS,
phase: "macOS native command deadline",
unchanged: `The ${String(NATIVE_COMMAND_OUTPUT_BUDGET_BYTES)}-byte command output allowance and the ${String(NATIVE_FAILURE_DIAGNOSTIC_BYTES)}-byte failure-diagnostic excerpt have no runtime override.`,
}),
@@ -1429,7 +1429,7 @@ const translateCommandFailure = (
timeoutMs,
setting: "native_command_timeout_ms",
cliFlag: "--native-command-timeout-ms",
defaultMs: NATIVE_COMMAND_TIMEOUT_MS,
defaultMs: DEFAULT_NATIVE_COMMAND_TIMEOUT_MS,
phase: "macOS native command deadline",
unchanged: `The ${String(NATIVE_COMMAND_OUTPUT_BUDGET_BYTES)}-byte command output allowance and the ${String(NATIVE_FAILURE_DIAGNOSTIC_BYTES)}-byte failure-diagnostic excerpt have no runtime override.`,
}),
+2 -2
View File
@@ -1,7 +1,7 @@
import { expect, it, vi } from "vitest";
import { execFileOutput } from "../process/ExecFileOutput.js";
import { createNativeUiHelperRuntime } from "./NativeUiHelperRuntime.js";
import { NATIVE_UI_DEADLINE_MS } from "./NativeUiInterruptionControl.js";
import { DEFAULT_NATIVE_UI_DEADLINE_MS } from "../domain/native/nativeDeadlines.js";
vi.mock("../process/ExecFileOutput.js", async (importOriginal) => ({
...(await importOriginal<typeof import("../process/ExecFileOutput.js")>()),
@@ -37,7 +37,7 @@ it.each([250_000, undefined])(
} finally {
await runtime.close();
}
const expected = deadlineMs ?? NATIVE_UI_DEADLINE_MS;
const expected = deadlineMs ?? DEFAULT_NATIVE_UI_DEADLINE_MS;
const calls = vi.mocked(execFileOutput).mock.calls;
expect(calls).toHaveLength(2);
expect(calls[0]?.[0]).toBe("/usr/bin/xcrun");
+2 -2
View File
@@ -8,9 +8,9 @@ import { fileURLToPath } from "node:url";
import { SWIFTC_INTERRUPT } from "../process/DarwinProcessRunTokenReader.js";
import { execFileOutput } from "../process/ExecFileOutput.js";
import { safeParseJson } from "../domain/safeJson.js";
import { DEFAULT_NATIVE_UI_DEADLINE_MS } from "../domain/native/nativeDeadlines.js";
import type { NativeUiHelper } from "./NativeUiObservation.js";
import { NATIVE_UI_HELPER_MAX_BUFFER } from "./NativeUiOutputBudget.js";
import { NATIVE_UI_DEADLINE_MS } from "./NativeUiInterruptionControl.js";
export interface NativeUiHelperRuntime {
readonly invoke: NativeUiHelper;
@@ -25,7 +25,7 @@ export interface NativeUiHelperRuntime {
/** Lazily compile one owned helper per observation/scenario and remove its compiler cache. */
export const createNativeUiHelperRuntime = (
environment: Readonly<NodeJS.ProcessEnv>,
deadlineMs = NATIVE_UI_DEADLINE_MS,
deadlineMs = DEFAULT_NATIVE_UI_DEADLINE_MS,
): NativeUiHelperRuntime => {
const selectedEnvironment = snapshotEnvironment(environment);
const deadlineSignal = AbortSignal.timeout(deadlineMs);
+2 -5
View File
@@ -8,9 +8,6 @@ import {
nativeDeadlineRecovery,
} from "../domain/native/nativeDeadlines.js";
/** Omitted `native_ui_deadline_ms`. */
export const NATIVE_UI_DEADLINE_MS = DEFAULT_NATIVE_UI_DEADLINE_MS;
type Interruption =
| { readonly kind: "caller"; readonly reason: unknown }
| { readonly kind: "deadline"; readonly reason: unknown };
@@ -38,7 +35,7 @@ export class NativeUiInterruptionControl {
constructor(
caller: AbortSignal | undefined,
deadline: AbortSignal,
deadlineMs = NATIVE_UI_DEADLINE_MS,
deadlineMs = DEFAULT_NATIVE_UI_DEADLINE_MS,
) {
this.#caller = caller;
this.#deadline = deadline;
@@ -86,7 +83,7 @@ export class NativeUiInterruptionControl {
timeoutMs: this.#deadlineMs,
setting: "native_ui_deadline_ms",
cliFlag: "--native-ui-deadline-ms",
defaultMs: NATIVE_UI_DEADLINE_MS,
defaultMs: DEFAULT_NATIVE_UI_DEADLINE_MS,
phase: "native UI observation deadline",
detail: " A partial observation may already be retained.",
unchanged:
+2 -5
View File
@@ -34,10 +34,7 @@ import {
NATIVE_UI_OUTPUT_BUDGET_BYTES,
NATIVE_UI_OUTPUT_WEIGHT,
} from "./NativeUiOutputBudget.js";
import {
NATIVE_UI_DEADLINE_MS,
NativeUiInterruptionControl,
} from "./NativeUiInterruptionControl.js";
import { NativeUiInterruptionControl } from "./NativeUiInterruptionControl.js";
const helper = fileURLToPath(
new URL("../../bridge/native/ReaNativeUI.swift", import.meta.url),
@@ -79,7 +76,7 @@ export const observeNativeUi = async (
new NativeUiInterruptionControl(
options.signal,
runtime.signal,
runtime.deadlineMs ?? NATIVE_UI_DEADLINE_MS,
runtime.deadlineMs ?? DEFAULT_NATIVE_UI_DEADLINE_MS,
);
const ownsInterruption = options.interruption === undefined;
let result: Result<z.infer<typeof nativeUiResultSchema>, AnalysisError>;