refactor(native): use canonical deadline defaults
This commit is contained in:
1 parent
183b4d4e7e
commit
db87917daa
7 files changed
+19
-32
No files matched your search
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
|
||||
@@ -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.`,
|
||||
}),
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>;
|
||||
|
||||
Reference in new issue
Block a user