@apicity/openf1 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,537 @@
1
+ import { attachExamples } from "./example.js";
2
+ import { OpenF1Error } from "./types.js";
3
+ import { OpenF1CarDataRequestSchema, OpenF1ChampionshipDriverRequestSchema, OpenF1ChampionshipTeamRequestSchema, OpenF1DriversRequestSchema, OpenF1IntervalsRequestSchema, OpenF1LapRequestSchema, OpenF1LocationRequestSchema, OpenF1MeetingsRequestSchema, OpenF1OvertakeRequestSchema, OpenF1PositionRequestSchema, OpenF1PitStopRequestSchema, OpenF1RaceControlMessageRequestSchema, OpenF1SessionResultRequestSchema, OpenF1SessionRequestSchema, OpenF1StartingGridEntryRequestSchema, OpenF1StintRequestSchema, OpenF1TeamRadioRequestSchema, OpenF1TokenRequestSchema, OpenF1WeatherRequestSchema, } from "./zod.js";
4
+ const CAR_DATA_QUERY_FIELDS = [
5
+ "brake",
6
+ "date",
7
+ "driver_number",
8
+ "drs",
9
+ "meeting_key",
10
+ "n_gear",
11
+ "rpm",
12
+ "session_key",
13
+ "speed",
14
+ "throttle",
15
+ ];
16
+ const DRIVERS_QUERY_FIELDS = [
17
+ "broadcast_name",
18
+ "country_code",
19
+ "driver_number",
20
+ "first_name",
21
+ "full_name",
22
+ "headshot_url",
23
+ "last_name",
24
+ "meeting_key",
25
+ "name_acronym",
26
+ "session_key",
27
+ "team_colour",
28
+ "team_name",
29
+ ];
30
+ const MEETINGS_QUERY_FIELDS = [
31
+ "circuit_key",
32
+ "circuit_image",
33
+ "circuit_info_url",
34
+ "circuit_short_name",
35
+ "circuit_type",
36
+ "country_code",
37
+ "country_flag",
38
+ "country_key",
39
+ "country_name",
40
+ "date_end",
41
+ "date_start",
42
+ "gmt_offset",
43
+ "is_cancelled",
44
+ "location",
45
+ "meeting_key",
46
+ "meeting_name",
47
+ "meeting_official_name",
48
+ "year",
49
+ ];
50
+ const CHAMPIONSHIP_DRIVER_QUERY_FIELDS = [
51
+ "driver_number",
52
+ "meeting_key",
53
+ "points_current",
54
+ "points_start",
55
+ "position_current",
56
+ "position_start",
57
+ "session_key",
58
+ ];
59
+ const CHAMPIONSHIP_TEAM_QUERY_FIELDS = [
60
+ "meeting_key",
61
+ "points_current",
62
+ "points_start",
63
+ "position_current",
64
+ "position_start",
65
+ "session_key",
66
+ "team_name",
67
+ ];
68
+ const INTERVALS_QUERY_FIELDS = [
69
+ "date",
70
+ "driver_number",
71
+ "gap_to_leader",
72
+ "interval",
73
+ "meeting_key",
74
+ "session_key",
75
+ ];
76
+ const LAPS_QUERY_FIELDS = [
77
+ "date_start",
78
+ "driver_number",
79
+ "duration_sector_1",
80
+ "duration_sector_2",
81
+ "duration_sector_3",
82
+ "i1_speed",
83
+ "i2_speed",
84
+ "is_pit_out_lap",
85
+ "lap_duration",
86
+ "lap_number",
87
+ "meeting_key",
88
+ "segments_sector_1",
89
+ "segments_sector_2",
90
+ "segments_sector_3",
91
+ "session_key",
92
+ "st_speed",
93
+ ];
94
+ const LOCATION_QUERY_FIELDS = [
95
+ "date",
96
+ "driver_number",
97
+ "meeting_key",
98
+ "session_key",
99
+ "x",
100
+ "y",
101
+ "z",
102
+ ];
103
+ const OVERTAKES_QUERY_FIELDS = [
104
+ "date",
105
+ "meeting_key",
106
+ "overtaken_driver_number",
107
+ "overtaking_driver_number",
108
+ "position",
109
+ "session_key",
110
+ ];
111
+ const POSITION_QUERY_FIELDS = [
112
+ "date",
113
+ "driver_number",
114
+ "meeting_key",
115
+ "position",
116
+ "session_key",
117
+ ];
118
+ const PIT_STOP_QUERY_FIELDS = [
119
+ "date",
120
+ "driver_number",
121
+ "lane_duration",
122
+ "lap_number",
123
+ "meeting_key",
124
+ "pit_duration",
125
+ "session_key",
126
+ "stop_duration",
127
+ ];
128
+ const RACE_CONTROL_QUERY_FIELDS = [
129
+ "category",
130
+ "date",
131
+ "driver_number",
132
+ "flag",
133
+ "lap_number",
134
+ "meeting_key",
135
+ "message",
136
+ "qualifying_phase",
137
+ "scope",
138
+ "sector",
139
+ "session_key",
140
+ ];
141
+ const SESSION_RESULT_QUERY_FIELDS = [
142
+ "dnf",
143
+ "dns",
144
+ "dsq",
145
+ "driver_number",
146
+ "duration",
147
+ "gap_to_leader",
148
+ "number_of_laps",
149
+ "meeting_key",
150
+ "position",
151
+ "session_key",
152
+ ];
153
+ const SESSIONS_QUERY_FIELDS = [
154
+ "circuit_key",
155
+ "circuit_short_name",
156
+ "country_code",
157
+ "country_key",
158
+ "country_name",
159
+ "date_end",
160
+ "date_start",
161
+ "gmt_offset",
162
+ "is_cancelled",
163
+ "location",
164
+ "meeting_key",
165
+ "session_key",
166
+ "session_name",
167
+ "session_type",
168
+ "year",
169
+ ];
170
+ const STARTING_GRID_QUERY_FIELDS = [
171
+ "driver_number",
172
+ "lap_duration",
173
+ "meeting_key",
174
+ "position",
175
+ "session_key",
176
+ ];
177
+ const TEAM_RADIO_QUERY_FIELDS = [
178
+ "date",
179
+ "driver_number",
180
+ "meeting_key",
181
+ "recording_url",
182
+ "session_key",
183
+ ];
184
+ const WEATHER_QUERY_FIELDS = [
185
+ "air_temperature",
186
+ "date",
187
+ "humidity",
188
+ "meeting_key",
189
+ "pressure",
190
+ "rainfall",
191
+ "session_key",
192
+ "track_temperature",
193
+ "wind_direction",
194
+ "wind_speed",
195
+ ];
196
+ const STINTS_QUERY_FIELDS = [
197
+ "compound",
198
+ "driver_number",
199
+ "lap_end",
200
+ "lap_start",
201
+ "meeting_key",
202
+ "session_key",
203
+ "stint_number",
204
+ "tyre_age_at_start",
205
+ ];
206
+ function isErrorBody(value) {
207
+ return typeof value === "object" && value !== null;
208
+ }
209
+ function formatErrorMessage(status, body) {
210
+ if (isErrorBody(body)) {
211
+ const message = body.detail ?? body.error ?? body.message ?? body.title;
212
+ if (message) {
213
+ return `OpenF1 API error ${status}: ${message}`;
214
+ }
215
+ }
216
+ if (typeof body === "string" && body.length > 0) {
217
+ return `OpenF1 API error ${status}: ${body}`;
218
+ }
219
+ return `OpenF1 API error: ${status}`;
220
+ }
221
+ function attachAbortHandler(signal, controller) {
222
+ if (signal.aborted) {
223
+ controller.abort();
224
+ return;
225
+ }
226
+ signal.addEventListener("abort", () => controller.abort(), { once: true });
227
+ }
228
+ function addQueryValue(qs, key, value) {
229
+ if (value === undefined) {
230
+ return;
231
+ }
232
+ if (Array.isArray(value)) {
233
+ for (const item of value) {
234
+ qs.append(key, String(item));
235
+ }
236
+ return;
237
+ }
238
+ qs.append(key, String(value));
239
+ }
240
+ function addComparisonFilter(qs, filter) {
241
+ const key = filter.op === "=" ? filter.field : `${filter.field}${filter.op}`;
242
+ qs.append(key, String(filter.value));
243
+ }
244
+ function buildQuery(req, fields) {
245
+ const qs = new URLSearchParams();
246
+ for (const field of fields) {
247
+ addQueryValue(qs, field, req[field]);
248
+ }
249
+ for (const filter of req.filters ?? []) {
250
+ addComparisonFilter(qs, filter);
251
+ }
252
+ if (req.csv === true) {
253
+ qs.append("csv", "true");
254
+ }
255
+ const query = qs.toString();
256
+ return query ? `?${query}` : "";
257
+ }
258
+ export function createOpenF1(opts) {
259
+ const baseURL = (opts?.baseURL ?? "https://api.openf1.org").replace(/\/+$/, "");
260
+ const doFetch = opts?.fetch ?? fetch;
261
+ const timeout = opts?.timeout ?? 30000;
262
+ async function parseBody(res) {
263
+ const text = await res.text();
264
+ if (text.length === 0) {
265
+ return null;
266
+ }
267
+ try {
268
+ return JSON.parse(text);
269
+ }
270
+ catch {
271
+ return text;
272
+ }
273
+ }
274
+ async function resolveAccessToken() {
275
+ if (opts?.tokenProvider) {
276
+ return opts.tokenProvider();
277
+ }
278
+ return opts?.accessToken;
279
+ }
280
+ async function makeGetRequest(path, signal, responseKind = "json") {
281
+ const controller = new AbortController();
282
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
283
+ if (signal) {
284
+ attachAbortHandler(signal, controller);
285
+ }
286
+ try {
287
+ const headers = {};
288
+ const accessToken = await resolveAccessToken();
289
+ if (accessToken) {
290
+ headers.Authorization = `Bearer ${accessToken}`;
291
+ }
292
+ const res = await doFetch(`${baseURL}${path}`, {
293
+ method: "GET",
294
+ headers,
295
+ signal: controller.signal,
296
+ });
297
+ clearTimeout(timeoutId);
298
+ if (!res.ok) {
299
+ const body = await parseBody(res);
300
+ throw new OpenF1Error(formatErrorMessage(res.status, body), res.status, body);
301
+ }
302
+ if (responseKind === "text") {
303
+ return (await res.text());
304
+ }
305
+ const body = await parseBody(res);
306
+ return body;
307
+ }
308
+ catch (error) {
309
+ clearTimeout(timeoutId);
310
+ if (error instanceof OpenF1Error)
311
+ throw error;
312
+ throw new OpenF1Error(`OpenF1 request failed: ${error}`, 500);
313
+ }
314
+ }
315
+ async function makeTokenRequest(req, signal) {
316
+ const controller = new AbortController();
317
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
318
+ if (signal) {
319
+ attachAbortHandler(signal, controller);
320
+ }
321
+ const form = new URLSearchParams();
322
+ form.set("username", req.username);
323
+ form.set("password", req.password);
324
+ try {
325
+ const res = await doFetch(`${baseURL}/token`, {
326
+ method: "POST",
327
+ headers: {
328
+ "Content-Type": "application/x-www-form-urlencoded",
329
+ },
330
+ body: form.toString(),
331
+ signal: controller.signal,
332
+ });
333
+ clearTimeout(timeoutId);
334
+ if (!res.ok) {
335
+ const body = await parseBody(res);
336
+ throw new OpenF1Error(formatErrorMessage(res.status, body), res.status, body);
337
+ }
338
+ const body = await parseBody(res);
339
+ return body;
340
+ }
341
+ catch (error) {
342
+ clearTimeout(timeoutId);
343
+ if (error instanceof OpenF1Error)
344
+ throw error;
345
+ throw new OpenF1Error(`OpenF1 request failed: ${error}`, 500);
346
+ }
347
+ }
348
+ // POST https://api.openf1.org/token
349
+ // Docs: https://openf1.org/auth.html
350
+ const token = Object.assign(async (req, signal) => makeTokenRequest(req, signal), { schema: OpenF1TokenRequestSchema });
351
+ // GET https://api.openf1.org/v1/car_data{query}
352
+ // Docs: https://openf1.org/docs/#car-data
353
+ const carData = Object.assign(async (req = {}, signal) => {
354
+ const query = buildQuery(req, CAR_DATA_QUERY_FIELDS);
355
+ if (req.csv === true) {
356
+ return makeGetRequest(`/v1/car_data${query}`, signal, "text");
357
+ }
358
+ return makeGetRequest(`/v1/car_data${query}`, signal);
359
+ }, { schema: OpenF1CarDataRequestSchema });
360
+ // GET https://api.openf1.org/v1/drivers{query}
361
+ // Docs: https://openf1.org/docs/#drivers
362
+ const drivers = Object.assign(async (req = {}, signal) => {
363
+ const query = buildQuery(req, DRIVERS_QUERY_FIELDS);
364
+ if (req.csv === true) {
365
+ return makeGetRequest(`/v1/drivers${query}`, signal, "text");
366
+ }
367
+ return makeGetRequest(`/v1/drivers${query}`, signal);
368
+ }, { schema: OpenF1DriversRequestSchema });
369
+ // GET https://api.openf1.org/v1/meetings{query}
370
+ // Docs: https://openf1.org/docs/#meetings
371
+ const meetings = Object.assign(async (req = {}, signal) => {
372
+ const query = buildQuery(req, MEETINGS_QUERY_FIELDS);
373
+ if (req.csv === true) {
374
+ return makeGetRequest(`/v1/meetings${query}`, signal, "text");
375
+ }
376
+ return makeGetRequest(`/v1/meetings${query}`, signal);
377
+ }, { schema: OpenF1MeetingsRequestSchema });
378
+ // GET https://api.openf1.org/v1/championship_drivers{query}
379
+ // Docs: https://openf1.org/docs/#drivers-championship-beta
380
+ const championshipDrivers = Object.assign(async (req = {}, signal) => {
381
+ const query = buildQuery(req, CHAMPIONSHIP_DRIVER_QUERY_FIELDS);
382
+ if (req.csv === true) {
383
+ return makeGetRequest(`/v1/championship_drivers${query}`, signal, "text");
384
+ }
385
+ return makeGetRequest(`/v1/championship_drivers${query}`, signal);
386
+ }, { schema: OpenF1ChampionshipDriverRequestSchema });
387
+ // GET https://api.openf1.org/v1/championship_teams{query}
388
+ // Docs: https://openf1.org/docs/#teams-championship-beta
389
+ const championshipTeams = Object.assign(async (req = {}, signal) => {
390
+ const query = buildQuery(req, CHAMPIONSHIP_TEAM_QUERY_FIELDS);
391
+ if (req.csv === true) {
392
+ return makeGetRequest(`/v1/championship_teams${query}`, signal, "text");
393
+ }
394
+ return makeGetRequest(`/v1/championship_teams${query}`, signal);
395
+ }, { schema: OpenF1ChampionshipTeamRequestSchema });
396
+ // GET https://api.openf1.org/v1/intervals{query}
397
+ // Docs: https://openf1.org/docs/#intervals
398
+ const intervals = Object.assign(async (req = {}, signal) => {
399
+ const query = buildQuery(req, INTERVALS_QUERY_FIELDS);
400
+ if (req.csv === true) {
401
+ return makeGetRequest(`/v1/intervals${query}`, signal, "text");
402
+ }
403
+ return makeGetRequest(`/v1/intervals${query}`, signal);
404
+ }, { schema: OpenF1IntervalsRequestSchema });
405
+ // GET https://api.openf1.org/v1/laps{query}
406
+ // Docs: https://openf1.org/docs/#laps
407
+ const laps = Object.assign(async (req = {}, signal) => {
408
+ const query = buildQuery(req, LAPS_QUERY_FIELDS);
409
+ if (req.csv === true) {
410
+ return makeGetRequest(`/v1/laps${query}`, signal, "text");
411
+ }
412
+ return makeGetRequest(`/v1/laps${query}`, signal);
413
+ }, { schema: OpenF1LapRequestSchema });
414
+ // GET https://api.openf1.org/v1/location{query}
415
+ // Docs: https://openf1.org/docs/#location
416
+ const location = Object.assign(async (req = {}, signal) => {
417
+ const query = buildQuery(req, LOCATION_QUERY_FIELDS);
418
+ if (req.csv === true) {
419
+ return makeGetRequest(`/v1/location${query}`, signal, "text");
420
+ }
421
+ return makeGetRequest(`/v1/location${query}`, signal);
422
+ }, { schema: OpenF1LocationRequestSchema });
423
+ // GET https://api.openf1.org/v1/overtakes{query}
424
+ // Docs: https://openf1.org/docs/#overtakes
425
+ const overtakes = Object.assign(async (req = {}, signal) => {
426
+ const query = buildQuery(req, OVERTAKES_QUERY_FIELDS);
427
+ if (req.csv === true) {
428
+ return makeGetRequest(`/v1/overtakes${query}`, signal, "text");
429
+ }
430
+ return makeGetRequest(`/v1/overtakes${query}`, signal);
431
+ }, { schema: OpenF1OvertakeRequestSchema });
432
+ // GET https://api.openf1.org/v1/position{query}
433
+ // Docs: https://openf1.org/docs/#position
434
+ const position = Object.assign(async (req = {}, signal) => {
435
+ const query = buildQuery(req, POSITION_QUERY_FIELDS);
436
+ if (req.csv === true) {
437
+ return makeGetRequest(`/v1/position${query}`, signal, "text");
438
+ }
439
+ return makeGetRequest(`/v1/position${query}`, signal);
440
+ }, { schema: OpenF1PositionRequestSchema });
441
+ // GET https://api.openf1.org/v1/pit{query}
442
+ // Docs: https://openf1.org/docs/#pit
443
+ const pit = Object.assign(async (req = {}, signal) => {
444
+ const query = buildQuery(req, PIT_STOP_QUERY_FIELDS);
445
+ if (req.csv === true) {
446
+ return makeGetRequest(`/v1/pit${query}`, signal, "text");
447
+ }
448
+ return makeGetRequest(`/v1/pit${query}`, signal);
449
+ }, { schema: OpenF1PitStopRequestSchema });
450
+ // GET https://api.openf1.org/v1/race_control{query}
451
+ // Docs: https://openf1.org/docs/#race-control
452
+ const raceControl = Object.assign(async (req = {}, signal) => {
453
+ const query = buildQuery(req, RACE_CONTROL_QUERY_FIELDS);
454
+ if (req.csv === true) {
455
+ return makeGetRequest(`/v1/race_control${query}`, signal, "text");
456
+ }
457
+ return makeGetRequest(`/v1/race_control${query}`, signal);
458
+ }, { schema: OpenF1RaceControlMessageRequestSchema });
459
+ // GET https://api.openf1.org/v1/session_result{query}
460
+ // Docs: https://openf1.org/docs/#session-result
461
+ const sessionResult = Object.assign(async (req = {}, signal) => {
462
+ const query = buildQuery(req, SESSION_RESULT_QUERY_FIELDS);
463
+ if (req.csv === true) {
464
+ return makeGetRequest(`/v1/session_result${query}`, signal, "text");
465
+ }
466
+ return makeGetRequest(`/v1/session_result${query}`, signal);
467
+ }, { schema: OpenF1SessionResultRequestSchema });
468
+ // GET https://api.openf1.org/v1/sessions{query}
469
+ // Docs: https://openf1.org/docs/#sessions
470
+ const sessions = Object.assign(async (req = {}, signal) => {
471
+ const query = buildQuery(req, SESSIONS_QUERY_FIELDS);
472
+ if (req.csv === true) {
473
+ return makeGetRequest(`/v1/sessions${query}`, signal, "text");
474
+ }
475
+ return makeGetRequest(`/v1/sessions${query}`, signal);
476
+ }, { schema: OpenF1SessionRequestSchema });
477
+ // GET https://api.openf1.org/v1/starting_grid{query}
478
+ // Docs: https://openf1.org/docs/#starting-grid
479
+ const startingGrid = Object.assign(async (req = {}, signal) => {
480
+ const query = buildQuery(req, STARTING_GRID_QUERY_FIELDS);
481
+ if (req.csv === true) {
482
+ return makeGetRequest(`/v1/starting_grid${query}`, signal, "text");
483
+ }
484
+ return makeGetRequest(`/v1/starting_grid${query}`, signal);
485
+ }, { schema: OpenF1StartingGridEntryRequestSchema });
486
+ // GET https://api.openf1.org/v1/team_radio{query}
487
+ // Docs: https://openf1.org/docs/#team-radio
488
+ const teamRadio = Object.assign(async (req = {}, signal) => {
489
+ const query = buildQuery(req, TEAM_RADIO_QUERY_FIELDS);
490
+ if (req.csv === true) {
491
+ return makeGetRequest(`/v1/team_radio${query}`, signal, "text");
492
+ }
493
+ return makeGetRequest(`/v1/team_radio${query}`, signal);
494
+ }, { schema: OpenF1TeamRadioRequestSchema });
495
+ // GET https://api.openf1.org/v1/weather{query}
496
+ // Docs: https://openf1.org/docs/#weather
497
+ const weather = Object.assign(async (req = {}, signal) => {
498
+ const query = buildQuery(req, WEATHER_QUERY_FIELDS);
499
+ if (req.csv === true) {
500
+ return makeGetRequest(`/v1/weather${query}`, signal, "text");
501
+ }
502
+ return makeGetRequest(`/v1/weather${query}`, signal);
503
+ }, { schema: OpenF1WeatherRequestSchema });
504
+ // GET https://api.openf1.org/v1/stints{query}
505
+ // Docs: https://openf1.org/docs/#stints
506
+ const stints = Object.assign(async (req = {}, signal) => {
507
+ const query = buildQuery(req, STINTS_QUERY_FIELDS);
508
+ if (req.csv === true) {
509
+ return makeGetRequest(`/v1/stints${query}`, signal, "text");
510
+ }
511
+ return makeGetRequest(`/v1/stints${query}`, signal);
512
+ }, { schema: OpenF1StintRequestSchema });
513
+ return attachExamples({
514
+ token,
515
+ v1: {
516
+ carData,
517
+ championshipDrivers,
518
+ championshipTeams,
519
+ drivers,
520
+ intervals,
521
+ laps,
522
+ location,
523
+ meetings,
524
+ overtakes,
525
+ position,
526
+ pit,
527
+ raceControl,
528
+ sessionResult,
529
+ sessions,
530
+ startingGrid,
531
+ stints,
532
+ teamRadio,
533
+ weather,
534
+ },
535
+ });
536
+ }
537
+ //# sourceMappingURL=openf1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openf1.js","sourceRoot":"","sources":["../../src/openf1.ts"],"names":[],"mappings":"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"}