UNPKG

@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

296 lines (295 loc) • 10.9 kB
import { AsyncLocalStorage } from "node:async_hooks"; import { withTimeout } from "../utils/async/withTimeout.js"; import { logger } from "../utils/logger.js"; const PROXY_RESPONSE_CANCEL_TIMEOUT_MS = 1_000; // Bridge identity is registered by this process, never trusted from an inbound // parent-id header. One-use capabilities expire even if loopback dispatch fails. const internalRequests = new Map(); const bridgeResults = new Map(); export function getProxyBridgeResult(requestId) { return bridgeResults.get(requestId); } const requestAccounting = new Map(); export function registerInternalProxyRequest(parentRequestId) { if (internalRequests.size >= 5000) { throw Object.assign(new Error("Internal proxy dispatch capacity is full"), { status: 503, code: "PROXY_INTERNAL_CAPACITY", retryable: false, }); } const token = crypto.randomUUID(); const requestId = crypto.randomUUID(); internalRequests.set(token, { parentRequestId, requestId }); requestAccounting.set(parentRequestId, { accountingScope: "client", usageOwnerRequestId: requestId, }); const timer = setTimeout(() => { if (internalRequests.delete(token)) { requestAccounting.delete(parentRequestId); bridgeResults.delete(parentRequestId); } }, 300_000); timer.unref?.(); return { token, requestId, dispose() { clearTimeout(timer); internalRequests.delete(token); }, }; } export function consumeInternalProxyRequest(token) { if (!token) { return undefined; } const result = internalRequests.get(token); internalRequests.delete(token); if (result) { requestAccounting.set(result.requestId, { parentRequestId: result.parentRequestId, accountingScope: "internal", usageOwnerRequestId: result.requestId, }); } return result; } export function getProxyRequestAccounting(requestId) { return requestAccounting.get(requestId); } export function releaseProxyRequestAccounting(requestId) { requestAccounting.delete(requestId); bridgeResults.delete(requestId); } let activeRequests = 0; let lastActivityAtMs = null; // Route handlers can attach terminal observers to their request context without // wrapping the response body a second time. The HTTP runtime drains every // response through one tracker, which fans these observers out at the point // where bytes actually leave the proxy. const responseObserversByMetadata = new WeakMap(); const finalOwnership = new Map(); const finalOwnershipContext = new AsyncLocalStorage(); /** Deferred native callbacks retain this owner even after transport cleanup. */ export function withProxyFinalLogOwnership(requestId, run) { const owner = finalOwnership.get(requestId); return owner ? finalOwnershipContext.run(owner, run) : run(); } const finalLogObservers = new Map(); const attemptLogObservers = new Map(); /** Join route accounting to the HTTP lifecycle without relying on write order. */ export function observeProxyFinalLog(requestId, observer, attemptObserver) { finalLogObservers.set(requestId, observer); finalOwnership.set(requestId, { requestId, finalized: false }); if (attemptObserver) { attemptLogObservers.set(requestId, attemptObserver); } else { attemptLogObservers.delete(requestId); } return () => { if (finalLogObservers.get(requestId) === observer) { finalLogObservers.delete(requestId); finalOwnership.delete(requestId); attemptLogObservers.delete(requestId); } }; } /** Check without claiming: aggregate accounting must not revive a cancelled request. */ export function isProxyRequestFinalized(requestId) { const contextual = finalOwnershipContext.getStore(); return ((contextual?.requestId === requestId ? contextual : finalOwnership.get(requestId))?.finalized ?? false); } export function notifyProxyFinalLog(entry) { const contextual = finalOwnershipContext.getStore(); const owner = contextual?.requestId === entry.requestId ? contextual : finalOwnership.get(entry.requestId); if (owner) { if (owner.finalized) { return false; } owner.finalized = true; } const parent = requestAccounting.get(entry.requestId)?.parentRequestId; if (parent && requestAccounting.has(parent)) { bridgeResults.set(parent, entry); } finalLogObservers.get(entry.requestId)?.(entry); return true; } /** Retain only the last attempt for a currently observed HTTP request. */ export function notifyProxyAttemptLog(entry) { const observer = attemptLogObservers.get(entry.requestId); observer?.(entry); if (entry.parentRequestId && entry.parentRequestId !== entry.requestId) { const parentObserver = attemptLogObservers.get(entry.parentRequestId); if (parentObserver !== observer) { parentObserver?.(entry); } } } export function registerProxyResponseObserver(metadata, observer) { const existing = responseObserversByMetadata.get(metadata); if (existing) { existing.push(observer); return; } responseObserversByMetadata.set(metadata, [observer]); } export function takeProxyResponseObservers(metadata) { const observers = responseObserversByMetadata.get(metadata) ?? []; responseObserversByMetadata.delete(metadata); return observers; } function touchActivity() { lastActivityAtMs = Date.now(); } function safelyNotifyObserver(callback) { try { callback?.(); } catch (error) { // Observability must never alter response handling. if (logger.shouldLog("debug")) { logger.debug("[proxy] response lifecycle observer failed", { error: error instanceof Error ? error.message : String(error), }); } } } /** Track one client-facing proxy request until its response body settles. */ export function beginProxyRequest() { activeRequests += 1; touchActivity(); let finished = false; return () => { if (finished) { return; } finished = true; activeRequests = Math.max(0, activeRequests - 1); touchActivity(); }; } export function getProxyActivitySnapshot() { return { activeRequests, lastActivityAt: lastActivityAtMs === null ? null : new Date(lastActivityAtMs), }; } export function isProxyActivityQuiet(snapshot, quietThresholdMs, nowMs = Date.now()) { if (snapshot.activeRequests > 0) { return false; } if (snapshot.lastActivityAt === null) { return true; } return nowMs - snapshot.lastActivityAt.getTime() >= quietThresholdMs; } /** Keep activity open until the response body completes, errors, or is cancelled. */ export function trackProxyResponse(response, finishRequest, observer, abortSignal) { if (!response.body) { try { const notified = observer?.onTerminal?.({ outcome: "bodyless", observedBodyBytes: 0, responseChunks: 0, }); void withTimeout(Promise.resolve(notified), 4000, "Timed out finalizing proxy response accounting").then(finishRequest, finishRequest); } catch { finishRequest(); } return response; } const reader = response.body.getReader(); let observedBodyBytes = 0; let responseChunks = 0; let settled = false; let sourceClosed = false; const settle = (outcome, error) => { if (settled) { return; } settled = true; abortSignal?.removeEventListener("abort", onAbort); // Keep drain accounting open through bounded terminal bookkeeping, but // never hold back the client's response body while telemetry is written. try { const notified = observer?.onTerminal?.({ outcome, error, observedBodyBytes, responseChunks, }); void withTimeout(Promise.resolve(notified), 4000, "Timed out finalizing proxy response accounting").then(finishRequest, finishRequest); } catch { finishRequest(); } }; const onAbort = () => { settle(abortSignal?.reason?.name === "TimeoutError" ? "stream_error" : "client_cancelled", abortSignal?.reason); void withTimeout(reader.cancel(abortSignal?.reason), PROXY_RESPONSE_CANCEL_TIMEOUT_MS, "Timed out cancelling the upstream proxy response").catch(() => undefined); }; abortSignal?.addEventListener("abort", onAbort, { once: true }); if (abortSignal?.aborted) { onAbort(); } // A failed source cannot be observed only on a future downstream pull: a // stalled reader might never pull again, leaving admission/drain open forever. void reader.closed.then(() => { sourceClosed = true; }, (error) => { settle("stream_error", error); }); const trackedBody = new ReadableStream({ async pull(controller) { try { const { value, done } = await reader.read(); if (done) { settle("completed"); controller.close(); return; } controller.enqueue(value); observedBodyBytes += value.byteLength; responseChunks += 1; if (responseChunks === 1) { safelyNotifyObserver(() => observer?.onFirstChunk?.({ observedBodyBytes, responseChunks: 1, })); } } catch (error) { settle("stream_error", error); controller.error(error); } }, async cancel(reason) { // Read the state before cancelling: reader.cancel() itself rejects the // closed promise for a genuinely active source, which is too late to // distinguish it from a source that had already ended normally. await Promise.resolve(); settle(sourceClosed ? "completed" : "client_cancelled"); await withTimeout(reader.cancel(reason), PROXY_RESPONSE_CANCEL_TIMEOUT_MS, "Timed out cancelling the upstream proxy response"); }, }); return new Response(trackedBody, { status: response.status, statusText: response.statusText, headers: response.headers, }); } export function resetProxyActivityForTests() { activeRequests = 0; lastActivityAtMs = null; }