|  | 
| 1 | 1 | import { IRacingSDK } from 'irsdk-node'; | 
| 2 | 2 | import { TelemetrySink } from './telemetrySink'; | 
| 3 | 3 | import { OverlayManager } from 'src/app/overlayManager'; | 
|  | 4 | +import type { IrSdkBridge, Session, Telemetry } from '@irdashies/types'; | 
| 4 | 5 | 
 | 
| 5 | 6 | const TIMEOUT = 1000; | 
| 6 | 7 | 
 | 
| 7 | 8 | export async function publishIRacingSDKEvents( | 
| 8 | 9 |   telemetrySink: TelemetrySink, | 
| 9 | 10 |   overlayManager: OverlayManager | 
| 10 |  | -) { | 
|  | 11 | +): Promise<IrSdkBridge> { | 
| 11 | 12 |   console.log('Loading iRacing SDK bridge...'); | 
| 12 | 13 | 
 | 
| 13 |  | -  setInterval(async () => { | 
|  | 14 | +  let shouldStop = false; | 
|  | 15 | +  const runningStateInterval = setInterval(async () => { | 
| 14 | 16 |     const isSimRunning = await IRacingSDK.IsSimRunning(); | 
| 15 | 17 |     console.log('Sending running state to window', isSimRunning); | 
| 16 | 18 |     overlayManager.publishMessage('runningState', isSimRunning); | 
| 17 | 19 |   }, 2000); | 
| 18 | 20 | 
 | 
| 19 |  | -  while (true) { | 
| 20 |  | -    if (await IRacingSDK.IsSimRunning()) { | 
| 21 |  | -      console.log('iRacing is running'); | 
| 22 |  | -      const sdk = new IRacingSDK(); | 
| 23 |  | -      sdk.autoEnableTelemetry = true; | 
|  | 21 | +  // Start the telemetry loop in the background | 
|  | 22 | +  (async () => { | 
|  | 23 | +    while (!shouldStop) { | 
|  | 24 | +      if (await IRacingSDK.IsSimRunning()) { | 
|  | 25 | +        console.log('iRacing is running'); | 
|  | 26 | +        const sdk = new IRacingSDK(); | 
|  | 27 | +        sdk.autoEnableTelemetry = true; | 
| 24 | 28 | 
 | 
| 25 |  | -      await sdk.ready(); | 
|  | 29 | +        await sdk.ready(); | 
| 26 | 30 | 
 | 
| 27 |  | -      while (sdk.waitForData(TIMEOUT)) { | 
| 28 |  | -        const telemetry = sdk.getTelemetry(); | 
| 29 |  | -        const session = sdk.getSessionData(); | 
| 30 |  | -        await new Promise((resolve) => setTimeout(resolve, 1000 / 60)); | 
|  | 31 | +        while (!shouldStop && sdk.waitForData(TIMEOUT)) { | 
|  | 32 | +          const telemetry = sdk.getTelemetry(); | 
|  | 33 | +          const session = sdk.getSessionData(); | 
|  | 34 | +          await new Promise((resolve) => setTimeout(resolve, 1000 / 60)); | 
| 31 | 35 | 
 | 
| 32 |  | -        if (telemetry) { | 
| 33 |  | -          overlayManager.publishMessage('telemetry', telemetry); | 
| 34 |  | -          telemetrySink.addTelemetry(telemetry); | 
| 35 |  | -        } | 
|  | 36 | +          if (telemetry) { | 
|  | 37 | +            overlayManager.publishMessage('telemetry', telemetry); | 
|  | 38 | +            telemetrySink.addTelemetry(telemetry); | 
|  | 39 | +          } | 
| 36 | 40 | 
 | 
| 37 |  | -        if (session) { | 
| 38 |  | -          overlayManager.publishMessage('sessionData', session); | 
| 39 |  | -          telemetrySink.addSession(session); | 
|  | 41 | +          if (session) { | 
|  | 42 | +            overlayManager.publishMessage('sessionData', session); | 
|  | 43 | +            telemetrySink.addSession(session); | 
|  | 44 | +          } | 
| 40 | 45 |         } | 
|  | 46 | + | 
|  | 47 | +        console.log('iRacing is no longer publishing telemetry'); | 
|  | 48 | +      } else { | 
|  | 49 | +        console.log('iRacing is not running'); | 
| 41 | 50 |       } | 
| 42 | 51 | 
 | 
| 43 |  | -      console.log('iRacing is no longer publishing telemetry'); | 
| 44 |  | -    } else { | 
| 45 |  | -      console.log('iRacing is not running'); | 
|  | 52 | +      await new Promise((resolve) => setTimeout(resolve, TIMEOUT)); | 
| 46 | 53 |     } | 
|  | 54 | +  })(); | 
| 47 | 55 | 
 | 
| 48 |  | -    await new Promise((resolve) => setTimeout(resolve, TIMEOUT)); | 
| 49 |  | -  } | 
|  | 56 | +  return { | 
|  | 57 | +    onTelemetry: (callback: (value: Telemetry) => void) => callback({} as Telemetry), | 
|  | 58 | +    onSessionData: (callback: (value: Session) => void) => callback({} as Session), | 
|  | 59 | +    onRunningState: (callback: (value: boolean) => void) => callback(false), | 
|  | 60 | +    stop: () => { | 
|  | 61 | +      shouldStop = true; | 
|  | 62 | +      clearInterval(runningStateInterval); | 
|  | 63 | +    } | 
|  | 64 | +  }; | 
| 50 | 65 | } | 
0 commit comments