@juspay/neurolink
Version:
The pipe layer of an AI nervous system: one interface connecting provider neurons to your application, across three inference types — generate, stream and decide. `decide` returns typed, calibrated judgements from a non-generative model (~400ms, ~$0.00002
110 lines (109 loc) • 3.66 kB
JavaScript
import { extractSSEEvents } from "./sseInterceptor.js";
const STREAM_PREFLIGHT_MAX_BYTES = 64 * 1024;
const STREAM_PREFLIGHT_MAX_CHUNKS = 32;
function parseSSEError(data) {
try {
const parsed = JSON.parse(data);
return {
errorType: parsed.error?.type ?? parsed.type ?? "stream_error",
message: parsed.error?.message ?? parsed.message ?? "Upstream SSE error",
};
}
catch {
return {
errorType: "stream_error",
message: data.trim() || "Upstream SSE error",
};
}
}
function isSSEErrorEvent(event) {
if (event.event === "error") {
return true;
}
try {
const parsed = JSON.parse(event.data);
return parsed.type === "error" || parsed.error !== undefined;
}
catch {
return false;
}
}
/** Hold only pre-commit SSE frames so immediate upstream errors remain retryable. */
export async function preflightAnthropicStream(reader) {
const decoder = new TextDecoder();
const chunks = [];
let parseBuffer = "";
let totalBytes = 0;
while (totalBytes < STREAM_PREFLIGHT_MAX_BYTES &&
chunks.length < STREAM_PREFLIGHT_MAX_CHUNKS) {
let result;
try {
result = await reader.read();
}
catch (error) {
return { kind: "transport_error", chunks, error };
}
if (result.done) {
parseBuffer += decoder.decode();
const { events } = extractSSEEvents(parseBuffer);
const errorEvent = events.find(isSSEErrorEvent);
if (errorEvent) {
return { kind: "sse_error", chunks, ...parseSSEError(errorEvent.data) };
}
return chunks.length > 0
? { kind: "ready", chunks }
: { kind: "empty", chunks };
}
if (!result.value || result.value.length === 0) {
continue;
}
chunks.push(result.value);
totalBytes += result.value.byteLength;
parseBuffer += decoder.decode(result.value, { stream: true });
const parsed = extractSSEEvents(parseBuffer);
parseBuffer = parsed.remainder;
for (const event of parsed.events) {
if (isSSEErrorEvent(event)) {
return { kind: "sse_error", chunks, ...parseSSEError(event.data) };
}
if (event.event !== "ping" && (event.event || event.data)) {
return { kind: "ready", chunks };
}
}
}
return chunks.length > 0
? { kind: "ready", chunks }
: { kind: "empty", chunks };
}
export function createStreamTerminalOutcomeTracker() {
let settled = false;
let resolveOutcome;
const outcome = new Promise((resolve) => {
resolveOutcome = resolve;
});
const settle = (value) => {
if (settled) {
return;
}
settled = true;
resolveOutcome(value);
};
return {
outcome,
complete: () => settle({ kind: "completed" }),
fail: (message) => settle({ kind: "upstream_error", message }),
cancel: () => settle({ kind: "client_cancelled" }),
};
}
export function mergeStreamTerminalOutcome(outcome, sseErrorMessage, messageStopReceived) {
if (outcome.kind === "completed" && sseErrorMessage) {
return { kind: "upstream_error", message: sseErrorMessage };
}
if (outcome.kind === "completed" && messageStopReceived === false) {
return {
kind: "upstream_error",
message: "Anthropic stream ended without a message_stop event",
};
}
return outcome;
}