@@ -12,37 +12,32 @@ const useProcessedData = () => {
1212 }
1313
1414 const perRegionStats = { } ;
15-
1615 const orchestrators = Object . entries ( apiData ) . map ( ( [ orchestratorId , orchestratorData ] ) => {
16+ const leaderboardResults = orchestratorData . leaderboardResults || { } ;
1717 const instances = Object . entries ( orchestratorData . instances || { } ) . map (
1818 ( [ instanceId , instanceData ] ) => {
19- // Extract probedFrom, regions, and livepeer_regions
2019 const probedFrom = Object . keys ( instanceData . probedFrom || { } ) ;
2120 const regions = Object . keys ( instanceData . regions || { } ) ;
2221 const livepeerRegions = Object . keys ( instanceData . livepeer_regions || { } ) ;
2322
24- // Calculate lastPing as the maximum lastTime in probedFrom
2523 const lastPing = Object . values ( instanceData . probedFrom || { } ) . reduce (
2624 ( max , regionData ) => Math . max ( max , regionData . lastTime || 0 ) ,
2725 0
2826 ) ;
2927
30- // Calculate avgPerformance metrics (latestRTR, latestSR) by mapping livepeer_regions to leaderboardResults
31- let totalRTR = 0 ;
32- let totalSR = 0 ;
33- let performanceCount = 0 ;
28+ const avgRTR = livepeerRegions . reduce ( ( sum , region ) => {
29+ const leaderboard = leaderboardResults [ region ] ;
30+ return leaderboard ? sum + ( leaderboard . latestRTR || 0 ) : sum ;
31+ } , 0 ) / ( livepeerRegions . length || 1 ) ;
3432
35- livepeerRegions . forEach ( ( region ) => {
36- const leaderboard = orchestratorData . leaderboardResults ?. [ region ] ;
37- if ( leaderboard ) {
38- totalRTR += leaderboard . latestRTR || 0 ;
39- totalSR += leaderboard . latestSR || 0 ;
40- performanceCount ++ ;
41- }
42- } ) ;
33+ const avgSR = livepeerRegions . reduce ( ( sum , region ) => {
34+ const leaderboard = leaderboardResults [ region ] ;
35+ return leaderboard ? sum + ( leaderboard . latestSR || 0 ) : sum ;
36+ } , 0 ) / ( livepeerRegions . length || 1 ) ;
4337
44- const avgRTR = performanceCount > 0 ? totalRTR / performanceCount : null ;
45- const avgSR = performanceCount > 0 ? totalSR / performanceCount : null ;
38+ const bestDiscoveryTime = Object . values ( orchestratorData . regionalStats || { } )
39+ . map ( ( stats ) => stats . avgDiscoveryTime || Infinity )
40+ . reduce ( ( best , current ) => Math . min ( best , current ) , Infinity ) ;
4641
4742 return {
4843 id : instanceId ,
@@ -53,52 +48,68 @@ const useProcessedData = () => {
5348 regions,
5449 livepeer_regions : livepeerRegions ,
5550 lastPing : lastPing || null ,
56- bestDiscoveryTime : Object . values ( orchestratorData . regionalStats || { } )
57- . map ( ( stats ) => stats . avgDiscoveryTime || Infinity )
58- . reduce ( ( best , current ) => Math . min ( best , current ) , Infinity ) || null ,
59- avgRTR,
60- avgSR,
51+ bestDiscoveryTime : bestDiscoveryTime === Infinity ? null : bestDiscoveryTime ,
52+ avgRTR : avgRTR || null ,
53+ avgSR : avgSR || null ,
6154 } ;
6255 }
6356 ) ;
6457
65- // Calculate orchestrator-level aggregates
6658 const avgPrice =
6759 instances . reduce ( ( sum , inst ) => sum + inst . price , 0 ) / ( instances . length || 1 ) ;
68- const avgRTR =
69- instances . reduce ( ( sum , inst ) => sum + ( inst . avgRTR || 0 ) , 0 ) /
70- ( instances . filter ( ( inst ) => inst . avgRTR !== null ) . length || 1 ) ;
71- const avgSR =
72- instances . reduce ( ( sum , inst ) => sum + ( inst . avgSR || 0 ) , 0 ) /
73- ( instances . filter ( ( inst ) => inst . avgSR !== null ) . length || 1 ) ;
7460
75- const bestDiscoveryTime = instances . reduce (
76- ( best , inst ) => Math . min ( best , inst . bestDiscoveryTime || Infinity ) ,
77- Infinity
78- ) ;
61+ const avgDiscoveryTime = Object . values ( orchestratorData . regionalStats || { } )
62+ . map ( ( stats ) => stats . avgDiscoveryTime || Infinity )
63+ . reduce ( ( best , current ) => Math . min ( best , current ) , Infinity ) ;
7964
80- const validBestDiscoveryTime =
81- bestDiscoveryTime === Infinity ? null : bestDiscoveryTime ;
65+ const avgRTR =
66+ Object . values ( leaderboardResults ) . reduce ( ( sum , metrics ) => sum + ( metrics . latestRTR || 0 ) , 0 ) /
67+ ( Object . keys ( leaderboardResults ) . length || 1 ) ;
68+
69+ const avgSR =
70+ Object . values ( leaderboardResults ) . reduce ( ( sum , metrics ) => sum + ( metrics . latestSR || 0 ) , 0 ) /
71+ ( Object . keys ( leaderboardResults ) . length || 1 ) ;
8272
8373 return {
8474 id : orchestratorId ,
8575 name : orchestratorData . name ,
8676 avgPrice : avgPrice || null ,
77+ avgDiscoveryTime : avgDiscoveryTime === Infinity ? null : avgDiscoveryTime ,
8778 avgRTR : avgRTR || null ,
8879 avgSR : avgSR || null ,
89- bestDiscoveryTime : validBestDiscoveryTime ,
9080 instances,
9181 } ;
9282 } ) ;
9383
84+ // Calculate average values for normalization
85+ const avgDiscoveryTime =
86+ orchestrators . reduce ( ( sum , orchestrator ) => sum + ( orchestrator . avgDiscoveryTime || 0 ) , 0 ) /
87+ orchestrators . length ;
88+
89+ const avgPrice =
90+ orchestrators . reduce ( ( sum , orchestrator ) => sum + ( orchestrator . avgPrice || 0 ) , 0 ) /
91+ orchestrators . length ;
92+
93+ // Normalize discovery time and pricing
94+ orchestrators . forEach ( ( orchestrator ) => {
95+ orchestrator . normalizedDiscoveryTime =
96+ orchestrator . avgDiscoveryTime !== null
97+ ? ( avgDiscoveryTime - orchestrator . avgDiscoveryTime ) / avgDiscoveryTime
98+ : null ;
99+
100+ orchestrator . normalizedPrice =
101+ orchestrator . avgPrice !== null
102+ ? ( avgPrice - orchestrator . avgPrice ) / avgPrice
103+ : null ;
104+ } ) ;
105+
94106 // Process per-region stats
95107 Object . entries ( apiData ) . forEach ( ( [ orchestratorId , orchestratorData ] ) => {
96108 Object . entries ( orchestratorData . regionalStats || { } ) . forEach ( ( [ region , stats ] ) => {
97109 if ( ! perRegionStats [ region ] ) {
98110 perRegionStats [ region ] = { totalAvgTime : 0 , totalPrice : 0 , count : 0 } ;
99111 }
100112
101- // Aggregate per-region stats
102113 perRegionStats [ region ] . totalAvgTime += stats . avgDiscoveryTime || 0 ;
103114
104115 const instancePrices = Object . values ( orchestratorData . instances || { } ) . map (
@@ -115,14 +126,12 @@ const useProcessedData = () => {
115126 . flatMap ( ( orchestrator ) => orchestrator . instances . map ( ( inst ) => inst . price ) )
116127 . filter ( ( price ) => price !== null ) ;
117128 const allDiscoveryTimes = orchestrators
118- . map ( ( orchestrator ) => orchestrator . bestDiscoveryTime )
129+ . map ( ( orchestrator ) => orchestrator . avgDiscoveryTime )
119130 . filter ( ( time ) => time !== null ) ;
120131 const allRTR = orchestrators
121- . flatMap ( ( orchestrator ) => orchestrator . instances . map ( ( inst ) => inst . avgRTR ) )
132+ . map ( ( orchestrator ) => orchestrator . avgRTR )
122133 . filter ( ( rtr ) => rtr !== null ) ;
123- const allSR = orchestrators
124- . flatMap ( ( orchestrator ) => orchestrator . instances . map ( ( inst ) => inst . avgSR ) )
125- . filter ( ( sr ) => sr !== null ) ;
134+ const allSR = orchestrators . map ( ( orchestrator ) => orchestrator . avgSR ) . filter ( ( sr ) => sr !== null ) ;
126135
127136 const priceBuckets = createBuckets ( allPrices , 10 ) ;
128137 const discoveryTimeBuckets = createBuckets ( allDiscoveryTimes , 10 ) ;
0 commit comments