Skip to content

Commit 8ee7537

Browse files
nirgaclaude
andcommitted
refactor: optimize image processing for Node.js backend
Replace browser-specific code with Node.js equivalents: - Use Buffer.toString('base64') instead of btoa() - Handle Node.js Buffer objects and ReadStreams - Remove browser File API dependencies - Use Buffer.from(arrayBuffer) for cleaner conversion Since this code only runs in Node.js backend environments, browser-specific APIs are unnecessary and can cause issues. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 1623b0b commit 8ee7537

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

packages/instrumentation-openai/src/image-wrappers.ts

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,30 @@ async function processImageInRequest(
9090
filename = `input_image_${index}.png`;
9191
}
9292
} else if (image && typeof image === "object") {
93-
// Handle File objects or other binary data
94-
if (image.arrayBuffer && typeof image.arrayBuffer === "function") {
95-
const arrayBuffer = await image.arrayBuffer();
96-
const buffer = new Uint8Array(arrayBuffer);
97-
// Convert buffer to base64 safely without stack overflow
98-
let binary = '';
99-
for (let i = 0; i < buffer.byteLength; i++) {
100-
binary += String.fromCharCode(buffer[i]);
101-
}
102-
base64Data = btoa(binary);
103-
filename = image.name || `input_image_${index}.png`;
93+
// Handle Node.js Buffer objects and ReadStream
94+
if (Buffer.isBuffer(image)) {
95+
// Node.js Buffer
96+
base64Data = image.toString("base64");
97+
filename = `input_image_${index}.png`;
98+
} else if (image.read && typeof image.read === "function") {
99+
// Node.js ReadStream (from fs.createReadStream)
100+
const chunks: Buffer[] = [];
101+
return new Promise((resolve) => {
102+
image.on("data", (chunk: Buffer) => chunks.push(chunk));
103+
image.on("end", async () => {
104+
try {
105+
const buffer = Buffer.concat(chunks);
106+
const base64Data = buffer.toString("base64");
107+
const filename = image.path || `input_image_${index}.png`;
108+
const url = await uploadCallback(traceId, spanId, filename, base64Data);
109+
resolve(url);
110+
} catch (error) {
111+
console.error("Error processing stream image:", error);
112+
resolve(null);
113+
}
114+
});
115+
image.on("error", () => resolve(null));
116+
});
104117
} else {
105118
return null;
106119
}
@@ -336,17 +349,11 @@ export async function setImageGenerationResponseAttributes(
336349
const traceId = span.spanContext().traceId;
337350
const spanId = span.spanContext().spanId;
338351

339-
// Fetch the image from OpenAI URL and convert to base64
352+
// Fetch the image from OpenAI URL and convert to base64 (Node.js)
340353
const response = await fetch(firstImage.url);
341354
const arrayBuffer = await response.arrayBuffer();
342-
const buffer = new Uint8Array(arrayBuffer);
343-
344-
// Convert buffer to base64 safely
345-
let binary = '';
346-
for (let i = 0; i < buffer.byteLength; i++) {
347-
binary += String.fromCharCode(buffer[i]);
348-
}
349-
const base64Data = btoa(binary);
355+
const buffer = Buffer.from(arrayBuffer);
356+
const base64Data = buffer.toString("base64");
350357

351358
const uploadedUrl = await uploadCallback(
352359
traceId,

0 commit comments

Comments
 (0)