import { fetch } from 'cross-fetch'; import { specifyErrors } from '../../errors/index.js'; import { ExecuteParsersEnginRPCRouteRequestBody, makeExecuteParsersEngineRPCRoute, } from '../index.js'; import { SerializedParsersEngineResults } from '../../parsersEngine/index.js'; import { formatRequestHeaders } from './internals/formatRequestHeaders.js'; import { makeSpecifyHttpApiRoute } from './internals/makeSpecifyHttpApiRoute.js'; /** * Creates a RPC client to consume data from the Specify HTTP RPC API. * @internal * @param personalAccessToken */ export function createRPCClient(personalAccessToken: string | undefined) { const headers = formatRequestHeaders(personalAccessToken); return { executeParsersEngine: async ({ body }: { body: ExecuteParsersEnginRPCRouteRequestBody }) => { try { const response = await fetch(makeSpecifyHttpApiRoute(makeExecuteParsersEngineRPCRoute()), { method: 'POST', body: JSON.stringify(body), headers: headers, }); return (await response.json()) as SerializedParsersEngineResults; } catch (error) { let message = 'Unexpected error while fetching Specify HTTP API.'; if (error instanceof Error) { message = `${message} Original: ${error.message}`; } // Always return a fallback in case of error to let the caller handle it const fallback: SerializedParsersEngineResults = body.rules.map(rule => ({ pipelineName: rule && (rule as any)?.name ? (rule as any).name : 'Unknown rule', isFromRule: true, status: 'error', output: null, next: null, errorMessages: [ { type: 'error', errorKey: specifyErrors.PARSERS_ENGINE_RPC_EXECUTION_FAILED.errorKey, content: message, }, ], warningMessages: [], informationMessages: [], })); return fallback; } }, }; }