~ knotless Search/
↑↓ move↵ open⇧↵ all results

chadtmiller.com/pds.js

An atproto PDS in JavaScript, for Cloudflare Workers and Node

0
0
main
42 lines · 1.2 KB Raw History
/** Byte sizes, relative times, and git idents, formatted for display. */

/** @param {number|null|undefined} size */
export function bytes(size) {
  if (size === null || size === undefined) return '';
  if (size < 1024) return `${size} B`;
  if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;
  return `${(size / (1024 * 1024)).toFixed(1)} MB`;
}

/** @type {Array<[string, number]>} */
const UNITS = [
  ['second', 60],
  ['minute', 60],
  ['hour', 24],
  ['day', 7],
  ['week', 4.35],
  ['month', 12],
  ['year', Number.POSITIVE_INFINITY],
];

/** @param {string|number} when - an ISO string or epoch milliseconds */
export function timeAgo(when) {
  const then = typeof when === 'number' ? when : Date.parse(when);
  if (!then) return '';
  let value = Math.max(1, (Date.now() - then) / 1000);
  for (const [unit, size] of UNITS) {
    if (value < size) {
      const count = Math.floor(value);
      return `${count} ${unit}${count === 1 ? '' : 's'} ago`;
    }
    value /= size;
  }
  return '';
}

/**
 * An ident is "Name <address>"; the page shows the name.
 * @param {string|undefined} ident
 */
export const identName = (ident) =>
  String(ident || '').replace(/\s*<[^>]*>$/, '');