Files
homarr/packages/api/src/router/kubernetes/resource-parser/memory-resource-parser.ts
2025-03-09 17:46:15 +01:00

70 lines
1.8 KiB
TypeScript

import type { ResourceParser } from "./resource-parser";
export class MemoryResourceParser implements ResourceParser {
private readonly binaryMultipliers: Record<string, number> = {
ki: 1024,
mi: 1024 ** 2,
gi: 1024 ** 3,
ti: 1024 ** 4,
pi: 1024 ** 5,
} as const;
private readonly decimalMultipliers: Record<string, number> = {
k: 1000,
m: 1000 ** 2,
g: 1000 ** 3,
t: 1000 ** 4,
p: 1000 ** 5,
} as const;
parse(value: string): number {
if (!value.length) {
return NaN;
}
value = value.replace(/,/g, "").trim();
const [, numericValue, unit = ""] = /^([0-9.]+)\s*([a-zA-Z]*)$/.exec(value) ?? [];
if (!numericValue) {
return NaN;
}
const parsedValue = parseFloat(numericValue);
if (isNaN(parsedValue)) {
return NaN;
}
const unitLower = unit.toLowerCase();
// Handle binary units (Ki, Mi, Gi, etc.)
if (unitLower in this.binaryMultipliers) {
const multiplier = this.binaryMultipliers[unitLower];
const giMultiplier = this.binaryMultipliers.gi;
if (multiplier !== undefined && giMultiplier !== undefined) {
return (parsedValue * multiplier) / giMultiplier;
}
}
// Handle decimal units (K, M, G, etc.)
if (unitLower in this.decimalMultipliers) {
const multiplier = this.decimalMultipliers[unitLower];
const giMultiplier = this.binaryMultipliers.gi;
if (multiplier !== undefined && giMultiplier !== undefined) {
return (parsedValue * multiplier) / giMultiplier;
}
}
// No unit or unrecognized unit, assume bytes and convert to GiB
const giMultiplier = this.binaryMultipliers.gi;
if (giMultiplier !== undefined) {
return parsedValue / giMultiplier;
}
return NaN; // Return NaN if giMultiplier is undefined
}
}