iracing-api
Version:
Javascript client for iracing API
218 lines (217 loc) • 14.6 kB
JavaScript
import { API } from './api';
/**
* Provides methods for interacting with session result endpoints.
*/
export class ResultsAPI extends API {
constructor() {
super(...arguments);
/**
* Get the results of a specific subsession.
*
* Note: `series_logo` image paths in response are relative to `https://images-static.iracing.com/img/logos/series/`.
*
* @param {GetResultParams} params - Parameters for the request.
* @param {number} params.subsessionId - The ID of the subsession.
* @param {boolean} [params.includeLicenses=false] - Include license information in the response.
*
* @returns A promise resolving to the race result data, or undefined on error.
*/
this.getResult = async (params) => await this._getData('data/results/get', {
subsession_id: params.subsessionId,
include_licenses: params.includeLicenses,
});
/**
* Get the event log for a specific subsession and simsession.
*
* @param {GetResultsEventLogParams} params - Parameters for the request.
* @param {number} params.subsessionId - The ID of the subsession.
* @param {number} params.simsessionNumber - The simsession number (0 for main event, -1 for preceding, etc.).
* @param {Object} [options] - Options for fetching data.
* @param {boolean} [options.getAllChunks=false] - If true, fetch and combine data from all chunks (if applicable).
*
* @returns A promise resolving to the event log data, potentially combined from chunks, or throws an error if fetching fails.
*/
this.getResultsEventLog = async (params, options) => {
const data = await this._getData('data/results/event_log', {
subsession_id: params.subsessionId,
simsession_number: params.simsessionNumber,
});
if (!data) {
throw new Error('Failed to fetch event log data');
}
if (!(options === null || options === void 0 ? void 0 : options.getAllChunks) || !data.chunkInfo)
return data;
const chunkData = await Promise.all(data.chunkInfo.chunkFileNames.map((chunkFileName) => {
return this._getLinkData(`${data.chunkInfo.baseDownloadUrl}${chunkFileName}`);
}));
return Object.assign(Object.assign({}, data), { eventLog: chunkData.flatMap((chunk) => chunk) });
};
/**
* Get lap chart data for a specific subsession and simsession.
*
* @param {GetResultsLapChartDataParams} params - Parameters for the request.
* @param {number} params.subsessionId - The ID of the subsession.
* @param {number} params.simsessionNumber - The simsession number (0 for main event, -1 for preceding, etc.).
* @param {Object} [options] - Options for fetching data.
* @param {boolean} [options.getAllChunks=false] - If true, fetch and combine data from all chunks (if applicable).
*
* @returns A promise resolving to the lap chart data, potentially combined from chunks, or throws an error if fetching fails.
*/
this.getResultsLapChartData = async (params, options) => {
var _a, _b, _c;
const data = await this._getData('data/results/lap_chart_data', {
subsession_id: params.subsessionId,
simsession_number: params.simsessionNumber,
});
if (!data) {
throw new Error('Failed to fetch lap chart data');
}
if (!(options === null || options === void 0 ? void 0 : options.getAllChunks))
return data;
const chunkData = await Promise.all((_c = (_b = (_a = data.chunkInfo) === null || _a === void 0 ? void 0 : _a.chunkFileNames) === null || _b === void 0 ? void 0 : _b.map((chunkFileName) => {
var _a;
return this._getLinkData(`${(_a = data.chunkInfo) === null || _a === void 0 ? void 0 : _a.baseDownloadUrl}${chunkFileName}`);
})) !== null && _c !== void 0 ? _c : []);
return Object.assign(Object.assign({}, data), { lapChartData: chunkData.flatMap((chunk) => chunk) });
};
/**
* Get lap data for a driver or team in a specific subsession and simsession.
*
* @param {GetResultsLapDataParams} params - Parameters for the request.
* @param {number} params.subsessionId - The ID of the subsession.
* @param {number} params.simsessionNumber - The simsession number (0 for main event, -1 for preceding, etc.).
* @param {number} [params.customerId] - Required for single-driver events. Optional for team events (returns all team laps if omitted).
* @param {number} [params.teamId] - Required for team events.
*
* @param {GetResultsLapDataOptions} [options] - Options for fetching data.
* @param {boolean} [options.getAllChunks=false] - If true, fetch and combine data from all chunks (if applicable).
*
* @returns A promise resolving to the lap data, potentially combined from chunks, or throws an error if fetching fails.
*/
this.getResultsLapData = async (params, options) => {
var _a, _b, _c;
const data = await this._getData('data/results/lap_data', {
subsession_id: params.subsessionId,
simsession_number: params.simsessionNumber,
cust_id: params.customerId,
team_id: params.teamId,
});
if (!data) {
throw new Error('Failed to fetch lap data');
}
if (!(options === null || options === void 0 ? void 0 : options.getAllChunks))
return data;
const chunkData = await Promise.all((_c = (_b = (_a = data.chunkInfo) === null || _a === void 0 ? void 0 : _a.chunkFileNames) === null || _b === void 0 ? void 0 : _b.map((chunkFileName) => {
var _a;
return this._getLinkData(`${(_a = data.chunkInfo) === null || _a === void 0 ? void 0 : _a.baseDownloadUrl}${chunkFileName}`);
})) !== null && _c !== void 0 ? _c : []);
return Object.assign(Object.assign({}, data), { lapData: chunkData.flatMap((chunk) => chunk) });
};
/**
* Search for hosted and league session results.
*
* Note: Maximum time frame is 90 days. Results may be split into chunks.
* Requires one time range (`start_range_begin` or `finish_range_begin`).
* Requires one identifier (`custId`, `teamId`, `hostCustId`, `sessionName`).
*
* @param {SearchHostedParams} [params] - Search parameters.
* @param {string} [params.startRangeBegin] - Session start time range begin (ISO-8601 UTC).
* @param {string} [params.startRangeEnd] - Session start time range end (ISO-8601 UTC, exclusive).
* @param {string} [params.finishRangeBegin] - Session finish time range begin (ISO-8601 UTC).
* @param {string} [params.finishRangeEnd] - Session finish time range end (ISO-8601 UTC, exclusive).
* @param {number} [params.custId] - Participant's customer ID (ignored if `teamId` provided).
* @param {number} [params.teamId] - Team ID (takes priority over `custId`).
* @param {number} [params.hostCustId] - Host's customer ID.
* @param {string} [params.sessionName] - Partial or full session name.
* @param {number} [params.leagueId] - Filter by league ID.
* @param {number} [params.leagueSeasonId] - Filter by league season ID.
* @param {number} [params.carId] - Filter by car ID used in the session.
* @param {number} [params.trackId] - Filter by track ID used in the session.
* @param {number[]} [params.categoryIds] - Filter by track category IDs (defaults to all).
*
* @returns A promise resolving to the search results (possibly chunked), or undefined on error.
*/
this.searchHosted = async (params) => {
var _a;
return await this._getData('data/results/search_hosted', {
start_range_begin: params === null || params === void 0 ? void 0 : params.startRangeBegin,
start_range_end: params === null || params === void 0 ? void 0 : params.startRangeEnd,
finish_range_begin: params === null || params === void 0 ? void 0 : params.finishRangeBegin,
finish_range_end: params === null || params === void 0 ? void 0 : params.finishRangeEnd,
cust_id: params === null || params === void 0 ? void 0 : params.custId,
team_id: params === null || params === void 0 ? void 0 : params.teamId,
host_cust_id: params === null || params === void 0 ? void 0 : params.hostCustId,
session_name: params === null || params === void 0 ? void 0 : params.sessionName,
league_id: params === null || params === void 0 ? void 0 : params.leagueId,
league_season_id: params === null || params === void 0 ? void 0 : params.leagueSeasonId,
car_id: params === null || params === void 0 ? void 0 : params.carId,
track_id: params === null || params === void 0 ? void 0 : params.trackId,
category_ids: (_a = params === null || params === void 0 ? void 0 : params.categoryIds) === null || _a === void 0 ? void 0 : _a.join(','),
});
};
/**
* Search for official series results.
*
* Note: Maximum time frame is 90 days. Results may be split into chunks.
* Requires at least one time filter (`season_year`/`season_quarter`, `start_range_begin`, or `finish_range_begin`).
*
* @param {SearchSeriesParams} [params] - Search parameters.
* @param {number} [params.seasonYear] - Season year (requires `seasonQuarter`).
* @param {number} [params.seasonQuarter] - Season quarter (requires `seasonYear`).
* @param {string} [params.startRangeBegin] - Session start time range begin (ISO-8601 UTC).
* @param {string} [params.startRangeEnd] - Session start time range end (ISO-8601 UTC, exclusive).
* @param {string} [params.finishRangeBegin] - Session finish time range begin (ISO-8601 UTC).
* @param {string} [params.finishRangeEnd] - Session finish time range end (ISO-8601 UTC, exclusive).
* @param {number} [params.customerId] - Participant's customer ID (ignored if `teamId` provided).
* @param {number} [params.teamId] - Team ID (takes priority over `customerId`).
* @param {number} [params.seriesId] - Filter by series ID.
* @param {number} [params.raceWeekNum] - Filter by race week number (0-based).
* @param {boolean} [params.officialOnly=false] - Include only official sessions earning points.
* @param {number[]} [params.eventTypes] - Filter by event type IDs (defaults to all).
* @param {number[]} [params.categoryIds] - Filter by license category IDs (defaults to all).
*
* @returns A promise resolving to the search results (potentially combined from chunks), or the raw chunk info response if chunk fetching is not implemented/fails.
*/
this.searchSeries = async (params) => {
var _a, _b, _c, _d;
const responseData = await this._getData('data/results/search_series', {
season_year: params === null || params === void 0 ? void 0 : params.seasonYear,
season_quarter: params === null || params === void 0 ? void 0 : params.seasonQuarter,
start_range_begin: params === null || params === void 0 ? void 0 : params.startRangeBegin,
start_range_end: params === null || params === void 0 ? void 0 : params.startRangeEnd,
finish_range_begin: params === null || params === void 0 ? void 0 : params.finishRangeBegin,
finish_range_end: params === null || params === void 0 ? void 0 : params.finishRangeEnd,
cust_id: params === null || params === void 0 ? void 0 : params.customerId,
team_id: params === null || params === void 0 ? void 0 : params.teamId,
series_id: params === null || params === void 0 ? void 0 : params.seriesId,
race_week_num: params === null || params === void 0 ? void 0 : params.raceWeekNum,
official_only: params === null || params === void 0 ? void 0 : params.officialOnly,
event_types: (_a = params === null || params === void 0 ? void 0 : params.eventTypes) === null || _a === void 0 ? void 0 : _a.join(','),
category_ids: (_b = params === null || params === void 0 ? void 0 : params.categoryIds) === null || _b === void 0 ? void 0 : _b.join(','),
});
if (!((_c = responseData === null || responseData === void 0 ? void 0 : responseData.data) === null || _c === void 0 ? void 0 : _c.success) || !((_d = responseData === null || responseData === void 0 ? void 0 : responseData.data) === null || _d === void 0 ? void 0 : _d.chunk_info)) {
return responseData;
}
const { data: { chunk_info: { base_download_url, chunk_file_names }, }, } = responseData;
const chunksData = await Promise.all(chunk_file_names.map(async (chunkFileName) => {
return await this._getLinkData(`${base_download_url}${chunkFileName}`);
}));
return chunksData.flatMap((chunk) => chunk);
};
/**
* Get results for a specific season, optionally filtered by event type and race week.
*
* @param {GetSeasonResultsParams} params - Parameters for the request.
* @param {number} params.seasonId - The ID of the season.
* @param {number} [params.eventType] - Filter by event type ID (2=Practice, 3=Qualify, 4=Time Trial, 5=Race).
* @param {number} [params.raceWeekNumber] - Filter by race week number (0-based).
*
* @returns A promise resolving to the season results data, or undefined on error.
*/
this.getSeasonResults = async (params) => await this._getData('data/results/season_results', {
season_id: params.seasonId,
event_type: params.eventType,
race_week_num: params.raceWeekNumber,
});
}
}