You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/session/utils/AttachmentsV2.ts

135 lines
3.3 KiB
TypeScript

import * as crypto from 'crypto';
import { Attachment } from '../../types/Attachment';
import { OpenGroupRequestCommonType } from '../../opengroup/opengroupV2/ApiUtil';
import {
AttachmentPointer,
Preview,
Quote,
QuotedAttachment,
} from '../messages/outgoing/visibleMessage/VisibleMessage';
import { AttachmentUtils } from './Attachments';
import { uploadFileOpenGroupV2 } from '../../opengroup/opengroupV2/OpenGroupAPIV2';
interface UploadParamsV2 {
attachment: Attachment;
openGroup: OpenGroupRequestCommonType;
}
interface RawPreview {
url?: string;
title?: string;
image: Attachment;
}
interface RawQuoteAttachment {
contentType?: string;
fileName?: string;
thumbnail?: Attachment;
}
interface RawQuote {
id?: number;
author?: string;
text?: string;
attachments?: Array<RawQuoteAttachment>;
}
const PADDING_BYTE = 0;
export async function uploadV2(params: UploadParamsV2): Promise<AttachmentPointer> {
const { attachment, openGroup } = params;
if (typeof attachment !== 'object' || attachment == null) {
throw new Error('Invalid attachment passed.');
}
if (!(attachment.data instanceof ArrayBuffer)) {
throw new TypeError(
`attachment.data must be an ArrayBuffer but got: ${typeof attachment.data}`
);
}
const pointer: AttachmentPointer = {
contentType: attachment.contentType || undefined,
size: attachment.size,
fileName: attachment.fileName,
flags: attachment.flags,
caption: attachment.caption,
};
const paddedAttachment: ArrayBuffer = window.lokiFeatureFlags.padOutgoingAttachments
? AttachmentUtils.addAttachmentPadding(attachment.data)
: attachment.data;
const fileDetails = await uploadFileOpenGroupV2(new Uint8Array(paddedAttachment), openGroup);
pointer.id = fileDetails?.fileId || undefined;
pointer.url = fileDetails?.fileUrl || undefined;
return pointer;
}
export async function uploadAttachmentsV2(
attachments: Array<Attachment>,
openGroup: OpenGroupRequestCommonType
): Promise<Array<AttachmentPointer>> {
const promises = (attachments || []).map(async attachment =>
exports.uploadV2({
attachment,
openGroup,
})
);
return Promise.all(promises);
}
export async function uploadLinkPreviewsV2(
previews: Array<RawPreview>,
openGroup: OpenGroupRequestCommonType
): Promise<Array<Preview>> {
const promises = (previews || []).map(async item => {
// some links does not have an image associated, and it makes the whole message fail to send
if (!item.image) {
return item;
}
return {
...item,
image: await exports.uploadV2({
attachment: item.image,
openGroup,
}),
};
});
return Promise.all(promises);
}
export async function uploadQuoteThumbnailsV2(
openGroup: OpenGroupRequestCommonType,
quote?: RawQuote
): Promise<Quote | undefined> {
if (!quote) {
return undefined;
}
const promises = (quote.attachments ?? []).map(async attachment => {
let thumbnail: AttachmentPointer | undefined;
if (attachment.thumbnail) {
thumbnail = await exports.uploadV2({
attachment: attachment.thumbnail,
openGroup,
});
}
return {
...attachment,
thumbnail,
} as QuotedAttachment;
});
const attachments = await Promise.all(promises);
return {
...quote,
attachments,
};
}