import { getBinary, getJson, postJson } from "./client"; export interface ServiceInfo { service: string; version: number; } export interface RunRecord { schemaVersion: number; runId: string; runSeq: number | null; runDir: string; validationTime: string | null; syncMode: string | null; startedAt: string | null; finishedAt: string | null; wallMs: number | null; artifactPaths: Record; counts: { publicationPoints: number; objects: number; freshObjects: number; cachedObjects: number; rejectedObjects: number; freshRejectedObjects: number; cachedRejectedObjects: number; trustAnchors: number; vrps: number; aspas: number; warnings: number; }; indexStatus: string; indexError: string | null; } export interface RepositoryRecord { schemaVersion: number; runId: string; repoId: string; uri: string; host: string; transport: string; publicationPoints: number; objects: number; rejectedObjects: number; downloadBytes: number | null; syncDurationMsTotal: number; phases: Record; terminalStates: Record; } export interface PublicationPointRecord { schemaVersion: number; runId: string; ppId: string; repoId: string; nodeId: number | null; parentNodeId: number | null; rsyncBaseUri: string | null; manifestRsyncUri: string | null; publicationPointRsyncUri: string | null; rrdpNotificationUri: string | null; source: string | null; repoSyncSource: string | null; repoSyncPhase: string | null; repoSyncDurationMs: number | null; repoSyncError: string | null; repoTerminalState: string | null; thisUpdate: string | null; nextUpdate: string | null; verifiedAt: string | null; objects: number; rejectedObjects: number; warnings: number; } export interface ObjectInstanceRecord { schemaVersion: number; runId: string; objectInstanceId: string; uri: string; uriHash: string; sha256: string; objectType: string; result: string; detailSummary: string | null; repoId: string; ppId: string; sourceSection: string; rejected: boolean; rejectReason: string | null; } export interface ObjectProjectionRecord { schemaVersion?: number; objectType?: string; sha256?: string; uri?: string; parseStatus?: string; errorSummary?: string | null; projection?: unknown; } export interface ValidationIssueRecord { stage?: string; severity?: string; reasonCode?: string; summary?: string; } export interface ObjectValidationRecord { objectInstanceId: string; uri: string; sha256: string; objectType: string; finalStatus: string; auditResult: string; detailSummary: string | null; rejected: boolean; rejectReason: string | null; sourceSection: string; explainAvailable: boolean; authoritative: boolean; fileValidation: { status: string; stage: string; issues: ValidationIssueRecord[]; detailSummary: string | null; }; chainValidation: { status: string; stage: string; issues: ValidationIssueRecord[]; note?: string; edgesPage?: { nextCursor: string | null; limit: number }; }; } export interface ChainEdgeRecord { relation: string; fromUri: string; toUri: string; toObjectInstanceId: string | null; toSha256: string | null; status: string; evidence: unknown; } export interface ValidationExplainRecord { schemaVersion: number; explainVersion: number; runId: string; objectInstanceId: string; uri: string; sha256: string; objectType: string; finalStatus: string; auditResult: string; detailSummary: string | null; authoritative: boolean; explainMode: string; generatedAt: string; parsevalidate: unknown; chainvalidate: unknown; chainEdges: ChainEdgeRecord[]; } export interface ObjectUriIndexRecord { runId: string; uri: string; sha256: string; objectInstanceId: string; repoId: string; ppId: string; } export interface ExportJobRecord { schemaVersion: number; jobId: string; runId: string; scope: string; repoId: string | null; ppId: string | null; status: string; createdAt: string; finishedAt: string | null; outputPath: string | null; objectCount: number; bytesWritten: number; error: string | null; } export type CountsByKey = Record; export async function getServiceInfo() { return getJson("/api/v1"); } export async function getLatestRun() { return getJson("/api/v1/latest_run"); } export async function getRunSummary(runId: string) { return getJson>(`/api/v1/runs/${runId}/summary`); } export async function getStatsObjectTypes(runId: string) { return getJson(`/api/v1/runs/${runId}/stats/object-types`); } export async function getStatsValidation(runId: string) { return getJson(`/api/v1/runs/${runId}/stats/validation`); } export async function getStatsReasons(runId: string) { return getJson(`/api/v1/runs/${runId}/stats/reasons`); } export async function getStatsDownloads(runId: string) { return getJson>(`/api/v1/runs/${runId}/stats/downloads`); } export async function listRepos(runId: string, limit = 5, cursor?: string | null) { return getJson(`/api/v1/runs/${runId}/repos`, { limit, cursor: cursor ?? undefined }); } export async function listPublicationPointsForRepo(runId: string, repoId: string, limit = 50, cursor?: string | null) { return getJson(`/api/v1/runs/${runId}/repos/${repoId}/publication-points`, { limit, cursor: cursor ?? undefined }); } export async function listObjectsForPublicationPoint(runId: string, ppId: string, limit = 50, cursor?: string | null) { return getJson(`/api/v1/runs/${runId}/publication-points/${ppId}/objects`, { limit, cursor: cursor ?? undefined }); } export async function getObject(runId: string, objectInstanceId: string) { return getJson(`/api/v1/runs/${runId}/objects/${objectInstanceId}`); } export async function getObjectByUri(runId: string, uri: string) { return getJson(`/api/v1/runs/${runId}/objects/by-uri`, { uri }); } export async function getObjectParsed(runId: string, objectInstanceId: string) { return getJson(`/api/v1/runs/${runId}/objects/${objectInstanceId}/parsed`); } export async function getObjectValidation(runId: string, objectInstanceId: string) { return getJson(`/api/v1/runs/${runId}/objects/${objectInstanceId}/validation`); } export async function getObjectChain(runId: string, objectInstanceId: string) { return getJson(`/api/v1/runs/${runId}/objects/${objectInstanceId}/chain`); } export async function listManifestFiles(runId: string, objectInstanceId: string, limit = 50, cursor?: string | null) { return getJson(`/api/v1/runs/${runId}/objects/${objectInstanceId}/parsed/manifest-files`, { limit, cursor: cursor ?? undefined }); } export async function listRevokedCertificates(runId: string, objectInstanceId: string, limit = 50, cursor?: string | null) { return getJson(`/api/v1/runs/${runId}/objects/${objectInstanceId}/parsed/revoked-certs`, { limit, cursor: cursor ?? undefined }); } export async function explainObjectValidation(runId: string, objectInstanceId: string, forceRefresh = false) { return postJson(`/api/v1/runs/${runId}/objects/${objectInstanceId}/validation/explain`, { forceRefresh }); } export async function downloadRawObject(runId: string, objectInstanceId: string) { return getBinary(`/api/v1/runs/${runId}/objects/${objectInstanceId}/raw`); } export async function createObjectSetExport(runId: string, objectInstanceIds: string[]) { return postJson(`/api/v1/runs/${runId}/exports`, { objectInstanceIds, scope: "object_set" }); } export async function createPublicationPointExport(runId: string, ppId: string) { return postJson(`/api/v1/runs/${runId}/exports`, { ppId, scope: "publication_point" }); } export async function getExportJob(runId: string, jobId: string) { return getJson(`/api/v1/runs/${runId}/exports/${jobId}`); }