import type { BatchPayload } from "../content/market/batch-payload"; import { isAuthResponseMessage } from "./auth-messages"; interface FetchResponseLike { json(): Promise; ok: boolean; status: number; } type FetchLike = ( input: string, init?: RequestInit ) => Promise; type SendMessageLike = (message: unknown) => Promise; export function createBatchSubmitClient(options: { baseUrl: string; fetchImpl?: FetchLike; sendMessage: SendMessageLike; }) { const fetchImpl = options.fetchImpl ?? fetch; return { async submitBatch(payload: BatchPayload) { const token = await readAccessToken(options.sendMessage); const response = await fetchImpl( new URL("/api/mock/batches", options.baseUrl).toString(), { body: JSON.stringify(payload), headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" }, method: "POST" } ); if (response.status === 401 || response.status === 403) { throw new Error("batch submit unauthorized"); } if (!response.ok) { throw new Error(`batch submit failed: ${response.status}`); } return response.json(); } }; } async function readAccessToken(sendMessage: SendMessageLike): Promise { const response = await sendMessage({ type: "auth:get-access-token" }); if ( !isAuthResponseMessage(response) || !response.ok || response.type !== "auth:token" || !response.value.accessToken.trim() ) { throw new Error("batch submit token unavailable"); } return response.value.accessToken; }