mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-20 14:12:59 +03:00
captureCurrentProviderRequest mirrors every Bedrock Converse request into the pending-request log tracker right after openAIToBedrockConverse() builds it, including the decoded image.source.bytes Uint8Array. sanitizePayloadPII() and redactPayload() in src/lib/logPayloads.ts both gate their recursive walk on Array.isArray(), which is false for typed arrays, so each image fell into the generic-object branch and got enumerated one JS key per decoded byte (twice, once per function) before any truncation bound applied. For 3x ~1MB images this took ~4s of synchronous, event-loop-blocking work, matching the reporter's "1-2 images OK, 3+ fails" threshold and their --stack-size observation (data-width pressure, not call-depth). Add an opaque-binary short-circuit (ArrayBuffer.isView) ahead of the Array.isArray branch in both functions, returning a fixed-size placeholder instead of recursing. Apply the same guard to cloneBoundedForLog() in open-sse/utils/requestLogger.ts for defense-in-depth (same blind spot, only accidentally safe today via its own key-count slice). Regression test reproduces the exact reporter shape (3x 1MB images) through the real openAIToBedrockConverse() converter and protectPayloadForLog(), asserting completion well under the previous ~4s and that binary bytes are never expanded into per-byte object keys.