Files
MemShellParty/web/app/lib/utils.ts
T
2026-08-30 21:05:21 +08:00

79 lines
2.3 KiB
TypeScript

import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
export function downloadContent(content: Blob, fileName: string, fileExtension: string) {
const link = document.createElement("a");
link.href = URL.createObjectURL(content);
link.download = `${fileName}${fileExtension}`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
export function base64ToBytes(base64String: string) {
const byteCharacters = atob(base64String);
const bytes = new Uint8Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
bytes[i] = byteCharacters.charCodeAt(i);
}
return bytes;
}
export function downloadBytes(base64String: string, className?: string, jarName?: string) {
const byteArray = base64ToBytes(base64String);
const blob = new Blob([byteArray], {
type: className ? "application/java-vm" : "application/java-archive",
});
const link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = className
? `${className.substring(className.lastIndexOf("."))}.class`
: `${jarName}.jar`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
export function formatBytes(bytes: number) {
if (bytes === 0) return "0 Bytes";
if (Number.isNaN(bytes) || !Number.isFinite(bytes)) return "N/A";
const k = 1024;
const sizes = ["Bytes", "KB", "MB"];
if (bytes < k) {
return `${bytes.toFixed(0)} ${sizes[0]}`;
}
const i = Math.floor(Math.log(bytes) / Math.log(k));
if (i >= 2 || bytes / k ** 1 >= 1000) {
const mbValue = Number.parseFloat((bytes / k ** 2).toFixed(2));
return `${mbValue} ${sizes[2]}`;
}
const kbValue = Number.parseFloat((bytes / k ** 1).toFixed(1));
return `${kbValue} ${sizes[1]}`;
}
export function notNeedUrlPattern(shellType: string | undefined) {
if (shellType === undefined) {
return false;
}
return (
shellType.endsWith("Listener") ||
shellType.endsWith("Valve") ||
shellType.startsWith("Agent") ||
shellType.endsWith("Interceptor") ||
(shellType.endsWith("Handler") && !shellType.includes("Controller")) ||
shellType.endsWith("WebFilter") ||
shellType === "Customizer" ||
shellType === "Upgrade"
);
}