Skip to content

Commit 0d4505c

Browse files
fix: handle Uint8Array media values from persistence layers (#2298)
1 parent e1b8007 commit 0d4505c

2 files changed

Lines changed: 38 additions & 2 deletions

File tree

packages/layout-engine/pm-adapter/src/utilities.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,40 @@ describe('Media Utilities', () => {
836836
const result = hydrateImageBlocks(blocks, mediaFiles);
837837
expect(result[0].src).toBe('data:image/png;base64,iVBORw0KGgoAAAANS');
838838
});
839+
840+
it('handles Uint8Array media values from persistence layers', () => {
841+
const blocks: FlowBlock[] = [
842+
{
843+
kind: 'image',
844+
id: '1',
845+
src: 'media/image.png',
846+
runs: [],
847+
},
848+
];
849+
// Persistence layers (e.g., Y.js binary encoding) may return Uint8Array
850+
const base64String = 'iVBORw0KGgoAAAANS';
851+
const mediaFiles = { 'media/image.png': new TextEncoder().encode(base64String) };
852+
853+
const result = hydrateImageBlocks(blocks, mediaFiles);
854+
expect(result[0].src).toBe('data:image/png;base64,iVBORw0KGgoAAAANS');
855+
});
856+
857+
it('handles Uint8Array data URI values from persistence layers', () => {
858+
const blocks: FlowBlock[] = [
859+
{
860+
kind: 'image',
861+
id: '1',
862+
src: 'media/image.png',
863+
runs: [],
864+
},
865+
];
866+
// Data URI stored as Uint8Array
867+
const dataUri = 'data:image/png;base64,iVBORw0KGgoAAAANS';
868+
const mediaFiles = { 'media/image.png': new TextEncoder().encode(dataUri) };
869+
870+
const result = hydrateImageBlocks(blocks, mediaFiles);
871+
expect(result[0].src).toBe('data:image/png;base64,iVBORw0KGgoAAAANS');
872+
});
839873
});
840874

841875
describe('hydrateImageBlocks - ShapeGroup image hydration', () => {

packages/layout-engine/pm-adapter/src/utilities.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ export function inferExtensionFromPath(value?: string | null): string | undefine
954954
* // Matches via candidate path: word/media/rId3.png
955955
* ```
956956
*/
957-
export function hydrateImageBlocks(blocks: FlowBlock[], mediaFiles?: Record<string, string>): FlowBlock[] {
957+
export function hydrateImageBlocks(blocks: FlowBlock[], mediaFiles?: Record<string, string | Uint8Array>): FlowBlock[] {
958958
if (!mediaFiles || Object.keys(mediaFiles).length === 0) {
959959
return blocks;
960960
}
@@ -963,7 +963,9 @@ export function hydrateImageBlocks(blocks: FlowBlock[], mediaFiles?: Record<stri
963963
Object.entries(mediaFiles).forEach(([key, value]) => {
964964
const normalized = normalizeMediaKey(key);
965965
if (normalized) {
966-
normalizedMedia.set(normalized, value);
966+
// Handle Uint8Array values from persistence layers (e.g., Y.js binary encoding)
967+
const stringValue = value instanceof Uint8Array ? new TextDecoder().decode(value) : value;
968+
normalizedMedia.set(normalized, stringValue);
967969
}
968970
});
969971

0 commit comments

Comments
 (0)