({ updateState, updatePosition, updateCarData }: Props)
| 22 | }; |
| 23 | |
| 24 | export const useDataEngine = ({ updateState, updatePosition, updateCarData }: Props) => { |
| 25 | const buffers = { |
| 26 | ExtrapolatedClock: useStatefulBuffer(), |
| 27 | TopThree: useStatefulBuffer(), |
| 28 | TimingStats: useStatefulBuffer(), |
| 29 | TimingAppData: useStatefulBuffer(), |
| 30 | WeatherData: useStatefulBuffer(), |
| 31 | TrackStatus: useStatefulBuffer(), |
| 32 | SessionStatus: useStatefulBuffer(), |
| 33 | DriverList: useStatefulBuffer(), |
| 34 | RaceControlMessages: useStatefulBuffer(), |
| 35 | SessionInfo: useStatefulBuffer(), |
| 36 | SessionData: useStatefulBuffer(), |
| 37 | LapCount: useStatefulBuffer(), |
| 38 | TimingData: useStatefulBuffer(), |
| 39 | TeamRadio: useStatefulBuffer(), |
| 40 | ChampionshipPrediction: useStatefulBuffer(), |
| 41 | }; |
| 42 | |
| 43 | const carBuffer = useBuffer<CarsData>(); |
| 44 | const posBuffer = useBuffer<Positions>(); |
| 45 | |
| 46 | const [maxDelay, setMaxDelay] = useState<number>(0); |
| 47 | |
| 48 | const delayRef = useRef<number>(0); |
| 49 | |
| 50 | useSettingsStore.subscribe( |
| 51 | (state) => state.delay, |
| 52 | (delay) => (delayRef.current = delay), |
| 53 | { fireImmediately: true }, |
| 54 | ); |
| 55 | |
| 56 | const intervalRef = useRef<NodeJS.Timeout | null>(null); |
| 57 | |
| 58 | const handleInitial = ({ CarDataZ: carZ, PositionZ: posZ, ...initial }: MessageInitial) => { |
| 59 | updateState(initial); |
| 60 | |
| 61 | Object.keys(buffers).forEach((key) => { |
| 62 | const data = initial[key as keyof typeof initial]; |
| 63 | const buffer = buffers[key as keyof typeof buffers]; |
| 64 | if (data) buffer.push(data); |
| 65 | }); |
| 66 | |
| 67 | if (carZ) { |
| 68 | const carData = inflate<CarData>(carZ); |
| 69 | updateCarData(carData.Entries[0].Cars); |
| 70 | |
| 71 | for (const entry of carData.Entries) { |
| 72 | carBuffer.pushTimed(entry.Cars, utcToLocalMs(entry.Utc)); |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | if (posZ) { |
| 77 | const position = inflate<Position>(posZ); |
| 78 | updatePosition(position.Position[0].Entries); |
| 79 | |
| 80 | for (const entry of position.Position) { |
| 81 | posBuffer.pushTimed(entry.Entries, utcToLocalMs(entry.Timestamp)); |
no test coverage detected