@@ -12,37 +12,32 @@ const useProcessedData = () => {
12
12
}
13
13
14
14
const perRegionStats = { } ;
15
-
16
15
const orchestrators = Object . entries ( apiData ) . map ( ( [ orchestratorId , orchestratorData ] ) => {
16
+ const leaderboardResults = orchestratorData . leaderboardResults || { } ;
17
17
const instances = Object . entries ( orchestratorData . instances || { } ) . map (
18
18
( [ instanceId , instanceData ] ) => {
19
- // Extract probedFrom, regions, and livepeer_regions
20
19
const probedFrom = Object . keys ( instanceData . probedFrom || { } ) ;
21
20
const regions = Object . keys ( instanceData . regions || { } ) ;
22
21
const livepeerRegions = Object . keys ( instanceData . livepeer_regions || { } ) ;
23
22
24
- // Calculate lastPing as the maximum lastTime in probedFrom
25
23
const lastPing = Object . values ( instanceData . probedFrom || { } ) . reduce (
26
24
( max , regionData ) => Math . max ( max , regionData . lastTime || 0 ) ,
27
25
0
28
26
) ;
29
27
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 ) ;
34
32
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 ) ;
43
37
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 ) ;
46
41
47
42
return {
48
43
id : instanceId ,
@@ -53,52 +48,68 @@ const useProcessedData = () => {
53
48
regions,
54
49
livepeer_regions : livepeerRegions ,
55
50
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 ,
61
54
} ;
62
55
}
63
56
) ;
64
57
65
- // Calculate orchestrator-level aggregates
66
58
const avgPrice =
67
59
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 ) ;
74
60
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 ) ;
79
64
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 ) ;
82
72
83
73
return {
84
74
id : orchestratorId ,
85
75
name : orchestratorData . name ,
86
76
avgPrice : avgPrice || null ,
77
+ avgDiscoveryTime : avgDiscoveryTime === Infinity ? null : avgDiscoveryTime ,
87
78
avgRTR : avgRTR || null ,
88
79
avgSR : avgSR || null ,
89
- bestDiscoveryTime : validBestDiscoveryTime ,
90
80
instances,
91
81
} ;
92
82
} ) ;
93
83
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
+
94
106
// Process per-region stats
95
107
Object . entries ( apiData ) . forEach ( ( [ orchestratorId , orchestratorData ] ) => {
96
108
Object . entries ( orchestratorData . regionalStats || { } ) . forEach ( ( [ region , stats ] ) => {
97
109
if ( ! perRegionStats [ region ] ) {
98
110
perRegionStats [ region ] = { totalAvgTime : 0 , totalPrice : 0 , count : 0 } ;
99
111
}
100
112
101
- // Aggregate per-region stats
102
113
perRegionStats [ region ] . totalAvgTime += stats . avgDiscoveryTime || 0 ;
103
114
104
115
const instancePrices = Object . values ( orchestratorData . instances || { } ) . map (
@@ -115,14 +126,12 @@ const useProcessedData = () => {
115
126
. flatMap ( ( orchestrator ) => orchestrator . instances . map ( ( inst ) => inst . price ) )
116
127
. filter ( ( price ) => price !== null ) ;
117
128
const allDiscoveryTimes = orchestrators
118
- . map ( ( orchestrator ) => orchestrator . bestDiscoveryTime )
129
+ . map ( ( orchestrator ) => orchestrator . avgDiscoveryTime )
119
130
. filter ( ( time ) => time !== null ) ;
120
131
const allRTR = orchestrators
121
- . flatMap ( ( orchestrator ) => orchestrator . instances . map ( ( inst ) => inst . avgRTR ) )
132
+ . map ( ( orchestrator ) => orchestrator . avgRTR )
122
133
. 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 ) ;
126
135
127
136
const priceBuckets = createBuckets ( allPrices , 10 ) ;
128
137
const discoveryTimeBuckets = createBuckets ( allDiscoveryTimes , 10 ) ;
0 commit comments