import { Room } from 'matrix-js-sdk'; import { TUploadItem } from '../state/room/roomInputDrafts'; import { encryptFile } from './matrix'; import { safeFile } from './mimeTypes'; import { fulfilledPromiseSettledResult } from './common'; import { stripImageMetadata } from './stripImageMetadata'; /** * Files → composer upload items for `room`, encrypting first when the room * is E2EE. Shared by the composer's pick/drop/paste paths and the PWA share * target (#155). */ export async function filesToUploadItems( room: Room, files: File[], stripMetadata = true, ): Promise { const prepared = await Promise.all( files.map(async (raw) => { const f = safeFile(raw); // [Gitea #109] Drop EXIF/XMP/IPTC before anything else sees the bytes // (including encryption), so what's uploaded never carried them. const { file, stripped } = stripMetadata ? await stripImageMetadata(f) : { file: f, stripped: false }; return { file, metadata: { markedAsSpoiler: false, metadataStripped: stripped || undefined }, }; }), ); if (room.hasEncryptionStateEvent()) { const encrypted = fulfilledPromiseSettledResult( await Promise.allSettled( prepared.map(async ({ file, metadata }) => ({ ...(await encryptFile(file)), metadata })), ), ); return encrypted; } return prepared.map(({ file, metadata }) => ({ file, originalFile: file, encInfo: undefined, metadata, })); }