odds-api-io 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +329 -0
- package/dist/cjs/client.js +426 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.js +73 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/client.js +422 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.js +64 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.js +5 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/client.d.ts +275 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/errors.d.ts +40 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types.d.ts +180 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OddsAPIClient = void 0;
|
|
4
|
+
const errors_js_1 = require("./errors.js");
|
|
5
|
+
const DEFAULT_BASE_URL = 'https://api2.odds-api.io/v3';
|
|
6
|
+
const DEFAULT_TIMEOUT = 10000;
|
|
7
|
+
/**
|
|
8
|
+
* Official Node.js client for Odds-API.io
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { OddsAPIClient } from 'odds-api-io';
|
|
13
|
+
*
|
|
14
|
+
* const client = new OddsAPIClient({ apiKey: 'your-api-key' });
|
|
15
|
+
* const sports = await client.getSports();
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
class OddsAPIClient {
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.apiKey = config.apiKey;
|
|
21
|
+
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
22
|
+
this.timeout = config.timeout || DEFAULT_TIMEOUT;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Make a GET request to the API
|
|
26
|
+
*/
|
|
27
|
+
async request(path, params = {}, requiresAuth = false) {
|
|
28
|
+
const url = new URL(`${this.baseUrl}/${path}`);
|
|
29
|
+
// Add query parameters
|
|
30
|
+
if (requiresAuth) {
|
|
31
|
+
params.apiKey = this.apiKey;
|
|
32
|
+
}
|
|
33
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
34
|
+
if (value !== undefined && value !== null) {
|
|
35
|
+
url.searchParams.append(key, String(value));
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const controller = new AbortController();
|
|
39
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(url.toString(), {
|
|
42
|
+
method: 'GET',
|
|
43
|
+
signal: controller.signal,
|
|
44
|
+
headers: {
|
|
45
|
+
'User-Agent': 'odds-api-io-node-sdk/1.0.0',
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
clearTimeout(timeoutId);
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
await this.handleErrorResponse(response);
|
|
51
|
+
}
|
|
52
|
+
return (await response.json());
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
clearTimeout(timeoutId);
|
|
56
|
+
if (error.name === 'AbortError') {
|
|
57
|
+
throw new errors_js_1.TimeoutError(`Request timeout after ${this.timeout}ms`);
|
|
58
|
+
}
|
|
59
|
+
if (error instanceof errors_js_1.OddsAPIError) {
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
throw new errors_js_1.NetworkError(`Network request failed: ${error.message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Make a PUT request to the API
|
|
67
|
+
*/
|
|
68
|
+
async requestPut(path, params = {}, requiresAuth = false) {
|
|
69
|
+
const url = new URL(`${this.baseUrl}/${path}`);
|
|
70
|
+
// Add query parameters
|
|
71
|
+
if (requiresAuth) {
|
|
72
|
+
params.apiKey = this.apiKey;
|
|
73
|
+
}
|
|
74
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
75
|
+
if (value !== undefined && value !== null) {
|
|
76
|
+
url.searchParams.append(key, String(value));
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetch(url.toString(), {
|
|
83
|
+
method: 'PUT',
|
|
84
|
+
signal: controller.signal,
|
|
85
|
+
headers: {
|
|
86
|
+
'User-Agent': 'odds-api-io-node-sdk/1.0.0',
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
clearTimeout(timeoutId);
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
await this.handleErrorResponse(response);
|
|
92
|
+
}
|
|
93
|
+
return (await response.json());
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
clearTimeout(timeoutId);
|
|
97
|
+
if (error.name === 'AbortError') {
|
|
98
|
+
throw new errors_js_1.TimeoutError(`Request timeout after ${this.timeout}ms`);
|
|
99
|
+
}
|
|
100
|
+
if (error instanceof errors_js_1.OddsAPIError) {
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
throw new errors_js_1.NetworkError(`Network request failed: ${error.message}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Handle error responses from the API
|
|
108
|
+
*/
|
|
109
|
+
async handleErrorResponse(response) {
|
|
110
|
+
const status = response.status;
|
|
111
|
+
let errorMessage;
|
|
112
|
+
try {
|
|
113
|
+
const errorBody = await response.text();
|
|
114
|
+
errorMessage = errorBody || response.statusText;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
errorMessage = response.statusText;
|
|
118
|
+
}
|
|
119
|
+
switch (status) {
|
|
120
|
+
case 401:
|
|
121
|
+
throw new errors_js_1.InvalidAPIKeyError('Invalid API key');
|
|
122
|
+
case 429:
|
|
123
|
+
throw new errors_js_1.RateLimitExceededError('Rate limit exceeded - please wait before retrying');
|
|
124
|
+
case 404:
|
|
125
|
+
throw new errors_js_1.NotFoundError('Resource not found');
|
|
126
|
+
default:
|
|
127
|
+
throw new errors_js_1.OddsAPIError(`API error ${status}: ${errorMessage}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// ============================================================================
|
|
131
|
+
// SPORTS & LEAGUES
|
|
132
|
+
// ============================================================================
|
|
133
|
+
/**
|
|
134
|
+
* Get all available sports
|
|
135
|
+
*
|
|
136
|
+
* @returns List of available sports
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const sports = await client.getSports();
|
|
141
|
+
* console.log(`Found ${sports.length} sports`);
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
async getSports() {
|
|
145
|
+
return this.request('sports');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get leagues for a specific sport
|
|
149
|
+
*
|
|
150
|
+
* @param sport - Sport identifier (e.g., 'basketball', 'football')
|
|
151
|
+
* @returns List of leagues
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```typescript
|
|
155
|
+
* const leagues = await client.getLeagues('basketball');
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
async getLeagues(sport) {
|
|
159
|
+
return this.request('leagues', { sport }, true);
|
|
160
|
+
}
|
|
161
|
+
// ============================================================================
|
|
162
|
+
// EVENTS
|
|
163
|
+
// ============================================================================
|
|
164
|
+
/**
|
|
165
|
+
* Get events with optional filters
|
|
166
|
+
*
|
|
167
|
+
* @param params - Event filter parameters
|
|
168
|
+
* @returns List of events
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* const events = await client.getEvents({
|
|
173
|
+
* sport: 'basketball',
|
|
174
|
+
* league: 'usa-nba'
|
|
175
|
+
* });
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
async getEvents(params) {
|
|
179
|
+
return this.request('events', params, true);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get a specific event by ID
|
|
183
|
+
*
|
|
184
|
+
* @param eventId - Event ID
|
|
185
|
+
* @returns Event details
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```typescript
|
|
189
|
+
* const event = await client.getEventById('62924717');
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
async getEventById(eventId) {
|
|
193
|
+
return this.request(`events/${eventId}`, {}, true);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get currently live events for a sport
|
|
197
|
+
*
|
|
198
|
+
* @param sport - Sport identifier
|
|
199
|
+
* @returns List of live events
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* ```typescript
|
|
203
|
+
* const liveEvents = await client.getLiveEvents('basketball');
|
|
204
|
+
* ```
|
|
205
|
+
*/
|
|
206
|
+
async getLiveEvents(sport) {
|
|
207
|
+
return this.request('events/live', { sport }, true);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Search for events by keyword
|
|
211
|
+
*
|
|
212
|
+
* @param query - Search query
|
|
213
|
+
* @returns List of matching events
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```typescript
|
|
217
|
+
* const events = await client.searchEvents('Lakers');
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
async searchEvents(query) {
|
|
221
|
+
return this.request('events/search', { query }, true);
|
|
222
|
+
}
|
|
223
|
+
// ============================================================================
|
|
224
|
+
// ODDS
|
|
225
|
+
// ============================================================================
|
|
226
|
+
/**
|
|
227
|
+
* Get odds for a specific event
|
|
228
|
+
*
|
|
229
|
+
* @param params - Odds query parameters
|
|
230
|
+
* @returns Event odds data
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* ```typescript
|
|
234
|
+
* const odds = await client.getEventOdds({
|
|
235
|
+
* eventId: '62924717',
|
|
236
|
+
* bookmakers: 'pinnacle,bet365'
|
|
237
|
+
* });
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
async getEventOdds(params) {
|
|
241
|
+
return this.request('odds', params, true);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Track odds movements for an event
|
|
245
|
+
*
|
|
246
|
+
* @param params - Odds movement parameters
|
|
247
|
+
* @returns Historical odds movements
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
* ```typescript
|
|
251
|
+
* const movements = await client.getOddsMovement({
|
|
252
|
+
* eventId: '62924717',
|
|
253
|
+
* bookmaker: 'pinnacle',
|
|
254
|
+
* market: 'moneyline'
|
|
255
|
+
* });
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
async getOddsMovement(params) {
|
|
259
|
+
return this.request('odds/movements', params, true);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get odds for multiple events at once
|
|
263
|
+
*
|
|
264
|
+
* @param params - Multi-event odds parameters
|
|
265
|
+
* @returns Array of event odds
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* ```typescript
|
|
269
|
+
* const odds = await client.getOddsForMultipleEvents({
|
|
270
|
+
* eventIds: '12345,67890',
|
|
271
|
+
* bookmakers: 'pinnacle,bet365'
|
|
272
|
+
* });
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
async getOddsForMultipleEvents(params) {
|
|
276
|
+
return this.request('odds/multi', params, true);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get odds updated since a given timestamp
|
|
280
|
+
*
|
|
281
|
+
* @param params - Updated odds parameters
|
|
282
|
+
* @returns Array of updated event odds
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* ```typescript
|
|
286
|
+
* const updatedOdds = await client.getUpdatedOddsSince({
|
|
287
|
+
* since: Date.now() - 3600000, // Last hour
|
|
288
|
+
* bookmaker: 'pinnacle',
|
|
289
|
+
* sport: 'basketball'
|
|
290
|
+
* });
|
|
291
|
+
* ```
|
|
292
|
+
*/
|
|
293
|
+
async getUpdatedOddsSince(params) {
|
|
294
|
+
return this.request('odds/updated', params, true);
|
|
295
|
+
}
|
|
296
|
+
// ============================================================================
|
|
297
|
+
// PARTICIPANTS
|
|
298
|
+
// ============================================================================
|
|
299
|
+
/**
|
|
300
|
+
* Get participants (teams/players) for a sport
|
|
301
|
+
*
|
|
302
|
+
* @param params - Participant query parameters
|
|
303
|
+
* @returns List of participants
|
|
304
|
+
*
|
|
305
|
+
* @example
|
|
306
|
+
* ```typescript
|
|
307
|
+
* const participants = await client.getParticipants({
|
|
308
|
+
* sport: 'basketball',
|
|
309
|
+
* search: 'Warriors'
|
|
310
|
+
* });
|
|
311
|
+
* ```
|
|
312
|
+
*/
|
|
313
|
+
async getParticipants(params) {
|
|
314
|
+
return this.request('participants', params, true);
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Get a specific participant by ID
|
|
318
|
+
*
|
|
319
|
+
* @param participantId - Participant ID
|
|
320
|
+
* @returns Participant details
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* ```typescript
|
|
324
|
+
* const participant = await client.getParticipantById(3428);
|
|
325
|
+
* ```
|
|
326
|
+
*/
|
|
327
|
+
async getParticipantById(participantId) {
|
|
328
|
+
return this.request(`participants/${participantId}`, {}, true);
|
|
329
|
+
}
|
|
330
|
+
// ============================================================================
|
|
331
|
+
// BOOKMAKERS
|
|
332
|
+
// ============================================================================
|
|
333
|
+
/**
|
|
334
|
+
* Get all available bookmakers
|
|
335
|
+
*
|
|
336
|
+
* @returns List of bookmakers
|
|
337
|
+
*
|
|
338
|
+
* @example
|
|
339
|
+
* ```typescript
|
|
340
|
+
* const bookmakers = await client.getBookmakers();
|
|
341
|
+
* ```
|
|
342
|
+
*/
|
|
343
|
+
async getBookmakers() {
|
|
344
|
+
return this.request('bookmakers');
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Get your selected bookmakers
|
|
348
|
+
*
|
|
349
|
+
* @returns List of selected bookmakers
|
|
350
|
+
*
|
|
351
|
+
* @example
|
|
352
|
+
* ```typescript
|
|
353
|
+
* const selected = await client.getSelectedBookmakers();
|
|
354
|
+
* ```
|
|
355
|
+
*/
|
|
356
|
+
async getSelectedBookmakers() {
|
|
357
|
+
return this.request('bookmakers/selected', {}, true);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Select specific bookmakers for your account
|
|
361
|
+
*
|
|
362
|
+
* @param bookmakers - Comma-separated bookmaker IDs
|
|
363
|
+
* @returns Success response
|
|
364
|
+
*
|
|
365
|
+
* @example
|
|
366
|
+
* ```typescript
|
|
367
|
+
* await client.selectBookmakers('pinnacle,bet365');
|
|
368
|
+
* ```
|
|
369
|
+
*/
|
|
370
|
+
async selectBookmakers(bookmakers) {
|
|
371
|
+
return this.requestPut('bookmakers/selected/select', { bookmakers }, true);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Clear your selected bookmakers
|
|
375
|
+
*
|
|
376
|
+
* @returns Success response
|
|
377
|
+
*
|
|
378
|
+
* @example
|
|
379
|
+
* ```typescript
|
|
380
|
+
* await client.clearSelectedBookmakers();
|
|
381
|
+
* ```
|
|
382
|
+
*/
|
|
383
|
+
async clearSelectedBookmakers() {
|
|
384
|
+
return this.requestPut('bookmakers/selected/clear', {}, true);
|
|
385
|
+
}
|
|
386
|
+
// ============================================================================
|
|
387
|
+
// BETTING ANALYSIS
|
|
388
|
+
// ============================================================================
|
|
389
|
+
/**
|
|
390
|
+
* Find arbitrage betting opportunities
|
|
391
|
+
*
|
|
392
|
+
* @param params - Arbitrage bet parameters
|
|
393
|
+
* @returns List of arbitrage opportunities
|
|
394
|
+
*
|
|
395
|
+
* @example
|
|
396
|
+
* ```typescript
|
|
397
|
+
* const arbs = await client.getArbitrageBets({
|
|
398
|
+
* bookmakers: 'pinnacle,bet365',
|
|
399
|
+
* limit: 10,
|
|
400
|
+
* includeEventDetails: true
|
|
401
|
+
* });
|
|
402
|
+
* ```
|
|
403
|
+
*/
|
|
404
|
+
async getArbitrageBets(params) {
|
|
405
|
+
return this.request('arbitrage-bets', params, true);
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Find value betting opportunities
|
|
409
|
+
*
|
|
410
|
+
* @param params - Value bet parameters
|
|
411
|
+
* @returns List of value bets
|
|
412
|
+
*
|
|
413
|
+
* @example
|
|
414
|
+
* ```typescript
|
|
415
|
+
* const valueBets = await client.getValueBets({
|
|
416
|
+
* bookmaker: 'pinnacle',
|
|
417
|
+
* includeEventDetails: true
|
|
418
|
+
* });
|
|
419
|
+
* ```
|
|
420
|
+
*/
|
|
421
|
+
async getValueBets(params) {
|
|
422
|
+
return this.request('value-bets', params, true);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
exports.OddsAPIClient = OddsAPIClient;
|
|
426
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Custom error classes for Odds-API.io client
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.NetworkError = exports.TimeoutError = exports.NotFoundError = exports.RateLimitExceededError = exports.InvalidAPIKeyError = exports.OddsAPIError = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Base error class for all Odds-API.io errors
|
|
9
|
+
*/
|
|
10
|
+
class OddsAPIError extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'OddsAPIError';
|
|
14
|
+
Object.setPrototypeOf(this, OddsAPIError.prototype);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.OddsAPIError = OddsAPIError;
|
|
18
|
+
/**
|
|
19
|
+
* Thrown when the API key is invalid or missing
|
|
20
|
+
*/
|
|
21
|
+
class InvalidAPIKeyError extends OddsAPIError {
|
|
22
|
+
constructor(message = 'Invalid API key') {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = 'InvalidAPIKeyError';
|
|
25
|
+
Object.setPrototypeOf(this, InvalidAPIKeyError.prototype);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.InvalidAPIKeyError = InvalidAPIKeyError;
|
|
29
|
+
/**
|
|
30
|
+
* Thrown when rate limit is exceeded
|
|
31
|
+
*/
|
|
32
|
+
class RateLimitExceededError extends OddsAPIError {
|
|
33
|
+
constructor(message = 'Rate limit exceeded - please wait before retrying') {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = 'RateLimitExceededError';
|
|
36
|
+
Object.setPrototypeOf(this, RateLimitExceededError.prototype);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.RateLimitExceededError = RateLimitExceededError;
|
|
40
|
+
/**
|
|
41
|
+
* Thrown when a resource is not found (404)
|
|
42
|
+
*/
|
|
43
|
+
class NotFoundError extends OddsAPIError {
|
|
44
|
+
constructor(message = 'Resource not found') {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = 'NotFoundError';
|
|
47
|
+
Object.setPrototypeOf(this, NotFoundError.prototype);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.NotFoundError = NotFoundError;
|
|
51
|
+
/**
|
|
52
|
+
* Thrown when request times out
|
|
53
|
+
*/
|
|
54
|
+
class TimeoutError extends OddsAPIError {
|
|
55
|
+
constructor(message = 'Request timeout') {
|
|
56
|
+
super(message);
|
|
57
|
+
this.name = 'TimeoutError';
|
|
58
|
+
Object.setPrototypeOf(this, TimeoutError.prototype);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.TimeoutError = TimeoutError;
|
|
62
|
+
/**
|
|
63
|
+
* Thrown when network request fails
|
|
64
|
+
*/
|
|
65
|
+
class NetworkError extends OddsAPIError {
|
|
66
|
+
constructor(message) {
|
|
67
|
+
super(message);
|
|
68
|
+
this.name = 'NetworkError';
|
|
69
|
+
Object.setPrototypeOf(this, NetworkError.prototype);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.NetworkError = NetworkError;
|
|
73
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH;;GAEG;AACH,MAAa,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACF;AAND,oCAMC;AAED;;GAEG;AACH,MAAa,kBAAmB,SAAQ,YAAY;IAClD,YAAY,UAAkB,iBAAiB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF;AAND,gDAMC;AAED;;GAEG;AACH,MAAa,sBAAuB,SAAQ,YAAY;IACtD,YAAY,UAAkB,mDAAmD;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;CACF;AAND,wDAMC;AAED;;GAEG;AACH,MAAa,aAAc,SAAQ,YAAY;IAC7C,YAAY,UAAkB,oBAAoB;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACF;AAND,sCAMC;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,YAAY;IAC5C,YAAY,UAAkB,iBAAiB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACF;AAND,oCAMC;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,YAAY;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACF;AAND,oCAMC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Odds-API.io Node.js SDK
|
|
4
|
+
*
|
|
5
|
+
* Official Node.js client for Odds-API.io - Real-time sports betting odds from 250+ bookmakers
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.NetworkError = exports.TimeoutError = exports.NotFoundError = exports.RateLimitExceededError = exports.InvalidAPIKeyError = exports.OddsAPIError = exports.OddsAPIClient = void 0;
|
|
11
|
+
var client_js_1 = require("./client.js");
|
|
12
|
+
Object.defineProperty(exports, "OddsAPIClient", { enumerable: true, get: function () { return client_js_1.OddsAPIClient; } });
|
|
13
|
+
var errors_js_1 = require("./errors.js");
|
|
14
|
+
Object.defineProperty(exports, "OddsAPIError", { enumerable: true, get: function () { return errors_js_1.OddsAPIError; } });
|
|
15
|
+
Object.defineProperty(exports, "InvalidAPIKeyError", { enumerable: true, get: function () { return errors_js_1.InvalidAPIKeyError; } });
|
|
16
|
+
Object.defineProperty(exports, "RateLimitExceededError", { enumerable: true, get: function () { return errors_js_1.RateLimitExceededError; } });
|
|
17
|
+
Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return errors_js_1.NotFoundError; } });
|
|
18
|
+
Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return errors_js_1.TimeoutError; } });
|
|
19
|
+
Object.defineProperty(exports, "NetworkError", { enumerable: true, get: function () { return errors_js_1.NetworkError; } });
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,yCAOqB;AANnB,yGAAA,YAAY,OAAA;AACZ,+GAAA,kBAAkB,OAAA;AAClB,mHAAA,sBAAsB,OAAA;AACtB,0GAAA,aAAa,OAAA;AACb,yGAAA,YAAY,OAAA;AACZ,yGAAA,YAAY,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|