| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /**
- * Quick example (matches curl usage):
- * await callDataApi("Youtube/search", {
- * query: { gl: "US", hl: "en", q: "manus" },
- * })
- */
- import { ENV } from "./env";
- export type DataApiCallOptions = {
- query?: Record<string, unknown>;
- body?: Record<string, unknown>;
- pathParams?: Record<string, unknown>;
- formData?: Record<string, unknown>;
- };
- export async function callDataApi(
- apiId: string,
- options: DataApiCallOptions = {}
- ): Promise<unknown> {
- if (!ENV.forgeApiUrl) {
- throw new Error("BUILT_IN_FORGE_API_URL is not configured");
- }
- if (!ENV.forgeApiKey) {
- throw new Error("BUILT_IN_FORGE_API_KEY is not configured");
- }
- // Build the full URL by appending the service path to the base URL
- const baseUrl = ENV.forgeApiUrl.endsWith("/") ? ENV.forgeApiUrl : `${ENV.forgeApiUrl}/`;
- const fullUrl = new URL("webdevtoken.v1.WebDevService/CallApi", baseUrl).toString();
- const response = await fetch(fullUrl, {
- method: "POST",
- headers: {
- accept: "application/json",
- "content-type": "application/json",
- "connect-protocol-version": "1",
- authorization: `Bearer ${ENV.forgeApiKey}`,
- },
- body: JSON.stringify({
- apiId,
- query: options.query,
- body: options.body,
- path_params: options.pathParams,
- multipart_form_data: options.formData,
- }),
- });
- if (!response.ok) {
- const detail = await response.text().catch(() => "");
- throw new Error(
- `Data API request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}`
- );
- }
- const payload = await response.json().catch(() => ({}));
- if (payload && typeof payload === "object" && "jsonData" in payload) {
- try {
- return JSON.parse((payload as Record<string, string>).jsonData ?? "{}");
- } catch {
- return (payload as Record<string, unknown>).jsonData;
- }
- }
- return payload;
- }
|