From d22f788e3ef3ed80a237326119cf8d1efc592bc7 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 29 Jul 2026 17:26:51 +0700 Subject: [PATCH] fix: wrap Bun.file().stream() in Readable.from() for Telegraf compat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replaces createReadStream / bare ReadableStream with Readable.from(Bun.file(path).stream()) — works in both test (Bun.write + Bun.file) and production (Node Readable) - Reverts writeBufferToTemp back to Bun.write --- src/interfaces/http/controllers/upload-controller.ts | 5 +++-- test/upload.test.ts | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/interfaces/http/controllers/upload-controller.ts b/src/interfaces/http/controllers/upload-controller.ts index 8e1e4d2..4a6664c 100644 --- a/src/interfaces/http/controllers/upload-controller.ts +++ b/src/interfaces/http/controllers/upload-controller.ts @@ -1,3 +1,4 @@ +import { Readable } from 'node:stream'; import { nanoid } from 'nanoid'; import { buildNewFile } from '../../../domain/entities/file-factory'; import { config } from '../../../env'; @@ -206,7 +207,7 @@ const handleMultipartUpload = async (req: Request): Promise => { // Single-message — direct to Telegram storage const forwardResult = await telegramService.forwardToStorage( - Bun.file(prepared.tempPath).stream(), + Readable.from(Bun.file(prepared.tempPath).stream()), finalFileName, fileType, ); @@ -318,7 +319,7 @@ const handleJSONUpload = async (req: Request): Promise => { // Single-message — direct to Telegram storage const forwardResult = await telegramService.forwardToStorage( - Bun.file(prepared.tempPath).stream(), + Readable.from(Bun.file(prepared.tempPath).stream()), finalFileName, fileType, ); diff --git a/test/upload.test.ts b/test/upload.test.ts index 8a68f18..2c364bf 100644 --- a/test/upload.test.ts +++ b/test/upload.test.ts @@ -17,8 +17,6 @@ beforeAll(async () => { 'hex', ); } - // Pre-create temp file for multipart upload test - await Bun.write('/tmp/filedrop-test-photo', realPhotoBuffer); }); // Mock db @@ -113,6 +111,7 @@ describe('Upload Route Handler', () => { mockFileRepo.create.mockClear(); mockForwardToStorage.mockClear(); mockFindByHashResult = null; + nanoidCounter = 0; const uploadRoute = await import('../src/interfaces/http/controllers/upload-controller'); handleUpload = uploadRoute.handleUpload; });