33 lines
912 B
TypeScript
33 lines
912 B
TypeScript
|
|
import type { TrackResponse } from '../model/types';
|
||
|
|
|
||
|
|
const API_BASE = (import.meta.env.VITE_API_URL || '/snp-api').replace(/\/$/, '');
|
||
|
|
|
||
|
|
export async function fetchVesselTrack(
|
||
|
|
mmsi: number,
|
||
|
|
minutes: number,
|
||
|
|
signal?: AbortSignal,
|
||
|
|
): Promise<TrackResponse> {
|
||
|
|
const controller = new AbortController();
|
||
|
|
const timeout = setTimeout(() => controller.abort(), 15_000);
|
||
|
|
|
||
|
|
const combinedSignal = signal ?? controller.signal;
|
||
|
|
|
||
|
|
try {
|
||
|
|
const url = `${API_BASE}/api/ais-target/${mmsi}/track?minutes=${minutes}`;
|
||
|
|
const res = await fetch(url, {
|
||
|
|
signal: combinedSignal,
|
||
|
|
headers: { accept: 'application/json' },
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!res.ok) {
|
||
|
|
const text = await res.text().catch(() => '');
|
||
|
|
throw new Error(`Track API error ${res.status}: ${text.slice(0, 200)}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
const json = (await res.json()) as TrackResponse;
|
||
|
|
return json;
|
||
|
|
} finally {
|
||
|
|
clearTimeout(timeout);
|
||
|
|
}
|
||
|
|
}
|