@@ -5,9 +5,18 @@ import {
55 type ShredEventTsDeltas ,
66 type SlotsShreds ,
77} from "./atoms" ;
8- import { delayMs , shredColors , shredEventDescPriorities } from "./const" ;
8+ import { delayMs , shredEventDescPriorities } from "./const" ;
99import { showStartupProgressAtom } from "../../StartupProgress/atoms" ;
10- import { shredSkippedColor } from "../../../colors" ;
10+ import {
11+ shredReceivedRepairColor ,
12+ shredReceivedTurbineColor ,
13+ shredRepairRequestedColor ,
14+ shredReplayedNothingColor ,
15+ shredReplayedRepairColor ,
16+ shredReplayedTurbineColor ,
17+ shredReplayStartedColor ,
18+ shredSkippedColor ,
19+ } from "../../../colors" ;
1120import { skippedClusterSlotsAtom } from "../../../atoms" ;
1221import { clamp } from "lodash" ;
1322import { ShredEvent } from "../../../api/entities" ;
@@ -94,6 +103,13 @@ export function shredsProgressionPlugin(
94103
95104 for ( const slotNumber of orderedSlotNumbers ) {
96105 const eventsByFillStyle : EventsByFillStyle = { } ;
106+ const addEventPosition = (
107+ fillStyle : string ,
108+ position : [ x : number , y : number , width : number ] ,
109+ ) => {
110+ eventsByFillStyle [ fillStyle ] ??= [ ] ;
111+ eventsByFillStyle [ fillStyle ] . push ( position ) ;
112+ } ;
97113
98114 const slot = liveShreds . slots . get ( slotNumber ) ;
99115 if ( ! slot ) continue ;
@@ -111,7 +127,7 @@ export function shredsProgressionPlugin(
111127 ) ;
112128
113129 addEventsForRow ( {
114- eventsByFillStyle ,
130+ addEventPosition ,
115131 u,
116132 firstShredIdx,
117133 lastShredIdx,
@@ -199,7 +215,10 @@ const getDrawInfo = (
199215} ;
200216
201217interface AddEventsForRowArgs {
202- eventsByFillStyle : EventsByFillStyle ;
218+ addEventPosition : (
219+ fillStyle : string ,
220+ position : [ x : number , y : number , width : number ] ,
221+ ) => void ;
203222 u : uPlot ;
204223 firstShredIdx : number ;
205224 lastShredIdx : number ;
@@ -217,12 +236,11 @@ interface AddEventsForRowArgs {
217236 getXPos : ( xVal : number ) => number ;
218237}
219238/**
220- * Mutate eventsByFillStyle
221239 * Draw rows for shreds, with rectangles or dots for events.
222240 * Each row may represent partial or multiple shreds. Use the most completed shred.
223241 */
224242function addEventsForRow ( {
225- eventsByFillStyle ,
243+ addEventPosition ,
226244 u,
227245 firstShredIdx,
228246 lastShredIdx,
@@ -256,6 +274,11 @@ function addEventsForRow({
256274 : // event goes to slot completion or max x
257275 Math . min ( getXPos ( slotCompletionTsDelta - tsXValueOffset ) , maxXPos ) ;
258276
277+ const eventPositions = new Map <
278+ Exclude < ShredEvent , ShredEvent . slot_complete > ,
279+ [ x : number , y : number , width : number ]
280+ > ( ) ;
281+
259282 // draw events from highest to lowest priority
260283 for ( const eventType of shredEventDescPriorities ) {
261284 const tsDelta = eventTsDeltas [ eventType ] ;
@@ -269,19 +292,49 @@ function addEventsForRow({
269292
270293 const yOffset = getYOffset ?.( eventType ) ?? 0 ;
271294
272- const fillStyle = isSlotSkipped
273- ? shredSkippedColor
274- : ( shredColors [ eventType ] ?? "transparent" ) ;
275-
276- eventsByFillStyle [ fillStyle ] ??= [ ] ;
277- eventsByFillStyle [ fillStyle ] . push (
295+ eventPositions . set (
296+ eventType ,
278297 drawOnlyDots || isSlotSkipped
279298 ? [ startXPos , y + yOffset , dotWidth ]
280299 : [ startXPos , y + yOffset , endXPos - startXPos ] ,
281300 ) ;
282-
283301 endXPos = startXPos ;
284302 }
303+
304+ for ( const [ eventType , position ] of eventPositions . entries ( ) ) {
305+ if ( isSlotSkipped ) {
306+ addEventPosition ( shredSkippedColor , position ) ;
307+ continue ;
308+ }
309+ switch ( eventType ) {
310+ case ShredEvent . shred_repair_request : {
311+ addEventPosition ( shredRepairRequestedColor , position ) ;
312+ break ;
313+ }
314+ case ShredEvent . shred_received_turbine : {
315+ addEventPosition ( shredReceivedTurbineColor , position ) ;
316+ break ;
317+ }
318+ case ShredEvent . shred_received_repair : {
319+ addEventPosition ( shredReceivedRepairColor , position ) ;
320+ break ;
321+ }
322+ case ShredEvent . shred_replay_start : {
323+ addEventPosition ( shredReplayStartedColor , position ) ;
324+ break ;
325+ }
326+ case ShredEvent . shred_replayed : {
327+ if ( eventPositions . has ( ShredEvent . shred_received_repair ) ) {
328+ addEventPosition ( shredReplayedRepairColor , position ) ;
329+ } else if ( eventPositions . has ( ShredEvent . shred_received_turbine ) ) {
330+ addEventPosition ( shredReplayedTurbineColor , position ) ;
331+ } else {
332+ addEventPosition ( shredReplayedNothingColor , position ) ;
333+ }
334+ break ;
335+ }
336+ }
337+ }
285338}
286339
287340function getMostCompletedShredIdx (
0 commit comments