@hotlap.ai/telemetry 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-server.d.ts","sourceRoot":"","sources":["../src/telemetry-server.ts"],"names":[],"mappings":";AASA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,gBAAgB,EAAE,MAAM,CAAA;QACxB,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,MAAM,CAAA;QACnB,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,cAAc,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,cAAc,EAAE,OAAO,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE;QACJ,SAAS,EAAE,OAAO,CAAA;QAClB,WAAW,EAAE,OAAO,CAAA;QACpB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,aAAa,CAAA"}
@@ -0,0 +1,234 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ import {
4
+ createIRSDK
5
+ } from "./live.js";
6
+ import"./index-k5bgtn4c.js";
7
+ import"./binary-reader.js";
8
+ import"./constants.js";
9
+
10
+ // src/telemetry-server.ts
11
+ var TELEMETRY_PORT = 32100;
12
+ var TELEMETRY_RATE_HZ = 60;
13
+ var SESSION_INFO_RATE_HZ = 1;
14
+ var ir = createIRSDK();
15
+ var tickCount = 0;
16
+ var lastLap = -1;
17
+ var lastSessionNum = -1;
18
+ var sessionInfoSent = false;
19
+ async function connectToIRacing() {
20
+ console.log("Connecting to iRacing...");
21
+ const connected = await ir.startup();
22
+ if (!connected) {
23
+ console.error("Failed to connect to iRacing. Make sure iRacing is running.");
24
+ return false;
25
+ }
26
+ console.log("Connected to iRacing!");
27
+ return true;
28
+ }
29
+ function getSessionInfo() {
30
+ const weekendInfo = ir.getSessionInfo("WeekendInfo");
31
+ const driverInfo = ir.getSessionInfo("DriverInfo");
32
+ if (!weekendInfo || !driverInfo)
33
+ return null;
34
+ const playerDriver = driverInfo.Drivers?.[driverInfo.DriverCarIdx ?? 0];
35
+ const sessionNum = ir.get("SessionNum") ?? 0;
36
+ return {
37
+ trackId: weekendInfo.TrackID,
38
+ trackName: weekendInfo.TrackName,
39
+ trackDisplayName: weekendInfo.TrackDisplayName,
40
+ trackLength: weekendInfo.TrackLength,
41
+ trackConfig: weekendInfo.TrackConfigName,
42
+ carId: playerDriver?.CarID ?? 0,
43
+ carName: playerDriver?.CarScreenName ?? "Unknown Car",
44
+ carNumber: playerDriver?.CarNumber ?? "0",
45
+ driverName: playerDriver?.UserName ?? "Unknown Driver",
46
+ driverId: playerDriver?.UserID ?? 0,
47
+ sessionType: weekendInfo.EventType ?? "Unknown",
48
+ sessionNum,
49
+ tickRate: 60
50
+ };
51
+ }
52
+ function getTelemetryFrame() {
53
+ ir.freezeVarBufferLatest();
54
+ const frame = {
55
+ tick: tickCount++,
56
+ sessionTime: ir.get("SessionTime") ?? 0,
57
+ lap: ir.get("Lap") ?? 0,
58
+ lapDistPct: ir.get("LapDistPct") ?? 0,
59
+ speed: ir.get("Speed") ?? 0,
60
+ rpm: ir.get("RPM") ?? 0,
61
+ gear: ir.get("Gear") ?? 0,
62
+ throttle: ir.get("Throttle") ?? 0,
63
+ brake: ir.get("Brake") ?? 0,
64
+ clutch: ir.get("Clutch") ?? 0,
65
+ steer: ir.get("SteeringWheelAngle") ?? 0,
66
+ lat: ir.get("Lat") ?? 0,
67
+ lon: ir.get("Lon") ?? 0,
68
+ alt: ir.get("Alt") ?? 0,
69
+ yaw: ir.get("Yaw") ?? 0,
70
+ pitch: ir.get("Pitch") ?? 0,
71
+ roll: ir.get("Roll") ?? 0,
72
+ lapCurrentLapTime: ir.get("LapCurrentLapTime") ?? 0,
73
+ lapLastLapTime: ir.get("LapLastLapTime") ?? 0,
74
+ lapBestLapTime: ir.get("LapBestLapTime") ?? 0,
75
+ lapDeltaToBestLap: ir.get("LapDeltaToBestLap") ?? 0,
76
+ fuelLevel: ir.get("FuelLevel") ?? 0,
77
+ fuelLevelPct: ir.get("FuelLevelPct") ?? 0,
78
+ oilTemp: ir.get("OilTemp") ?? 0,
79
+ waterTemp: ir.get("WaterTemp") ?? 0,
80
+ isOnTrack: ir.get("IsOnTrack") ?? false,
81
+ playerPosition: ir.get("PlayerCarPosition") ?? 0,
82
+ playerClassPosition: ir.get("PlayerCarClassPosition") ?? 0,
83
+ brakeABSactive: ir.get("BrakeABSactive") ?? false,
84
+ dcBrakeBias: ir.get("dcBrakeBias") ?? 0,
85
+ dcTractionControl: ir.get("dcTractionControl") ?? 0,
86
+ dcABS: ir.get("dcABS") ?? 0,
87
+ tireTempLF: ir.get("LFtempCL") ?? 0,
88
+ tireTempRF: ir.get("RFtempCL") ?? 0,
89
+ tireTempLR: ir.get("LRtempCL") ?? 0,
90
+ tireTempRR: ir.get("RRtempCL") ?? 0
91
+ };
92
+ ir.unfreezeVarBufferLatest();
93
+ return frame;
94
+ }
95
+ function checkLapChange(frame, server) {
96
+ const currentLap = frame.lap;
97
+ const currentSessionNum = ir.get("SessionNum") ?? 0;
98
+ if (currentSessionNum !== lastSessionNum) {
99
+ lastSessionNum = currentSessionNum;
100
+ lastLap = currentLap;
101
+ sessionInfoSent = false;
102
+ return;
103
+ }
104
+ if (currentLap !== lastLap && lastLap !== -1) {
105
+ const lapChangeMsg = {
106
+ type: "lap_change",
107
+ data: {
108
+ fromLap: lastLap,
109
+ toLap: currentLap,
110
+ lapTime: frame.lapLastLapTime,
111
+ sessionNum: currentSessionNum
112
+ }
113
+ };
114
+ server.publish("telemetry", JSON.stringify(lapChangeMsg));
115
+ console.log(`Lap ${lastLap} completed: ${formatLapTime(frame.lapLastLapTime)}`);
116
+ }
117
+ lastLap = currentLap;
118
+ }
119
+ function formatLapTime(seconds) {
120
+ if (!seconds || seconds < 0 || seconds > 3600)
121
+ return "--:--.---";
122
+ const mins = Math.floor(seconds / 60);
123
+ const secs = (seconds % 60).toFixed(3).padStart(6, "0");
124
+ return `${mins}:${secs}`;
125
+ }
126
+ async function main() {
127
+ const connected = await connectToIRacing();
128
+ if (!connected) {
129
+ process.exit(1);
130
+ }
131
+ const sessionInfo = getSessionInfo();
132
+ if (sessionInfo) {
133
+ console.log(`Track: ${sessionInfo.trackDisplayName}`);
134
+ console.log(`Driver: ${sessionInfo.driverName}`);
135
+ console.log(`Car: ${sessionInfo.carName} #${sessionInfo.carNumber}`);
136
+ }
137
+ const server = Bun.serve({
138
+ port: TELEMETRY_PORT,
139
+ fetch(req, server2) {
140
+ const url = new URL(req.url);
141
+ if (url.pathname === "/ws" || req.headers.get("upgrade") === "websocket") {
142
+ const success = server2.upgrade(req);
143
+ if (success) {
144
+ return;
145
+ }
146
+ return new Response("WebSocket upgrade failed", { status: 400 });
147
+ }
148
+ if (url.pathname === "/status") {
149
+ return Response.json({
150
+ connected: ir.isConnected,
151
+ initialized: ir.isInitialized,
152
+ sessionInfo: getSessionInfo()
153
+ });
154
+ }
155
+ if (url.pathname === "/health") {
156
+ return new Response("OK", { status: 200 });
157
+ }
158
+ return new Response("Not found", { status: 404 });
159
+ },
160
+ websocket: {
161
+ open(ws) {
162
+ console.log("Client connected");
163
+ ws.subscribe("telemetry");
164
+ const statusMsg = {
165
+ type: "status",
166
+ data: {
167
+ connected: ir.isConnected,
168
+ initialized: ir.isInitialized
169
+ }
170
+ };
171
+ ws.send(JSON.stringify(statusMsg));
172
+ const sessionInfo2 = getSessionInfo();
173
+ if (sessionInfo2) {
174
+ const sessionMsg = {
175
+ type: "session_info",
176
+ data: sessionInfo2
177
+ };
178
+ ws.send(JSON.stringify(sessionMsg));
179
+ }
180
+ },
181
+ close(ws) {
182
+ console.log("Client disconnected");
183
+ },
184
+ message(ws, msg) {}
185
+ }
186
+ });
187
+ console.log(`
188
+ Telemetry server running at ws://127.0.0.1:${server.port}/ws`);
189
+ console.log(`Status endpoint: http://127.0.0.1:${server.port}/status`);
190
+ console.log(`Waiting for connections...
191
+ `);
192
+ let lastSessionInfoTime = 0;
193
+ setInterval(() => {
194
+ if (!ir.isConnected) {
195
+ return;
196
+ }
197
+ const frame = getTelemetryFrame();
198
+ checkLapChange(frame, server);
199
+ const telemetryMsg = {
200
+ type: "telemetry",
201
+ data: frame
202
+ };
203
+ server.publish("telemetry", JSON.stringify(telemetryMsg));
204
+ const now = Date.now();
205
+ if (now - lastSessionInfoTime > 1000 / SESSION_INFO_RATE_HZ) {
206
+ lastSessionInfoTime = now;
207
+ const sessionInfo2 = getSessionInfo();
208
+ if (sessionInfo2 && !sessionInfoSent) {
209
+ const sessionMsg = {
210
+ type: "session_info",
211
+ data: sessionInfo2
212
+ };
213
+ server.publish("telemetry", JSON.stringify(sessionMsg));
214
+ sessionInfoSent = true;
215
+ }
216
+ }
217
+ }, 1000 / TELEMETRY_RATE_HZ);
218
+ process.on("SIGINT", () => {
219
+ console.log(`
220
+ Shutting down...`);
221
+ ir.shutdown();
222
+ process.exit(0);
223
+ });
224
+ process.on("SIGTERM", () => {
225
+ console.log(`
226
+ Shutting down...`);
227
+ ir.shutdown();
228
+ process.exit(0);
229
+ });
230
+ }
231
+ main().catch((err) => {
232
+ console.error("Fatal error:", err);
233
+ process.exit(1);
234
+ });
@@ -0,0 +1,212 @@
1
+ import type { VarType } from './constants';
2
+ export interface VarHeader {
3
+ type: VarType;
4
+ offset: number;
5
+ count: number;
6
+ countAsTime: boolean;
7
+ name: string;
8
+ desc: string;
9
+ unit: string;
10
+ }
11
+ export interface VarBuffer {
12
+ tickCount: number;
13
+ bufOffset: number;
14
+ }
15
+ export interface Header {
16
+ version: number;
17
+ status: number;
18
+ tickRate: number;
19
+ sessionInfoUpdate: number;
20
+ sessionInfoLen: number;
21
+ sessionInfoOffset: number;
22
+ numVars: number;
23
+ varHeaderOffset: number;
24
+ numBuf: number;
25
+ bufLen: number;
26
+ varBuf: VarBuffer[];
27
+ }
28
+ export interface DiskSubHeader {
29
+ sessionStartDate: bigint;
30
+ sessionStartTime: number;
31
+ sessionEndTime: number;
32
+ sessionLapCount: number;
33
+ sessionRecordCount: number;
34
+ }
35
+ export interface SessionInfo {
36
+ [key: string]: unknown;
37
+ }
38
+ export interface WeekendInfo {
39
+ TrackName: string;
40
+ TrackID: number;
41
+ TrackLength: string;
42
+ TrackDisplayName: string;
43
+ TrackDisplayShortName: string;
44
+ TrackConfigName: string;
45
+ TrackCity: string;
46
+ TrackCountry: string;
47
+ TrackAltitude: string;
48
+ TrackLatitude: string;
49
+ TrackLongitude: string;
50
+ TrackNorthOffset: string;
51
+ TrackNumTurns: number;
52
+ TrackPitSpeedLimit: string;
53
+ TrackType: string;
54
+ TrackDirection: string;
55
+ TrackWeatherType: string;
56
+ TrackSkies: string;
57
+ TrackSurfaceTemp: string;
58
+ TrackAirTemp: string;
59
+ TrackAirPressure: string;
60
+ TrackWindVel: string;
61
+ TrackWindDir: string;
62
+ TrackRelativeHumidity: string;
63
+ TrackFogLevel: string;
64
+ TrackCleanup: number;
65
+ TrackDynamicTrack: number;
66
+ TrackVersion: string;
67
+ SeriesID: number;
68
+ SeasonID: number;
69
+ SessionID: number;
70
+ SubSessionID: number;
71
+ LeagueID: number;
72
+ Official: number;
73
+ RaceWeek: number;
74
+ EventType: string;
75
+ Category: string;
76
+ SimMode: string;
77
+ TeamRacing: number;
78
+ MinDrivers: number;
79
+ MaxDrivers: number;
80
+ DCRuleSet: string;
81
+ QualifierMustStartRace: number;
82
+ NumCarClasses: number;
83
+ NumCarTypes: number;
84
+ HeatRacing: number;
85
+ BuildType: string;
86
+ BuildTarget: string;
87
+ BuildVersion: string;
88
+ }
89
+ export interface DriverInfo {
90
+ DriverCarIdx: number;
91
+ DriverUserID: number;
92
+ PaceCarIdx: number;
93
+ DriverHeadPosX: number;
94
+ DriverHeadPosY: number;
95
+ DriverHeadPosZ: number;
96
+ DriverCarIsElectric: number;
97
+ DriverCarIdleRPM: number;
98
+ DriverCarRedLine: number;
99
+ DriverCarEngCylinderCount: number;
100
+ DriverCarFuelKgPerLtr: number;
101
+ DriverCarFuelMaxLtr: number;
102
+ DriverCarMaxFuelPct: number;
103
+ DriverCarGearNumForward: number;
104
+ DriverCarGearNeutral: number;
105
+ DriverCarGearReverse: number;
106
+ DriverCarSLFirstRPM: number;
107
+ DriverCarSLShiftRPM: number;
108
+ DriverCarSLLastRPM: number;
109
+ DriverCarSLBlinkRPM: number;
110
+ DriverCarVersion: string;
111
+ DriverPitTrkPct: number;
112
+ DriverCarEstLapTime: number;
113
+ DriverSetupName: string;
114
+ DriverSetupIsModified: number;
115
+ DriverSetupLoadTypeName: string;
116
+ DriverSetupPassedTech: number;
117
+ DriverIncidentCount: number;
118
+ Drivers: Driver[];
119
+ }
120
+ export interface Driver {
121
+ CarIdx: number;
122
+ UserName: string;
123
+ AbbrevName: string;
124
+ Initials: string;
125
+ UserID: number;
126
+ TeamID: number;
127
+ TeamName: string;
128
+ CarNumber: string;
129
+ CarNumberRaw: number;
130
+ CarPath: string;
131
+ CarClassID: number;
132
+ CarID: number;
133
+ CarIsPaceCar: number;
134
+ CarIsAI: number;
135
+ CarIsElectric: number;
136
+ CarScreenName: string;
137
+ CarScreenNameShort: string;
138
+ CarClassShortName: string;
139
+ CarClassRelSpeed: number;
140
+ CarClassLicenseLevel: number;
141
+ CarClassMaxFuelPct: string;
142
+ CarClassWeightPenalty: string;
143
+ CarClassPowerAdjust: string;
144
+ CarClassDryTireSetLimit: string;
145
+ CarClassColor: number;
146
+ CarClassEstLapTime: number;
147
+ IRating: number;
148
+ LicLevel: number;
149
+ LicSubLevel: number;
150
+ LicString: string;
151
+ LicColor: number;
152
+ IsSpectator: number;
153
+ CarDesignStr: string;
154
+ HelmetDesignStr: string;
155
+ SuitDesignStr: string;
156
+ CarNumberDesignStr: string;
157
+ CarSponsor_1: number;
158
+ CarSponsor_2: number;
159
+ CurDriverIncidentCount: number;
160
+ TeamIncidentCount: number;
161
+ }
162
+ export interface SessionInfoData {
163
+ Sessions: Session[];
164
+ }
165
+ export interface Session {
166
+ SessionNum: number;
167
+ SessionLaps: string;
168
+ SessionTime: string;
169
+ SessionNumLapsToAvg: number;
170
+ SessionType: string;
171
+ SessionTrackRubberState: string;
172
+ SessionName: string;
173
+ SessionSubType: string;
174
+ SessionSkipped: number;
175
+ SessionRunGroupsUsed: number;
176
+ SessionEnforceTireCompoundChange: number;
177
+ ResultsPositions: ResultPosition[];
178
+ ResultsFastestLap: FastestLap[];
179
+ ResultsAverageLapTime: number;
180
+ ResultsNumCautionFlags: number;
181
+ ResultsNumCautionLaps: number;
182
+ ResultsNumLeadChanges: number;
183
+ ResultsLapsComplete: number;
184
+ ResultsOfficial: number;
185
+ }
186
+ export interface ResultPosition {
187
+ Position: number;
188
+ ClassPosition: number;
189
+ CarIdx: number;
190
+ Lap: number;
191
+ Time: number;
192
+ FastestLap: number;
193
+ FastestTime: number;
194
+ LastTime: number;
195
+ LapsLed: number;
196
+ LapsComplete: number;
197
+ JokerLapsComplete: number;
198
+ LapsDriven: number;
199
+ Incidents: number;
200
+ ReasonOutId: number;
201
+ ReasonOutStr: string;
202
+ }
203
+ export interface FastestLap {
204
+ CarIdx: number;
205
+ FastestLap: number;
206
+ FastestTime: number;
207
+ }
208
+ export type TelemetryValue = number | number[] | boolean | boolean[];
209
+ export interface TelemetryData {
210
+ [key: string]: TelemetryValue;
211
+ }
212
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ // @bun
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@hotlap.ai/telemetry",
3
+ "version": "1.0.0",
4
+ "description": "High-performance iRacing SDK for Bun - telemetry parsing and live data",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./ibt": {
16
+ "types": "./dist/ibt.d.ts",
17
+ "import": "./dist/ibt.js",
18
+ "default": "./dist/ibt.js"
19
+ },
20
+ "./live": {
21
+ "types": "./dist/live.d.ts",
22
+ "import": "./dist/live.js",
23
+ "default": "./dist/live.js"
24
+ },
25
+ "./constants": {
26
+ "types": "./dist/constants.d.ts",
27
+ "import": "./dist/constants.js",
28
+ "default": "./dist/constants.js"
29
+ }
30
+ },
31
+ "bin": {
32
+ "irsdk": "./dist/cli.js"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "LICENSE",
38
+ "CONTRIBUTING.md"
39
+ ],
40
+ "scripts": {
41
+ "build": "bun run build:js && bun run build:types",
42
+ "build:js": "bun build ./src/index.ts ./src/ibt.ts ./src/live.ts ./src/constants.ts ./src/cli.ts ./src/telemetry-server.ts ./src/types.ts ./src/binary-reader.ts --outdir ./dist --target bun --splitting",
43
+ "build:types": "tsc --emitDeclarationOnly --declaration --declarationMap --outDir ./dist",
44
+ "build:server": "bun build ./src/telemetry-server.ts --compile --outfile ./dist/hotlap-telemetry",
45
+ "clean": "rm -rf dist",
46
+ "dev": "bun --watch src/cli.ts",
47
+ "dashboard": "bun run examples/dashboard-server.ts",
48
+ "server": "bun run src/telemetry-server.ts",
49
+ "typecheck": "tsc --noEmit",
50
+ "test": "bun test",
51
+ "bench": "bun run bench/parse-ibt.bench.ts",
52
+ "prepublishOnly": "bun run clean && bun run build"
53
+ },
54
+ "dependencies": {
55
+ "yaml": "^2.7.0"
56
+ },
57
+ "devDependencies": {
58
+ "bun-types": "latest",
59
+ "mitata": "^1.0.10",
60
+ "typescript": "^5.7.2"
61
+ },
62
+ "keywords": [
63
+ "iracing",
64
+ "telemetry",
65
+ "ibt",
66
+ "racing",
67
+ "simulator",
68
+ "bun",
69
+ "sim-racing",
70
+ "motorsport",
71
+ "data-logging"
72
+ ],
73
+ "author": "HotLap.ai",
74
+ "license": "MIT",
75
+ "repository": {
76
+ "type": "git",
77
+ "url": "git+https://github.com/hotlap-ai/telemetry.git"
78
+ },
79
+ "homepage": "https://github.com/hotlap-ai/telemetry#readme",
80
+ "bugs": {
81
+ "url": "https://github.com/hotlap-ai/telemetry/issues"
82
+ },
83
+ "engines": {
84
+ "bun": ">=1.0.0"
85
+ },
86
+ "sideEffects": false,
87
+ "publishConfig": {
88
+ "access": "public"
89
+ }
90
+ }