UNPKG

iracing-data-client

Version:

Fully-typed HTTP Client for the iRacing Data API with automatic code generation, built-in caching, smart authentication, and comprehensive error handling.

1,555 lines (1,548 loc) 130 kB
import * as z6 from 'zod/mini'; var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; var IRacingClientOptionsSchema = z6.object({ email: z6.optional(z6.string()), password: z6.optional(z6.string()), headers: z6.optional(z6.record(z6.string(), z6.string())), fetchFn: z6.optional(z6.any()), validateParams: z6.optional(z6.boolean()) }); var IRacingError = class extends Error { constructor(message, status, statusText, responseData) { super(message); this.status = status; this.statusText = statusText; this.responseData = responseData; this.name = "IRacingError"; } get isMaintenanceMode() { var _a; return this.status === 503 && ((_a = this.responseData) == null ? void 0 : _a.error) === "Site Maintenance"; } get isRateLimited() { return this.status === 429; } get isUnauthorized() { return this.status === 401; } }; var IRacingClient = class { constructor(opts = {}) { __publicField(this, "baseUrl", "https://members-ng.iracing.com"); __publicField(this, "fetchFn"); __publicField(this, "authData", null); __publicField(this, "cookies", null); __publicField(this, "email"); __publicField(this, "password"); __publicField(this, "presetHeaders"); __publicField(this, "validateParams"); __publicField(this, "expiringCache", /* @__PURE__ */ new Map()); var _a, _b; const validatedOpts = IRacingClientOptionsSchema.parse(opts); this.fetchFn = (_a = validatedOpts.fetchFn) != null ? _a : globalThis.fetch; if (!this.fetchFn) throw new Error("No fetch available. Pass fetchFn in IRacingClientOptions."); this.email = validatedOpts.email; this.password = validatedOpts.password; this.presetHeaders = validatedOpts.headers; this.validateParams = (_b = validatedOpts.validateParams) != null ? _b : true; if (!this.email && !this.password && !this.presetHeaders) { throw new Error("Must provide either email/password or headers for authentication"); } } buildUrl(endpoint, params) { const url = new URL(endpoint.startsWith("http") ? endpoint : `${this.baseUrl}${endpoint}`); if (params) { Object.entries(params).forEach(([key, value]) => { if (value !== void 0 && value !== null) { if (Array.isArray(value)) { url.searchParams.append(key, value.join(",")); } else if (typeof value === "boolean") { url.searchParams.append(key, value ? "true" : "false"); } else { url.searchParams.append(key, String(value)); } } }); } return url.toString(); } ensureAuthenticated() { return __async(this, null, function* () { if (this.presetHeaders) { return; } if (!this.authData && this.email && this.password) { yield this.authenticate(); } }); } authenticate() { return __async(this, null, function* () { if (!this.email || !this.password) { throw new Error("Email and password required for authentication"); } const response = yield this.fetchFn(`${this.baseUrl}/auth`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email: this.email, password: this.password }) }); if (!response.ok) { const text = yield response.text().catch(() => ""); throw new Error(`Authentication failed: ${response.statusText} - ${text}`); } this.authData = yield response.json(); if (!this.authData) { throw new Error("Authentication failed - no auth data received"); } this.cookies = { "irsso_membersv2": this.authData.ssoCookieValue, "authtoken_members": `%7B%22authtoken%22%3A%7B%22authcode%22%3A%22${this.authData.authcode}%22%2C%22email%22%3A%22${encodeURIComponent(this.authData.email)}%22%7D%7D` }; }); } mapParamsToApi(params) { if (!params) return void 0; const mapped = {}; for (const [key, value] of Object.entries(params)) { const snakeKey = key.replace(/[A-Z]/g, (m) => "_" + m.toLowerCase()); mapped[snakeKey] = value; } return mapped; } mapResponseFromApi(data) { if (data === null || data === void 0) return data; if (Array.isArray(data)) { return data.map((item) => this.mapResponseFromApi(item)); } if (typeof data === "object") { const mapped = {}; for (const [key, value] of Object.entries(data)) { const camelKey = key.replace(/_([a-z0-9])/g, (_, char) => char.toUpperCase()).replace(/-([a-z0-9])/g, (_, char) => char.toUpperCase()); mapped[camelKey] = this.mapResponseFromApi(value); } return mapped; } return data; } get(url, options) { return __async(this, null, function* () { yield this.ensureAuthenticated(); const apiParams = this.mapParamsToApi(options == null ? void 0 : options.params); const headers = {}; if (this.presetHeaders) { Object.assign(headers, this.presetHeaders); } else if (this.cookies) { const cookieString = Object.entries(this.cookies).map(([name, value]) => `${name}=${value}`).join("; "); headers["Cookie"] = cookieString; } else { throw new Error("No authentication available"); } const response = yield this.fetchFn(this.buildUrl(url, apiParams), { headers }); if (!response.ok) { const text = yield response.text().catch(() => ""); let responseData = null; try { responseData = JSON.parse(text); } catch (e) { } if (response.status === 503 && (responseData == null ? void 0 : responseData.error) === "Site Maintenance") { throw new IRacingError( `iRacing is currently in maintenance mode: ${responseData.message || "Service temporarily unavailable"}`, response.status, response.statusText, responseData ); } if (response.status === 429) { throw new IRacingError( "Rate limit exceeded. Please wait before making more requests.", response.status, response.statusText, responseData ); } if (response.status === 401) { throw new IRacingError( "Authentication failed. Please check your credentials.", response.status, response.statusText, responseData ); } const errorMessage = (responseData == null ? void 0 : responseData.message) || (responseData == null ? void 0 : responseData.error) || text || response.statusText; throw new IRacingError( `Request failed: ${errorMessage}`, response.status, response.statusText, responseData ); } const contentType = response.headers.get("content-type") || ""; if (contentType.includes("application/json")) { const data = yield response.json(); if (data.link && data.expires) { const s3Response = yield this.fetchFn(data.link); if (!s3Response.ok) { throw new Error(`Failed to fetch from S3: ${s3Response.statusText}`); } const s3ContentType = s3Response.headers.get("content-type") || ""; if (s3ContentType.includes("text/csv") || s3ContentType.includes("text/plain")) { const csvText = yield s3Response.text(); return { ContentType: "csv", RawData: csvText, Note: "This endpoint returns CSV data, not JSON" }; } const s3Data = yield s3Response.json(); const mappedData2 = this.mapResponseFromApi(s3Data); if (options == null ? void 0 : options.schema) { return options.schema.parse(mappedData2); } return mappedData2; } const mappedData = this.mapResponseFromApi(data); if (options == null ? void 0 : options.schema) { return options.schema.parse(mappedData); } return mappedData; } throw new Error(`Unexpected content type: ${contentType}`); }); } isAuthenticated() { return this.authData !== null || !!this.presetHeaders; } getCustomerId() { var _a, _b; return (_b = (_a = this.authData) == null ? void 0 : _a.custId) != null ? _b : null; } }; var CarAssets = z6.record(z6.string(), z6.object({ carId: z6.optional(z6.nullable(z6.number())), carRules: z6.optional(z6.nullable(z6.array(z6.unknown()))), detailCopy: z6.optional(z6.nullable(z6.string())), detailScreenShotImages: z6.optional(z6.nullable(z6.string())), detailTechspecsCopy: z6.optional(z6.nullable(z6.string())), folder: z6.optional(z6.nullable(z6.string())), galleryImages: z6.optional(z6.nullable(z6.string())), galleryPrefix: z6.optional(z6.nullable(z6.string())), groupImage: z6.optional(z6.nullable(z6.string())), groupName: z6.optional(z6.nullable(z6.string())), largeImage: z6.optional(z6.nullable(z6.string())), logo: z6.optional(z6.nullable(z6.string())), smallImage: z6.optional(z6.nullable(z6.string())), sponsorLogo: z6.optional(z6.nullable(z6.string())), templatePath: z6.optional(z6.nullable(z6.string())) })); var CarGet = z6.array(z6.object({ aiEnabled: z6.boolean(), allowNumberColors: z6.boolean(), allowNumberFont: z6.boolean(), allowSponsor1: z6.boolean(), allowSponsor2: z6.boolean(), allowWheelColor: z6.boolean(), awardExempt: z6.boolean(), carConfigDefs: z6.array(z6.object({ carcfg: z6.number(), cfgSubdir: z6.nullable(z6.string()), customPaintExt: z6.nullable(z6.string()), name: z6.string() })), carConfigs: z6.array(z6.object({ carcfg: z6.number(), trackId: z6.optional(z6.number()), trackType: z6.optional(z6.number()) })), carDirpath: z6.string(), carId: z6.number(), carName: z6.string(), carNameAbbreviated: z6.string(), carTypes: z6.array(z6.object({ carType: z6.string() })), carWeight: z6.number(), categories: z6.array(z6.string()), created: z6.string(), firstSale: z6.string(), folder: z6.string(), forumUrl: z6.optional(z6.string()), freeWithSubscription: z6.boolean(), hasHeadlights: z6.boolean(), hasMultipleDryTireTypes: z6.boolean(), hasRainCapableTireTypes: z6.boolean(), hp: z6.number(), isPsPurchasable: z6.boolean(), logo: z6.nullable(z6.string()), maxPowerAdjustPct: z6.number(), maxWeightPenaltyKg: z6.number(), minPowerAdjustPct: z6.number(), packageId: z6.number(), patterns: z6.number(), price: z6.number(), priceDisplay: z6.optional(z6.string()), rainEnabled: z6.boolean(), retired: z6.boolean(), searchFilters: z6.string(), sku: z6.number(), smallImage: z6.string(), sponsorLogo: z6.nullable(z6.string()), carMake: z6.optional(z6.string()), carModel: z6.optional(z6.string()), paintRules: z6.optional(z6.record(z6.string(), z6.unknown())), siteUrl: z6.optional(z6.string()) })); var CarAssetsParamsSchema = z6.object({}); var CarGetParamsSchema = z6.object({}); // src/car/service.ts var CarService = class { constructor(client) { this.client = client; } /** * assets * @see https://members-ng.iracing.com/data/car/assets * @sample car.assets.json */ assets() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/car/assets", { schema: CarAssets }); }); } /** * get * @see https://members-ng.iracing.com/data/car/get * @sample car.get.json */ get() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/car/get", { schema: CarGet }); }); } }; z6.object({ carDirpath: z6.string(), // maps from: car_dirpath carId: z6.number(), // maps from: car_id rainEnabled: z6.boolean(), // maps from: rain_enabled retired: z6.boolean() }); var CarclassGet = z6.array(z6.object({ carClassId: z6.number(), carsInClass: z6.array(z6.object({ carDirpath: z6.string(), carId: z6.number(), rainEnabled: z6.boolean(), retired: z6.boolean() })), custId: z6.number(), name: z6.string(), rainEnabled: z6.boolean(), relativeSpeed: z6.number(), shortName: z6.string() })); var CarclassGetParamsSchema = z6.object({}); // src/carclass/service.ts var CarclassService = class { constructor(client) { this.client = client; } /** * get * @see https://members-ng.iracing.com/data/carclass/get * @sample carclass.get.json */ get() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/carclass/get", { schema: CarclassGet }); }); } }; var ConstantsCategories = z6.array(z6.object({ label: z6.string(), value: z6.number() })); var ConstantsDivisions = z6.array(z6.object({ label: z6.string(), value: z6.number() })); var ConstantsEventTypes = z6.array(z6.object({ label: z6.string(), value: z6.number() })); var ConstantsCategoriesParamsSchema = z6.object({}); var ConstantsDivisionsParamsSchema = z6.object({}); var ConstantsEventTypesParamsSchema = z6.object({}); // src/constants/service.ts var ConstantsService = class { constructor(client) { this.client = client; } /** * categories * @see https://members-ng.iracing.com/data/constants/categories * @sample constants.categories.json */ categories() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/constants/categories", { schema: ConstantsCategories }); }); } /** * divisions * @see https://members-ng.iracing.com/data/constants/divisions * @sample constants.divisions.json */ divisions() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/constants/divisions", { schema: ConstantsDivisions }); }); } /** * event_types * @see https://members-ng.iracing.com/data/constants/event_types * @sample constants.event_types.json */ eventTypes() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/constants/event_types", { schema: ConstantsEventTypes }); }); } }; var DriverStatsByCategoryOval = z6.object({ ContentType: z6.literal("csv"), RawData: z6.string(), Note: z6.string() }); var DriverStatsByCategorySportsCar = z6.object({ ContentType: z6.literal("csv"), RawData: z6.string(), Note: z6.string() }); var DriverStatsByCategoryFormulaCar = z6.object({ ContentType: z6.literal("csv"), RawData: z6.string(), Note: z6.string() }); var DriverStatsByCategoryRoad = z6.object({ ContentType: z6.literal("csv"), RawData: z6.string(), Note: z6.string() }); var DriverStatsByCategoryDirtOval = z6.object({ ContentType: z6.literal("csv"), RawData: z6.string(), Note: z6.string() }); var DriverStatsByCategoryDirtRoad = z6.object({ ContentType: z6.literal("csv"), RawData: z6.string(), Note: z6.string() }); var DriverStatsByCategoryOvalParamsSchema = z6.object({}); var DriverStatsByCategorySportsCarParamsSchema = z6.object({}); var DriverStatsByCategoryFormulaCarParamsSchema = z6.object({}); var DriverStatsByCategoryRoadParamsSchema = z6.object({}); var DriverStatsByCategoryDirtOvalParamsSchema = z6.object({}); var DriverStatsByCategoryDirtRoadParamsSchema = z6.object({}); // src/driver-stats-by-category/service.ts var DriverStatsByCategoryService = class { constructor(client) { this.client = client; } /** * oval * @see https://members-ng.iracing.com/data/driver_stats_by_category/oval * @sample driver_stats_by_category.oval.json */ oval() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/driver_stats_by_category/oval", { schema: DriverStatsByCategoryOval }); }); } /** * sports_car * @see https://members-ng.iracing.com/data/driver_stats_by_category/sports_car * @sample driver_stats_by_category.sports_car.json */ sportsCar() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/driver_stats_by_category/sports_car", { schema: DriverStatsByCategorySportsCar }); }); } /** * formula_car * @see https://members-ng.iracing.com/data/driver_stats_by_category/formula_car * @sample driver_stats_by_category.formula_car.json */ formulaCar() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/driver_stats_by_category/formula_car", { schema: DriverStatsByCategoryFormulaCar }); }); } /** * road * @see https://members-ng.iracing.com/data/driver_stats_by_category/road * @sample driver_stats_by_category.road.json */ road() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/driver_stats_by_category/road", { schema: DriverStatsByCategoryRoad }); }); } /** * dirt_oval * @see https://members-ng.iracing.com/data/driver_stats_by_category/dirt_oval * @sample driver_stats_by_category.dirt_oval.json */ dirtOval() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/driver_stats_by_category/dirt_oval", { schema: DriverStatsByCategoryDirtOval }); }); } /** * dirt_road * @see https://members-ng.iracing.com/data/driver_stats_by_category/dirt_road * @sample driver_stats_by_category.dirt_road.json */ dirtRoad() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/driver_stats_by_category/dirt_road", { schema: DriverStatsByCategoryDirtRoad }); }); } }; var HostedCombinedSessions = z6.object({ subscribed: z6.boolean(), sequence: z6.number(), sessions: z6.array(z6.object({ numDrivers: z6.number(), numSpotters: z6.number(), numSpectators: z6.number(), numBroadcasters: z6.number(), availableReservedBroadcasterSlots: z6.number(), numSpectatorSlots: z6.number(), availableSpectatorSlots: z6.number(), canBroadcast: z6.boolean(), canWatch: z6.boolean(), canSpot: z6.boolean(), elig: z6.object({ sessionFull: z6.boolean(), canSpot: z6.boolean(), canWatch: z6.boolean(), canDrive: z6.boolean(), hasSessPassword: z6.boolean(), needsPurchase: z6.boolean(), ownCar: z6.boolean(), ownTrack: z6.boolean(), purchaseSkus: z6.array(z6.number()), registered: z6.boolean() }), driverChanges: z6.boolean(), restrictViewing: z6.boolean(), maxUsers: z6.number(), privateSessionId: z6.number(), sessionId: z6.number(), subsessionId: z6.number(), passwordProtected: z6.boolean(), sessionName: z6.string(), sessionDesc: z6.optional(z6.string()), openRegExpires: z6.string(), launchAt: z6.string(), fullCourseCautions: z6.boolean(), numFastTows: z6.number(), rollingStarts: z6.boolean(), restarts: z6.number(), multiclassType: z6.number(), pitsInUse: z6.number(), carsLeft: z6.number(), maxDrivers: z6.number(), hardcoreLevel: z6.number(), practiceLength: z6.number(), loneQualify: z6.boolean(), qualifyLaps: z6.number(), qualifyLength: z6.number(), warmupLength: z6.number(), raceLaps: z6.number(), raceLength: z6.number(), timeLimit: z6.number(), restrictResults: z6.boolean(), incidentLimit: z6.number(), incidentWarnMode: z6.number(), incidentWarnParam1: z6.number(), incidentWarnParam2: z6.number(), unsportConductRuleMode: z6.number(), connectionBlackFlag: z6.boolean(), luckyDog: z6.boolean(), minTeamDrivers: z6.number(), maxTeamDrivers: z6.number(), qualifierMustStartRace: z6.boolean(), driverChangeRule: z6.number(), fixedSetup: z6.boolean(), entryCount: z6.number(), leagueId: z6.number(), leagueSeasonId: z6.number(), sessionType: z6.number(), orderId: z6.number(), minLicenseLevel: z6.number(), maxLicenseLevel: z6.number(), status: z6.number(), paceCarId: z6.nullable(z6.number()), paceCarClassId: z6.nullable(z6.number()), numOptLaps: z6.number(), damageModel: z6.number(), doNotPaintCars: z6.boolean(), greenWhiteCheckeredLimit: z6.number(), doNotCountCautionLaps: z6.boolean(), consecCautionsSingleFile: z6.boolean(), consecCautionWithinNlaps: z6.number(), noLapperWaveArounds: z6.boolean(), shortParadeLap: z6.boolean(), startOnQualTire: z6.boolean(), telemetryRestriction: z6.number(), telemetryForceToDisk: z6.number(), maxAiDrivers: z6.number(), aiAvoidPlayers: z6.boolean(), adaptiveAiEnabled: z6.boolean(), adaptiveAiDifficulty: z6.optional(z6.number()), mustUseDiffTireTypesInRace: z6.boolean(), startZone: z6.boolean(), enablePitlaneCollisions: z6.boolean(), disallowVirtualMirror: z6.boolean(), maxVisorTearoffs: z6.number(), categoryId: z6.number(), category: z6.string(), sessionFull: z6.boolean(), host: z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }) }), track: z6.object({ categoryId: z6.number(), configName: z6.optional(z6.string()), trackId: z6.number(), trackName: z6.string() }), weather: z6.object({ allowFog: z6.boolean(), forecastOptions: z6.optional(z6.object({ forecastType: z6.number(), precipitation: z6.number(), skies: z6.number(), stopPrecip: z6.number(), temperature: z6.number(), weatherSeed: z6.number(), windDir: z6.number(), windSpeed: z6.number() })), precipOption: z6.number(), relHumidity: z6.number(), simulatedStartTime: z6.string(), simulatedTimeMultiplier: z6.number(), simulatedTimeOffsets: z6.array(z6.number()), skies: z6.number(), tempUnits: z6.number(), tempValue: z6.number(), timeOfDay: z6.number(), trackWater: z6.number(), version: z6.number(), weatherSummary: z6.optional(z6.object({ maxPrecipRate: z6.number(), maxPrecipRateDesc: z6.string(), precipChance: z6.number(), skiesHigh: z6.number(), skiesLow: z6.number(), tempHigh: z6.number(), tempLow: z6.number(), tempUnits: z6.number(), windDir: z6.number(), windHigh: z6.number(), windLow: z6.number(), windUnits: z6.number() })), weatherUrl: z6.optional(z6.string()), windDir: z6.number(), windUnits: z6.number(), windValue: z6.number(), fog: z6.optional(z6.number()), type: z6.optional(z6.number()) }), trackState: z6.object({ leaveMarbles: z6.boolean(), practiceRubber: z6.number(), qualifyRubber: z6.number(), raceRubber: z6.number(), warmupRubber: z6.number() }), farm: z6.object({ farmId: z6.number(), displayName: z6.string(), imagePath: z6.string(), displayed: z6.boolean() }), admins: z6.array(z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }) })), allowedTeams: z6.array(z6.unknown()), allowedLeagues: z6.array(z6.unknown()), cars: z6.array(z6.object({ carId: z6.number(), carName: z6.string(), carClassId: z6.number(), carClassName: z6.string(), maxPctFuelFill: z6.number(), weightPenaltyKg: z6.number(), powerAdjustPct: z6.number(), maxDryTireSets: z6.number(), packageId: z6.number() })), countByCarId: z6.object({ 112: z6.optional(z6.number()), 117: z6.optional(z6.number()), 118: z6.optional(z6.number()), 119: z6.optional(z6.number()), 128: z6.optional(z6.number()), 132: z6.optional(z6.number()), 133: z6.optional(z6.number()), 143: z6.optional(z6.number()), 146: z6.optional(z6.number()), 147: z6.optional(z6.number()), 150: z6.optional(z6.number()), 156: z6.optional(z6.number()), 157: z6.optional(z6.number()), 169: z6.optional(z6.number()), 173: z6.optional(z6.number()), 176: z6.optional(z6.number()), 184: z6.optional(z6.number()), 185: z6.optional(z6.number()), 188: z6.optional(z6.number()), 189: z6.optional(z6.number()), 190: z6.optional(z6.number()), 192: z6.optional(z6.number()), 194: z6.optional(z6.number()), 195: z6.optional(z6.number()) }), countByCarClassId: z6.object({ 0: z6.optional(z6.number()), 2708: z6.optional(z6.number()), 3104: z6.optional(z6.number()), 4073: z6.optional(z6.number()), 4076: z6.optional(z6.number()), 4083: z6.optional(z6.number()), 4084: z6.optional(z6.number()), 4085: z6.optional(z6.number()) }), carTypes: z6.array(z6.object({ carType: z6.string() })), trackTypes: z6.array(z6.object({ trackType: z6.string() })), licenseGroupTypes: z6.array(z6.object({ licenseGroupType: z6.number() })), eventTypes: z6.array(z6.object({ eventType: z6.number() })), sessionTypes: z6.array(z6.object({ sessionType: z6.number() })), canJoin: z6.boolean(), sessAdmin: z6.boolean(), friends: z6.array(z6.unknown()), watched: z6.array(z6.unknown()), endTime: z6.string(), teamEntryCount: z6.number(), isHeatRacing: z6.boolean(), populated: z6.boolean(), broadcaster: z6.boolean(), minIr: z6.number(), maxIr: z6.number(), aiMinSkill: z6.optional(z6.number()), aiMaxSkill: z6.optional(z6.number()), aiRosterName: z6.optional(z6.string()) })), success: z6.boolean(), packageId: z6.optional(z6.number()) }); var HostedSessions = z6.object({ subscribed: z6.boolean(), sessions: z6.array(z6.object({ adaptiveAiEnabled: z6.boolean(), admins: z6.array(z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }) })), aiAvoidPlayers: z6.boolean(), aiMaxSkill: z6.optional(z6.number()), aiMinSkill: z6.optional(z6.number()), aiRosterName: z6.optional(z6.string()), allowedLeagues: z6.array(z6.unknown()), allowedTeams: z6.array(z6.unknown()), carTypes: z6.array(z6.object({ carType: z6.string() })), cars: z6.array(z6.object({ carId: z6.number(), carName: z6.string(), carClassId: z6.number(), carClassName: z6.string(), maxPctFuelFill: z6.number(), weightPenaltyKg: z6.number(), powerAdjustPct: z6.number(), maxDryTireSets: z6.number(), packageId: z6.number() })), carsLeft: z6.number(), category: z6.string(), categoryId: z6.number(), connectionBlackFlag: z6.boolean(), consecCautionWithinNlaps: z6.number(), consecCautionsSingleFile: z6.boolean(), countByCarClassId: z6.object({ 0: z6.optional(z6.number()), 2708: z6.optional(z6.number()), 3104: z6.optional(z6.number()), 4073: z6.optional(z6.number()), 4076: z6.optional(z6.number()), 4083: z6.optional(z6.number()), 4084: z6.optional(z6.number()), 4085: z6.optional(z6.number()) }), countByCarId: z6.object({ 112: z6.optional(z6.number()), 117: z6.optional(z6.number()), 118: z6.optional(z6.number()), 119: z6.optional(z6.number()), 128: z6.optional(z6.number()), 132: z6.optional(z6.number()), 133: z6.optional(z6.number()), 143: z6.optional(z6.number()), 146: z6.optional(z6.number()), 147: z6.optional(z6.number()), 150: z6.optional(z6.number()), 156: z6.optional(z6.number()), 157: z6.optional(z6.number()), 169: z6.optional(z6.number()), 173: z6.optional(z6.number()), 176: z6.optional(z6.number()), 184: z6.optional(z6.number()), 185: z6.optional(z6.number()), 188: z6.optional(z6.number()), 189: z6.optional(z6.number()), 190: z6.optional(z6.number()), 192: z6.optional(z6.number()), 194: z6.optional(z6.number()), 195: z6.optional(z6.number()) }), damageModel: z6.number(), disallowVirtualMirror: z6.boolean(), doNotCountCautionLaps: z6.boolean(), doNotPaintCars: z6.boolean(), driverChangeRule: z6.number(), driverChanges: z6.boolean(), elig: z6.object({ sessionFull: z6.boolean(), canSpot: z6.boolean(), canWatch: z6.boolean(), canDrive: z6.boolean(), hasSessPassword: z6.boolean(), needsPurchase: z6.boolean(), ownCar: z6.boolean(), ownTrack: z6.boolean(), purchaseSkus: z6.array(z6.number()), registered: z6.boolean() }), enablePitlaneCollisions: z6.boolean(), entryCount: z6.number(), eventTypes: z6.array(z6.object({ eventType: z6.number() })), farm: z6.object({ farmId: z6.number(), displayName: z6.string(), imagePath: z6.string(), displayed: z6.boolean() }), fixedSetup: z6.boolean(), fullCourseCautions: z6.boolean(), greenWhiteCheckeredLimit: z6.number(), hardcoreLevel: z6.number(), host: z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }) }), incidentLimit: z6.number(), incidentWarnMode: z6.number(), incidentWarnParam1: z6.number(), incidentWarnParam2: z6.number(), launchAt: z6.string(), leagueId: z6.number(), leagueSeasonId: z6.number(), licenseGroupTypes: z6.array(z6.object({ licenseGroupType: z6.number() })), loneQualify: z6.boolean(), luckyDog: z6.boolean(), maxAiDrivers: z6.number(), maxDrivers: z6.number(), maxIr: z6.number(), maxLicenseLevel: z6.number(), maxTeamDrivers: z6.number(), maxVisorTearoffs: z6.number(), minIr: z6.number(), minLicenseLevel: z6.number(), minTeamDrivers: z6.number(), multiclassType: z6.number(), mustUseDiffTireTypesInRace: z6.boolean(), noLapperWaveArounds: z6.boolean(), numFastTows: z6.number(), numOptLaps: z6.number(), openRegExpires: z6.string(), orderId: z6.number(), paceCarClassId: z6.nullable(z6.number()), paceCarId: z6.nullable(z6.number()), passwordProtected: z6.boolean(), pitsInUse: z6.number(), practiceLength: z6.number(), privateSessionId: z6.number(), qualifierMustStartRace: z6.boolean(), qualifyLaps: z6.number(), qualifyLength: z6.number(), raceLaps: z6.number(), raceLength: z6.number(), restarts: z6.number(), restrictResults: z6.boolean(), restrictViewing: z6.boolean(), rollingStarts: z6.boolean(), sessionFull: z6.boolean(), sessionId: z6.number(), sessionName: z6.string(), sessionType: z6.number(), sessionTypes: z6.array(z6.object({ sessionType: z6.number() })), shortParadeLap: z6.boolean(), startOnQualTire: z6.boolean(), startZone: z6.boolean(), status: z6.number(), subsessionId: z6.number(), teamEntryCount: z6.number(), telemetryForceToDisk: z6.number(), telemetryRestriction: z6.number(), timeLimit: z6.number(), track: z6.object({ categoryId: z6.number(), configName: z6.optional(z6.string()), trackId: z6.number(), trackName: z6.string() }), trackState: z6.object({ leaveMarbles: z6.boolean(), practiceRubber: z6.number(), qualifyRubber: z6.number(), raceRubber: z6.number(), warmupRubber: z6.number() }), trackTypes: z6.array(z6.object({ trackType: z6.string() })), unsportConductRuleMode: z6.number(), warmupLength: z6.number(), weather: z6.object({ allowFog: z6.boolean(), forecastOptions: z6.optional(z6.object({ forecastType: z6.number(), precipitation: z6.number(), skies: z6.number(), stopPrecip: z6.number(), temperature: z6.number(), weatherSeed: z6.number(), windDir: z6.number(), windSpeed: z6.number() })), precipOption: z6.number(), relHumidity: z6.number(), simulatedStartTime: z6.string(), simulatedTimeMultiplier: z6.number(), simulatedTimeOffsets: z6.array(z6.number()), skies: z6.number(), tempUnits: z6.number(), tempValue: z6.number(), timeOfDay: z6.number(), trackWater: z6.number(), version: z6.number(), weatherSummary: z6.optional(z6.object({ maxPrecipRate: z6.number(), maxPrecipRateDesc: z6.string(), precipChance: z6.number(), skiesHigh: z6.number(), skiesLow: z6.number(), tempHigh: z6.number(), tempLow: z6.number(), tempUnits: z6.number(), windDir: z6.number(), windHigh: z6.number(), windLow: z6.number(), windUnits: z6.number() })), weatherUrl: z6.optional(z6.string()), windDir: z6.number(), windUnits: z6.number(), windValue: z6.number(), fog: z6.optional(z6.number()), type: z6.optional(z6.number()) }), adaptiveAiDifficulty: z6.optional(z6.number()), sessionDesc: z6.optional(z6.string()) })), success: z6.boolean() }); var HostedCombinedSessionsParamsSchema = z6.object({ packageId: z6.optional(z6.number()) // If set, return only sessions using this car or track package ID. // maps to: package_id }); var HostedSessionsParamsSchema = z6.object({}); // src/hosted/service.ts var HostedService = class { constructor(client) { this.client = client; } /** * combined_sessions * @see https://members-ng.iracing.com/data/hosted/combined_sessions * @sample hosted.combined_sessions.json */ combinedSessions(params) { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/hosted/combined_sessions", { params, schema: HostedCombinedSessions }); }); } /** * sessions * @see https://members-ng.iracing.com/data/hosted/sessions * @sample hosted.sessions.json */ sessions() { return __async(this, null, function* () { return this.client.get("https://members-ng.iracing.com/data/hosted/sessions", { schema: HostedSessions }); }); } }; var LeagueCustLeagueSessions = z6.object({ mine: z6.boolean(), subscribed: z6.boolean(), sequence: z6.number(), sessions: z6.array(z6.object({ numDrivers: z6.number(), numSpotters: z6.number(), numSpectators: z6.number(), numBroadcasters: z6.number(), availableReservedBroadcasterSlots: z6.number(), numSpectatorSlots: z6.number(), availableSpectatorSlots: z6.number(), canBroadcast: z6.boolean(), canWatch: z6.boolean(), canSpot: z6.boolean(), elig: z6.object({ sessionFull: z6.boolean(), canSpot: z6.boolean(), canWatch: z6.boolean(), canDrive: z6.boolean(), hasSessPassword: z6.boolean(), needsPurchase: z6.boolean(), ownCar: z6.boolean(), ownTrack: z6.boolean(), purchaseSkus: z6.array(z6.number()), registered: z6.boolean() }), driverChanges: z6.boolean(), restrictViewing: z6.boolean(), maxUsers: z6.number(), privateSessionId: z6.number(), sessionId: z6.optional(z6.number()), subsessionId: z6.optional(z6.number()), passwordProtected: z6.boolean(), sessionName: z6.string(), openRegExpires: z6.optional(z6.string()), launchAt: z6.string(), fullCourseCautions: z6.boolean(), numFastTows: z6.number(), rollingStarts: z6.boolean(), restarts: z6.number(), multiclassType: z6.number(), pitsInUse: z6.optional(z6.number()), carsLeft: z6.optional(z6.number()), maxDrivers: z6.number(), hardcoreLevel: z6.number(), practiceLength: z6.number(), loneQualify: z6.boolean(), qualifyLaps: z6.number(), qualifyLength: z6.number(), warmupLength: z6.number(), raceLaps: z6.number(), raceLength: z6.number(), timeLimit: z6.number(), restrictResults: z6.boolean(), incidentLimit: z6.number(), incidentWarnMode: z6.number(), incidentWarnParam1: z6.number(), incidentWarnParam2: z6.number(), unsportConductRuleMode: z6.number(), connectionBlackFlag: z6.boolean(), luckyDog: z6.boolean(), minTeamDrivers: z6.number(), maxTeamDrivers: z6.number(), qualifierMustStartRace: z6.boolean(), driverChangeRule: z6.number(), fixedSetup: z6.boolean(), entryCount: z6.number(), leagueId: z6.number(), leagueName: z6.string(), leagueSeasonId: z6.number(), leagueSeasonName: z6.string(), sessionType: z6.number(), orderId: z6.number(), minLicenseLevel: z6.number(), maxLicenseLevel: z6.number(), status: z6.number(), paceCarId: z6.nullable(z6.number()), paceCarClassId: z6.nullable(z6.number()), numOptLaps: z6.number(), damageModel: z6.number(), doNotPaintCars: z6.boolean(), greenWhiteCheckeredLimit: z6.number(), doNotCountCautionLaps: z6.boolean(), consecCautionsSingleFile: z6.boolean(), consecCautionWithinNlaps: z6.number(), noLapperWaveArounds: z6.boolean(), shortParadeLap: z6.boolean(), startOnQualTire: z6.boolean(), telemetryRestriction: z6.number(), telemetryForceToDisk: z6.number(), maxAiDrivers: z6.number(), aiAvoidPlayers: z6.boolean(), adaptiveAiEnabled: z6.boolean(), adaptiveAiDifficulty: z6.number(), mustUseDiffTireTypesInRace: z6.boolean(), startZone: z6.boolean(), enablePitlaneCollisions: z6.boolean(), disallowVirtualMirror: z6.boolean(), maxVisorTearoffs: z6.number(), categoryId: z6.number(), category: z6.string(), sessionFull: z6.optional(z6.boolean()), host: z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }) }), track: z6.object({ categoryId: z6.number(), configName: z6.optional(z6.string()), trackId: z6.number(), trackName: z6.string() }), weather: z6.object({ allowFog: z6.boolean(), forecastOptions: z6.optional(z6.object({ forecastType: z6.number(), precipitation: z6.number(), skies: z6.number(), stopPrecip: z6.number(), temperature: z6.number(), weatherSeed: z6.number(), windDir: z6.number(), windSpeed: z6.number() })), precipOption: z6.number(), relHumidity: z6.number(), simulatedStartTime: z6.string(), simulatedTimeMultiplier: z6.number(), simulatedTimeOffsets: z6.array(z6.number()), skies: z6.number(), tempUnits: z6.number(), tempValue: z6.number(), timeOfDay: z6.number(), trackWater: z6.number(), version: z6.number(), weatherSummary: z6.optional(z6.object({ maxPrecipRate: z6.number(), maxPrecipRateDesc: z6.string(), precipChance: z6.number(), skiesHigh: z6.number(), skiesLow: z6.number(), tempHigh: z6.number(), tempLow: z6.number(), tempUnits: z6.number(), windDir: z6.number(), windHigh: z6.number(), windLow: z6.number(), windUnits: z6.number() })), weatherUrl: z6.optional(z6.string()), windDir: z6.number(), windUnits: z6.number(), windValue: z6.number(), fog: z6.optional(z6.number()), type: z6.optional(z6.number()) }), trackState: z6.object({ leaveMarbles: z6.boolean(), practiceRubber: z6.number(), qualifyRubber: z6.number(), raceRubber: z6.number(), warmupRubber: z6.number() }), farm: z6.object({ farmId: z6.number(), displayName: z6.string(), imagePath: z6.string(), displayed: z6.boolean() }), admins: z6.array(z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }) })), allowedTeams: z6.array(z6.unknown()), allowedLeagues: z6.array(z6.number()), cars: z6.array(z6.object({ carId: z6.number(), carName: z6.string(), carClassId: z6.number(), carClassName: z6.string(), maxPctFuelFill: z6.number(), weightPenaltyKg: z6.number(), powerAdjustPct: z6.number(), maxDryTireSets: z6.number(), qualSetupId: z6.optional(z6.number()), qualSetupFilename: z6.optional(z6.string()), raceSetupId: z6.optional(z6.number()), raceSetupFilename: z6.optional(z6.string()), packageId: z6.number() })), heatSesInfo: z6.optional(z6.object({ consolationDeltaMaxFieldSize: z6.number(), consolationDeltaSessionLaps: z6.number(), consolationDeltaSessionLengthMinutes: z6.number(), consolationFirstMaxFieldSize: z6.number(), consolationFirstSessionLaps: z6.number(), consolationFirstSessionLengthMinutes: z6.number(), consolationNumPositionToInvert: z6.number(), consolationNumToConsolation: z6.number(), consolationNumToMain: z6.number(), consolationRunAlways: z6.boolean(), consolationScoresChampPoints: z6.boolean(), created: z6.string(), custId: z6.number(), description: z6.optional(z6.string()), heatCautionType: z6.number(), heatInfoId: z6.number(), heatInfoName: z6.string(), heatLaps: z6.number(), heatLengthMinutes: z6.number(), heatMaxFieldSize: z6.number(), heatNumFromEachToMain: z6.number(), heatNumPositionToInvert: z6.number(), heatScoresChampPoints: z6.boolean(), heatSessionMinutesEstimate: z6.number(), hidden: z6.boolean(), mainLaps: z6.number(), mainLengthMinutes: z6.number(), mainMaxFieldSize: z6.number(), mainNumPositionToInvert: z6.number(), maxEntrants: z6.number(), openPractice: z6.boolean(), preMainPracticeLengthMinutes: z6.number(), preQualNumToMain: z6.number(), preQualPracticeLengthMinutes: z6.number(), qualCautionType: z6.number(), qualLaps: z6.number(), qualLengthMinutes: z6.number(), qualNumToMain: z6.number(), qualOpenDelaySeconds: z6.number(), qualScoresChampPoints: z6.boolean(), qualScoring: z6.number(), qualStyle: z6.number(), raceStyle: z6.number() })), countByCarId: z6.optional(z6.object({ 67: z6.optional(z6.number()), 106: z6.optional(z6.number()), 190: z6.optional(z6.number()), 192: z6.optional(z6.number()), 203: z6.optional(z6.number()) })), countByCarClassId: z6.optional(z6.object({ 0: z6.number() })), carTypes: z6.array(z6.object({ carType: z6.string() })), trackTypes: z6.array(z6.object({ trackType: z6.string() })), licenseGroupTypes: z6.array(z6.object({ licenseGroupType: z6.number() })), eventTypes: z6.array(z6.object({ eventType: z6.number() })), sessionTypes: z6.array(z6.object({ sessionType: z6.number() })), canJoin: z6.boolean(), image: z6.optional(z6.object({ smallLogo: z6.string(), largeLogo: z6.nullable(z6.string()) })), owner: z6.boolean(), admin: z6.boolean(), friends: z6.optional(z6.array(z6.unknown())), watched: z6.optional(z6.array(z6.unknown())), endTime: z6.string(), populated: z6.boolean(), teamEntryCount: z6.number(), isHeatRacing: z6.boolean(), broadcaster: z6.boolean(), minIr: z6.number(), maxIr: z6.number(), sessionDesc: z6.optional(z6.string()), raceLengthType: z6.optional(z6.number()) })), success: z6.boolean(), packageId: z6.optional(z6.number()) }); var LeagueDirectory = z6.object({ resultsPage: z6.array(z6.object({ leagueId: z6.number(), ownerId: z6.number(), leagueName: z6.string(), created: z6.string(), about: z6.optional(z6.string()), url: z6.optional(z6.string()), rosterCount: z6.number(), recruiting: z6.boolean(), isAdmin: z6.boolean(), isMember: z6.boolean(), pendingApplication: z6.boolean(), pendingInvitation: z6.boolean(), owner: z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }), carNumber: z6.nullable(z6.string()), nickName: z6.nullable(z6.string()) }) })), success: z6.boolean(), lowerbound: z6.number(), upperbound: z6.number(), rowCount: z6.number() }); var LeagueGet = z6.object({ leagueId: z6.number(), ownerId: z6.number(), leagueName: z6.string(), created: z6.string(), hidden: z6.boolean(), message: z6.string(), about: z6.string(), recruiting: z6.boolean(), privateWall: z6.boolean(), privateRoster: z6.boolean(), privateSchedule: z6.boolean(), privateResults: z6.boolean(), isOwner: z6.boolean(), isAdmin: z6.boolean(), rosterCount: z6.number(), owner: z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }), carNumber: z6.nullable(z6.unknown()), nickName: z6.nullable(z6.unknown()) }), image: z6.object({ smallLogo: z6.nullable(z6.unknown()), largeLogo: z6.nullable(z6.unknown()) }), tags: z6.object({ categorized: z6.array(z6.object({ categoryId: z6.number(), name: z6.string(), limit: z6.nullable(z6.number()), tags: z6.array(z6.object({ tagId: z6.number(), tagName: z6.string() })) })), notCategorized: z6.array(z6.unknown()) }), leagueApplications: z6.array(z6.unknown()), pendingRequests: z6.array(z6.unknown()), isMember: z6.boolean(), isApplicant: z6.boolean(), isInvite: z6.boolean(), isIgnored: z6.boolean(), roster: z6.array(z6.object({ custId: z6.number(), displayName: z6.string(), helmet: z6.object({ pattern: z6.number(), color1: z6.string(), color2: z6.string(), color3: z6.string(), faceType: z6.number(), helmetType: z6.number() }), owner: z6.boolean(), admin: z6.boolean(), leagueMailOptOut: z6.boolean(), leaguePmOptOut: z6.boolean(), leagueMemberSince: z6.string(), carNumber: z6.nullable(z6.string()), nickName: z6.string() })) }); var LeagueGetPointsSystems = z6.object({ subscribed: z6.boolean(), success: z6.boolean(), pointsSystems: z6.array(z6.object({ pointsSystemId: z6.number(), name: z6.string(), description: z6.string(), leagueId: z6.number(), retired: z6.boolean(), iracingSystem: z6.boolean() })), leagueId: z6.number(), seasonId: z6.optional(z6.number()) }); var LeagueMembership = z6.array(z6.object({ leagueId: z6.number(), leagueName: z6.string(), owner: z6.boolean(), admin: z6.boolean(), leagueMailOptOut: z6.boolean(), leaguePmOptOut: z6.boolean(), carNumber: z6.nullable(z6.string()), nickName: z6.nullable(z6.string()) })); var LeagueRoster = z6.object({ type: z6.string(), data: z6.object({ subscribed: z6.boolean(), success: z6.boolean(), rosterCount: z6.number(), leagueId: z6.number() }), dataUrl: z6.string() }); var LeagueSeasons = z6.object({ subscribed: z6.boolean(), seasons: z6.array(z6.object({ leagueId: z6.number(), seasonId: z6.number(), pointsSystemId: z6.number(), seasonName: z6.string(), active: z6.boolean(), hidden: z6.boolean(), numDrops: z6.number(), noDropsOnOrAfterRaceNum: z6.number(), pointsCars: z6.array(z6.object({ carId: z6.number(), carName: z6.string() })),