/** * GIF Result Wrapper * * Provides a rich wrapper around GIF binary data with convenient methods for * output in various formats across different environments (Node.js and browser). * This class abstracts platform differences and provides a unified API. */ /** * Rich wrapper around GIF binary data with cross-platform output methods. * * The GifResult class provides convenient methods for outputting GIF data in various * formats, with automatic platform detection and graceful fallbacks. Methods adapt * to the runtime environment (Node.js vs browser) to provide the most appropriate * output format. * * @example * ```typescript * import { createSolidColorGif } from 'gif-tools'; * * const gif = createSolidColorGif(100, 100, { red: 255, green: 0, blue: 0 }); * * // Raw data (works everywhere) * const data = gif.toUint8Array(); * * // Browser usage * const dataUrl = gif.toDataURL(); * document.body.innerHTML = ``; * gif.download('red-square.gif'); * * // Node.js usage * await gif.saveToFile('output.gif'); * const buffer = gif.toBuffer(); // Returns Node.js Buffer * ``` * * @example * ```typescript * // Properties and utilities * console.log(`GIF size: ${gif.sizeFormatted}`); // "2.1 KB" * console.log(`MIME type: ${gif.mimeType}`); // "image/gif" * console.log(`Valid GIF: ${gif.isValidGif()}`); // true * * // Get comprehensive info * const info = gif.getInfo(); * console.log(info); // { size, mimeType, extension, version, etc. } * ``` */ export declare class GifResult { private readonly data; /** * Creates a new GifResult wrapper around binary GIF data. * * @param data - Binary GIF data as Uint8Array * @throws {GifValidationError} When data is not a valid Uint8Array * * @example * ```typescript * const gifData = new Uint8Array([0x47, 0x49, 0x46, ...]); // GIF data * const result = new GifResult(gifData); * ``` */ constructor(data: Uint8Array); /** * Returns the raw GIF data as Uint8Array. * * This method always returns a Uint8Array and works in all environments. * Use this when you need the raw binary data or when working with APIs * that expect Uint8Array input. * * @returns The GIF data as Uint8Array * * @example * ```typescript * const gif = createSolidColorGif(100, 100, { red: 255, green: 0, blue: 0 }); * const data = gif.toUint8Array(); * * // Use with other APIs * await fetch('/upload', { * method: 'POST', * body: data, * headers: { 'Content-Type': 'image/gif' } * }); * ``` */ toUint8Array(): Uint8Array; /** * Returns the GIF data as Buffer (Node.js) or Uint8Array (browser). * * Automatically detects the runtime environment and returns the most appropriate * data type. In Node.js, returns a Buffer for maximum compatibility with Node.js * APIs. In browsers, gracefully falls back to Uint8Array. * * @returns Buffer in Node.js, Uint8Array in browsers * * @example * ```typescript * const gif = createSolidColorGif(100, 100, { red: 0, green: 255, blue: 0 }); * const buffer = gif.toBuffer(); * * // Node.js usage * if (typeof window === 'undefined') { * // This will be a Buffer in Node.js * await require('fs').promises.writeFile('output.gif', buffer); * } else { * // This will be a Uint8Array in browsers * console.log('Fallback to Uint8Array in browser'); * } * ``` */ toBuffer(): unknown; /** * Converts the GIF data to a base64 data URL for use in HTML. * * Creates a data: URL that can be used directly in HTML img src attributes, * CSS background-image properties, or anywhere a URL is expected. The result * includes the proper MIME type for GIFs. * * @returns Data URL string in format 'data:image/gif;base64,' * @throws {GifValidationError} When base64 encoding is not available * * @example * ```typescript * const gif = createGradientGif(200, 100, * { red: 255, green: 0, blue: 0 }, * { red: 0, green: 0, blue: 255 } * ); * * // Use in HTML * const dataUrl = gif.toDataURL(); * document.body.innerHTML = `Gradient`; * * // Use in CSS * document.body.style.backgroundImage = `url(${dataUrl})`; * ``` * * @example * ```typescript * // React usage * function MyComponent() { * const gif = createSolidColorGif(50, 50, { red: 0, green: 255, blue: 0 }); * return Green square; * } * ``` */ toDataURL(): string; /** * Converts to base64 string */ toBase64(): string; /** * Converts the GIF data to a Blob object (browser only). * * Creates a Blob object that can be used with various browser APIs for file * operations, downloads, or object URLs. Only available in browser environments. * * @returns Blob object with MIME type 'image/gif' * @throws {GifValidationError} When Blob is not available (Node.js environment) * * @example * ```typescript * const gif = createNoiseGif(300, 200, { type: 'perlin' }); * * // Create blob for file operations * const blob = gif.toBlob(); * const file = new File([blob], 'noise.gif', { type: 'image/gif' }); * * // Upload using FormData * const formData = new FormData(); * formData.append('image', blob, 'noise.gif'); * await fetch('/upload', { method: 'POST', body: formData }); * ``` * * @example * ```typescript * // Use with object URL * const gif = createFractalGif(400, 400, { type: 'mandelbrot' }); * const blob = gif.toBlob(); * const url = URL.createObjectURL(blob); * * // Clean up when done * setTimeout(() => URL.revokeObjectURL(url), 1000); * ``` */ toBlob(): Blob; /** * Creates an object URL for the GIF data (browser only). * * Generates a blob: URL that can be used in HTML elements or for downloads. * The URL remains valid until explicitly revoked with URL.revokeObjectURL(). * Remember to revoke the URL when no longer needed to prevent memory leaks. * * @returns Object URL string in format 'blob:' * @throws {GifValidationError} When URL.createObjectURL is not available * * @example * ```typescript * const gif = createGeometricGif(250, 250, { shape: 'hexagons' }); * const objectUrl = gif.toObjectURL(); * * // Use in image element * const img = document.createElement('img'); * img.src = objectUrl; * document.body.appendChild(img); * * // Clean up when done * img.onload = () => { * setTimeout(() => URL.revokeObjectURL(objectUrl), 100); * }; * ``` * * @example * ```typescript * // Use for download link * const gif = createSpiralGif(300, 300, { type: 'fibonacci' }); * const url = gif.toObjectURL(); * * const link = document.createElement('a'); * link.href = url; * link.download = 'fibonacci-spiral.gif'; * link.textContent = 'Download Spiral'; * document.body.appendChild(link); * ``` */ toObjectURL(): string; /** * Converts the GIF data to a ReadableStream (when available). * * Creates a ReadableStream that can be used with the Streams API for * streaming operations. Useful for piping data or working with stream-based APIs. * * @returns ReadableStream containing the GIF data * @throws {GifValidationError} When ReadableStream is not available * * @example * ```typescript * const gif = createAnimatedGradientGif(200, 100, * { red: 255, green: 0, blue: 0 }, * { red: 0, green: 255, blue: 0 }, * { animationType: 'pulse' } * ); * * // Use with fetch * const stream = gif.toStream(); * await fetch('/upload', { * method: 'POST', * body: stream, * headers: { 'Content-Type': 'image/gif' } * }); * ``` */ toStream(): ReadableStream; /** * Triggers a download of the GIF file in the browser. * * Creates a temporary download link and programmatically clicks it to trigger * the browser's download functionality. Only available in browser environments * with DOM access. * * @param filename - Name for the downloaded file (default: 'image.gif') * @throws {GifValidationError} When document/DOM is not available * * @example * ```typescript * const gif = createCheckerboardGif(200, 150, * { red: 255, green: 0, blue: 255 }, // Magenta * { red: 0, green: 255, blue: 255 } // Cyan * ); * * // Simple download * gif.download(); // Downloads as 'image.gif' * * // Custom filename * gif.download('my-checkerboard.gif'); * ``` * * @example * ```typescript * // Download button handler * document.getElementById('download-btn').addEventListener('click', () => { * const gif = createFractalGif(400, 400, { type: 'julia' }); * gif.download('julia-set-fractal.gif'); * }); * ``` */ download(filename?: string): void; /** * Saves the GIF to a file (Node.js only). * * Writes the GIF data to the specified file path using Node.js file system APIs. * Creates parent directories if they don't exist. Only available in Node.js environments. * * @param filepath - Path where the file should be saved * @throws {GifValidationError} When Node.js fs module is not available * * @example * ```typescript * const gif = createSolidColorGif(800, 600, { red: 70, green: 130, blue: 180 }); * * // Save to current directory * await gif.saveToFile('background.gif'); * * // Save to subdirectory * await gif.saveToFile('./output/steel-blue-bg.gif'); * * // Save with full path * await gif.saveToFile('/home/user/images/custom.gif'); * ``` * * @example * ```typescript * // Batch save multiple GIFs * const colors = [ * { red: 255, green: 0, blue: 0 }, * { red: 0, green: 255, blue: 0 }, * { red: 0, green: 0, blue: 255 } * ]; * * for (let i = 0; i < colors.length; i++) { * const gif = createSolidColorGif(100, 100, colors[i]); * await gif.saveToFile(`color-${i}.gif`); * } * ``` */ saveToFile(filepath: string): Promise; /** * Gets the size of the GIF in bytes */ get size(): number; /** * Gets the MIME type */ get mimeType(): string; /** * Gets the file extension */ get extension(): string; /** * Returns a formatted size string */ get sizeFormatted(): string; /** * Validates that the data appears to be a valid GIF */ isValidGif(): boolean; /** * Manual base64 encoding fallback */ private manualBase64Encode; /** * Gets comprehensive information about the GIF. * * Returns an object containing detailed information about the GIF including * size, format, version, and other metadata. Useful for debugging or displaying * file information to users. * * @returns Object containing GIF metadata and properties * * @example * ```typescript * const gif = createAnimatedGradientGif(300, 200, * { red: 255, green: 100, blue: 0 }, * { red: 100, green: 0, blue: 255 }, * { frames: 30, delay: 50 } * ); * * const info = gif.getInfo(); * console.log(info); * // { * // size: 15420, * // sizeFormatted: "15.1 KB", * // mimeType: "image/gif", * // extension: "gif", * // isValid: true, * // version: "GIF89a", * // hasTransparency: false, * // isAnimated: true * // } * ``` * * @example * ```typescript * // Display file info to user * function displayGifInfo(gif: GifResult) { * const info = gif.getInfo(); * * const infoDiv = document.createElement('div'); * infoDiv.innerHTML = ` *

GIF Information

*

Size: ${info.sizeFormatted}

*

Version: ${info.version}

*

Valid: ${info.isValid ? 'Yes' : 'No'}

*

Animated: ${info.isAnimated ? 'Yes' : 'No'}

* `; * * document.body.appendChild(infoDiv); * } * ``` */ getInfo(): { size: number; sizeFormatted: string; isValid: boolean; mimeType: string; signature: string; }; }