@img-arena/front-row-seat
Version:
IMG Arena Front Row Seat integration SDK
485 lines (484 loc) • 18.5 kB
TypeScript
declare enum MessageTopics {
CONTEXT_UPDATE = "context-update",
OPTIONS_UPDATE = "options-update",
SELECTION_UPDATE = "selection-update",
CLEAR_SELECTIONS = "clear-selections",
HANDSHAKE_ATTEMPT = "handshake-attempt",
HANDSHAKE_REPLY = "handshake-reply",
HANDSHAKE_FAILED = "handshake-failed",
VIDEO_PLAYBACK_AUTH_REQUEST = "video-playback-auth-request",
VIDEO_PLAYBACK_AUTH_RESPONSE = "video-playback-auth-response",
BETLINK_OPERATOR_AUTH_TOKEN_REQUEST = "betlink-operator-auth-token-request",
BETLINK_OPERATOR_AUTH_TOKEN_RESPONSE = "betlink-operator-auth-token-response",
APP_LOADED = "app-loaded",
CURRENT_EVENT_ID_UPDATE = "current-event-id-update",
MARKETS_UPDATE = "markets-update",
MARKETS_SUSPEND = "markets-suspend",
MARKETS_REMOVE = "markets-remove",
MARKETS_PLACE_BET = "markets-place-bet"
}
interface MarketDetails {
id: string;
title: string;
suspended?: boolean;
}
type Market = MarketDetails & {
options: MarketOption[];
};
interface MarketOption {
playerId: string;
title: string;
odds: MarketOdds;
id?: string;
suspended?: boolean;
marketDirection?: MarketDirection;
}
interface MarketOdds {
decimal?: string;
fractional?: string;
american?: string;
}
declare enum MarketDirection {
DEFAULT = "default",
LENGTHENING = "lengthening",
SHORTENING = "shortening"
}
interface MarketsUpdateMessage {
markets: Array<MarketDetails & Partial<Pick<Market, "options">>>;
}
interface MarketsSuspendMessage {
marketIds: string[];
playerIds?: string[] | null;
}
interface MarketsRemoveMessage {
marketIds: string[];
playerIds?: string[] | null;
}
interface MarketsPlaceBetMessage {
market: MarketDetails;
option: MarketOption;
}
// eslint-disable-next-line @typescript-eslint/naming-convention
declare const MARKETS_EVENT: {
readonly UPDATE: MessageTopics.MARKETS_UPDATE;
readonly SUSPEND: MessageTopics.MARKETS_SUSPEND;
readonly REMOVE: MessageTopics.MARKETS_REMOVE;
readonly PLACE_BET: MessageTopics.MARKETS_PLACE_BET;
};
type MarketsMessage = MarketsUpdateMessage | MarketsSuspendMessage | MarketsRemoveMessage | MarketsPlaceBetMessage;
interface IframeUrlObject {
origin: string;
path: string;
}
interface ConstructorArgs {
//? Operator.
operator?: string;
//? Indicates the theme to use
theme?: string;
//? Indicates the language to use .
language?: string;
//? selector for element where the Iframe is going to be added
targetElementSelector: string;
//? Indicates the backend environment for the event centre to use.
env?: "dev" | "staging" | "sims" | "prod" | "demo" | string;
//? when enabled the module will print debug messages
__debug__?: boolean;
}
interface EventCentreConstructorArgs extends ConstructorArgs {
sport: string;
//? Indicates the version of the event centre to use.
version?: "latest" | string;
//? Operator.
operator: string;
//? the environment of the consumer (e.g. UAT, or Staging; one use-case is that it allows us to treat analytics differently)
operatorEnv?: string;
//? Indicates the version of Betlink ot use, setting this will show the Betlink iframe instead of the event centre.
betlinkVersion?: string;
options?: InitializationOptions;
targetModule?: string;
initialContext?: ContextUpdateEvents;
//? Indicates the Betlink backend environment to use, overrides env
betlinkEnv?: "dev" | "staging" | "sims" | "prod" | "demo" | string;
enableEventSelection?: boolean;
trading?: boolean;
//? Used to target a specific event for Betlink or the event centre.
eventId?: EventIdType | string;
//? Overrides the URL of the event centre iframe embedded within Betlink
__iframe_url_override__?: IframeUrlObject;
//? Overrides the URL of the iframe that loads the event centre or Betlink
__betlink_iframe_url_override__?: IframeUrlObject;
__replay_id__?: string;
}
interface EventCentreLiteConstructorArgs extends ConstructorArgs {
//? sport to be loaded in the event centre lite
sport: string;
//? name of the standalone module to be loaded
targetModule?: string;
//? name of the page to preload
view?: "Stream" | "Pitch" | "Lineups" | "Stats";
//? Initial context
initialContext?: {
//? page to be displayed.
page?: number;
};
//? Used to target a specific event
eventId: string;
//? this is a private property to override the URL
__iframe_url_override__?: {
//? Overrides the origin in the url
origin?: string;
};
//? Overrides the URL of the iframe that loads the event centre or Betlink
__replay_id__?: string;
}
declare const enum HandshakeStates {
Pending = 0,
Failed = 1,
Success = 2
}
interface ShowEventCentreMessage {
eventId: string;
}
interface HandshakeMessage {
handshakeRef: string;
frameOrigin?: string;
versionNumber?: string;
}
interface HandshakeFailed {
timestamp: number;
}
interface QueuedMessage {
topic: MessageTopics;
context: IntegrationEvent;
}
interface ContextUpdateEventBase {
view: string;
}
type GolfViews = "leaderboard" | "player-detail" | "player-detail-hole" | "player-detail-scorecard" | "player-detail-shots" | "player-detail-stats" | "player-detail-streaming" | "playoff-detail" // compatibility: same as "playoff-detail-hole"
| "playoff-detail-hole" | "playoff-detail-shots" | "groups" | "groupdetail" | "group-detail" | "group-detail-hole" | "group-detail-scorecard" | "group-detail-shots" | "group-detail-stats" | "group-detail-streaming" | "course" | "course-live-streams" | "course-hole-detail" // compatibility: same as "course-detail-hole"
| "course-detail-hole" | "course-detail-scorecard" | "course-detail-shots" | "course-detail-streaming" | "match-play-list" | "match-play-detail" // compatibility: same as "match-play-detail-hole"
| "match-play-detail-hole" | "match-play-detail-scorecard" | "match-play-detail-shots" | "match-play-shot-tracker" | "match-play-streaming" | "match-play-streaming-hole" | "lpga-streaming" | "streaming" | "hospitality-detail-hole" | "the-open-player-tracker" | "the-open-hole-tracker" | "stats" | "insights";
interface GolfContextUpdateEvent extends ContextUpdateEventBase {
view: GolfViews;
tournamentId: number | string;
roundNo?: number | string;
holeNo?: number | string;
teamNo?: number | string;
groupNo?: number | string;
groupId?: number | string;
courseId?: number | string;
matchNo?: number | string;
playerId?: number | string;
leagueId?: number | string; // specific for Draft Kings and the golf hospitality target module
roundStatuses?: Array<{
number?: number;
status?: string;
}>;
}
interface MWSoccerContextUpdateBase extends ContextUpdateEventBase {
seasonId: string;
fixtureId?: string;
teamId?: string;
simpleView?: boolean;
}
interface MWSoccerPassesContextUpdate extends MWSoccerContextUpdateBase {
view: "passes";
playerId?: string;
}
interface MWSoccerXGContextUpdate extends MWSoccerContextUpdateBase {
view: "xg";
}
type MWSoccerContextUpdate = MWSoccerPassesContextUpdate | MWSoccerXGContextUpdate;
interface UfcContextUpdateEvent extends ContextUpdateEventBase {
fightId?: number | string;
}
declare enum TennisRoundShortNames {
Bronze = "Bronze",
F = "F",
First = "First",
Fourth = "Fourth",
Q = "Q",
Q1 = "Q1",
Q2 = "Q2",
Q3 = "Q3",
Q4 = "Q4",
Qf = "QF",
Robin = "Robin",
Rubber = "Rubber",
Sf = "SF",
Second = "Second",
Third = "Third",
W = "W"
}
declare enum MatchType {
Ld = "LD",
Ls = "LS",
Md = "MD",
Ms = "MS",
Qld = "QLD",
Qls = "QLS",
Qmd = "QMD",
Qms = "QMS",
Qs = "QS",
Qxd = "QXD",
Rs = "RS",
Xd = "XD"
}
interface TennisContextUpdateEvent extends ContextUpdateEventBase {
matchId?: string;
round?: TennisRoundShortNames;
matchType?: MatchType;
}
type SoccerView = "teams" | "teams-lineups" | "teams-formations" | "live" | "stats" | "stats-player" | "stats-match" | "form" | "form-guide" | "form-teams" | "form-leaders" | "form-standings" | "form-players" | "form-players-goals" | "form-players-shots" | "form-players-cards" | "chalkboard";
interface SoccerContextUpdateEvent extends ContextUpdateEventBase {
view: SoccerView;
playerShirtNumber?: string;
team?: "home" | "away";
chalkboard?: boolean;
}
interface BasketballContextUpdateEvent extends ContextUpdateEventBase {
eventId?: string;
operatorId?: number | string;
seasonId?: string;
federationId?: string;
teamId?: string;
}
type ContextUpdateEvents = GolfContextUpdateEvent | TennisContextUpdateEvent | UfcContextUpdateEvent | BasketballContextUpdateEvent | MWSoccerContextUpdate | SoccerContextUpdateEvent;
interface StakeLimits {
maxStake: number;
minStake: number;
maxPayOut: number;
minPayOut: number;
}
interface BetlinkInitializationOptions {
fractionalOdds?: boolean;
allowDecimalStakes?: boolean;
allowDecimalPayouts?: boolean;
currencySymbol?: string;
quickStakes?: {
[key: string]: number;
};
stakeLimits?: StakeLimits;
eachWay?: boolean;
multiplesBetting?: boolean;
closeButton?: boolean;
}
interface InitializationOptions {
videoPlaybackEnabled: boolean;
userId?: string;
units?: "imperial" | "metric";
betlinkOptions?: BetlinkInitializationOptions;
disablePeopleImages?: boolean;
holeNavOnly?: boolean; // used to amend UI for 'course-live-streams' view
oddsFormat?: "fractional" | "decimal" | "moneyline";
teeTimesFormat12h?: boolean;
}
interface VideoPlaybackAuthResponseEvent {
operatorId: string;
auth: string;
timestamp: number;
error?: Error;
}
interface BetlinkAuthTokenResponseEvent {
operatorAuthToken: string;
userId: string;
operatorId: string;
}
interface SelectionUpdateEvent {
marketId: number | string;
betId: number | string;
selected: boolean;
}
interface CurrentEventIdUpdate {
eventId: string;
}
type IntegrationEvent = HandshakeMessage | HandshakeFailed | ShowEventCentreMessage | SelectionUpdateEvent | GolfContextUpdateEvent | UfcContextUpdateEvent | TennisContextUpdateEvent | InitializationOptions | VideoPlaybackAuthResponseEvent | BetlinkAuthTokenResponseEvent | CurrentEventIdUpdate | MarketsMessage | Record<string | number, unknown>;
interface InternalMessage {
topic: MessageTopics;
context: IntegrationEvent;
handshakeRef: string;
}
interface IntegrationEventListener {
(event: IntegrationEvent): void;
}
interface CreateSelectionUpdateEventProps {
marketId: number | string;
betId: number | string;
selected: boolean;
}
declare enum EventIdType {
Current = "current"
}
declare enum SportType {
Golf = "golf",
Tennis = "tennis",
Ufc = "ufc",
Basketball = "basketball",
Soccer = "soccer",
MwSoccer = "mw-soccer"
}
interface EventCentreClient {
emit(topic: MessageTopics, message: IntegrationEvent): Error | void;
on(topic: MessageTopics, callback: IntegrationEventListener): void;
removeCallback(topic: MessageTopics): void;
getVersion: undefined // legacy
| (() => Promise<{
hostVersion?: string;
guestVersion?: string;
} | undefined>);
}
declare function eventCentreClient(debug?: boolean): EventCentreClient;
interface Message {
topic: MessageTopics;
context: IntegrationEvent;
handshakeRef?: string;
}
declare class ParentCommunication {
debug: boolean;
origin?: string | null;
handshakeRef: string | null;
iframe: HTMLIFrameElement;
iframeWindow?: Window | null;
handshakeSuccess: boolean;
listeners: Array<(message: Message) => void>;
private _messageQueue;
private _onIframeLoad?;
private _latestHandshakeTimeout?;
constructor(src: string | null, targetElement: HTMLElement, debug?: boolean);
resetIframe(src: string | null): void;
triggerHandshake(attemptsLeft: number): void;
flushQueue(): void;
sendMessageToIframe(message: Message): void;
sendMessageToParent(message: Message): void;
onMessage(callback: (message: Message) => void): void;
}
interface IFrameContainerInterface {
emit(topic: MessageTopics, message: IntegrationEvent): Error | void;
on(topic: MessageTopics, callback: IntegrationEventListener): void;
removeCallback(topic: MessageTopics): void;
}
interface Args {
__debug__: boolean;
targetElementSelector: string;
}
declare class IframeContainer implements IFrameContainerInterface {
debug: boolean;
communications: Array<ParentCommunication>;
listeners: {
[topic: string]: IntegrationEventListener;
};
private frontRowSeatContainerElement;
constructor(args: Args);
protected initCommunication(url: string, className: string): void;
emit(topic: MessageTopics, context: IntegrationEvent): Error | void;
on(topic: MessageTopics, callback: IntegrationEventListener): void;
removeCallback(topic: MessageTopics): void;
private addEventHandlers;
private getTargetElement;
}
declare class EventCentreIframe extends IframeContainer {
constructor(args: EventCentreConstructorArgs);
}
declare function eventCentre(options: EventCentreConstructorArgs): EventCentreIframe;
type RequiredDefaultProperties = Required<Omit<EventCentreLiteConstructorArgs, "sport" | "eventId" | "view" | "targetElementSelector" | "initialContext" | "__iframe_url_override__" | "__replay_id__" | "__debug__">>;
declare class EventCentreLiteIframe extends IframeContainer {
private readonly BASE_URL;
readonly iFrameUrl: string;
readonly args: RequiredDefaultProperties & EventCentreLiteConstructorArgs;
constructor(originalArgs: EventCentreLiteConstructorArgs);
private createEventCentreLiteUrl;
private appendParam;
private appendInitialContextParam;
}
declare function eventCentreLite(options: EventCentreLiteConstructorArgs): EventCentreLiteIframe;
declare const eventCenterLite: typeof eventCentreLite;
declare namespace eventCentreMarkets {
enum MessageTopics {
CONTEXT_UPDATE = "context-update",
OPTIONS_UPDATE = "options-update",
SELECTION_UPDATE = "selection-update",
CLEAR_SELECTIONS = "clear-selections",
HANDSHAKE_ATTEMPT = "handshake-attempt",
HANDSHAKE_REPLY = "handshake-reply",
HANDSHAKE_FAILED = "handshake-failed",
VIDEO_PLAYBACK_AUTH_REQUEST = "video-playback-auth-request",
VIDEO_PLAYBACK_AUTH_RESPONSE = "video-playback-auth-response",
BETLINK_OPERATOR_AUTH_TOKEN_REQUEST = "betlink-operator-auth-token-request",
BETLINK_OPERATOR_AUTH_TOKEN_RESPONSE = "betlink-operator-auth-token-response",
APP_LOADED = "app-loaded",
CURRENT_EVENT_ID_UPDATE = "current-event-id-update",
MARKETS_UPDATE = "markets-update",
MARKETS_SUSPEND = "markets-suspend",
MARKETS_REMOVE = "markets-remove",
MARKETS_PLACE_BET = "markets-place-bet"
}
interface MarketDetails {
id: string;
title: string;
suspended?: boolean;
}
type Market = MarketDetails & {
options: MarketOption[];
};
interface MarketOption {
playerId: string;
title: string;
odds: MarketOdds;
id?: string;
suspended?: boolean;
marketDirection?: MarketDirection;
}
interface MarketOdds {
decimal?: string;
fractional?: string;
american?: string;
}
enum MarketDirection {
DEFAULT = "default",
LENGTHENING = "lengthening",
SHORTENING = "shortening"
}
interface MarketsUpdateMessage {
markets: Array<MarketDetails & Partial<Pick<Market, "options">>>;
}
interface MarketsSuspendMessage {
marketIds: string[];
playerIds?: string[] | null;
}
interface MarketsRemoveMessage {
marketIds: string[];
playerIds?: string[] | null;
}
interface MarketsPlaceBetMessage {
market: MarketDetails;
option: MarketOption;
}
// eslint-disable-next-line @typescript-eslint/naming-convention
const MARKETS_EVENT: {
readonly UPDATE: MessageTopics.MARKETS_UPDATE;
readonly SUSPEND: MessageTopics.MARKETS_SUSPEND;
readonly REMOVE: MessageTopics.MARKETS_REMOVE;
readonly PLACE_BET: MessageTopics.MARKETS_PLACE_BET;
};
type MarketsEvent = (typeof MARKETS_EVENT)[keyof typeof MARKETS_EVENT];
type MarketsMessage = MarketsUpdateMessage | MarketsSuspendMessage | MarketsRemoveMessage | MarketsPlaceBetMessage;
}
declare function encodeJSONParameter(input?: object, enableURLEncoding?: boolean): string;
declare function decodeJSONParameter<T = ContextUpdateEvents | InitializationOptions | EventCentreConstructorArgs>(input?: string, urlEncoded?: boolean): T | undefined;
declare const eventCentreUtils: {
MessageTopics: typeof MessageTopics;
encodeJSONParameter: typeof encodeJSONParameter;
decodeJSONParameter: typeof decodeJSONParameter;
};
declare const _default: {
eventCentreClient: typeof eventCentreClient;
eventCenterLite: typeof eventCenterLite;
eventCentre: typeof eventCentre;
eventCentreUtils: {
MessageTopics: typeof MessageTopics;
encodeJSONParameter: typeof encodeJSONParameter;
decodeJSONParameter: typeof decodeJSONParameter;
};
eventCentreMarkets: typeof eventCentreMarkets;
};
export { _default as default, MessageTopics, IframeUrlObject, ConstructorArgs, EventCentreConstructorArgs, EventCentreLiteConstructorArgs, HandshakeStates, ShowEventCentreMessage, HandshakeMessage, HandshakeFailed, QueuedMessage, ContextUpdateEventBase, GolfViews, GolfContextUpdateEvent, MWSoccerContextUpdate, UfcContextUpdateEvent, TennisRoundShortNames, MatchType, TennisContextUpdateEvent, SoccerView, SoccerContextUpdateEvent, BasketballContextUpdateEvent, ContextUpdateEvents, StakeLimits, BetlinkInitializationOptions, InitializationOptions, VideoPlaybackAuthResponseEvent, BetlinkAuthTokenResponseEvent, SelectionUpdateEvent, CurrentEventIdUpdate, IntegrationEvent, InternalMessage, IntegrationEventListener, CreateSelectionUpdateEventProps, EventIdType, SportType, eventCenterLite, eventCentre, eventCentreClient, eventCentreMarkets, eventCentreUtils };