import type { ParsedError } from "@noya-app/noya-pipeline"; import type { ScriptEvaluatorRequest, ScriptEvaluatorResponse, } from "./rpc/routes"; import { RPCManager } from "./rpcManager"; type RequestOfType = Omit< Extract, "type" >; export type EvaluateScriptOptions = RequestOfType<"code">; export type EvaluateScriptUrlOptions = RequestOfType<"url">; export type EvaluateScriptFilesOptions = RequestOfType<"files">; export type ScriptEvaluationResult = { result: Result; logs: unknown[][]; }; export class ScriptEvaluationError extends Error { constructor( public evaluationError: ParsedError, public logs: unknown[][] ) { super(evaluationError.message); this.name = "ScriptEvaluationError"; } } export class ScriptEvaluatorManager { constructor(private rpcManager: RPCManager) {} evaluateScript( options: EvaluateScriptOptions ): Promise> { return this.evaluate({ type: "code", ...options }); } evaluateUrl( options: EvaluateScriptUrlOptions ): Promise> { return this.evaluate({ type: "url", ...options }); } evaluateFiles( options: EvaluateScriptFilesOptions ): Promise> { return this.evaluate({ type: "files", ...options }); } private async evaluate( request: ScriptEvaluatorRequest ): Promise> { const response = await this.rpcManager.requestRoute( "POST /api/scripts/evaluate", { body: JSON.stringify(request), headers: { "Content-Type": "application/json" }, } ); const body = this.rpcManager.getResponseBody(response) as | ScriptEvaluatorResponse | undefined; if (!body || !Array.isArray(body.logs)) { throw new Error("Script evaluator returned an unexpected response"); } if (body.status === "error") { throw new ScriptEvaluationError(body.error, body.logs); } return { result: body.result as Result, logs: body.logs, }; } }