From 94f48c3882978c16fe48d07b9a5a216d6fd54d75 Mon Sep 17 00:00:00 2001 From: Jake Shirley Date: Fri, 2 May 2025 14:26:35 -0700 Subject: [PATCH 1/2] feat: Added client memory stats + cleaned up diagnostics prefabs --- webview-ui/src/diagnostics_panel/App.tsx | 200 ++--------- .../CustomizedStatisticPane.tsx | 2 +- .../diagnostics_panel/StatisticPrefabs.tsx | 327 ------------------ .../controls/MinecraftStatisticTable.tsx | 166 +++++++++ .../prefabs/StatisticPrefab.ts | 8 + .../prefabs/StatisticPrefabs.tsx | 25 ++ .../diagnostics_panel/prefabs/TabPrefab.ts | 18 + .../src/diagnostics_panel/prefabs/index.tsx | 24 ++ .../prefabs/tabs/ClientMemory.tsx | 55 +++ .../prefabs/tabs/ClientTiming.tsx | 64 ++++ .../prefabs/tabs/ServerBandwidth.tsx | 60 ++++ .../prefabs/tabs/ServerMemory.tsx | 101 ++++++ .../prefabs/tabs/ServerPackets.tsx | 110 ++++++ .../prefabs/tabs/ServerScriptHandleCounts.tsx | 47 +++ .../tabs/ServerScriptSubscriberCounts.tsx | 45 +++ .../prefabs/tabs/ServerTiming.tsx | 64 ++++ .../diagnostics_panel/prefabs/tabs/World.tsx | 51 +++ .../diagnostics_panel/prefabs/utilities.tsx | 13 + 18 files changed, 881 insertions(+), 499 deletions(-) delete mode 100644 webview-ui/src/diagnostics_panel/StatisticPrefabs.tsx create mode 100644 webview-ui/src/diagnostics_panel/controls/MinecraftStatisticTable.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/StatisticPrefab.ts create mode 100644 webview-ui/src/diagnostics_panel/prefabs/StatisticPrefabs.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/TabPrefab.ts create mode 100644 webview-ui/src/diagnostics_panel/prefabs/index.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/ClientMemory.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/ClientTiming.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/ServerBandwidth.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/ServerMemory.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/ServerPackets.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/ServerScriptHandleCounts.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/ServerScriptSubscriberCounts.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/ServerTiming.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/tabs/World.tsx create mode 100644 webview-ui/src/diagnostics_panel/prefabs/utilities.tsx diff --git a/webview-ui/src/diagnostics_panel/App.tsx b/webview-ui/src/diagnostics_panel/App.tsx index 294c3ac..e0df233 100644 --- a/webview-ui/src/diagnostics_panel/App.tsx +++ b/webview-ui/src/diagnostics_panel/App.tsx @@ -9,9 +9,11 @@ import MinecraftStatisticStackedLineChart from './controls/MinecraftStatisticSta import MinecraftStatisticStackedBarChart from './controls/MinecraftStatisticStackedBarChart'; import { MultipleStatisticProvider, SimpleStatisticProvider, StatisticUpdatedMessage } from './StatisticProvider'; import ReplayControls from './controls/ReplayControls'; -import * as statPrefabs from './StatisticPrefabs'; +import * as statPrefabs from './prefabs/StatisticPrefabs'; import { Icons } from './Icons'; import './App.css'; +import tabPrefabs from './prefabs'; +import { TabPrefabDataSource } from './prefabs/TabPrefab'; declare global { interface Window { @@ -25,19 +27,6 @@ interface VSCodePanelsChangeEvent extends Event { target: EventTarget & { activeid: string }; } -// Filter out events with a value of zero that haven't been previously subscribed to -function constructSubscribedSignalFilter() { - const nonFilteredValues: string[] = []; - const func = (event: StatisticUpdatedMessage) => { - if (event.values.length === 1 && event.values[0] === 0 && !nonFilteredValues.includes(event.id)) { - return false; - } - nonFilteredValues.push(event.id); - return true; - }; - return func; -} - const onRestart = () => { vscode.postMessage({ type: 'restart' }); }; @@ -110,163 +99,32 @@ function App() { /> )} handlePanelChange(event as VSCodePanelsChangeEvent)}> - World - Memory - Server Timing - Client Timing - Networking - Packets - Networking - Bandwidth - Handle Counts - Subscriber Counts - -
- {statPrefabs.entityCount.reactNode} - {statPrefabs.loadedChunks.reactNode} -
-
{statPrefabs.commandsRan.reactNode}
-
- -
- {statPrefabs.appMemoryUsage.reactNode} - {statPrefabs.appMemoryFree.reactNode} -
-
- {statPrefabs.javaScriptMemoryAllocated.reactNode} - {statPrefabs.javaScriptMemoryFree.reactNode} -
-
- -
- {statPrefabs.serverTickTimings.reactNode} -
-
{statPrefabs.commandsRan.reactNode}
-
- - - - - - -
- {statPrefabs.packetsReceivedLineChart.reactNode} - {statPrefabs.packetsReceivedStackedLineChart.reactNode} -
-
- {statPrefabs.packetsSentLineChart.reactNode} - {statPrefabs.packetsSentStackedLineChart.reactNode} -
-
- - {statPrefabs.packetDataReceived.reactNode} - {statPrefabs.packetDataSent.reactNode} - - - - - - - - - - + {tabPrefabs.map((tabPrefab, index) => ( + {tabPrefab.name} + ))} + {tabPrefabs.map((tabPrefab, index) => ( + + {tabPrefab.dataSource === TabPrefabDataSource.Client ? ( + + ) : ( +
+ )} + {tabPrefab.dataSource === TabPrefabDataSource.ServerScript ? ( + + ) : ( +
+ )} + {tabPrefab.content({ selectedClient, selectedPlugin })} + + ))} ); diff --git a/webview-ui/src/diagnostics_panel/CustomizedStatisticPane.tsx b/webview-ui/src/diagnostics_panel/CustomizedStatisticPane.tsx index 861f39d..551c5b9 100644 --- a/webview-ui/src/diagnostics_panel/CustomizedStatisticPane.tsx +++ b/webview-ui/src/diagnostics_panel/CustomizedStatisticPane.tsx @@ -1,7 +1,7 @@ // Copyright (C) Microsoft Corporation. All rights reserved. import { VSCodeDropdown, VSCodeOption } from '@vscode/webview-ui-toolkit/react'; -import * as statPrefabs from './StatisticPrefabs'; +import * as statPrefabs from './prefabs/StatisticPrefabs'; type Options = { name: string; diff --git a/webview-ui/src/diagnostics_panel/StatisticPrefabs.tsx b/webview-ui/src/diagnostics_panel/StatisticPrefabs.tsx deleted file mode 100644 index 4b6008c..0000000 --- a/webview-ui/src/diagnostics_panel/StatisticPrefabs.tsx +++ /dev/null @@ -1,327 +0,0 @@ -// Copyright (C) Microsoft Corporation. All rights reserved. - -import { ReactNode } from 'react'; -import { - NestedStatResolver, - ParentNameStatResolver, - StatisticType, - YAxisType, - createStatResolver, -} from './StatisticResolver'; -import MinecraftStatisticLineChart from './controls/MinecraftStatisticLineChart'; -import MinecraftStatisticStackedLineChart from './controls/MinecraftStatisticStackedLineChart'; -import MinecraftStatisticStackedBarChart from './controls/MinecraftStatisticStackedBarChart'; -import { - MultipleStatisticProvider, - NestedStatisticProvider, - RegexStatisticProvider, - SimpleStatisticProvider, -} from './StatisticProvider'; - -interface StatisticPrefab { - name: string; - reactNode: ReactNode; -} - -// -// TODO: add prefabs for stats within sub groups. -// ex: entity counts are per plugin and client timings are grouped by player name. -// - -export const entityCount: StatisticPrefab = { - name: 'Entity Count', - reactNode: ( - - ), -}; - -export const loadedChunks: StatisticPrefab = { - name: 'Loaded Chunks', - reactNode: ( - - ), -}; - -export const appMemoryUsage: StatisticPrefab = { - name: 'App Memory Usage', - reactNode: ( - - ), -}; - -export const appMemoryFree: StatisticPrefab = { - name: 'App Memory Free', - reactNode: ( - - ), -}; - -export const javaScriptMemoryFree: StatisticPrefab = { - name: 'JavaScript Memory Used', - reactNode: ( - - ), -}; - -export const javaScriptMemoryAllocated: StatisticPrefab = { - name: 'JavaScript Memory Free', - reactNode: ( - - ), -}; - -export const serverTickTimings: StatisticPrefab = { - name: 'Server Tick Timings', - reactNode: ( - - ), -}; - -export const commandsRan: StatisticPrefab = { - name: 'Commands Ran', - reactNode: ( - - ), -}; - -export const packetsReceivedLineChart: StatisticPrefab = { - name: 'Packets Received (Line)', - reactNode: ( - - ), -}; - -export const packetsReceivedStackedLineChart: StatisticPrefab = { - name: 'Packets Recieved (Stack)', - reactNode: ( - - ), -}; - -export const packetsSentLineChart: StatisticPrefab = { - name: 'Packets Sent (Line)', - reactNode: ( - - ), -}; - -export const packetsSentStackedLineChart: StatisticPrefab = { - name: 'Packets Sent (Stack)', - reactNode: ( - - ), -}; - -export const packetDataReceived: StatisticPrefab = { - name: 'Packet Data Received', - reactNode: ( - - ), -}; - -export const packetDataSent: StatisticPrefab = { - name: 'Packet Data Sent', - reactNode: ( - - ), -}; diff --git a/webview-ui/src/diagnostics_panel/controls/MinecraftStatisticTable.tsx b/webview-ui/src/diagnostics_panel/controls/MinecraftStatisticTable.tsx new file mode 100644 index 0000000..50d8cad --- /dev/null +++ b/webview-ui/src/diagnostics_panel/controls/MinecraftStatisticTable.tsx @@ -0,0 +1,166 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +import { useCallback, useEffect, useState } from 'react'; +import { StatisticProvider, StatisticUpdatedMessage } from '../StatisticProvider'; +import { StatisticResolver, TrackedStat, YAxisStyle } from '../StatisticResolver'; +import { + VSCodeDataGrid, + VSCodeDataGridRow, + VSCodeDataGridCell, + VSCodeDropdown, + VSCodeOption, +} from '@vscode/webview-ui-toolkit/react'; + +export enum MinecraftStatisticTableSortOrder { + Ascending, + Descending, +} + +export enum MinecraftStatisticTableSortType { + Alphabetical, + Numerical, +} + +type MinecraftStatisticTableProps = { + title: string; + statisticDataProvider: StatisticProvider; + statisticResolver: StatisticResolver; + defaultSortOrder?: MinecraftStatisticTableSortOrder; + defaultSortType?: MinecraftStatisticTableSortType; + + keyLabel: string; + valueLabel: string; +}; + +const sortOrderOptions = [ + { id: MinecraftStatisticTableSortOrder.Ascending, label: 'Ascending' }, + { id: MinecraftStatisticTableSortOrder.Descending, label: 'Descending' }, +]; + +const sortTypeOptions = [ + { id: MinecraftStatisticTableSortType.Alphabetical, label: 'Alphabetical' }, + { id: MinecraftStatisticTableSortType.Numerical, label: 'Numerical' }, +]; + +export default function MinecraftStatisticTable({ + title, + statisticDataProvider, + statisticResolver, + defaultSortOrder = MinecraftStatisticTableSortOrder.Descending, + defaultSortType = MinecraftStatisticTableSortType.Numerical, + keyLabel, + valueLabel, +}: MinecraftStatisticTableProps): JSX.Element { + // states + const [data, setData] = useState([]); + + const [selectedSortOrder, setSelectedSortOrder] = useState(defaultSortOrder); + const [selectedSortType, setSelectedSortType] = useState(defaultSortType); + + const _onSelectedSortOrderChange = useCallback((e: Event | React.FormEvent): void => { + const target = e.target as HTMLSelectElement; + setSelectedSortOrder(sortOrderOptions[target.selectedIndex].id); + }, []); + + const _onSelectedSortTypeChange = useCallback((e: Event | React.FormEvent): void => { + const target = e.target as HTMLSelectElement; + setSelectedSortType(sortTypeOptions[target.selectedIndex].id); + }, []); + + useEffect(() => { + const eventHandler = (event: StatisticUpdatedMessage): void => { + // Update data with new data point + setData((prevState: TrackedStat[]): TrackedStat[] => { + let newData = statisticResolver(event, prevState); + + // Calculate the latest tick for each category, as some content might come from different ticks + const latestTicks = new Map(); + newData.forEach(dataPoint => { + const currentTick = latestTicks.get(dataPoint.category!) ?? 0; + if (dataPoint.time > currentTick) { + latestTicks.set(dataPoint.category!, dataPoint.time); + } + }); + + // Filter out data points that are older than the latest tick + newData = newData.filter(dataPoint => { + const latestTick = latestTicks.get(dataPoint.category!); + return latestTick !== undefined && dataPoint.time === latestTick; + }); + + // Sort based on sortOrder and sortType + newData.sort((a, b) => { + if (selectedSortType === MinecraftStatisticTableSortType.Alphabetical) { + return selectedSortOrder === MinecraftStatisticTableSortOrder.Ascending + ? a.category!.localeCompare(b.category!) + : b.category!.localeCompare(a.category!); + } else { + return selectedSortOrder === MinecraftStatisticTableSortOrder.Ascending + ? a.absoluteValue - b.absoluteValue + : b.absoluteValue - a.absoluteValue; + } + }); + + return newData; + }); + }; + + statisticDataProvider.registerWindowListener(window); + statisticDataProvider.addSubscriber(eventHandler); + + // Remove old listener + return () => { + statisticDataProvider.removeSubscriber(eventHandler); + statisticDataProvider.unregisterWindowListener(window); + }; + }, [statisticDataProvider, selectedSortOrder, selectedSortType]); + + return ( +
+

