/** * `client.httpRequest` from `aaf_sdk.js` — proxied HTTP from the host (Ameyo REST, third-party URLs, multipart). * Documented as available at **all** app locations. */ export type AafHttpMethod = "HEAD" | "GET" | "POST" | "PUT" | "DELETE" | "OPTIONS"; /** * Request object for `invokeAmeyo` / `invoke`. * - **invokeAmeyo**: `url` is an Ameyo endpoint path only (e.g. `ameyorestapi/systemintegration/getAllAppInfo`). * - **invoke**: `url` is the **full** third-party URL (`https://…`). */ export type AafHttpRequestObject = { url: string; /** String key/value pairs; if `content-type` is omitted, host may default to `application/json`. */ headers?: Record; method: AafHttpMethod; /** Often `JSON.stringify(...)` for JSON APIs. */ body?: string; }; /** * Successful HTTP response shape from the host (per integration docs). * Parse `response` (string) as JSON when your API returns JSON. */ export type AafHttpResponse = { statusCode: number; statusText: string; response: string; headers: Record; }; export interface AafHttpRequestApi { invokeAmeyo: (requestData: AafHttpRequestObject) => Promise; invoke: (requestData: AafHttpRequestObject) => Promise; /** Present on newer SDK builds (e.g. `application.ui` sdk/1.0.0); absent on some older `ameyo.ui` bundles. */ invokeAmeyoMultiPart?: ( endpoint: string, formData: Record, methodType: AafHttpMethod ) => Promise; } export interface HasHttpRequest { httpRequest: AafHttpRequestApi; } function assertHttpRequestObject(req: AafHttpRequestObject): void { if (req == null || typeof req !== "object") { throw new Error("request object is required"); } if (typeof req.url !== "string" || req.url.trim() === "") { throw new Error("url is mandatory (host error 101: url not provided)"); } if (typeof req.method !== "string" || req.method.trim() === "") { throw new Error("method is mandatory"); } } function asHttpResponse(data: unknown): AafHttpResponse { return data as AafHttpResponse; } /** Invoke an **Ameyo** REST/command URL (path only, not full `https://`). */ export function invokeAmeyoHttp( client: HasHttpRequest, request: AafHttpRequestObject ): Promise { assertHttpRequestObject(request); return client.httpRequest.invokeAmeyo(request).then(asHttpResponse); } /** Invoke a **third-party** HTTP URL (`url` must be absolute). */ export function invokeThirdPartyHttp( client: HasHttpRequest, request: AafHttpRequestObject ): Promise { assertHttpRequestObject(request); return client.httpRequest.invoke(request).then(asHttpResponse); } /** * Multipart upload / POST to an **Ameyo** endpoint (path + optional query string). * `formData` holds files and stringified body fields per API (e.g. `formData.file = fileInput.files`). */ export function invokeAmeyoMultiPartHttp( client: HasHttpRequest, endpoint: string, formData: Record, method: AafHttpMethod ): Promise { const mp = client.httpRequest.invokeAmeyoMultiPart; if (typeof mp !== "function") { return Promise.reject( new Error("httpRequest.invokeAmeyoMultiPart is missing — use an aaf_sdk.js build that includes multipart (e.g. application.ui sdk).") ); } if (typeof endpoint !== "string" || endpoint.trim() === "") { return Promise.reject(new Error("endpoint url is mandatory for multipart")); } if (formData == null || typeof formData !== "object") { return Promise.reject(new Error("formData is mandatory for multipart")); } return mp.call(client.httpRequest, endpoint, formData, method).then(asHttpResponse); }