perf(read-image-resizer): decode only first 32KB of base64 for dimension parsing
Previously decoded entire image buffer to read headers. Now slices base64 to 32KB prefix before decoding — sufficient for PNG/GIF/WebP/JPEG headers. Dramatically reduces memory allocation for large images.
This commit is contained in:
@@ -28,6 +28,13 @@ function createGifDataUrl(width: number, height: number): string {
|
||||
return `data:image/gif;base64,${buf.toString("base64")}`
|
||||
}
|
||||
|
||||
function createLargePngDataUrl(width: number, height: number, extraBase64Chars: number): string {
|
||||
const baseDataUrl = createPngDataUrl(width, height)
|
||||
const base64Data = baseDataUrl.slice(baseDataUrl.indexOf(",") + 1)
|
||||
const paddedBase64 = `${base64Data}${"A".repeat(extraBase64Chars)}`
|
||||
return `data:image/png;base64,${paddedBase64}`
|
||||
}
|
||||
|
||||
describe("parseImageDimensions", () => {
|
||||
it("parses PNG 1x1 dimensions", () => {
|
||||
//#given
|
||||
@@ -51,6 +58,17 @@ describe("parseImageDimensions", () => {
|
||||
expect(result).toEqual({ width: 3000, height: 2000 })
|
||||
})
|
||||
|
||||
it("parses PNG dimensions from a very large base64 payload", () => {
|
||||
//#given
|
||||
const dataUrl = createLargePngDataUrl(4096, 2160, 10 * 1024 * 1024)
|
||||
|
||||
//#when
|
||||
const result = parseImageDimensions(dataUrl, "image/png")
|
||||
|
||||
//#then
|
||||
expect(result).toEqual({ width: 4096, height: 2160 })
|
||||
})
|
||||
|
||||
it("parses GIF 1x1 dimensions", () => {
|
||||
//#given
|
||||
const dataUrl = GIF_1X1_DATA_URL
|
||||
|
||||
Reference in New Issue
Block a user