{title}

+
+
+ + elem.id === selectedSortOrder)} + > + {sortOrderOptions.map(sortOption => ( + {sortOption.label} + ))} + +
+
+
+ + elem.id === selectedSortType)} + > + {sortTypeOptions.map(sortOption => ( + {sortOption.label} + ))} + +
+
+ + + + {keyLabel} + + + {valueLabel} + + + {data.map(dataPoint => ( + + {dataPoint.category} + {dataPoint.absoluteValue.toFixed(1)} + + ))} + +
+ ); +} diff --git a/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefab.ts b/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefab.ts new file mode 100644 index 0000000..bfb7af3 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefab.ts @@ -0,0 +1,8 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +import { ReactNode } from 'react'; + +export interface StatisticPrefab { + name: string; + reactNode: ReactNode; +} diff --git a/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefabs.tsx b/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefabs.tsx new file mode 100644 index 0000000..570ee58 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefabs.tsx @@ -0,0 +1,25 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +import { ReactNode } from 'react'; +import { + NestedStatResolver, + ParentNameStatResolver, + StatisticType, + YAxisType, + createStatResolver, +} from '../StatisticResolver'; +import MinecraftStatisticLineChart from '../controls/MinecraftStatisticLineChart'; +import MinecraftStatisticStackedLineChart from '../controls/MinecraftStatisticStackedLineChart'; +import MinecraftStatisticStackedBarChart from '../controls/MinecraftStatisticStackedBarChart'; +import { + MultipleStatisticProvider, + NestedStatisticProvider, + RegexStatisticProvider, + SimpleStatisticProvider, +} from '../StatisticProvider'; +import { StatisticPrefab } from './StatisticPrefab'; + +// +// TODO: add prefabs for stats within sub groups. +// ex: entity counts are per plugin and client timings are grouped by player name. +// diff --git a/webview-ui/src/diagnostics_panel/prefabs/TabPrefab.ts b/webview-ui/src/diagnostics_panel/prefabs/TabPrefab.ts new file mode 100644 index 0000000..ca70a62 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/TabPrefab.ts @@ -0,0 +1,18 @@ +import { StatisticPrefab } from './StatisticPrefab'; + +export type TabPrefabParams = { + selectedClient: string; + selectedPlugin: string; +}; + +export enum TabPrefabDataSource { + Client = 'client', + Server = 'server', + ServerScript = 'server_script', +} + +export interface TabPrefab { + name: string; + dataSource: TabPrefabDataSource; + content: (params: TabPrefabParams) => JSX.Element; +} diff --git a/webview-ui/src/diagnostics_panel/prefabs/index.tsx b/webview-ui/src/diagnostics_panel/prefabs/index.tsx new file mode 100644 index 0000000..02929ea --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/index.tsx @@ -0,0 +1,24 @@ +import worldTab from './tabs/World'; + +import serverMemoryTab from './tabs/ServerMemory'; +import serverTimingTab from './tabs/ServerTiming'; +import serverPacketsTab from './tabs/ServerPackets'; +import serverBandwidthTab from './tabs/ServerBandwidth'; + +import serverScriptHandleCountsTab from './tabs/ServerScriptHandleCounts'; +import serverScriptSubscriberCountsTab from './tabs/ServerScriptSubscriberCounts'; + +import clientTimingTab from './tabs/ClientTiming'; +import clientMemoryTab from './tabs/ClientMemory'; + +export default [ + worldTab, + serverMemoryTab, + serverTimingTab, + serverPacketsTab, + serverBandwidthTab, + serverScriptHandleCountsTab, + serverScriptSubscriberCountsTab, + clientTimingTab, + clientMemoryTab, +]; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/ClientMemory.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/ClientMemory.tsx new file mode 100644 index 0000000..74e5992 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/ClientMemory.tsx @@ -0,0 +1,55 @@ +import MinecraftStatisticStackedLineChart from '../../controls/MinecraftStatisticStackedLineChart'; +import { MultipleStatisticProvider } from '../../StatisticProvider'; +import { StatisticType, YAxisType, createStatResolver } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource, TabPrefabParams } from '../TabPrefab'; +import MinecraftStatisticTable from '../../controls/MinecraftStatisticTable'; + +const statsTab: TabPrefab = { + name: 'Client - Memory', + dataSource: TabPrefabDataSource.Client, + content: ({ selectedClient }: TabPrefabParams) => { + return ( +
+
+ {/* Added wrapper div with flex: 1 */} + +
+
+ {/* Added wrapper div with flex: 1 */} + +
+
+ ); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/ClientTiming.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/ClientTiming.tsx new file mode 100644 index 0000000..f053897 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/ClientTiming.tsx @@ -0,0 +1,64 @@ +import MinecraftStatisticStackedLineChart from '../../controls/MinecraftStatisticStackedLineChart'; +import { MultipleStatisticProvider, SimpleStatisticProvider } from '../../StatisticProvider'; +import { StatisticType, YAxisType, createStatResolver } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource, TabPrefabParams } from '../TabPrefab'; +import MinecraftStatisticLineChart from '../../controls/MinecraftStatisticLineChart'; + +const statsTab: TabPrefab = { + name: 'Client - Timings', + dataSource: TabPrefabDataSource.Client, + content: ({ selectedClient }: TabPrefabParams) => { + return ( +
+ + +
+ ); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerBandwidth.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerBandwidth.tsx new file mode 100644 index 0000000..749087e --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerBandwidth.tsx @@ -0,0 +1,60 @@ +import MinecraftStatisticLineChart from '../../controls/MinecraftStatisticLineChart'; +import { StatisticPrefab } from '../StatisticPrefab'; +import { SimpleStatisticProvider } from '../../StatisticProvider'; +import { StatisticType, YAxisType } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource } from '../TabPrefab'; +import { generateRowsFromStatsPrefabs } from '../utilities'; + +const packetDataReceived: StatisticPrefab = { + name: 'Packet Data Received', + reactNode: ( + + ), +}; + +const packetDataSent: StatisticPrefab = { + name: 'Packet Data Sent', + reactNode: ( + + ), +}; + +const statsTab: TabPrefab = { + name: 'Server - Bandwidth', + dataSource: TabPrefabDataSource.Server, + content: () => { + return generateRowsFromStatsPrefabs([[packetDataReceived, packetDataSent]]); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerMemory.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerMemory.tsx new file mode 100644 index 0000000..29bca47 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerMemory.tsx @@ -0,0 +1,101 @@ +import MinecraftStatisticLineChart from '../../controls/MinecraftStatisticLineChart'; +import { StatisticPrefab } from '../StatisticPrefab'; +import { SimpleStatisticProvider } from '../../StatisticProvider'; +import { StatisticType, YAxisType } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource } from '../TabPrefab'; +import { generateRowsFromStatsPrefabs } from '../utilities'; + +const appMemoryUsage: StatisticPrefab = { + name: 'App Memory Usage', + reactNode: ( + + ), +}; + +const appMemoryFree: StatisticPrefab = { + name: 'App Memory Free', + reactNode: ( + + ), +}; + +const javaScriptMemoryFree: StatisticPrefab = { + name: 'JavaScript Memory Used', + reactNode: ( + + ), +}; + +const javaScriptMemoryAllocated: StatisticPrefab = { + name: 'JavaScript Memory Free', + reactNode: ( + + ), +}; + +const statsTab: TabPrefab = { + name: 'Server - Memory', + dataSource: TabPrefabDataSource.Server, + content: () => { + return generateRowsFromStatsPrefabs([ + [appMemoryUsage, appMemoryFree], + [javaScriptMemoryAllocated, javaScriptMemoryFree], + ]); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerPackets.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerPackets.tsx new file mode 100644 index 0000000..2ca7b54 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerPackets.tsx @@ -0,0 +1,110 @@ +import MinecraftStatisticLineChart from '../../controls/MinecraftStatisticLineChart'; +import { StatisticPrefab } from '../StatisticPrefab'; +import { SimpleStatisticProvider, RegexStatisticProvider } from '../../StatisticProvider'; +import { StatisticType, YAxisType, createStatResolver, ParentNameStatResolver } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource } from '../TabPrefab'; +import { generateRowsFromStatsPrefabs } from '../utilities'; +import MinecraftStatisticStackedBarChart from '../../controls/MinecraftStatisticStackedBarChart'; + +const packetsReceivedLineChart: StatisticPrefab = { + name: 'Packets Received (Line)', + reactNode: ( + + ), +}; + +const packetsReceivedStackedLineChart: StatisticPrefab = { + name: 'Packets Recieved (Stack)', + reactNode: ( + + ), +}; + +const packetsSentLineChart: StatisticPrefab = { + name: 'Packets Sent (Line)', + reactNode: ( + + ), +}; + +const packetsSentStackedLineChart: StatisticPrefab = { + name: 'Packets Sent (Stack)', + reactNode: ( + + ), +}; + +const statsTab: TabPrefab = { + name: 'Server - Packets', + dataSource: TabPrefabDataSource.Server, + content: () => { + return generateRowsFromStatsPrefabs([ + [packetsReceivedLineChart, packetsSentLineChart], + [packetsReceivedStackedLineChart, packetsSentStackedLineChart], + ]); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerScriptHandleCounts.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerScriptHandleCounts.tsx new file mode 100644 index 0000000..787f697 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerScriptHandleCounts.tsx @@ -0,0 +1,47 @@ +import { SimpleStatisticProvider } from '../../StatisticProvider'; +import { StatisticType, YAxisType } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource, TabPrefabParams } from '../TabPrefab'; +import MinecraftStatisticLineChart from '../../controls/MinecraftStatisticLineChart'; + +const statsTab: TabPrefab = { + name: 'Server - Scripting Handle Counts', + dataSource: TabPrefabDataSource.ServerScript, + content: ({ selectedPlugin }: TabPrefabParams) => { + return ( +
+ + +
+ ); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerScriptSubscriberCounts.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerScriptSubscriberCounts.tsx new file mode 100644 index 0000000..63bff90 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerScriptSubscriberCounts.tsx @@ -0,0 +1,45 @@ +import { MultipleStatisticProvider, StatisticUpdatedMessage } from '../../StatisticProvider'; +import { createStatResolver, StatisticType, YAxisType } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource, TabPrefabParams } from '../TabPrefab'; +import MinecraftStatisticStackedBarChart from '../../controls/MinecraftStatisticStackedBarChart'; + +// Filter out events with a value of zero that haven't been previously subscribed to +function constructSubscribedSignalFilter() { + const nonFilteredValues: string[] = []; + const func = (event: StatisticUpdatedMessage) => { + if (event.values.length === 1 && event.values[0] === 0 && !nonFilteredValues.includes(event.id)) { + return false; + } + nonFilteredValues.push(event.id); + return true; + }; + return func; +} + +const statsTab: TabPrefab = { + name: 'Server - Scripting Subscriber Counts', + dataSource: TabPrefabDataSource.ServerScript, + content: ({ selectedPlugin }: TabPrefabParams) => { + return ( +
+ +
+ ); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerTiming.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerTiming.tsx new file mode 100644 index 0000000..42aa416 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/ServerTiming.tsx @@ -0,0 +1,64 @@ +import MinecraftStatisticStackedLineChart from '../../controls/MinecraftStatisticStackedLineChart'; +import { StatisticPrefab } from '../StatisticPrefab'; +import { MultipleStatisticProvider } from '../../StatisticProvider'; +import { StatisticType, YAxisType, createStatResolver } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource } from '../TabPrefab'; +import { generateRowsFromStatsPrefabs } from '../utilities'; + +const serverTickTimings: StatisticPrefab = { + name: 'Server Tick Timings', + reactNode: ( + + ), +}; + +const commandsRan: StatisticPrefab = { + name: 'Commands Ran', + reactNode: ( + + ), +}; + +const statsTab: TabPrefab = { + name: 'Server - Timings', + dataSource: TabPrefabDataSource.Server, + content: () => { + return generateRowsFromStatsPrefabs([[serverTickTimings], [commandsRan]]); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/tabs/World.tsx b/webview-ui/src/diagnostics_panel/prefabs/tabs/World.tsx new file mode 100644 index 0000000..f1ba78c --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/tabs/World.tsx @@ -0,0 +1,51 @@ +import MinecraftStatisticLineChart from '../../controls/MinecraftStatisticLineChart'; +import MinecraftStatisticStackedLineChart from '../../controls/MinecraftStatisticStackedLineChart'; +import { StatisticPrefab } from '../StatisticPrefab'; +import { SimpleStatisticProvider, NestedStatisticProvider } from '../../StatisticProvider'; +import { StatisticType, YAxisType, NestedStatResolver, createStatResolver } from '../../StatisticResolver'; +import { TabPrefab, TabPrefabDataSource } from '../TabPrefab'; +import { generateRowsFromStatsPrefabs } from '../utilities'; + +const entityCount: StatisticPrefab = { + name: 'Entity Count', + reactNode: ( + + ), +}; + +const loadedChunks: StatisticPrefab = { + name: 'Loaded Chunks', + reactNode: ( + + ), +}; + +const statsTab: TabPrefab = { + name: 'World', + dataSource: TabPrefabDataSource.Server, + content: () => { + return generateRowsFromStatsPrefabs([[entityCount], [loadedChunks]]); + }, +}; + +export default statsTab; diff --git a/webview-ui/src/diagnostics_panel/prefabs/utilities.tsx b/webview-ui/src/diagnostics_panel/prefabs/utilities.tsx new file mode 100644 index 0000000..f03ad49 --- /dev/null +++ b/webview-ui/src/diagnostics_panel/prefabs/utilities.tsx @@ -0,0 +1,13 @@ +import { StatisticPrefab } from './StatisticPrefab'; + +export function generateRowsFromStatsPrefabs(statsPrefabs: StatisticPrefab[][]): JSX.Element { + return ( +
+ {statsPrefabs.map((statPrefabRow: StatisticPrefab[]) => ( +
+ {statPrefabRow.map(statPrefab => statPrefab.reactNode)} +
+ ))} +
+ ); +} From 880af3e1726938b18cf1bf527fde80e9fd3e9d0f Mon Sep 17 00:00:00 2001 From: Jake Shirley Date: Fri, 2 May 2025 14:28:22 -0700 Subject: [PATCH 2/2] removed unused file --- .../prefabs/StatisticPrefabs.tsx | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 webview-ui/src/diagnostics_panel/prefabs/StatisticPrefabs.tsx diff --git a/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefabs.tsx b/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefabs.tsx deleted file mode 100644 index 570ee58..0000000 --- a/webview-ui/src/diagnostics_panel/prefabs/StatisticPrefabs.tsx +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) Microsoft Corporation. All rights reserved. - -import { ReactNode } from 'react'; -import { - NestedStatResolver, - ParentNameStatResolver, - StatisticType, - YAxisType, - createStatResolver, -} from '../StatisticResolver'; -import MinecraftStatisticLineChart from '../controls/MinecraftStatisticLineChart'; -import MinecraftStatisticStackedLineChart from '../controls/MinecraftStatisticStackedLineChart'; -import MinecraftStatisticStackedBarChart from '../controls/MinecraftStatisticStackedBarChart'; -import { - MultipleStatisticProvider, - NestedStatisticProvider, - RegexStatisticProvider, - SimpleStatisticProvider, -} from '../StatisticProvider'; -import { StatisticPrefab } from './StatisticPrefab'; - -// -// TODO: add prefabs for stats within sub groups. -// ex: entity counts are per plugin and client timings are grouped by player name. -//