File size: 1,845 Bytes
9d2d895 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | import { getRpcBaseUrl } from '@/services/rpc-client';
import { premiumFetch } from '@/services/premium-fetch';
import type { RunScenarioRequest, RunScenarioResponse, GetScenarioStatusResponse, ListScenarioTemplatesResponse, ScenarioResult, ScenarioImpactCountry, ScenarioResultTemplate, ScenarioTemplate } from '@/generated/client/worldmonitor/scenario/v1/service_client';
import { ScenarioServiceClient } from '@/services/generated-rpc-clients';
export type {
RunScenarioRequest,
RunScenarioResponse,
GetScenarioStatusResponse,
ListScenarioTemplatesResponse,
ScenarioResult,
ScenarioImpactCountry,
ScenarioResultTemplate,
ScenarioTemplate,
};
// RunScenario + GetScenarioStatus are PRO-gated — premiumFetch injects the
// Clerk Bearer token / API key. ListScenarioTemplates is public but harmless
// to route through the same fetch wrapper.
const client = new ScenarioServiceClient(getRpcBaseUrl(), { fetch: premiumFetch });
/**
* Enqueue a scenario job and return the resulting job id. Server validates
* scenarioId against the template registry (400 on unknown) and enforces
* per-IP 10/min rate limiting at the gateway.
*/
export async function runScenario(
req: RunScenarioRequest,
options?: { signal?: AbortSignal },
): Promise<RunScenarioResponse> {
return client.runScenario(req, { signal: options?.signal });
}
/**
* Poll a scenario job's lifecycle state. Returns status ∈
* {pending, processing, done, failed}; result is populated only when done.
*/
export async function getScenarioStatus(
jobId: string,
options?: { signal?: AbortSignal },
): Promise<GetScenarioStatusResponse> {
return client.getScenarioStatus({ jobId }, { signal: options?.signal });
}
export async function listScenarioTemplates(): Promise<ListScenarioTemplatesResponse> {
return client.listScenarioTemplates({});
}
|