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.
		
		
		
		
		
			
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
import { Attachment } from '../../types/Attachment';
 | 
						|
 | 
						|
import { OpenGroupRequestCommonType } from '../apis/open_group_api/opengroupV2/ApiUtil';
 | 
						|
import {
 | 
						|
  AttachmentPointer,
 | 
						|
  AttachmentPointerWithUrl,
 | 
						|
  PreviewWithAttachmentUrl,
 | 
						|
  Quote,
 | 
						|
  QuotedAttachment,
 | 
						|
} from '../messages/outgoing/visibleMessage/VisibleMessage';
 | 
						|
import { addAttachmentPadding } from '../crypto/BufferPadding';
 | 
						|
import { RawPreview, RawQuote } from './Attachments';
 | 
						|
import _ from 'lodash';
 | 
						|
import { uploadFileToRoomSogs3 } from '../apis/open_group_api/sogsv3/sogsV3SendFile';
 | 
						|
 | 
						|
interface UploadParamsV2 {
 | 
						|
  attachment: Attachment;
 | 
						|
  openGroup: OpenGroupRequestCommonType;
 | 
						|
}
 | 
						|
 | 
						|
async function uploadV3(params: UploadParamsV2): Promise<AttachmentPointerWithUrl> {
 | 
						|
  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,
 | 
						|
    width: attachment.width && isFinite(attachment.width) ? attachment.width : undefined,
 | 
						|
    height: attachment.height && isFinite(attachment.height) ? attachment.height : undefined,
 | 
						|
  };
 | 
						|
 | 
						|
  const paddedAttachment: ArrayBuffer = !openGroup
 | 
						|
    ? addAttachmentPadding(attachment.data)
 | 
						|
    : attachment.data;
 | 
						|
 | 
						|
  const fileDetails = await uploadFileToRoomSogs3(new Uint8Array(paddedAttachment), openGroup);
 | 
						|
 | 
						|
  if (!fileDetails) {
 | 
						|
    throw new Error(`upload to fileopengroupv3 of ${attachment.fileName} failed`);
 | 
						|
  }
 | 
						|
 | 
						|
  return {
 | 
						|
    ...pointer,
 | 
						|
    id: fileDetails.fileId,
 | 
						|
    url: fileDetails.fileUrl,
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
export async function uploadAttachmentsV3(
 | 
						|
  attachments: Array<Attachment>,
 | 
						|
  openGroup: OpenGroupRequestCommonType
 | 
						|
): Promise<Array<AttachmentPointerWithUrl>> {
 | 
						|
  const promises = (attachments || []).map(async attachment =>
 | 
						|
    uploadV3({
 | 
						|
      attachment,
 | 
						|
      openGroup,
 | 
						|
    })
 | 
						|
  );
 | 
						|
 | 
						|
  return Promise.all(promises);
 | 
						|
}
 | 
						|
 | 
						|
export async function uploadLinkPreviewsV3(
 | 
						|
  preview: RawPreview | null,
 | 
						|
  openGroup: OpenGroupRequestCommonType
 | 
						|
): Promise<PreviewWithAttachmentUrl | undefined> {
 | 
						|
  // some links does not have an image associated, and it makes the whole message fail to send
 | 
						|
  if (!preview?.image) {
 | 
						|
    window.log.warn('tried to upload preview to opengroupv2 without image.. skipping');
 | 
						|
 | 
						|
    return undefined;
 | 
						|
  }
 | 
						|
  const image = await uploadV3({
 | 
						|
    attachment: preview.image,
 | 
						|
    openGroup,
 | 
						|
  });
 | 
						|
  return {
 | 
						|
    ...preview,
 | 
						|
    image,
 | 
						|
    url: preview.url || image.url,
 | 
						|
    id: image.id,
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
export async function uploadQuoteThumbnailsV3(
 | 
						|
  openGroup: OpenGroupRequestCommonType,
 | 
						|
  quote?: RawQuote
 | 
						|
): Promise<Quote | undefined> {
 | 
						|
  if (!quote) {
 | 
						|
    return undefined;
 | 
						|
  }
 | 
						|
 | 
						|
  const promises = (quote.attachments ?? []).map(async attachment => {
 | 
						|
    let thumbnail: QuotedAttachment | undefined;
 | 
						|
    if (attachment.thumbnail) {
 | 
						|
      thumbnail = (await uploadV3({
 | 
						|
        attachment: attachment.thumbnail,
 | 
						|
        openGroup,
 | 
						|
      })) as any;
 | 
						|
    }
 | 
						|
    return {
 | 
						|
      ...attachment,
 | 
						|
      thumbnail,
 | 
						|
    };
 | 
						|
  });
 | 
						|
 | 
						|
  const attachments = await Promise.all(promises);
 | 
						|
 | 
						|
  return {
 | 
						|
    ...quote,
 | 
						|
    attachments,
 | 
						|
  };
 | 
						|
}
 |