/** * What the server answers for an upload: the content-addressed name it stored the bytes under * (`{sha256}.{ext}`, see `isTextureFile`/`isFontFile`/`isSoundFile`) and the caption kept beside it. */ export interface UploadedFile { file: string; /** The name the file was uploaded under, '' when the server knows none. Never a path. */ name: string; bytes: number; } /** A file the server holds, whether any project references it or not. */ export interface StoredFile extends UploadedFile { updatedAt: string; } /** * Raw bytes rather than a multipart form: the server derives name and format from the file itself, * so there is nothing else to send. `type` only fills the Content-Type header – the server trusts * the bytes, not the label – and uploading the same bytes twice yields the same file, the hash of * its content. `name` is the caption kept beside it; uploading the same bytes under a new name * renames what the pickers show. Nothing here deletes a file: another account's project may wear it. */ export interface FileStore { upload(bytes: Blob | ArrayBuffer, type: string, name?: string): Promise; list(): Promise; }