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,224 lines (1,215 loc) 166 kB
'use strict'; var z6 = require('zod/mini'); function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var z6__namespace = /*#__PURE__*/_interopNamespace(z6); 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__namespace.object({ email: z6__namespace.optional(z6__namespace.string()), password: z6__namespace.optional(z6__namespace.string()), headers: z6__namespace.optional(z6__namespace.record(z6__namespace.string(), z6__namespace.string())), fetchFn: z6__namespace.optional(z6__namespace.any()), validateParams: z6__namespace.optional(z6__namespace.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__namespace.record(z6__namespace.string(), z6__namespace.object({ carId: z6__namespace.optional(z6__namespace.nullable(z6__namespace.number())), carRules: z6__namespace.optional(z6__namespace.nullable(z6__namespace.array(z6__namespace.unknown()))), detailCopy: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), detailScreenShotImages: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), detailTechspecsCopy: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), folder: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), galleryImages: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), galleryPrefix: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), groupImage: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), groupName: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), largeImage: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), logo: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), smallImage: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), sponsorLogo: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())), templatePath: z6__namespace.optional(z6__namespace.nullable(z6__namespace.string())) })); var CarGet = z6__namespace.array(z6__namespace.object({ aiEnabled: z6__namespace.boolean(), allowNumberColors: z6__namespace.boolean(), allowNumberFont: z6__namespace.boolean(), allowSponsor1: z6__namespace.boolean(), allowSponsor2: z6__namespace.boolean(), allowWheelColor: z6__namespace.boolean(), awardExempt: z6__namespace.boolean(), carConfigDefs: z6__namespace.array(z6__namespace.object({ carcfg: z6__namespace.number(), cfgSubdir: z6__namespace.nullable(z6__namespace.string()), customPaintExt: z6__namespace.nullable(z6__namespace.string()), name: z6__namespace.string() })), carConfigs: z6__namespace.array(z6__namespace.object({ carcfg: z6__namespace.number(), trackId: z6__namespace.optional(z6__namespace.number()), trackType: z6__namespace.optional(z6__namespace.number()) })), carDirpath: z6__namespace.string(), carId: z6__namespace.number(), carName: z6__namespace.string(), carNameAbbreviated: z6__namespace.string(), carTypes: z6__namespace.array(z6__namespace.object({ carType: z6__namespace.string() })), carWeight: z6__namespace.number(), categories: z6__namespace.array(z6__namespace.string()), created: z6__namespace.string(), firstSale: z6__namespace.string(), folder: z6__namespace.string(), forumUrl: z6__namespace.optional(z6__namespace.string()), freeWithSubscription: z6__namespace.boolean(), hasHeadlights: z6__namespace.boolean(), hasMultipleDryTireTypes: z6__namespace.boolean(), hasRainCapableTireTypes: z6__namespace.boolean(), hp: z6__namespace.number(), isPsPurchasable: z6__namespace.boolean(), logo: z6__namespace.nullable(z6__namespace.string()), maxPowerAdjustPct: z6__namespace.number(), maxWeightPenaltyKg: z6__namespace.number(), minPowerAdjustPct: z6__namespace.number(), packageId: z6__namespace.number(), patterns: z6__namespace.number(), price: z6__namespace.number(), priceDisplay: z6__namespace.optional(z6__namespace.string()), rainEnabled: z6__namespace.boolean(), retired: z6__namespace.boolean(), searchFilters: z6__namespace.string(), sku: z6__namespace.number(), smallImage: z6__namespace.string(), sponsorLogo: z6__namespace.nullable(z6__namespace.string()), carMake: z6__namespace.optional(z6__namespace.string()), carModel: z6__namespace.optional(z6__namespace.string()), paintRules: z6__namespace.optional(z6__namespace.record(z6__namespace.string(), z6__namespace.unknown())), siteUrl: z6__namespace.optional(z6__namespace.string()) })); var CarAssetsParamsSchema = z6__namespace.object({}); var CarGetParamsSchema = z6__namespace.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__namespace.object({ carDirpath: z6__namespace.string(), // maps from: car_dirpath carId: z6__namespace.number(), // maps from: car_id rainEnabled: z6__namespace.boolean(), // maps from: rain_enabled retired: z6__namespace.boolean() }); var CarclassGet = z6__namespace.array(z6__namespace.object({ carClassId: z6__namespace.number(), carsInClass: z6__namespace.array(z6__namespace.object({ carDirpath: z6__namespace.string(), carId: z6__namespace.number(), rainEnabled: z6__namespace.boolean(), retired: z6__namespace.boolean() })), custId: z6__namespace.number(), name: z6__namespace.string(), rainEnabled: z6__namespace.boolean(), relativeSpeed: z6__namespace.number(), shortName: z6__namespace.string() })); var CarclassGetParamsSchema = z6__namespace.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__namespace.array(z6__namespace.object({ label: z6__namespace.string(), value: z6__namespace.number() })); var ConstantsDivisions = z6__namespace.array(z6__namespace.object({ label: z6__namespace.string(), value: z6__namespace.number() })); var ConstantsEventTypes = z6__namespace.array(z6__namespace.object({ label: z6__namespace.string(), value: z6__namespace.number() })); var ConstantsCategoriesParamsSchema = z6__namespace.object({}); var ConstantsDivisionsParamsSchema = z6__namespace.object({}); var ConstantsEventTypesParamsSchema = z6__namespace.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__namespace.object({ ContentType: z6__namespace.literal("csv"), RawData: z6__namespace.string(), Note: z6__namespace.string() }); var DriverStatsByCategorySportsCar = z6__namespace.object({ ContentType: z6__namespace.literal("csv"), RawData: z6__namespace.string(), Note: z6__namespace.string() }); var DriverStatsByCategoryFormulaCar = z6__namespace.object({ ContentType: z6__namespace.literal("csv"), RawData: z6__namespace.string(), Note: z6__namespace.string() }); var DriverStatsByCategoryRoad = z6__namespace.object({ ContentType: z6__namespace.literal("csv"), RawData: z6__namespace.string(), Note: z6__namespace.string() }); var DriverStatsByCategoryDirtOval = z6__namespace.object({ ContentType: z6__namespace.literal("csv"), RawData: z6__namespace.string(), Note: z6__namespace.string() }); var DriverStatsByCategoryDirtRoad = z6__namespace.object({ ContentType: z6__namespace.literal("csv"), RawData: z6__namespace.string(), Note: z6__namespace.string() }); var DriverStatsByCategoryOvalParamsSchema = z6__namespace.object({}); var DriverStatsByCategorySportsCarParamsSchema = z6__namespace.object({}); var DriverStatsByCategoryFormulaCarParamsSchema = z6__namespace.object({}); var DriverStatsByCategoryRoadParamsSchema = z6__namespace.object({}); var DriverStatsByCategoryDirtOvalParamsSchema = z6__namespace.object({}); var DriverStatsByCategoryDirtRoadParamsSchema = z6__namespace.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__namespace.object({ subscribed: z6__namespace.boolean(), sequence: z6__namespace.number(), sessions: z6__namespace.array(z6__namespace.object({ numDrivers: z6__namespace.number(), numSpotters: z6__namespace.number(), numSpectators: z6__namespace.number(), numBroadcasters: z6__namespace.number(), availableReservedBroadcasterSlots: z6__namespace.number(), numSpectatorSlots: z6__namespace.number(), availableSpectatorSlots: z6__namespace.number(), canBroadcast: z6__namespace.boolean(), canWatch: z6__namespace.boolean(), canSpot: z6__namespace.boolean(), elig: z6__namespace.object({ sessionFull: z6__namespace.boolean(), canSpot: z6__namespace.boolean(), canWatch: z6__namespace.boolean(), canDrive: z6__namespace.boolean(), hasSessPassword: z6__namespace.boolean(), needsPurchase: z6__namespace.boolean(), ownCar: z6__namespace.boolean(), ownTrack: z6__namespace.boolean(), purchaseSkus: z6__namespace.array(z6__namespace.number()), registered: z6__namespace.boolean() }), driverChanges: z6__namespace.boolean(), restrictViewing: z6__namespace.boolean(), maxUsers: z6__namespace.number(), privateSessionId: z6__namespace.number(), sessionId: z6__namespace.number(), subsessionId: z6__namespace.number(), passwordProtected: z6__namespace.boolean(), sessionName: z6__namespace.string(), sessionDesc: z6__namespace.optional(z6__namespace.string()), openRegExpires: z6__namespace.string(), launchAt: z6__namespace.string(), fullCourseCautions: z6__namespace.boolean(), numFastTows: z6__namespace.number(), rollingStarts: z6__namespace.boolean(), restarts: z6__namespace.number(), multiclassType: z6__namespace.number(), pitsInUse: z6__namespace.number(), carsLeft: z6__namespace.number(), maxDrivers: z6__namespace.number(), hardcoreLevel: z6__namespace.number(), practiceLength: z6__namespace.number(), loneQualify: z6__namespace.boolean(), qualifyLaps: z6__namespace.number(), qualifyLength: z6__namespace.number(), warmupLength: z6__namespace.number(), raceLaps: z6__namespace.number(), raceLength: z6__namespace.number(), timeLimit: z6__namespace.number(), restrictResults: z6__namespace.boolean(), incidentLimit: z6__namespace.number(), incidentWarnMode: z6__namespace.number(), incidentWarnParam1: z6__namespace.number(), incidentWarnParam2: z6__namespace.number(), unsportConductRuleMode: z6__namespace.number(), connectionBlackFlag: z6__namespace.boolean(), luckyDog: z6__namespace.boolean(), minTeamDrivers: z6__namespace.number(), maxTeamDrivers: z6__namespace.number(), qualifierMustStartRace: z6__namespace.boolean(), driverChangeRule: z6__namespace.number(), fixedSetup: z6__namespace.boolean(), entryCount: z6__namespace.number(), leagueId: z6__namespace.number(), leagueSeasonId: z6__namespace.number(), sessionType: z6__namespace.number(), orderId: z6__namespace.number(), minLicenseLevel: z6__namespace.number(), maxLicenseLevel: z6__namespace.number(), status: z6__namespace.number(), paceCarId: z6__namespace.nullable(z6__namespace.number()), paceCarClassId: z6__namespace.nullable(z6__namespace.number()), numOptLaps: z6__namespace.number(), damageModel: z6__namespace.number(), doNotPaintCars: z6__namespace.boolean(), greenWhiteCheckeredLimit: z6__namespace.number(), doNotCountCautionLaps: z6__namespace.boolean(), consecCautionsSingleFile: z6__namespace.boolean(), consecCautionWithinNlaps: z6__namespace.number(), noLapperWaveArounds: z6__namespace.boolean(), shortParadeLap: z6__namespace.boolean(), startOnQualTire: z6__namespace.boolean(), telemetryRestriction: z6__namespace.number(), telemetryForceToDisk: z6__namespace.number(), maxAiDrivers: z6__namespace.number(), aiAvoidPlayers: z6__namespace.boolean(), adaptiveAiEnabled: z6__namespace.boolean(), adaptiveAiDifficulty: z6__namespace.optional(z6__namespace.number()), mustUseDiffTireTypesInRace: z6__namespace.boolean(), startZone: z6__namespace.boolean(), enablePitlaneCollisions: z6__namespace.boolean(), disallowVirtualMirror: z6__namespace.boolean(), maxVisorTearoffs: z6__namespace.number(), categoryId: z6__namespace.number(), category: z6__namespace.string(), sessionFull: z6__namespace.boolean(), host: z6__namespace.object({ custId: z6__namespace.number(), displayName: z6__namespace.string(), helmet: z6__namespace.object({ pattern: z6__namespace.number(), color1: z6__namespace.string(), color2: z6__namespace.string(), color3: z6__namespace.string(), faceType: z6__namespace.number(), helmetType: z6__namespace.number() }) }), track: z6__namespace.object({ categoryId: z6__namespace.number(), configName: z6__namespace.optional(z6__namespace.string()), trackId: z6__namespace.number(), trackName: z6__namespace.string() }), weather: z6__namespace.object({ allowFog: z6__namespace.boolean(), forecastOptions: z6__namespace.optional(z6__namespace.object({ forecastType: z6__namespace.number(), precipitation: z6__namespace.number(), skies: z6__namespace.number(), stopPrecip: z6__namespace.number(), temperature: z6__namespace.number(), weatherSeed: z6__namespace.number(), windDir: z6__namespace.number(), windSpeed: z6__namespace.number() })), precipOption: z6__namespace.number(), relHumidity: z6__namespace.number(), simulatedStartTime: z6__namespace.string(), simulatedTimeMultiplier: z6__namespace.number(), simulatedTimeOffsets: z6__namespace.array(z6__namespace.number()), skies: z6__namespace.number(), tempUnits: z6__namespace.number(), tempValue: z6__namespace.number(), timeOfDay: z6__namespace.number(), trackWater: z6__namespace.number(), version: z6__namespace.number(), weatherSummary: z6__namespace.optional(z6__namespace.object({ maxPrecipRate: z6__namespace.number(), maxPrecipRateDesc: z6__namespace.string(), precipChance: z6__namespace.number(), skiesHigh: z6__namespace.number(), skiesLow: z6__namespace.number(), tempHigh: z6__namespace.number(), tempLow: z6__namespace.number(), tempUnits: z6__namespace.number(), windDir: z6__namespace.number(), windHigh: z6__namespace.number(), windLow: z6__namespace.number(), windUnits: z6__namespace.number() })), weatherUrl: z6__namespace.optional(z6__namespace.string()), windDir: z6__namespace.number(), windUnits: z6__namespace.number(), windValue: z6__namespace.number(), fog: z6__namespace.optional(z6__namespace.number()), type: z6__namespace.optional(z6__namespace.number()) }), trackState: z6__namespace.object({ leaveMarbles: z6__namespace.boolean(), practiceRubber: z6__namespace.number(), qualifyRubber: z6__namespace.number(), raceRubber: z6__namespace.number(), warmupRubber: z6__namespace.number() }), farm: z6__namespace.object({ farmId: z6__namespace.number(), displayName: z6__namespace.string(), imagePath: z6__namespace.string(), displayed: z6__namespace.boolean() }), admins: z6__namespace.array(z6__namespace.object({ custId: z6__namespace.number(), displayName: z6__namespace.string(), helmet: z6__namespace.object({ pattern: z6__namespace.number(), color1: z6__namespace.string(), color2: z6__namespace.string(), color3: z6__namespace.string(), faceType: z6__namespace.number(), helmetType: z6__namespace.number() }) })), allowedTeams: z6__namespace.array(z6__namespace.unknown()), allowedLeagues: z6__namespace.array(z6__namespace.unknown()), cars: z6__namespace.array(z6__namespace.object({ carId: z6__namespace.number(), carName: z6__namespace.string(), carClassId: z6__namespace.number(), carClassName: z6__namespace.string(), maxPctFuelFill: z6__namespace.number(), weightPenaltyKg: z6__namespace.number(), powerAdjustPct: z6__namespace.number(), maxDryTireSets: z6__namespace.number(), packageId: z6__namespace.number() })), countByCarId: z6__namespace.object({ 112: z6__namespace.optional(z6__namespace.number()), 117: z6__namespace.optional(z6__namespace.number()), 118: z6__namespace.optional(z6__namespace.number()), 119: z6__namespace.optional(z6__namespace.number()), 128: z6__namespace.optional(z6__namespace.number()), 132: z6__namespace.optional(z6__namespace.number()), 133: z6__namespace.optional(z6__namespace.number()), 143: z6__namespace.optional(z6__namespace.number()), 146: z6__namespace.optional(z6__namespace.number()), 147: z6__namespace.optional(z6__namespace.number()), 150: z6__namespace.optional(z6__namespace.number()), 156: z6__namespace.optional(z6__namespace.number()), 157: z6__namespace.optional(z6__namespace.number()), 169: z6__namespace.optional(z6__namespace.number()), 173: z6__namespace.optional(z6__namespace.number()), 176: z6__namespace.optional(z6__namespace.number()), 184: z6__namespace.optional(z6__namespace.number()), 185: z6__namespace.optional(z6__namespace.number()), 188: z6__namespace.optional(z6__namespace.number()), 189: z6__namespace.optional(z6__namespace.number()), 190: z6__namespace.optional(z6__namespace.number()), 192: z6__namespace.optional(z6__namespace.number()), 194: z6__namespace.optional(z6__namespace.number()), 195: z6__namespace.optional(z6__namespace.number()) }), countByCarClassId: z6__namespace.object({ 0: z6__namespace.optional(z6__namespace.number()), 2708: z6__namespace.optional(z6__namespace.number()), 3104: z6__namespace.optional(z6__namespace.number()), 4073: z6__namespace.optional(z6__namespace.number()), 4076: z6__namespace.optional(z6__namespace.number()), 4083: z6__namespace.optional(z6__namespace.number()), 4084: z6__namespace.optional(z6__namespace.number()), 4085: z6__namespace.optional(z6__namespace.number()) }), carTypes: z6__namespace.array(z6__namespace.object({ carType: z6__namespace.string() })), trackTypes: z6__namespace.array(z6__namespace.object({ trackType: z6__namespace.string() })), licenseGroupTypes: z6__namespace.array(z6__namespace.object({ licenseGroupType: z6__namespace.number() })), eventTypes: z6__namespace.array(z6__namespace.object({ eventType: z6__namespace.number() })), sessionTypes: z6__namespace.array(z6__namespace.object({ sessionType: z6__namespace.number() })), canJoin: z6__namespace.boolean(), sessAdmin: z6__namespace.boolean(), friends: z6__namespace.array(z6__namespace.unknown()), watched: z6__namespace.array(z6__namespace.unknown()), endTime: z6__namespace.string(), teamEntryCount: z6__namespace.number(), isHeatRacing: z6__namespace.boolean(), populated: z6__namespace.boolean(), broadcaster: z6__namespace.boolean(), minIr: z6__namespace.number(), maxIr: z6__namespace.number(), aiMinSkill: z6__namespace.optional(z6__namespace.number()), aiMaxSkill: z6__namespace.optional(z6__namespace.number()), aiRosterName: z6__namespace.optional(z6__namespace.string()) })), success: z6__namespace.boolean(), packageId: z6__namespace.optional(z6__namespace.number()) }); var HostedSessions = z6__namespace.object({ subscribed: z6__namespace.boolean(), sessions: z6__namespace.array(z6__namespace.object({ adaptiveAiEnabled: z6__namespace.boolean(), admins: z6__namespace.array(z6__namespace.object({ custId: z6__namespace.number(), displayName: z6__namespace.string(), helmet: z6__namespace.object({ pattern: z6__namespace.number(), color1: z6__namespace.string(), color2: z6__namespace.string(), color3: z6__namespace.string(), faceType: z6__namespace.number(), helmetType: z6__namespace.number() }) })), aiAvoidPlayers: z6__namespace.boolean(), aiMaxSkill: z6__namespace.optional(z6__namespace.number()), aiMinSkill: z6__namespace.optional(z6__namespace.number()), aiRosterName: z6__namespace.optional(z6__namespace.string()), allowedLeagues: z6__namespace.array(z6__namespace.unknown()), allowedTeams: z6__namespace.array(z6__namespace.unknown()), carTypes: z6__namespace.array(z6__namespace.object({ carType: z6__namespace.string() })), cars: z6__namespace.array(z6__namespace.object({ carId: z6__namespace.number(), carName: z6__namespace.string(), carClassId: z6__namespace.number(), carClassName: z6__namespace.string(), maxPctFuelFill: z6__namespace.number(), weightPenaltyKg: z6__namespace.number(), powerAdjustPct: z6__namespace.number(), maxDryTireSets: z6__namespace.number(), packageId: z6__namespace.number() })), carsLeft: z6__namespace.number(), category: z6__namespace.string(), categoryId: z6__namespace.number(), connectionBlackFlag: z6__namespace.boolean(), consecCautionWithinNlaps: z6__namespace.number(), consecCautionsSingleFile: z6__namespace.boolean(), countByCarClassId: z6__namespace.object({ 0: z6__namespace.optional(z6__namespace.number()), 2708: z6__namespace.optional(z6__namespace.number()), 3104: z6__namespace.optional(z6__namespace.number()), 4073: z6__namespace.optional(z6__namespace.number()), 4076: z6__namespace.optional(z6__namespace.number()), 4083: z6__namespace.optional(z6__namespace.number()), 4084: z6__namespace.optional(z6__namespace.number()), 4085: z6__namespace.optional(z6__namespace.number()) }), countByCarId: z6__namespace.object({ 112: z6__namespace.optional(z6__namespace.number()), 117: z6__namespace.optional(z6__namespace.number()), 118: z6__namespace.optional(z6__namespace.number()), 119: z6__namespace.optional(z6__namespace.number()), 128: z6__namespace.optional(z6__namespace.number()), 132: z6__namespace.optional(z6__namespace.number()), 133: z6__namespace.optional(z6__namespace.number()), 143: z6__namespace.optional(z6__namespace.number()), 146: z6__namespace.optional(z6__namespace.number()), 147: z6__namespace.optional(z6__namespace.number()), 150: z6__namespace.optional(z6__namespace.number()), 156: z6__namespace.optional(z6__namespace.number()), 157: z6__namespace.optional(z6__namespace.number()), 169: z6__namespace.optional(z6__namespace.number()), 173: z6__namespace.optional(z6__namespace.number()), 176: z6__namespace.optional(z6__namespace.number()), 184: z6__namespace.optional(z6__namespace.number()), 185: z6__namespace.optional(z6__namespace.number()), 188: z6__namespace.optional(z6__namespace.number()), 189: z6__namespace.optional(z6__namespace.number()), 190: z6__namespace.optional(z6__namespace.number()), 192: z6__namespace.optional(z6__namespace.number()), 194: z6__namespace.optional(z6__namespace.number()), 195: z6__namespace.optional(z6__namespace.number()) }), damageModel: z6__namespace.number(), disallowVirtualMirror: z6__namespace.boolean(), doNotCountCautionLaps: z6__namespace.boolean(), doNotPaintCars: z6__namespace.boolean(), driverChangeRule: z6__namespace.number(), driverChanges: z6__namespace.boolean(), elig: z6__namespace.object({ sessionFull: z6__namespace.boolean(), canSpot: z6__namespace.boolean(), canWatch: z6__namespace.boolean(), canDrive: z6__namespace.boolean(), hasSessPassword: z6__namespace.boolean(), needsPurchase: z6__namespace.boolean(), ownCar: z6__namespace.boolean(), ownTrack: z6__namespace.boolean(), purchaseSkus: z6__namespace.array(z6__namespace.number()), registered: z6__namespace.boolean() }), enablePitlaneCollisions: z6__namespace.boolean(), entryCount: z6__namespace.number(), eventTypes: z6__namespace.array(z6__namespace.object({ eventType: z6__namespace.number() })), farm: z6__namespace.object({ farmId: z6__namespace.number(), displayName: z6__namespace.string(), imagePath: z6__namespace.string(), displayed: z6__namespace.boolean() }), fixedSetup: z6__namespace.boolean(), fullCourseCautions: z6__namespace.boolean(), greenWhiteCheckeredLimit: z6__namespace.number(), hardcoreLevel: z6__namespace.number(), host: z6__namespace.object({ custId: z6__namespace.number(), displayName: z6__namespace.string(), helmet: z6__namespace.object({ pattern: z6__namespace.number(), color1: z6__namespace.string(), color2: z6__namespace.string(), color3: z6__namespace.string(), faceType: z6__namespace.number(), helmetType: z6__namespace.number() }) }), incidentLimit: z6__namespace.number(), incidentWarnMode: z6__namespace.number(), incidentWarnParam1: z6__namespace.number(), incidentWarnParam2: z6__namespace.number(), launchAt: z6__namespace.string(), leagueId: z6__namespace.number(), leagueSeasonId: z6__namespace.number(), licenseGroupTypes: z6__namespace.array(z6__namespace.object({ licenseGroupType: z6__namespace.number() })), loneQualify: z6__namespace.boolean(), luckyDog: z6__namespace.boolean(), maxAiDrivers: z6__namespace.number(), maxDrivers: z6__namespace.number(), maxIr: z6__namespace.number(), maxLicenseLevel: z6__namespace.number(), maxTeamDrivers: z6__namespace.number(), maxVisorTearoffs: z6__namespace.number(), minIr: z6__namespace.number(), minLicenseLevel: z6__namespace.number(), minTeamDrivers: z6__namespace.number(), multiclassType: z6__namespace.number(), mustUseDiffTireTypesInRace: z6__namespace.boolean(), noLapperWaveArounds: z6__namespace.boolean(), numFastTows: z6__namespace.number(), numOptLaps: z6__namespace.number(), openRegExpires: z6__namespace.string(), orderId: z6__namespace.number(), paceCarClassId: z6__namespace.nullable(z6__namespace.number()), paceCarId: z6__namespace.nullable(z6__namespace.number()), passwordProtected: z6__namespace.boolean(), pitsInUse: z6__namespace.number(), practiceLength: z6__namespace.number(), privateSessionId: z6__namespace.number(), qualifierMustStartRace: z6__namespace.boolean(), qualifyLaps: z6__namespace.number(), qualifyLength: z6__namespace.number(), raceLaps: z6__namespace.number(), raceLength: z6__namespace.number(), restarts: z6__namespace.number(), restrictResults: z6__namespace.boolean(), restrictViewing: z6__namespace.boolean(), rollingStarts: z6__namespace.boolean(), sessionFull: z6__namespace.boolean(), sessionId: z6__namespace.number(), sessionName: z6__namespace.string(), sessionType: z6__namespace.number(), sessionTypes: z6__namespace.array(z6__namespace.object({ sessionType: z6__namespace.number() })), shortParadeLap: z6__namespace.boolean(), startOnQualTire: z6__namespace.boolean(), startZone: z6__namespace.boolean(), status: z6__namespace.number(), subsessionId: z6__namespace.number(), teamEntryCount: z6__namespace.number(), telemetryForceToDisk: z6__namespace.number(), telemetryRestriction: z6__namespace.number(), timeLimit: z6__namespace.number(), track: z6__namespace.object({ categoryId: z6__namespace.number(), configName: z6__namespace.optional(z6__namespace.string()), trackId: z6__namespace.number(), trackName: z6__namespace.string() }), trackState: z6__namespace.object({ leaveMarbles: z6__namespace.boolean(), practiceRubber: z6__namespace.number(), qualifyRubber: z6__namespace.number(), raceRubber: z6__namespace.number(), warmupRubber: z6__namespace.number() }), trackTypes: z6__namespace.array(z6__namespace.object({ trackType: z6__namespace.string() })), unsportConductRuleMode: z6__namespace.number(), warmupLength: z6__namespace.number(), weather: z6__namespace.object({ allowFog: z6__namespace.boolean(), forecastOptions: z6__namespace.optional(z6__namespace.object({ forecastType: z6__namespace.number(), precipitation: z6__namespace.number(), skies: z6__namespace.number(), stopPrecip: z6__namespace.number(), temperature: z6__namespace.number(), weatherSeed: z6__namespace.number(), windDir: z6__namespace.number(), windSpeed: z6__namespace.number() })), precipOption: z6__namespace.number(), relHumidity: z6__namespace.number(), simulatedStartTime: z6__namespace.string(), simulatedTimeMultiplier: z6__namespace.number(), simulatedTimeOffsets: z6__namespace.array(z6__namespace.number()), skies: z6__namespace.number(), tempUnits: z6__namespace.number(), tempValue: z6__namespace.number(), timeOfDay: z6__namespace.number(), trackWater: z6__namespace.number(), version: z6__namespace.number(), weatherSummary: z6__namespace.optional(z6__namespace.object({ maxPrecipRate: z6__namespace.number(), maxPrecipRateDesc: z6__namespace.string(), precipChance: z6__namespace.number(), skiesHigh: z6__namespace.number(), skiesLow: z6__namespace.number(), tempHigh: z6__namespace.number(), tempLow: z6__namespace.number(), tempUnits: z6__namespace.number(), windDir: z6__namespace.number(), windHigh: z6__namespace.number(), windLow: z6__namespace.number(), windUnits: z6__namespace.number() })), weatherUrl: z6__namespace.optional(z6__namespace.string()), windDir: z6__namespace.number(), windUnits: z6__namespace.number(), windValue: z6__namespace.number(), fog: z6__namespace.optional(z6__namespace.number()), type: z6__namespace.optional(z6__namespace.number()) }), adaptiveAiDifficulty: z6__namespace.optional(z6__namespace.number()), sessionDesc: z6__namespace.optional(z6__namespace.string()) })), success: z6__namespace.boolean() }); var HostedCombinedSessionsParamsSchema = z6__namespace.object({ packageId: z6__namespace.optional(z6__namespace.number()) // If set, return only sessions using this car or track package ID. // maps to: package_id }); var HostedSessionsParamsSchema = z6__namespace.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__namespace.object({ mine: z6__namespace.boolean(), subscribed: z6__namespace.boolean(), sequence: z6__namespace.number(), sessions: z6__namespace.array(z6__namespace.object({ numDrivers: z6__namespace.number(), numSpotters: z6__namespace.number(), numSpectators: z6__namespace.number(), numBroadcasters: z6__namespace.number(), availableReservedBroadcasterSlots: z6__namespace.number(), numSpectatorSlots: z6__namespace.number(), availableSpectatorSlots: z6__namespace.number(), canBroadcast: z6__namespace.boolean(), canWatch: z6__namespace.boolean(), canSpot: z6__namespace.boolean(), elig: z6__namespace.object({ sessionFull: z6__namespace.boolean(), canSpot: z6__namespace.boolean(), canWatch: z6__namespace.boolean(), canDrive: z6__namespace.boolean(), hasSessPassword: z6__namespace.boolean(), needsPurchase: z6__namespace.boolean(), ownCar: z6__namespace.boolean(), ownTrack: z6__namespace.boolean(), purchaseSkus: z6__namespace.array(z6__namespace.number()), registered: z6__namespace.boolean() }), driverChanges: z6__namespace.boolean(), restrictViewing: z6__namespace.boolean(), maxUsers: z6__namespace.number(), privateSessionId: z6__namespace.number(), sessionId: z6__namespace.optional(z6__namespace.number()), subsessionId: z6__namespace.optional(z6__namespace.number()), passwordProtected: z6__namespace.boolean(), sessionName: z6__namespace.string(), openRegExpires: z6__namespace.optional(z6__namespace.string()), launchAt: z6__namespace.string(), fullCourseCautions: z6__namespace.boolean(), numFastTows: z6__namespace.number(), rollingStarts: z6__namespace.boolean(), restarts: z6__namespace.number(), multiclassType: z6__namespace.number(), pitsInUse: z6__namespace.optional(z6__namespace.number()), carsLeft: z6__namespace.optional(z6__namespace.number()), maxDrivers: z6__namespace.number(), hardcoreLevel: z6__namespace.number(), practiceLength: z6__namespace.number(), loneQualify: z6__namespace.boolean(), qualifyLaps: z6__namespace.number(), qualifyLength: z6__namespace.number(), warmupLength: z6__namespace.number(), raceLaps: z6__namespace.number(), raceLength: z6__namespace.number(), timeLimit: z6__namespace.number(), restrictResults: z6__namespace.boolean(), incidentLimit: z6__namespace.number(), incidentWarnMode: z6__namespace.number(), incidentWarnParam1: z6__namespace.number(), incidentWarnParam2: z6__namespace.number(), unsportConductRuleMode: z6__namespace.number(), connectionBlackFlag: z6__namespace.boolean(), luckyDog: z6__namespace.boolean(), minTeamDrivers: z6__namespace.number(), maxTeamDrivers: z6__namespace.number(), qualifierMustStartRace: z6__namespace.boolean(), driverChangeRule: z6__namespace.number(), fixedSetup: z6__namespace.boolean(), entryCount: z6__namespace.number(), leagueId: z6__namespace.number(), leagueName: z6__namespace.string(), leagueSeasonId: z6__namespace.number(), leagueSeasonName: z6__namespace.string(), sessionType: z6__namespace.number(), orderId: z6__namespace.number(), minLicenseLevel: z6__namespace.number(), maxLicenseLevel: z6__namespace.number(), status: z6__namespace.number(), paceCarId: z6__namespace.nullable(z6__namespace.number()), paceCarClassId: z6__namespace.nullable(z6__namespace.number()), numOptLaps: z6__namespace.number(), damageModel: z6__namespace.number(), doNotPaintCars: z6__namespace.boolean(), greenWhiteCheckeredLimit: z6__namespace.number(), doNotCountCautionLaps: z6__namespace.boolean(), consecCautionsSingleFile: z6__namespace.boolean(), consecCautionWithinNlaps: z6__namespace.number(), noLapperWaveArounds: z6__namespace.boolean(), shortParadeLap: z6__namespace.boolean(), startOnQualTire: z6__namespace.boolean(), telemetryRestriction: z6__namespace.number(), telemetryForceToDisk: z6__namespace.number(), maxAiDrivers: z6__namespace.number(), aiAvoidPlayers: z6__namespace.boolean(), adaptiveAiEnabled: z6__namespace.boolean(), adaptiveAiDifficulty: z6__namespace.number(), mustUseDiffTireTypesInRace: z6__namespace.boolean(), startZone: z6__namespace.boolean(), enablePitlaneCollisions: z6__namespace.boolean(), disallowVirtualMirror: z6__namespace.boolean(), maxVisorTearoffs: z6__namespace.number(), categoryId: z6__namespace.number(), category: z6__name