78 lines
2.0 KiB
TypeScript
78 lines
2.0 KiB
TypeScript
/**
|
|
* Utility functions for mail data conversion and processing
|
|
*/
|
|
|
|
/**
|
|
* Converts an ArrayBuffer or byte array to a base64 string
|
|
* @param buffer - The buffer to convert (can be string, array, or ArrayBuffer)
|
|
* @returns Base64 encoded string
|
|
*/
|
|
export function arrayBufferToBase64(buffer: unknown): string {
|
|
// Already a base64 string
|
|
if (typeof buffer === 'string') {
|
|
return buffer;
|
|
}
|
|
|
|
// Handle array of bytes
|
|
if (Array.isArray(buffer)) {
|
|
let binary = '';
|
|
const bytes = new Uint8Array(buffer);
|
|
const len = bytes.byteLength;
|
|
for (let i = 0; i < len; i++) {
|
|
binary += String.fromCharCode(bytes[i]);
|
|
}
|
|
return window.btoa(binary);
|
|
}
|
|
|
|
// Handle ArrayBuffer
|
|
if (buffer instanceof ArrayBuffer) {
|
|
let binary = '';
|
|
const bytes = new Uint8Array(buffer);
|
|
const len = bytes.byteLength;
|
|
for (let i = 0; i < len; i++) {
|
|
binary += String.fromCharCode(bytes[i]);
|
|
}
|
|
return window.btoa(binary);
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Creates a data URL for downloading attachments
|
|
* @param contentType - MIME type of the attachment
|
|
* @param base64Data - Base64 encoded data
|
|
* @returns Data URL string
|
|
*/
|
|
export function createDataUrl(contentType: string, base64Data: string): string {
|
|
return `data:${contentType};base64,${base64Data}`;
|
|
}
|
|
|
|
/**
|
|
* Checks if a string looks like valid base64 content
|
|
* @param content - String to check
|
|
* @returns True if the content appears to be base64 encoded
|
|
*/
|
|
export function looksLikeBase64(content: string): boolean {
|
|
const clean = content.replace(/[\s\r\n]+/g, '');
|
|
return (
|
|
clean.length > 0 &&
|
|
clean.length % 4 === 0 &&
|
|
/^[A-Za-z0-9+/]+=*$/.test(clean)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Attempts to decode base64 content
|
|
* @param content - Base64 string to decode
|
|
* @returns Decoded string or null if decoding fails
|
|
*/
|
|
export function tryDecodeBase64(content: string): string | null {
|
|
try {
|
|
const clean = content.replace(/[\s\r\n]+/g, '');
|
|
return window.atob(clean);
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|