fix: memory blow on large files sending through URL

This commit is contained in:
canove
2025-05-05 21:11:40 -03:00
parent a85251250d
commit bff86ed4c1
2 changed files with 68 additions and 67 deletions
+16 -21
View File
@@ -1,7 +1,7 @@
import { Boom } from '@hapi/boom'
import axios from 'axios'
import { randomBytes } from 'crypto'
import { promises as fs } from 'fs'
import { createReadStream, promises as fs } from 'fs'
import { type Transform } from 'stream'
import { proto } from '../../WAProto'
import { MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults'
@@ -155,15 +155,14 @@ export const prepareWAMessageMedia = async(
(typeof uploadData['jpegThumbnail'] === 'undefined')
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation
const {
mediaKey,
encWriteStream,
bodyPath,
encFilePath,
originalFilePath,
fileEncSha256,
fileSha256,
fileLength,
didSaveToTmpPath
fileLength
} = await encryptedStream(
uploadData.media,
options.mediaTypeOverride || mediaType,
@@ -178,7 +177,7 @@ export const prepareWAMessageMedia = async(
const [{ mediaUrl, directPath }] = await Promise.all([
(async() => {
const result = await options.upload(
encWriteStream,
createReadStream(encFilePath),
{ fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs }
)
logger?.debug({ mediaType, cacheableKey }, 'uploaded media')
@@ -190,7 +189,7 @@ export const prepareWAMessageMedia = async(
const {
thumbnail,
originalImageDimensions
} = await generateThumbnail(bodyPath!, mediaType as 'image' | 'video', options)
} = await generateThumbnail(originalFilePath!, mediaType as 'image' | 'video', options)
uploadData.jpegThumbnail = thumbnail
if(!uploadData.width && originalImageDimensions) {
uploadData.width = originalImageDimensions.width
@@ -202,12 +201,12 @@ export const prepareWAMessageMedia = async(
}
if(requiresDurationComputation) {
uploadData.seconds = await getAudioDuration(bodyPath!)
uploadData.seconds = await getAudioDuration(originalFilePath!)
logger?.debug('computed audio duration')
}
if(requiresWaveformProcessing) {
uploadData.waveform = await getAudioWaveform(bodyPath!, logger)
uploadData.waveform = await getAudioWaveform(originalFilePath!, logger)
logger?.debug('processed waveform')
}
@@ -222,17 +221,13 @@ export const prepareWAMessageMedia = async(
])
.finally(
async() => {
encWriteStream.destroy()
// remove tmp files
if(didSaveToTmpPath && bodyPath) {
try {
await fs.access(bodyPath)
await fs.unlink(bodyPath)
logger?.debug('removed tmp file')
} catch(error) {
logger?.warn('failed to remove tmp file')
}
}
try {
await fs.unlink(encFilePath)
if (originalFilePath) await fs.unlink(originalFilePath)
logger?.debug('removed tmp files')
} catch(error) {
logger?.warn('failed to remove tmp file')
}
}
)