Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 28x 28x 28x 2x 2x 26x 26x 26x 28x 2x 2x 24x 24x 10x 28x 28x 28x 28x 28x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 33x 4x 4x 29x 29x 33x 33x 33x 33x | /**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import assert from "assert";
import { iter } from "./iter";
// Helper to convert memory from units Ki, Mi, Gi, Ti, Pi to bytes and vise versa
const baseMagnitude = 1024;
const maxMagnitude = ["PiB", baseMagnitude ** 5] as const;
const magnitudes = new Map([
["B", 1] as const,
["KiB", baseMagnitude ** 1] as const,
["MiB", baseMagnitude ** 2] as const,
["GiB", baseMagnitude ** 3] as const,
["TiB", baseMagnitude ** 4] as const,
maxMagnitude,
]);
const unitRegex = /(?<value>[0-9]+(\.[0-9]*)?)(?<suffix>(B|[KMGTP]iB?))?/;
type BinaryUnit = typeof magnitudes extends Map<infer Key, any> ? Key : never;
export function unitsToBytes(value: string): number {
const unitsMatch = value.match(unitRegex);
if (!unitsMatch?.groups) {
return NaN;
}
const parsedValue = parseFloat(unitsMatch.groups.value);
if (!unitsMatch.groups?.suffix) {
return parsedValue;
}
const magnitude = magnitudes.get(unitsMatch.groups.suffix as BinaryUnit)
?? magnitudes.get(`${unitsMatch.groups.suffix}B` as BinaryUnit);
assert(magnitude, "UnitRegex is wrong some how");
return parseInt((parsedValue * magnitude).toFixed(1));
}
export interface BytesToUnitesOptions {
/**
* The number of decimal places. MUST be an integer. MUST be in the range [0, 20].
* @default 1
*/
precision?: number;
}
export function bytesToUnits(bytes: number, { precision = 1 }: BytesToUnitesOptions = {}): string {
if (bytes <= 0 || isNaN(bytes) || !isFinite(bytes)) {
return "N/A";
}
const index = Math.floor(Math.log(bytes) / Math.log(baseMagnitude));
const [suffix, magnitude] = iter.nth(magnitudes.entries(), index) ?? maxMagnitude;
return `${(bytes / magnitude).toFixed(precision)}${suffix}`;
}
|