From 6362ac6b72d04247f8a9ae8677f22d6e23dd9e29 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Mon, 26 Oct 2026 14:08:30 +0800 Subject: [PATCH] refactor(web): reuse shared provider input admission --- src/application/WebModuleTraceService.ts | 26 ++++++------ src/application/WebRuntimeService.ts | 45 +++++---------------- src/application/WebSourceLocationService.ts | 26 ++++++------ 3 files changed, 35 insertions(+), 62 deletions(-) diff --git a/src/application/WebModuleTraceService.ts b/src/application/WebModuleTraceService.ts index ee57889e7a..2014b59c07 100644 --- a/src/application/WebModuleTraceService.ts +++ b/src/application/WebModuleTraceService.ts @@ -10,7 +10,6 @@ import { } from "../domain/analysisErrorCore.js"; import { createEvidence, type Evidence } from "../domain/evidence.js"; import { jsonObjectSchema } from "../domain/jsonValue.js"; -import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js"; import { err, ok, type Result } from "../domain/result.js"; import { collectWebModuleImports, @@ -37,7 +36,10 @@ import type { WebModuleResolutionPort, } from "./WebModulePorts.js"; -import { completeProviderEvidence } from "./ProviderOperationExecution.js"; +import { + completeProviderEvidence, + parseProviderOperationInput, +} from "./ProviderOperationExecution.js"; const OPERATION = "trace_web_module_imports"; const artifactsSchema = selectedWebScriptArtifactsSchema.extend({ @@ -81,18 +83,14 @@ export class WebModuleTraceService { rawInput: unknown, options?: ExecutionOptions, ): Promise> { - if (options?.signal?.aborted) - return err( - new AnalysisCancelledError(OPERATION, { cause: options.signal.reason }), - ); - const parsed = webModuleTraceInputSchema.safeParse(rawInput); - if (!parsed.success) - return err( - analysisInputErrorFromIssues(OPERATION, parsed.error.issues, rawInput, { - cause: parsed.error, - }), - ); - const input = parsed.data; + const parsed = parseProviderOperationInput( + OPERATION, + rawInput, + webModuleTraceInputSchema, + options?.signal, + ); + if (!parsed.ok) return parsed; + const input = parsed.value; for (const [path, value] of [ ["importer_url", input.importer_url], ["import_map.base_url", input.import_map?.base_url], diff --git a/src/application/WebRuntimeService.ts b/src/application/WebRuntimeService.ts index 64dd8d4d3b..53af27d648 100644 --- a/src/application/WebRuntimeService.ts +++ b/src/application/WebRuntimeService.ts @@ -2,13 +2,9 @@ import { z } from "zod"; import type { ExecutionOptions } from "./AnalysisProvider.js"; import type { WebRuntimePort } from "./WebRuntimePort.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js"; -import { - AnalysisCancelledError, - AnalysisOutputError, -} from "../domain/analysisErrorCore.js"; +import { AnalysisOutputError } from "../domain/analysisErrorCore.js"; import { createEvidence, type Evidence } from "../domain/evidence.js"; -import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js"; -import { err, ok, type Result } from "../domain/result.js"; +import { err, type Result } from "../domain/result.js"; import { observeWebExecutionInputSchema, webExecutionSchema, @@ -22,6 +18,7 @@ import { import { completeProviderEvidence, keepIncompleteObservation, + parseProviderOperationInput, } from "./ProviderOperationExecution.js"; /** Shared public workflows keep instrumentation and listener inspection independently selectable. */ @@ -34,11 +31,11 @@ export class WebRuntimeService { options?: ExecutionOptions, ): Promise> { const operation = "observe_web_execution"; - const parsed = parseInput( - observeWebExecutionInputSchema, - rawInput, + const parsed = parseProviderOperationInput( operation, - options, + rawInput, + observeWebExecutionInputSchema, + options?.signal, ); if (!parsed.ok) return parsed; const result = await this.provider.observeExecution(parsed.value, options); @@ -67,11 +64,11 @@ export class WebRuntimeService { options?: ExecutionOptions, ): Promise> { const operation = "inspect_web_event_listeners"; - const parsed = parseInput( - inspectWebEventListenersInputSchema, - rawInput, + const parsed = parseProviderOperationInput( operation, - options, + rawInput, + inspectWebEventListenersInputSchema, + options?.signal, ); if (!parsed.ok) return parsed; const result = await this.provider.inspectEventListeners( @@ -171,23 +168,3 @@ export class WebRuntimeService { ); } } - -const parseInput = ( - schema: z.ZodType, - rawInput: unknown, - operation: string, - options: ExecutionOptions | undefined, -): Result => { - if (options?.signal?.aborted) - return err( - new AnalysisCancelledError(operation, { cause: options.signal.reason }), - ); - const parsed = schema.safeParse(rawInput); - return parsed.success - ? ok(parsed.data) - : err( - analysisInputErrorFromIssues(operation, parsed.error.issues, rawInput, { - cause: parsed.error, - }), - ); -}; diff --git a/src/application/WebSourceLocationService.ts b/src/application/WebSourceLocationService.ts index 1a5ad8325b..ea64a191fd 100644 --- a/src/application/WebSourceLocationService.ts +++ b/src/application/WebSourceLocationService.ts @@ -8,7 +8,6 @@ import { AnalysisOutputError, } from "../domain/analysisErrorCore.js"; import { createEvidence, type Evidence } from "../domain/evidence.js"; -import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js"; import { err, ok, type Result } from "../domain/result.js"; import { selectedWebScriptArtifactsSchema, @@ -33,7 +32,10 @@ import type { WebSourceLocationArtifactPort, WebSourceMapPort, } from "./WebSourceLocationPorts.js"; -import { completeProviderEvidence } from "./ProviderOperationExecution.js"; +import { + completeProviderEvidence, + parseProviderOperationInput, +} from "./ProviderOperationExecution.js"; const OPERATION = "trace_web_source_location"; const artifactsSchema = selectedWebScriptArtifactsSchema.extend({ @@ -88,18 +90,14 @@ export class WebSourceLocationService { rawInput: unknown, options?: ExecutionOptions, ): Promise> { - if (options?.signal?.aborted) - return err( - new AnalysisCancelledError(OPERATION, { cause: options.signal.reason }), - ); - const parsed = webSourceLocationInputSchema.safeParse(rawInput); - if (!parsed.success) - return err( - analysisInputErrorFromIssues(OPERATION, parsed.error.issues, rawInput, { - cause: parsed.error, - }), - ); - const input = parsed.data; + const parsed = parseProviderOperationInput( + OPERATION, + rawInput, + webSourceLocationInputSchema, + options?.signal, + ); + if (!parsed.ok) return parsed; + const input = parsed.value; const admitted = admitContext(input); if (!admitted.ok) return admitted; const loaded = await this.artifacts.load(input, options);