@tldraw/utils
Version:
tldraw infinite canvas SDK (private utilities).
140 lines (139 loc) • 4.91 kB
JavaScript
import { fetch } from "./network.mjs";
class FileHelpers {
/**
* Converts a URL to an ArrayBuffer by fetching the resource.
*
* Fetches the resource at the given URL and returns its content as an ArrayBuffer.
* This is useful for loading binary data like images, videos, or other file types.
*
* @param url - The URL of the file to fetch
* @returns Promise that resolves to the file content as an ArrayBuffer
* @example
* ```ts
* const buffer = await FileHelpers.urlToArrayBuffer('https://example.com/image.png')
* console.log(buffer.byteLength) // Size of the file in bytes
* ```
* @public
*/
static async urlToArrayBuffer(url) {
const response = await fetch(url);
return await response.arrayBuffer();
}
/**
* Converts a URL to a Blob by fetching the resource.
*
* Fetches the resource at the given URL and returns its content as a Blob object.
* Blobs are useful for handling file data in web applications.
*
* @param url - The URL of the file to fetch
* @returns Promise that resolves to the file content as a Blob
* @example
* ```ts
* const blob = await FileHelpers.urlToBlob('https://example.com/document.pdf')
* console.log(blob.type) // 'application/pdf'
* console.log(blob.size) // Size in bytes
* ```
* @public
*/
static async urlToBlob(url) {
const response = await fetch(url);
return await response.blob();
}
/**
* Converts a URL to a data URL by fetching the resource.
*
* Fetches the resource at the given URL and converts it to a base64-encoded data URL.
* If the URL is already a data URL, it returns the URL unchanged. This is useful for embedding
* resources directly in HTML or CSS.
*
* @param url - The URL of the file to convert, or an existing data URL
* @returns Promise that resolves to a data URL string
* @example
* ```ts
* const dataUrl = await FileHelpers.urlToDataUrl('https://example.com/image.jpg')
* // Returns: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEA...'
*
* const existing = await FileHelpers.urlToDataUrl('data:text/plain;base64,SGVsbG8=')
* // Returns the same data URL unchanged
* ```
* @public
*/
static async urlToDataUrl(url) {
if (url.startsWith("data:")) return url;
const blob = await FileHelpers.urlToBlob(url);
return await FileHelpers.blobToDataUrl(blob);
}
/**
* Convert a Blob to a base64 encoded data URL.
*
* Converts a Blob object to a base64-encoded data URL using the FileReader API.
* This is useful for displaying images or embedding file content directly in HTML.
*
* @param file - The Blob object to convert
* @returns Promise that resolves to a base64-encoded data URL string
* @example
* ```ts
* const blob = new Blob(['Hello World'], { type: 'text/plain' })
* const dataUrl = await FileHelpers.blobToDataUrl(blob)
* // Returns: 'data:text/plain;base64,SGVsbG8gV29ybGQ='
*
* // With an image file
* const imageDataUrl = await FileHelpers.blobToDataUrl(myImageFile)
* // Can be used directly in img src attribute
* ```
* @public
*/
static async blobToDataUrl(file) {
return await new Promise((resolve, reject) => {
if (file) {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = (error) => reject(error);
reader.onabort = (error) => reject(error);
reader.readAsDataURL(file);
}
});
}
/**
* Convert a Blob to a unicode text string.
*
* Reads the content of a Blob object as a UTF-8 text string using the FileReader API.
* This is useful for reading text files or extracting text content from blobs.
*
* @param file - The Blob object to convert to text
* @returns Promise that resolves to the text content as a string
* @example
* ```ts
* const textBlob = new Blob(['Hello World'], { type: 'text/plain' })
* const text = await FileHelpers.blobToText(textBlob)
* console.log(text) // 'Hello World'
*
* // With a text file from user input
* const content = await FileHelpers.blobToText(myTextFile)
* console.log(content) // File content as string
* ```
* @public
*/
static async blobToText(file) {
return await new Promise((resolve, reject) => {
if (file) {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = (error) => reject(error);
reader.onabort = (error) => reject(error);
reader.readAsText(file);
}
});
}
static rewriteMimeType(blob, newMimeType) {
if (blob.type === newMimeType) return blob;
if (blob instanceof File) {
return new File([blob], blob.name, { type: newMimeType });
}
return new Blob([blob], { type: newMimeType });
}
}
export {
FileHelpers
};
//# sourceMappingURL=file.mjs.map