From cf99acc6822f7d8f1ccd3b8379129e5fc66244b6 Mon Sep 17 00:00:00 2001 From: marcos-silva-rodrigues Date: Sun, 26 Jan 2025 16:37:37 -0300 Subject: [PATCH] FEAT: send images in stream --- src/modules/theme/theme.controller.ts | 2 +- src/modules/theme/theme.service.ts | 38 ++++++++++++++++++++------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/modules/theme/theme.controller.ts b/src/modules/theme/theme.controller.ts index dba694e..db10ffe 100644 --- a/src/modules/theme/theme.controller.ts +++ b/src/modules/theme/theme.controller.ts @@ -74,7 +74,7 @@ export class ThemeController { logoBlack }); this.logger.info('saveCustomertheme' + JSON.stringify(theme)); - return { theme: theme }; + return theme; } catch (err) { if (err.details === ErrorCodes.CUSTOMER.NOT_FOUND) { this.logger.error('Error - saveCustomertheme - Expect CUSTOMER.NOT_FOUND'); diff --git a/src/modules/theme/theme.service.ts b/src/modules/theme/theme.service.ts index 4c5f33f..b2f4716 100644 --- a/src/modules/theme/theme.service.ts +++ b/src/modules/theme/theme.service.ts @@ -25,7 +25,6 @@ type Files = { logoBlack: Express.Multer.File, } -// This function will accept any string, which may result in a bug. @Injectable() export class ThemeService implements OnModuleInit { private themeService: ThemeProtoService; @@ -95,16 +94,11 @@ export class ThemeService implements OnModuleInit { } private async sendFile(file: Express.Multer.File, stream$: ReplaySubject) { - const bufferStream = new Readable({ - highWaterMark: 1024 * 1024, // 1 MB por chunk - read() {} - }); - bufferStream.push(file.buffer); - bufferStream.push(null); + const chunkSize = 4 * 1024 * 1024; + const bufferStream = new CustomBufferStream(file.buffer, chunkSize); return new Promise((resolve, reject) => { bufferStream.on('data', (chunk) => { - console.log('enviando chunk', file.fieldname) const mimetype = file.mimetype.split('/')[1]; // example image/jpeg const filename = file.fieldname.concat(".", mimetype); stream$.next({ @@ -119,15 +113,39 @@ export class ThemeService implements OnModuleInit { }); bufferStream.on('end', () => { - console.log('terminou de enviar') resolve(file.filename) }); bufferStream.on('error', (err) => { - console.error('Erro no stream:', err); reject(err); }); }); } } + +class CustomBufferStream extends Readable { + buffer: Buffer; + offset: number; + chunkSize: number; + + constructor(buffer: Buffer, chunkSize: number) { + super({ highWaterMark: chunkSize }); // Configura o tamanho do chunk + this.buffer = buffer; + this.offset = 0; + this.chunkSize = chunkSize; + } + + _read() { + if (this.offset < this.buffer.length) { + const end = Math.min(this.offset + this.chunkSize, this.buffer.length); + + const copiedBuf = Uint8Array.prototype.slice.call(this.buffer); + const chunk = copiedBuf.slice(this.offset, end); + this.offset = end; + this.push(chunk); + } else { + this.push(null); + } + } +}