chromium/components/metrics/debug/log_utils.ts

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {assert} from 'chrome://resources/js/assert.js';

import type {LogEvent} from './browser_proxy.js';

/**
 * Helper function to convert undefined UMA log types to "Unknown" string.
 * @param type The UMA log's type (i.e., ongoing, independent, or stability).
 * @returns The UMA log's type. "Unknown" if type is undefined.
 */
export function umaLogTypeToString(type: string|undefined) {
  if (!type) {
    return 'Unknown';
  }
  return type;
}

/**
 * Converts a given Unix timestamp into a human-readable string.
 * @param timestampSeconds The timestamp string (seconds since Epoch).
 * @return A human-readable representation of the timestamp (e.g "01/01/1970,
 *     12:00:00 AM").
 */
export function timestampToString(timestampSeconds: string) {
  if (!timestampSeconds.length) {
    // This case should not normally happen, but can happen when the table is
    // empty (a dummy log |EMPTY_LOG| is added, which has an empty timestamp).
    return 'N/A';
  }

  const timestampInt = parseInt(timestampSeconds);
  assert(!isNaN(timestampInt));
  // Multiply by 1000 since the constructor expects milliseconds, but the
  // timestamps are in seconds.
  return new Date(timestampInt * 1000).toLocaleString();
}

/**
 * Converts the size of a log to a human-readable string.
 * @param size The size of the log in bytes.
 * @returns The size of the log in KiB as a string.
 */
export function sizeToString(size: number) {
  if (size < 0) {
    // This case should not normally happen, but can happen when the table is
    // empty (a dummy log |EMPTY_LOG| is added, which has size -1).
    return 'N/A';
  }
  return `${(size / 1024).toFixed(2)} KiB`;
}

/**
 * Converts a log event to a human-readable string.
 * @param event The log event.
 * @returns A human-readable string of the log event.
 */
export function logEventToString(event: LogEvent) {
  let result = `[${new Date(event.timestampMs).toISOString()}] ${event.event}`;
  if (event.message) {
    result += ` (${event.message})`;
  }
  return result;
}

/**
 * Gets the string to display when the events div of a log are collapsed.
 * @param events The list of events of the log.
 * @returns A human-readable string of the last event that occurred.
 */
export function getEventsPeekString(events: LogEvent[]) {
  if (!events.length) {
    return 'N/A';
  }
  // Need to assert that last element exists, otherwise the call to
  // logEventToString() fails to compile.
  const lastEvent = events[events.length - 1];
  assert(lastEvent);
  return logEventToString(lastEvent);
}