const ROOM_NAME_SANITIZER = /[^\w.-]+/g; const STORED_FILENAME_SANITIZER = /[^\w.-]+/g; export function sanitizeAttachmentRoomName(roomName: string): string { const sanitizedRoomName = roomName.trim().replace(ROOM_NAME_SANITIZER, '_'); return sanitizedRoomName || 'room'; } export function resolveAttachmentStoredFilename(attachmentId: string, filename: string): string { const sanitizedAttachmentId = attachmentId.trim().replace(STORED_FILENAME_SANITIZER, '_') || 'attachment'; const basename = filename.trim().split(/[\\/]/) .pop() ?? ''; const extensionIndex = basename.lastIndexOf('.'); if (extensionIndex <= 0 || extensionIndex === basename.length - 1) { return sanitizedAttachmentId; } const sanitizedExtension = basename.slice(extensionIndex) .replace(STORED_FILENAME_SANITIZER, '_') .toLowerCase(); return sanitizedExtension === '.' ? sanitizedAttachmentId : `${sanitizedAttachmentId}${sanitizedExtension}`; } export function resolveAttachmentStorageBucket(mime: string): 'video' | 'audio' | 'image' | 'files' { if (mime.startsWith('video/')) { return 'video'; } if (mime.startsWith('audio/')) { return 'audio'; } if (mime.startsWith('image/')) { return 'image'; } return 'files'; }