import axios, { AxiosRequestConfig, Method } from "axios"; import { ApiResource, GenericResource, Signature, SignatureResponse, } from "../types"; import { getSanitizedApi } from "../utils"; export async function signResource({ token, branchName, resource, agentUrl, }: { token: string; branchName: string; resource: ApiResource | GenericResource; agentUrl: string; }): Promise { const requestResource: Record = { branchName: branchName ?? "main", }; if ((resource as ApiResource).api) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment requestResource.api = getSanitizedApi((resource as ApiResource).api); } else { requestResource.literal = (resource as GenericResource).literal; } const resp = await callAgent({ baseUrl: agentUrl, path: "v1/signature/sign", method: "post", token: token, data: { resource: requestResource }, }); return resp.signature; } export async function verifyResources({ agentUrl, token, branchName, resources, }: { resources: Array; token: string; branchName: string; agentUrl: string; }): Promise { await callAgent<{ keyId: string }>({ baseUrl: agentUrl, path: "v1/signature/verify", method: "post", token: token, data: { resources: resources.map((res) => { if ((res as ApiResource).api) { return { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment api: getSanitizedApi((res as ApiResource).api), branchName: branchName ?? "main", }; } return { ...res, branchName: branchName ?? "main", }; }), }, }); } async function callAgent({ baseUrl, path, method, token, data, }: { baseUrl: string; path: string; method: Method; token: string; data: any; }): Promise { try { const url = new URL(path, baseUrl); const config: AxiosRequestConfig = { url: url.toString(), method: method, headers: { Authorization: "Bearer " + token, }, // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment data: data, }; const resp = await axios(config); return resp.data; } catch (error) { throw new Error(`Failed to request the agent ${baseUrl}. Error: ${error}`); } }