Design system.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

106 rindas
3.7 KiB

  1. import {getTextMetadata, TextMetadata} from '@modal-sh/text-utils';
  2. import {getMetadataFromUrl as getImageMetadataFromUrl, ImageMetadata} from '@modal-sh/image-utils';
  3. import {getMetadataFromUrl as getAudioMetadataFromUrl, AudioMetadata} from '@modal-sh/audio-utils';
  4. import {getMetadataFromUrl as getVideoMetadataFromUrl, VideoMetadata} from '@modal-sh/video-utils';
  5. export const readAsDataURL = (blob: Partial<Blob>) => new Promise<string>((resolve, reject) => {
  6. // TODO when to revoke these URLs
  7. // return URL.createObjectURL(blob as Blob);
  8. const reader = new FileReader();
  9. reader.addEventListener('error', () => {
  10. reject(new Error('Could not read file as data URL'));
  11. });
  12. reader.addEventListener('load', (e) => {
  13. if (!e.target) {
  14. reject();
  15. return;
  16. }
  17. resolve(e.target.result as string);
  18. });
  19. reader.readAsDataURL(blob as Blob);
  20. });
  21. export interface FileWithDataUrl extends File {
  22. url?: string;
  23. }
  24. export const addDataUrl = async (f: Partial<File>): Promise<Partial<FileWithDataUrl>> => {
  25. (f as unknown as Record<string, unknown>).url = await readAsDataURL(f);
  26. return f;
  27. }
  28. export interface FileWithResolvedContentType extends Partial<FileWithDataUrl> {
  29. resolvedType: ContentType;
  30. }
  31. export interface TextFile extends FileWithResolvedContentType {
  32. resolvedType: ContentType.TEXT;
  33. metadata?: TextMetadata;
  34. }
  35. export const augmentTextFile = async <T extends Partial<FileWithDataUrl>>(file: T): Promise<TextFile> => {
  36. const contents = typeof file?.text === 'function' ? await file.text() : '';
  37. const fileMutable = file as unknown as Record<string, TextMetadata>;
  38. fileMutable.metadata = await getTextMetadata(contents ?? '', file.name);
  39. return fileMutable as unknown as TextFile;
  40. };
  41. export interface ImageFile extends FileWithResolvedContentType {
  42. resolvedType: ContentType.IMAGE;
  43. metadata?: ImageMetadata;
  44. }
  45. export const augmentImageFile = async <T extends Partial<FileWithDataUrl>>(file: T): Promise<ImageFile> => {
  46. const fileMutable = file as unknown as Record<string, ImageMetadata>;
  47. fileMutable.metadata = await getImageMetadataFromUrl(file.url);
  48. return fileMutable as unknown as ImageFile;
  49. };
  50. export interface AudioFile extends FileWithResolvedContentType {
  51. resolvedType: ContentType.AUDIO;
  52. metadata?: AudioMetadata;
  53. }
  54. export const augmentAudioFile = async <T extends Partial<FileWithDataUrl>>(file: T): Promise<AudioFile> => {
  55. const fileMutable = file as unknown as Record<string, AudioMetadata>;
  56. if (file.type === 'audio/mid') {
  57. fileMutable.metadata = {};
  58. } else {
  59. fileMutable.metadata = await getAudioMetadataFromUrl(file.url);
  60. }
  61. return fileMutable as unknown as AudioFile;
  62. };
  63. export interface BinaryFileMetadata {
  64. contents: ArrayBuffer;
  65. }
  66. export interface BinaryFile extends FileWithResolvedContentType {
  67. resolvedType: ContentType.BINARY;
  68. metadata?: BinaryFileMetadata;
  69. }
  70. export const augmentBinaryFile = async <T extends Partial<FileWithDataUrl>>(file: T): Promise<BinaryFile> => {
  71. const metadata = {} as BinaryFileMetadata;
  72. if (typeof file?.arrayBuffer === 'function') {
  73. metadata.contents = await file.arrayBuffer();
  74. }
  75. const fileMutable = file as unknown as Record<string, BinaryFileMetadata>;
  76. fileMutable.metadata = metadata;
  77. return fileMutable as unknown as BinaryFile;
  78. };
  79. export interface VideoFile extends FileWithResolvedContentType {
  80. resolvedType: ContentType.VIDEO;
  81. metadata?: VideoMetadata;
  82. }
  83. export const augmentVideoFile = async <T extends Partial<FileWithDataUrl>>(file: T): Promise<VideoFile> => {
  84. const fileMutable = file as unknown as Record<string, AudioMetadata>;
  85. fileMutable.metadata = await getVideoMetadataFromUrl(file.url);
  86. return fileMutable as unknown as VideoFile;
  87. };