← Files TrinityARCHIVED FILE
dist/send.js
1.56 KB · Oct 3, 2026 · 06:33 UTC
import { loadPolicy, savePolicy } from "./config.js";
export const REQUEST_TIMEOUT_MS = 5_000;
export class BatchRequestError extends Error {
status;
constructor(status) {
super(`ingest batch failed: ${status}`);
this.status = status;
}
}
export async function sendBatch(cfg, events, timeoutMs = REQUEST_TIMEOUT_MS) {
const res = await fetch(cfg.ingestUrl, {
method: "POST",
headers: {
Authorization: `Bearer ${cfg.token}`,
"Content-Type": "application/json",
"X-Trinity-Wire-Version": "1",
},
body: JSON.stringify({ items: events }),
signal: AbortSignal.timeout(timeoutMs),
});
if (!res.ok)
throw new BatchRequestError(res.status);
const body = (await res.json());
return body.results;
}
export async function refreshPolicy(dataDir, cfg, timeoutMs = REQUEST_TIMEOUT_MS) {
const current = loadPolicy(dataDir);
const policyUrl = cfg.ingestUrl.replace(/\/batches$/, "/policy");
const headers = { Authorization: `Bearer ${cfg.token}` };
if (current)
headers["If-None-Match"] = current.etag;
const res = await fetch(policyUrl, { headers, signal: AbortSignal.timeout(timeoutMs) });
if (res.status === 304 && current) {
const refreshed = { ...current, fetchedAt: Date.now() };
savePolicy(dataDir, refreshed);
return refreshed;
}
if (!res.ok)
return current;
const doc = (await res.json());
const policy = { ...doc, fetchedAt: Date.now() };
savePolicy(dataDir, policy);
return policy;
}
SHA-256: ea489527fd4927ac218b180ae783c53d2bedcd447022354df79e72453eaa1302