import { rateLimiter, EndpointCategory } from "./rate-limiter.js";
import { getConfig } from "./config.js";
const cfg = getConfig();
const DATA_API_BASE = cfg.dataApiUrl;
async function dataApiFetch<T>(
path: string,
params: Record<string, string | number | boolean | undefined> = {},
): Promise<T> {
await rateLimiter.acquire(EndpointCategory.DATA_API);
const url = new URL(path, DATA_API_BASE);
for (const [k, v] of Object.entries(params)) {
if (v !== undefined) url.searchParams.set(k, String(v));
}
const res = await fetch(url.toString());
if (!res.ok) {
throw new Error(`Data API error: ${res.status} ${res.statusText}`);
}
return (await res.json()) as T;
}
export async function getPositions(params: {
user: string;
market?: string;
limit?: number;
offset?: number;
}): Promise<unknown> {
return dataApiFetch("/positions", params as Record<string, string | number | boolean>);
}
export async function getClosedPositions(params: {
user: string;
market?: string;
limit?: number;
offset?: number;
}): Promise<unknown> {
return dataApiFetch("/closed-positions", params as Record<string, string | number | boolean>);
}
export async function getTrades(params: {
user?: string;
market?: string;
limit?: number;
offset?: number;
}): Promise<unknown> {
return dataApiFetch("/trades", params as Record<string, string | number | boolean>);
}
export async function getUserActivity(params: {
user: string;
limit?: number;
offset?: number;
}): Promise<unknown> {
return dataApiFetch("/activity", params as Record<string, string | number | boolean>);
}
export async function getTopHolders(params: {
market: string;
limit?: number;
}): Promise<unknown> {
return dataApiFetch("/holders", params as Record<string, string | number | boolean>);
}
export async function getPositionsValue(params: {
user: string;
}): Promise<unknown> {
return dataApiFetch("/value", params as Record<string, string | number | boolean>);
}
export async function getOpenInterest(params: {
market: string;
}): Promise<unknown> {
return dataApiFetch("/oi", params as Record<string, string | number | boolean>);
}
export async function getLiveVolume(params: {
id: string;
}): Promise<unknown> {
return dataApiFetch("/live-volume", params as Record<string, string | number | boolean>);
}
export async function getTotalTraded(params: {
user: string;
}): Promise<unknown> {
return dataApiFetch("/traded", params as Record<string, string | number | boolean>);
}
export async function getTraderLeaderboard(params: {
limit?: number;
offset?: number;
} = {}): Promise<unknown> {
return dataApiFetch("/v1/leaderboard", params as Record<string, string | number | boolean>);
}
export async function getBuilderLeaderboard(params: {
limit?: number;
offset?: number;
} = {}): Promise<unknown> {
return dataApiFetch("/v1/builders/leaderboard", params as Record<string, string | number | boolean>);
}
export async function getBuilderVolumeTimeseries(params: {
limit?: number;
} = {}): Promise<unknown> {
return dataApiFetch("/v1/builders/volume", params as Record<string, string | number | boolean>);
}
export async function checkDataApiHealth(): Promise<unknown> {
return dataApiFetch("/");
}