export const NETWORK_ACTIVITY_COLORS = { 'Total Active': '#64748b', 'HTTP/1.1': '#1976d2', 'HTTP/2': '#388e3c', 'HTTP/3': '#7b1fa2', 'WebSocket': '#f57c00', 'Other': '#757575', 'Inbound': '#22c55e', 'Outbound': '#8b5cf6', 'Requests/sec': '#3b82f6', } as const; export const NETWORK_ACTIVITY_PROTOCOL_ORDER = [ 'HTTP/1.1', 'HTTP/2', 'HTTP/3', 'WebSocket', 'Other', ] as const; export const PROTOCOL_CONNECTION_LEGEND_STATS: Array<'latest'> = ['latest']; export const PROTOCOL_CONNECTION_CHART_LINES: Array<'avg' | 'max'> = []; export const NETWORK_ACTIVITY_FALLBACK_COLORS = [ '#007aff', '#32ade6', '#af52de', '#ff9500', '#34c759', '#ff2d55', ] as const; const knownProtocolNames = new Set(NETWORK_ACTIVITY_PROTOCOL_ORDER); export const getNetworkActivityColor = ( nameArg: string, fallbackIndexArg = 0, ): string => { const canonicalColor = NETWORK_ACTIVITY_COLORS[ nameArg as keyof typeof NETWORK_ACTIVITY_COLORS ]; if (canonicalColor) return canonicalColor; const fallbackIndex = Math.max(0, Math.trunc(fallbackIndexArg)); return NETWORK_ACTIVITY_FALLBACK_COLORS[ fallbackIndex % NETWORK_ACTIVITY_FALLBACK_COLORS.length ]; }; export const orderNetworkActivityProtocolNames = ( namesArg: string[], ): string[] => { const names = new Set(namesArg.filter((name) => name && name !== 'Total Active')); const orderedKnown = NETWORK_ACTIVITY_PROTOCOL_ORDER .filter((name) => name !== 'Other' && names.has(name)); const orderedUnknown = [...names] .filter((name) => !knownProtocolNames.has(name)) .sort((nameA, nameB) => nameA.localeCompare(nameB)); return [ ...orderedKnown, ...orderedUnknown, ...(names.has('Other') ? ['Other'] : []), ]; }; export const createNetworkProtocolDonutData = ( countsArg: Record, paletteProtocolNamesArg: string[] = [], ): Array<{ name: string; value: number; color: string }> => { const orderedNames = orderNetworkActivityProtocolNames(Object.keys(countsArg)); const paletteNames = orderNetworkActivityProtocolNames([ ...orderedNames, ...paletteProtocolNamesArg, ]); const unknownNames = paletteNames.filter((name) => !knownProtocolNames.has(name)); return orderedNames .filter((name) => (countsArg[name] ?? 0) > 0) .map((name) => ({ name, value: countsArg[name] ?? 0, color: getNetworkActivityColor(name, unknownNames.indexOf(name)), })); }; export const colorNetworkProtocolSeries = ( seriesArg: T[], ): Array => { const orderedNames = orderNetworkActivityProtocolNames(seriesArg.map((series) => series.name)); const unknownNames = orderedNames.filter((name) => !knownProtocolNames.has(name)); return seriesArg.map((series) => ({ ...series, color: getNetworkActivityColor(series.name, unknownNames.indexOf(series.name)), })); };