43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
/**
|
|
* OddsAdapter — common interface every odds source must implement.
|
|
*
|
|
* The UnifiedOddsProvider calls these methods on every adapter via
|
|
* Promise.allSettled, so adapters should never throw at the module boundary
|
|
* — surface failures as a fulfilled result with `error` set, or a rejected
|
|
* promise that the orchestrator can attribute to a specific source.
|
|
*
|
|
* Return shapes:
|
|
* getGames(sport): Game[]
|
|
* getPlayerProps(sport): PlayerProp[]
|
|
*
|
|
* Game = {
|
|
* game_id, sport, away, home, start_time, status, score?,
|
|
* moneyline?: { away, home }, spread?: { line, juice }, total?: { line, juice }
|
|
* }
|
|
*
|
|
* PlayerProp = {
|
|
* game_id, player_name, player_id?, stat_type, line,
|
|
* odds_over, odds_under, book, fetched_at
|
|
* }
|
|
*/
|
|
|
|
class NotImplementedAdapter {
|
|
constructor(name) {
|
|
this.name = name;
|
|
}
|
|
async getGames(/* sport */) {
|
|
return this._notImplemented('getGames');
|
|
}
|
|
async getPlayerProps(/* sport */) {
|
|
return this._notImplemented('getPlayerProps');
|
|
}
|
|
_notImplemented(method) {
|
|
const err = new Error(`${this.name}.${method} not implemented`);
|
|
err.code = 'NOT_IMPLEMENTED';
|
|
err.skipBreaker = true; // don't penalize the breaker for missing impls
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
module.exports = { NotImplementedAdapter };
|