@bluebottle_gg/league-broadcast-client 0.2.0 → 0.2.1

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/dist/index.d.ts CHANGED
@@ -423,6 +423,8 @@ declare class tabPlayer$1 {
423
423
  id: string;
424
424
  playerName: string;
425
425
  playerHashtag: string;
426
+ givenName: string;
427
+ familyName: string;
426
428
  championAssets?: simpleChampionData$1;
427
429
  abilities: ingameAbilityInfo[];
428
430
  perks: perkInfoV2[];
@@ -520,7 +522,7 @@ declare enum TeamMemberRole {
520
522
  * Any changes made to this file can be lost when this file is regenerated.
521
523
  */
522
524
 
523
- declare class teamMember {
525
+ declare class teamMember$1 {
524
526
  memberId: number;
525
527
  teamId: number;
526
528
  alias: string;
@@ -539,7 +541,7 @@ declare class teamMember {
539
541
  */
540
542
 
541
543
  declare class teamWithMembers$1 {
542
- members: teamMember[];
544
+ members: teamMember$1[];
543
545
  teamId: number;
544
546
  name: string;
545
547
  tag: string;
@@ -573,6 +575,9 @@ declare class ingameFrontendData {
573
575
  baronPitTimer?: iObjectiveRespawnData;
574
576
  dragonPitTimer?: iObjectiveRespawnData;
575
577
  inhibitors?: teamInhibitorData[];
578
+ showTwitchPrediction: boolean;
579
+ showTwitchPoll: boolean;
580
+ showTwitchChatVote: boolean;
576
581
  sideInfoPage?: ingameSideInfoPage;
577
582
  goldGraph?: ingameGoldGraphData;
578
583
  runes?: ingameRuneData;
@@ -1027,7 +1032,7 @@ declare class ingameObjectiveEvent {
1027
1032
 
1028
1033
  declare class announcementParameter {
1029
1034
  champion?: simpleChampionData$1;
1030
- member?: teamMember;
1035
+ member?: teamMember$1;
1031
1036
  asset?: string;
1032
1037
  team: number;
1033
1038
  }
@@ -1099,7 +1104,7 @@ declare class killFeedEvent {
1099
1104
  * This is an auto-generated file.
1100
1105
  * Any changes made to this file can be lost when this file is regenerated.
1101
1106
  */
1102
- declare enum Team {
1107
+ declare enum Team$1 {
1103
1108
  None = 0,
1104
1109
  Order = 1,
1105
1110
  Chaos = 2,
@@ -1186,7 +1191,7 @@ declare class simpleChampionData {
1186
1191
  * Auto-generated REST API client for Champion select (pre-game) endpoints.
1187
1192
  * Do not edit manually. Changes will be lost.
1188
1193
  *
1189
- * @generated 2026-03-04
1194
+ * @generated 2026-03-11
1190
1195
  */
1191
1196
 
1192
1197
  declare class PreGameApi {
@@ -1229,13 +1234,42 @@ declare class gameWithTeams$1 {
1229
1234
  assetPatch: string;
1230
1235
  }
1231
1236
 
1237
+ /**
1238
+ * This is an auto-generated file.
1239
+ * Any changes made to this file can be lost when this file is regenerated.
1240
+ */
1241
+ declare enum Team {
1242
+ None = 0,
1243
+ Order = 1,
1244
+ Chaos = 2,
1245
+ Neutral = 3
1246
+ }
1247
+
1248
+ /**
1249
+ * This is an auto-generated file.
1250
+ * Any changes made to this file can be lost when this file is regenerated.
1251
+ */
1252
+
1253
+ declare class teamMember {
1254
+ memberId: number;
1255
+ teamId: number;
1256
+ alias: string;
1257
+ puuid: string;
1258
+ isActive: boolean;
1259
+ tag: string;
1260
+ iconUri?: string;
1261
+ role: TeamMemberRole;
1262
+ familyName: string;
1263
+ givenName: string;
1264
+ }
1265
+
1232
1266
  /**
1233
1267
  * This is an auto-generated file.
1234
1268
  * Any changes made to this file can be lost when this file is regenerated.
1235
1269
  */
1236
1270
 
1237
1271
  declare class teamWithMembers {
1238
- members: teamMember[];
1272
+ members: teamMember$1[];
1239
1273
  teamId: number;
1240
1274
  name: string;
1241
1275
  tag: string;
@@ -1252,7 +1286,7 @@ declare class teamWithMembers {
1252
1286
  * Auto-generated REST API client for Game CRUD and draft (picks/bans) endpoints.
1253
1287
  * Do not edit manually. Changes will be lost.
1254
1288
  *
1255
- * @generated 2026-03-04
1289
+ * @generated 2026-03-11
1256
1290
  */
1257
1291
 
1258
1292
  declare class GameApi {
@@ -1290,6 +1324,8 @@ declare class GameApi {
1290
1324
  setPicks(gameid: number, picks: Record<number, (string | null)[]>): Promise<void>;
1291
1325
  /** `PUT game/{gameid}/picks/{teamid}` */
1292
1326
  setPicksForTeam(gameid: number, teamid: number, picks: (string | null)[]): Promise<void>;
1327
+ /** `GET game/{gameid}/teams/players` */
1328
+ getPlayersInGame(gameid: number): Promise<Record<Team, teamMember[]>>;
1293
1329
  }
1294
1330
 
1295
1331
  /**
@@ -1301,6 +1337,8 @@ declare class tabPlayer {
1301
1337
  id: string;
1302
1338
  playerName: string;
1303
1339
  playerHashtag: string;
1340
+ givenName: string;
1341
+ familyName: string;
1304
1342
  championAssets?: simpleChampionData$1;
1305
1343
  abilities: ingameAbilityInfo[];
1306
1344
  perks: perkInfoV2[];
@@ -1318,7 +1356,7 @@ declare class tabPlayer {
1318
1356
  * Auto-generated REST API client for Live game state endpoints (requires active game).
1319
1357
  * Do not edit manually. Changes will be lost.
1320
1358
  *
1321
- * @generated 2026-03-04
1359
+ * @generated 2026-03-11
1322
1360
  */
1323
1361
 
1324
1362
  declare class GameStateApi {
@@ -1362,6 +1400,37 @@ declare class matchData {
1362
1400
  onStage: boolean;
1363
1401
  }
1364
1402
 
1403
+ /**
1404
+ * This is an auto-generated file.
1405
+ * Any changes made to this file can be lost when this file is regenerated.
1406
+ */
1407
+
1408
+ declare class addMatchRequestArgs {
1409
+ name?: string;
1410
+ type: BestOfType$1;
1411
+ teams: number[];
1412
+ isCurrent: boolean;
1413
+ onStage?: boolean;
1414
+ seasonId?: number;
1415
+ nextMatchId?: number;
1416
+ winnerNextMatchId?: number;
1417
+ loserNextMatchId?: number;
1418
+ matchDate?: string;
1419
+ timePerGame?: number;
1420
+ ruleSet: string;
1421
+ }
1422
+
1423
+ /**
1424
+ * This is an auto-generated file.
1425
+ * Any changes made to this file can be lost when this file is regenerated.
1426
+ */
1427
+
1428
+ declare class optionalMatchData {
1429
+ date?: Date;
1430
+ ruleSet?: MatchRuleSet$1;
1431
+ onStage?: boolean;
1432
+ }
1433
+
1365
1434
  /**
1366
1435
  * This is an auto-generated file.
1367
1436
  * Any changes made to this file can be lost when this file is regenerated.
@@ -1431,7 +1500,7 @@ declare class matchWithGamesAndTeams {
1431
1500
  * Auto-generated REST API client for Match (series) management endpoints.
1432
1501
  * Do not edit manually. Changes will be lost.
1433
1502
  *
1434
- * @generated 2026-03-04
1503
+ * @generated 2026-03-11
1435
1504
  */
1436
1505
 
1437
1506
  declare class MatchApi {
@@ -1502,13 +1571,13 @@ declare class MatchApi {
1502
1571
  /** `PATCH match/{matchid}/name/{matchName}` */
1503
1572
  setMatchName(matchid: number, matchName: string): Promise<void>;
1504
1573
  /** `PATCH match/{matchid}` */
1505
- updateMatch(matchid: number, matchUpdate: unknown): Promise<void>;
1574
+ updateMatch(matchid: number, matchUpdate: optionalMatchData): Promise<void>;
1506
1575
  /** `GET match/{matchid}/fearless/bans` */
1507
1576
  getMatchBans(matchid: number): Promise<Record<number, Record<number, simpleChampionData[]>>>;
1508
1577
  /** `GET match/{seriesid}/onstage` */
1509
1578
  getMatchOnStage(seriesid: number): Promise<boolean>;
1510
1579
  /** `PUT match` */
1511
- addMatch(match: unknown): Promise<number>;
1580
+ addMatch(match: addMatchRequestArgs): Promise<number>;
1512
1581
  /** `GET match/{matchId}/stage/team/{stageSide}` */
1513
1582
  getTeamOnStageSide(matchId: number, stageSide: number): Promise<teamWithMembers>;
1514
1583
  /** `GET match/current/stage/team/{stageSide}` */
@@ -1549,7 +1618,7 @@ declare class teamData {
1549
1618
  * Auto-generated REST API client for Season management endpoints.
1550
1619
  * Do not edit manually. Changes will be lost.
1551
1620
  *
1552
- * @generated 2026-03-04
1621
+ * @generated 2026-03-11
1553
1622
  */
1554
1623
 
1555
1624
  declare class SeasonApi {
@@ -1599,7 +1668,7 @@ declare class SeasonApi {
1599
1668
  * Auto-generated REST API client for In-game overlay and serialization endpoints.
1600
1669
  * Do not edit manually. Changes will be lost.
1601
1670
  *
1602
- * @generated 2026-03-04
1671
+ * @generated 2026-03-11
1603
1672
  */
1604
1673
 
1605
1674
  declare class IngameApi {
@@ -1630,7 +1699,7 @@ declare class IngameApi {
1630
1699
  /** `GET ingame/stage/{stageSide}/ingameteamid` */
1631
1700
  getIngameTeamOnStageSide(stageSide: number): Promise<number>;
1632
1701
  /** `GET ingame/state/activeOverlays` */
1633
- getActiveOverlays(): Promise<unknown>;
1702
+ getActiveOverlays(): Promise<string[]>;
1634
1703
  }
1635
1704
 
1636
1705
  /**
@@ -1705,7 +1774,7 @@ interface IngameEventHandlers {
1705
1774
  onPlayerEvent?: (event: playerUpdateEvent) => void;
1706
1775
  onTeamEvent?: (event: teamUpdateResults) => void;
1707
1776
  onObjectiveEvent?: (event: ingameObjectiveEvent) => void;
1708
- onFirstTowerEvent?: (teamId: Team) => void;
1777
+ onFirstTowerEvent?: (teamId: Team$1) => void;
1709
1778
  onAnnouncementEvent?: (event: announcerEvent) => void;
1710
1779
  onKillFeedEvent?: (event: killFeedEvent) => void;
1711
1780
  }
package/dist/index.js CHANGED
@@ -531,6 +531,9 @@ var ingameFrontendData = class {
531
531
  this.playbackSpeed = 0;
532
532
  this.gameVersion = "";
533
533
  this.gameStatus = 0 /* OutOfGame */;
534
+ this.showTwitchPrediction = false;
535
+ this.showTwitchPoll = false;
536
+ this.showTwitchChatVote = false;
534
537
  }
535
538
  };
536
539
 
@@ -745,6 +748,10 @@ var GameApi = class {
745
748
  async setPicksForTeam(gameid, teamid, picks) {
746
749
  return this.client.put(`game/${gameid}/picks/${teamid}`, picks);
747
750
  }
751
+ /** `GET game/{gameid}/teams/players` */
752
+ async getPlayersInGame(gameid) {
753
+ return this.client.get(`game/${gameid}/teams/players`);
754
+ }
748
755
  };
749
756
 
750
757
  // src/api/generated/GameStateApi.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/WebSocketManager.ts","../src/reactivity/GameStateStore.ts","../src/reactivity/ChampSelectStateStore.ts","../src/reactivity/structuralShare.ts","../types/shared/gamestate.ts","../types/ingame/ingamefrontenddata.ts","../types/pregame/champselectstatedata.ts","../src/api/ApiClient.ts","../src/api/generated/PreGameApi.ts","../src/api/generated/GameApi.ts","../src/api/generated/GameStateApi.ts","../src/api/generated/MatchApi.ts","../src/api/generated/SeasonApi.ts","../src/api/generated/IngameApi.ts","../src/api/RestApi.ts","../src/LeagueBroadcastClient.ts","../types/pregame/pickbanphase.ts","../types/pregame/actiontype.ts","../types/pregame/actionsubtype.ts","../types/pregame/timelineactiontype.ts","../types/shared/bestoftype.ts","../types/shared/matchruleset.ts","../src/util/ingameScoreboardBottomPlayerDataUtils.ts"],"names":["changed","GameState","PickBanPhase","ActionType","ActionSubType","TimeLineActionType","BestOfType","MatchRuleSet"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * WebSocket connection manager for League Broadcast backend\r\n */\r\nexport class WebSocketManager {\r\n private socket: WebSocket | null = null;\r\n private url: string = \"\";\r\n private reconnectAttempts: number = 0;\r\n private maxReconnectAttempts: number = 10;\r\n private reconnectDelay: number = 5000;\r\n private reconnectTimeout: number | null = null;\r\n private messageHandlers: Set<(data: any) => void> = new Set();\r\n private connectionHandlers: Set<() => void> = new Set();\r\n private disconnectionHandlers: Set<() => void> = new Set();\r\n private errorHandlers: Set<(error: Event) => void> = new Set();\r\n\r\n /**\r\n * Connect to the WebSocket server\r\n */\r\n connect(url: string): Promise<void> {\r\n this.url = url;\r\n this.cleanup();\r\n\r\n return new Promise((resolve, reject) => {\r\n try {\r\n this.socket = new WebSocket(url);\r\n\r\n this.socket.onopen = () => {\r\n console.log(\"[WebSocketManager] Connected to\", url);\r\n this.reconnectAttempts = 0;\r\n this.connectionHandlers.forEach((handler) => handler());\r\n resolve();\r\n };\r\n\r\n this.socket.onmessage = (event: MessageEvent) => {\r\n // Ignore keep-alive messages\r\n if (event.data === \"KeepAlive\") {\r\n return;\r\n }\r\n\r\n try {\r\n const data = JSON.parse(event.data);\r\n this.messageHandlers.forEach((handler) => handler(data));\r\n } catch (error) {\r\n console.error(\r\n \"[WebSocketManager] Failed to parse message:\",\r\n event.data,\r\n );\r\n }\r\n };\r\n\r\n this.socket.onclose = () => {\r\n console.log(\"[WebSocketManager] Disconnected\");\r\n this.disconnectionHandlers.forEach((handler) => handler());\r\n this.attemptReconnect();\r\n };\r\n\r\n this.socket.onerror = (error: Event) => {\r\n console.error(\"[WebSocketManager] Error:\", error);\r\n this.errorHandlers.forEach((handler) => handler(error));\r\n reject(error);\r\n };\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disconnect from the WebSocket server\r\n */\r\n disconnect(): void {\r\n if (this.reconnectTimeout !== null) {\r\n clearTimeout(this.reconnectTimeout);\r\n this.reconnectTimeout = null;\r\n }\r\n\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if connected to the WebSocket server\r\n */\r\n isConnected(): boolean {\r\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\r\n }\r\n\r\n /**\r\n * Send a message to the server\r\n */\r\n send(message: string | object): void {\r\n if (!this.isConnected()) {\r\n console.warn(\"[WebSocketManager] Cannot send message: not connected\");\r\n return;\r\n }\r\n\r\n const data =\r\n typeof message === \"string\" ? message : JSON.stringify(message);\r\n this.socket!.send(data);\r\n }\r\n\r\n /**\r\n * Register a message handler\r\n */\r\n onMessage(handler: (data: any) => void): () => void {\r\n this.messageHandlers.add(handler);\r\n return () => this.messageHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Register a connection handler\r\n */\r\n onConnect(handler: () => void): () => void {\r\n this.connectionHandlers.add(handler);\r\n return () => this.connectionHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Register a disconnection handler\r\n */\r\n onDisconnect(handler: () => void): () => void {\r\n this.disconnectionHandlers.add(handler);\r\n return () => this.disconnectionHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Register an error handler\r\n */\r\n onError(handler: (error: Event) => void): () => void {\r\n this.errorHandlers.add(handler);\r\n return () => this.errorHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Attempt to reconnect to the server\r\n */\r\n private attemptReconnect(): void {\r\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\r\n console.error(\"[WebSocketManager] Max reconnect attempts reached\");\r\n return;\r\n }\r\n\r\n this.reconnectAttempts++;\r\n console.log(\r\n `[WebSocketManager] Reconnecting in ${this.reconnectDelay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`,\r\n );\r\n\r\n this.reconnectTimeout = window.setTimeout(() => {\r\n this.connect(this.url).catch((error) => {\r\n console.error(\"[WebSocketManager] Reconnect failed:\", error);\r\n });\r\n }, this.reconnectDelay);\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n private cleanup(): void {\r\n if (this.reconnectTimeout !== null) {\r\n clearTimeout(this.reconnectTimeout);\r\n this.reconnectTimeout = null;\r\n }\r\n\r\n if (this.socket) {\r\n this.socket.onopen = null;\r\n this.socket.onmessage = null;\r\n this.socket.onclose = null;\r\n this.socket.onerror = null;\r\n\r\n if (this.socket.readyState === WebSocket.OPEN) {\r\n this.socket.close();\r\n }\r\n\r\n this.socket = null;\r\n }\r\n }\r\n}\r\n","import type { ingameFrontendData } from \"#types/ingame/ingamefrontenddata\";\r\nimport type { GameState } from \"#types/shared/GameState\";\r\n\r\n/**\r\n * A subscribable slice of state produced by `select()`.\r\n *\r\n * Compatible with:\r\n * - React 18+ `useSyncExternalStore(slice.subscribe, slice.getSnapshot)`\r\n * - Vue `watchEffect(() => slice.getSnapshot())`\r\n * - Svelte `readable` / custom store contract\r\n * - Solid `createEffect(() => slice.getSnapshot())`\r\n * - Vanilla JS `slice.subscribe(() => console.log(slice.getSnapshot()))`\r\n */\r\nexport interface Subscribable<T> {\r\n /** Register a listener that fires when the selected value changes. Returns an unsubscribe function. */\r\n subscribe(listener: () => void): () => void;\r\n /** Return the current value of this slice. */\r\n getSnapshot(): T;\r\n}\r\n\r\n/** Equality function used to compare snapshots. */\r\nexport type EqualityFn<T> = (a: T, b: T) => boolean;\r\n\r\n/**\r\n * Reactive store for League Broadcast game state.\r\n *\r\n * The store holds an immutable snapshot that is replaced on every update.\r\n * Fine-grained subscriptions are achieved through **selectors**: a selector\r\n * derives a slice of the full state and only notifies listeners when the\r\n * derived value actually changes (compared with a configurable equality\r\n * function — shallow reference equality by default).\r\n *\r\n * @example Vanilla JS\r\n * ```ts\r\n * const scoreboard = store.select(s => s.scoreboard);\r\n * scoreboard.subscribe(() => {\r\n * console.log('Scoreboard changed:', scoreboard.getSnapshot());\r\n * });\r\n * ```\r\n *\r\n * @example React 18+\r\n * ```tsx\r\n * function Scoreboard() {\r\n * const scoreboard = useSyncExternalStore(\r\n * store.select(s => s.scoreboard).subscribe,\r\n * store.select(s => s.scoreboard).getSnapshot,\r\n * );\r\n * return <div>{scoreboard?.teams[0]?.kills}</div>;\r\n * }\r\n * // — or use the provided useGameState hook (see docs)\r\n * ```\r\n *\r\n * @example Vue 3\r\n * ```ts\r\n * const kills = useGameStateRef(store, s => s.scoreboard?.teams[0]?.kills);\r\n * ```\r\n */\r\nexport class GameStateStore {\r\n /** Current immutable snapshot. Replaced (never mutated) on every update. */\r\n private snapshot: GameStateSnapshot;\r\n\r\n /** Global listeners — called on every state change regardless of selector. */\r\n private listeners = new Set<() => void>();\r\n\r\n /** Monotonically increasing version — used for cheap stale checks. */\r\n private version = 0;\r\n\r\n constructor(initialState: ingameFrontendData, initialGameState: GameState) {\r\n this.snapshot = Object.freeze({\r\n gameData: initialState,\r\n gameState: initialGameState,\r\n version: this.version,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Core API\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Return the current full snapshot. */\r\n getSnapshot(): GameStateSnapshot {\r\n return this.snapshot;\r\n }\r\n\r\n /** Return the current version number. */\r\n getVersion(): number {\r\n return this.version;\r\n }\r\n\r\n /**\r\n * Subscribe to **all** state changes (unfiltered).\r\n * Returns an unsubscribe function.\r\n *\r\n * This satisfies the `subscribe` half of `useSyncExternalStore` when\r\n * combined with `getSnapshot`.\r\n */\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Selectors — the main reactivity primitive\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Create a **subscribable slice** that only triggers when the selected\r\n * value changes according to `equalityFn` (defaults to `===`).\r\n *\r\n * The returned object satisfies the `useSyncExternalStore` contract and\r\n * can also be used with `watch()` for callback-style subscriptions.\r\n *\r\n * Selector instances are lightweight — create them freely (e.g. inside\r\n * render functions). Referential identity of the *selector function* is\r\n * **not** required to be stable.\r\n */\r\n select<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): Subscribable<S> {\r\n let currentValue: S = selector(this.snapshot);\r\n let lastVersion: number = this.version;\r\n const sliceListeners = new Set<() => void>();\r\n\r\n const getSnapshot = (): S => {\r\n // Re-derive only if the store version bumped since last read\r\n if (lastVersion !== this.version) {\r\n const next = selector(this.snapshot);\r\n if (!equalityFn(currentValue, next)) {\r\n currentValue = next;\r\n }\r\n lastVersion = this.version;\r\n }\r\n return currentValue;\r\n };\r\n\r\n const subscribe = (listener: () => void): (() => void) => {\r\n sliceListeners.add(listener);\r\n\r\n // Subscribe to the root store; filter notifications through equality\r\n const unsub = this.subscribe(() => {\r\n const prev = currentValue;\r\n const next = selector(this.snapshot);\r\n lastVersion = this.version;\r\n if (!equalityFn(prev, next)) {\r\n currentValue = next;\r\n listener();\r\n }\r\n });\r\n\r\n return () => {\r\n sliceListeners.delete(listener);\r\n unsub();\r\n };\r\n };\r\n\r\n return { subscribe, getSnapshot };\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Convenience helpers\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Watch a derived value and invoke `callback` whenever it changes.\r\n * Returns an unsubscribe function.\r\n *\r\n * This is the simplest API for imperative / vanilla-JS usage:\r\n *\r\n * ```ts\r\n * store.watch(\r\n * s => s.gameData.scoreboard?.teams[0]?.kills,\r\n * kills => console.log('Blue kills:', kills),\r\n * );\r\n * ```\r\n */\r\n watch<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): () => void {\r\n let prev: S = selector(this.snapshot);\r\n return this.subscribe(() => {\r\n const next = selector(this.snapshot);\r\n if (!equalityFn(prev, next)) {\r\n const old = prev;\r\n prev = next;\r\n callback(next, old);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Watch a derived value and invoke `callback` whenever it changes,\r\n * **and** invoke it immediately with the current value.\r\n */\r\n watchImmediate<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n callback: (value: S, prev: S | undefined) => void,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): () => void {\r\n const current = selector(this.snapshot);\r\n callback(current, undefined);\r\n return this.watch(selector, callback, equalityFn);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Internal — called by LeagueBroadcastClient\r\n // ---------------------------------------------------------------------------\r\n\r\n /** @internal Replace game data snapshot and notify listeners. */\r\n _setGameData(data: ingameFrontendData): void {\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n ...this.snapshot,\r\n gameData: data,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n /** @internal Replace game state and notify listeners. */\r\n _setGameState(state: GameState): void {\r\n if (this.snapshot.gameState === state) return;\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n ...this.snapshot,\r\n gameState: state,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n /** @internal Replace entire snapshot (used on game end / reset). */\r\n _reset(data: ingameFrontendData, state: GameState): void {\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n gameData: data,\r\n gameState: state,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n private emit(): void {\r\n this.listeners.forEach((l) => l());\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Snapshot type\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface GameStateSnapshot {\r\n readonly gameData: ingameFrontendData;\r\n readonly gameState: GameState;\r\n /** Monotonic version counter — useful for cheap stale checks. */\r\n readonly version: number;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Utility: shallow equality for object slices\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Shallow-compare two objects by their own enumerable keys.\r\n * Useful as `equalityFn` when selecting an object whose identity changes\r\n * on every update but whose contents may not (e.g. `{ kills: 3, deaths: 1 }`).\r\n */\r\nexport function shallowEqual<T>(a: T, b: T): boolean {\r\n if (Object.is(a, b)) return true;\r\n if (\r\n typeof a !== \"object\" ||\r\n typeof b !== \"object\" ||\r\n a === null ||\r\n b === null\r\n ) {\r\n return false;\r\n }\r\n\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n for (const key of keysA) {\r\n if (\r\n !Object.prototype.hasOwnProperty.call(b, key) ||\r\n !Object.is((a as any)[key], (b as any)[key])\r\n ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","import type { champSelectStateData } from \"#types/pregame/champselectstatedata\";\r\n\r\n/**\r\n * A subscribable slice of state produced by `select()`.\r\n *\r\n * Compatible with:\r\n * - React 18+ `useSyncExternalStore(slice.subscribe, slice.getSnapshot)`\r\n * - Vue `watchEffect(() => slice.getSnapshot())`\r\n * - Svelte `readable` / custom store contract\r\n * - Solid `createEffect(() => slice.getSnapshot())`\r\n * - Vanilla JS `slice.subscribe(() => console.log(slice.getSnapshot()))`\r\n */\r\nexport type { Subscribable, EqualityFn } from \"./GameStateStore\";\r\n\r\n// Re-import locally for use within this file\r\nimport type { Subscribable, EqualityFn } from \"./GameStateStore\";\r\n\r\n/**\r\n * Reactive store for League Broadcast champion-select (pre-game) state.\r\n *\r\n * Follows the same selector-based model as {@link GameStateStore} but holds\r\n * `champSelectStateData` instead of ingame data.\r\n *\r\n * @example Vanilla JS\r\n * ```ts\r\n * const timer = store.select(s => s.champSelectData.timer);\r\n * timer.subscribe(() => {\r\n * console.log('Timer changed:', timer.getSnapshot());\r\n * });\r\n * ```\r\n *\r\n * @example React 18+\r\n * ```tsx\r\n * function Timer() {\r\n * const timer = useSyncExternalStore(\r\n * store.select(s => s.champSelectData.timer).subscribe,\r\n * store.select(s => s.champSelectData.timer).getSnapshot,\r\n * );\r\n * return <div>{timer?.timeRemaining}</div>;\r\n * }\r\n * ```\r\n */\r\nexport class ChampSelectStateStore {\r\n /** Current immutable snapshot. Replaced (never mutated) on every update. */\r\n private snapshot: ChampSelectSnapshot;\r\n\r\n /** Global listeners — called on every state change regardless of selector. */\r\n private listeners = new Set<() => void>();\r\n\r\n /** Monotonically increasing version — used for cheap stale checks. */\r\n private version = 0;\r\n\r\n constructor(initialState: champSelectStateData) {\r\n this.snapshot = Object.freeze({\r\n champSelectData: initialState,\r\n isActive: initialState.isActive,\r\n version: this.version,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Core API\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Return the current full snapshot. */\r\n getSnapshot(): ChampSelectSnapshot {\r\n return this.snapshot;\r\n }\r\n\r\n /** Return the current version number. */\r\n getVersion(): number {\r\n return this.version;\r\n }\r\n\r\n /**\r\n * Subscribe to **all** state changes (unfiltered).\r\n * Returns an unsubscribe function.\r\n */\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Selectors\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Create a **subscribable slice** that only triggers when the selected\r\n * value changes according to `equalityFn` (defaults to `===`).\r\n */\r\n select<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): Subscribable<S> {\r\n let currentValue: S = selector(this.snapshot);\r\n let lastVersion: number = this.version;\r\n const sliceListeners = new Set<() => void>();\r\n\r\n const getSnapshot = (): S => {\r\n if (lastVersion !== this.version) {\r\n const next = selector(this.snapshot);\r\n if (!equalityFn(currentValue, next)) {\r\n currentValue = next;\r\n }\r\n lastVersion = this.version;\r\n }\r\n return currentValue;\r\n };\r\n\r\n const subscribe = (listener: () => void): (() => void) => {\r\n sliceListeners.add(listener);\r\n\r\n const unsub = this.subscribe(() => {\r\n const prev = currentValue;\r\n const next = selector(this.snapshot);\r\n lastVersion = this.version;\r\n if (!equalityFn(prev, next)) {\r\n currentValue = next;\r\n listener();\r\n }\r\n });\r\n\r\n return () => {\r\n sliceListeners.delete(listener);\r\n unsub();\r\n };\r\n };\r\n\r\n return { subscribe, getSnapshot };\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Convenience helpers\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Watch a derived value and invoke `callback` whenever it changes.\r\n * Returns an unsubscribe function.\r\n */\r\n watch<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): () => void {\r\n let prev: S = selector(this.snapshot);\r\n return this.subscribe(() => {\r\n const next = selector(this.snapshot);\r\n if (!equalityFn(prev, next)) {\r\n const old = prev;\r\n prev = next;\r\n callback(next, old);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Watch a derived value and invoke `callback` whenever it changes,\r\n * **and** invoke it immediately with the current value.\r\n */\r\n watchImmediate<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n callback: (value: S, prev: S | undefined) => void,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): () => void {\r\n const current = selector(this.snapshot);\r\n callback(current, undefined);\r\n return this.watch(selector, callback, equalityFn);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Internal — called by LeagueBroadcastClient\r\n // ---------------------------------------------------------------------------\r\n\r\n /** @internal Replace champ-select data snapshot and notify listeners. */\r\n _setChampSelectData(data: champSelectStateData): void {\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n champSelectData: data,\r\n isActive: data.isActive,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n /** @internal Replace entire snapshot (used on champ select end / reset). */\r\n _reset(data: champSelectStateData): void {\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n champSelectData: data,\r\n isActive: data.isActive,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n private emit(): void {\r\n this.listeners.forEach((l) => l());\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Snapshot type\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface ChampSelectSnapshot {\r\n readonly champSelectData: champSelectStateData;\r\n /** Whether champ select is currently active. */\r\n readonly isActive: boolean;\r\n /** Monotonic version counter — useful for cheap stale checks. */\r\n readonly version: number;\r\n}\r\n","/**\r\n * Structural sharing utility.\r\n *\r\n * Creates a new object/array tree from `next`, but reuses references from\r\n * `prev` when values are deeply equal. This keeps nested references stable\r\n * across updates, so selectors only re-fire when their content actually\r\n * changes.\r\n */\r\nexport function structuralShare<T>(prev: T, next: T): T {\r\n if (Object.is(prev, next)) {\r\n return prev;\r\n }\r\n\r\n if (!isObject(prev) || !isObject(next)) {\r\n return next;\r\n }\r\n\r\n if (Array.isArray(prev) || Array.isArray(next)) {\r\n if (!Array.isArray(prev) || !Array.isArray(next)) {\r\n return next;\r\n }\r\n\r\n if (prev.length !== next.length) {\r\n return next.map((value, index) =>\r\n structuralShare(prev[index] as any, value as any),\r\n ) as unknown as T;\r\n }\r\n\r\n let changed = false;\r\n const shared = next.map((value, index) => {\r\n const nextValue = structuralShare(prev[index] as any, value as any);\r\n if (!Object.is(nextValue, prev[index])) {\r\n changed = true;\r\n }\r\n return nextValue;\r\n });\r\n\r\n return changed ? (shared as unknown as T) : prev;\r\n }\r\n\r\n const prevObj = prev as Record<string, unknown>;\r\n const nextObj = next as Record<string, unknown>;\r\n const nextKeys = Object.keys(nextObj);\r\n const prevKeys = Object.keys(prevObj);\r\n\r\n let changed = nextKeys.length !== prevKeys.length;\r\n if (!changed) {\r\n for (const key of prevKeys) {\r\n if (!Object.prototype.hasOwnProperty.call(nextObj, key)) {\r\n changed = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const result: Record<string, unknown> = Object.create(\r\n Object.getPrototypeOf(next),\r\n );\r\n\r\n for (const key of nextKeys) {\r\n const prevValue = prevObj[key];\r\n const nextValue = nextObj[key];\r\n const sharedValue = structuralShare(prevValue as any, nextValue as any);\r\n result[key] = sharedValue;\r\n if (!Object.is(sharedValue, prevValue)) {\r\n changed = true;\r\n }\r\n }\r\n\r\n return changed ? (result as T) : prev;\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return value !== null && typeof value === \"object\";\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum GameState {\r\n OutOfGame = 0,\r\n Loading = 1,\r\n Running = 2,\r\n Paused = 3,\r\n Mocking = 4,\r\n GameOver = 5,\r\n ChampionSelect = 6\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nimport { GameState } from \"../shared/gamestate\";\r\nimport { ingameDamageGraphData } from \"./damageGraph/ingameDamageGraphData\";\r\nimport { ingameGoldGraphData } from \"./graph/ingameGoldGraphData\";\r\nimport { ingameRuneData } from \"./rune/ingameRuneData\";\r\nimport { ingameScoreboardBottomData } from \"./scoreboardBottom/ingameScoreboardBottomData\";\r\nimport { ingameScoreboardData } from \"./topScoreboard/ingameScoreboardData\";\r\nimport { ingameSideInfoPage } from \"./tab/ingameSideInfoPage\";\r\nimport { tabTeam } from \"./tab/tabTeam\";\r\nimport { teamInhibitorData } from \"./inhibitor/teamInhibitorData\";\r\nimport { teamWithMembers } from \"../shared/teamWithMembers\";\r\nimport type { iObjectiveRespawnData } from \"./objective/iObjectiveRespawnData\";\r\n\r\nexport class ingameFrontendData {\r\n gameTime: number = 0;\r\n playbackSpeed: number = 0;\r\n isTestingEnvironment?: boolean;\r\n gameVersion: string = \"\";\r\n patch?: string;\r\n teams?: teamWithMembers[];\r\n gameStatus: GameState = GameState.OutOfGame;\r\n scoreboard?: ingameScoreboardData;\r\n tabs?: { [key: string]: tabTeam };\r\n scoreboardBottom?: ingameScoreboardBottomData;\r\n baronPitTimer?: iObjectiveRespawnData;\r\n dragonPitTimer?: iObjectiveRespawnData;\r\n inhibitors?: teamInhibitorData[];\r\n sideInfoPage?: ingameSideInfoPage;\r\n goldGraph?: ingameGoldGraphData;\r\n runes?: ingameRuneData;\r\n damageGraph?: ingameDamageGraphData;\r\n teamfightDamageOverview?: ingameDamageGraphData;\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nimport { championSelectTeam } from \"./championSelectTeam\";\r\nimport { champSelectStateMetaData } from \"./champSelectStateMetaData\";\r\nimport { pickBanTimer } from \"./pickBanTimer\";\r\n\r\nexport class champSelectStateData {\r\n isActive: boolean = false;\r\n isConnected: boolean = false;\r\n isTestingEnvironment: boolean = false;\r\n blueTeam: championSelectTeam = {} as championSelectTeam;\r\n redTeam: championSelectTeam = {} as championSelectTeam;\r\n metaData: champSelectStateMetaData = {} as champSelectStateMetaData;\r\n timer: pickBanTimer = {} as pickBanTimer;\r\n}\r\n","/**\r\n * Base HTTP client for League Broadcast REST API calls.\r\n *\r\n * Provides typed `get`, `post`, `put`, `patch`, and `delete` helpers that\r\n * handle JSON serialization, error responses, and empty bodies.\r\n *\r\n * Used internally by the generated API modules — you normally access this\r\n * through `LeagueBroadcastClient.api.*` rather than constructing it directly.\r\n */\r\nexport class ApiClient {\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string) {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n /** Update the base URL (e.g. after reconnecting to a different host/port). */\r\n updateBaseUrl(baseUrl: string): void {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n /** Current base URL. */\r\n getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n // ── HTTP verbs ──────────────────────────────────────────────────────────\r\n\r\n async get<T>(path: string): Promise<T> {\r\n return this.request<T>(\"GET\", path);\r\n }\r\n\r\n async post<T = void>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>(\"POST\", path, body);\r\n }\r\n\r\n async put<T = void>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>(\"PUT\", path, body);\r\n }\r\n\r\n async patch<T = void>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>(\"PATCH\", path, body);\r\n }\r\n\r\n async delete<T = void>(path: string): Promise<T> {\r\n return this.request<T>(\"DELETE\", path);\r\n }\r\n\r\n /**\r\n * POST with a raw string body (e.g. base64 image data).\r\n * Sets Content-Type to text/plain instead of application/json.\r\n */\r\n async postRaw<T = void>(path: string, rawBody: string): Promise<T> {\r\n return this.request<T>(\"POST\", path, rawBody, \"text/plain\");\r\n }\r\n\r\n /**\r\n * PUT with a raw string body (e.g. base64 image data).\r\n * Sets Content-Type to text/plain instead of application/json.\r\n */\r\n async putRaw<T = void>(path: string, rawBody: string): Promise<T> {\r\n return this.request<T>(\"PUT\", path, rawBody, \"text/plain\");\r\n }\r\n\r\n // ── Internal ────────────────────────────────────────────────────────────\r\n\r\n private buildUrl(path: string): string {\r\n // Ensure no double slashes between base and path\r\n const base = this.baseUrl.endsWith(\"/\")\r\n ? this.baseUrl.slice(0, -1)\r\n : this.baseUrl;\r\n const cleanPath = path.startsWith(\"/\") ? path.slice(1) : path;\r\n return `${base}/${cleanPath}`;\r\n }\r\n\r\n private async request<T>(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n contentType?: string,\r\n ): Promise<T> {\r\n const url = this.buildUrl(path);\r\n\r\n const headers: Record<string, string> = {};\r\n let bodyStr: string | undefined;\r\n\r\n if (body !== undefined) {\r\n if (contentType === \"text/plain\") {\r\n headers[\"Content-Type\"] = \"text/plain\";\r\n bodyStr = String(body);\r\n } else {\r\n headers[\"Content-Type\"] = \"application/json\";\r\n bodyStr = JSON.stringify(body);\r\n }\r\n }\r\n\r\n const res = await fetch(url, {\r\n method,\r\n headers,\r\n body: bodyStr,\r\n });\r\n\r\n if (!res.ok) {\r\n const errorBody = await res.text().catch(() => \"\");\r\n throw new ApiError(res.status, res.statusText, errorBody, url);\r\n }\r\n\r\n return this.parseResponse<T>(res);\r\n }\r\n\r\n private async parseResponse<T>(res: Response): Promise<T> {\r\n const text = await res.text();\r\n if (!text || text.length === 0) return undefined as T;\r\n try {\r\n return JSON.parse(text) as T;\r\n } catch {\r\n // If it's not JSON, return the raw text (e.g. for string endpoints)\r\n return text as unknown as T;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a REST API call returns a non-2xx status.\r\n */\r\nexport class ApiError extends Error {\r\n constructor(\r\n public readonly status: number,\r\n public readonly statusText: string,\r\n public readonly body: string,\r\n public readonly url: string,\r\n ) {\r\n super(`API Error ${status} (${statusText}) at ${url}`);\r\n this.name = \"ApiError\";\r\n }\r\n}\r\n","/**\r\n * Auto-generated REST API client for Champion select (pre-game) endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-04\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { simpleChampionData } from \"#types/shared/simplechampiondata\";\r\n\r\nexport class PreGameApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `POST championselect/mock/{doMocking}` */\r\n async mockChampionSelect(doMocking: boolean, randomizationinterval?: number): Promise<boolean> {\r\n return this.client.post<boolean>(`championselect/mock/${doMocking}${randomizationinterval !== undefined ? `?randomizationinterval=${encodeURIComponent(String(randomizationinterval))}` : ''}`);\r\n }\r\n\r\n /** `GET championselect/mock` */\r\n async getMockingStatus(): Promise<boolean> {\r\n return this.client.get<boolean>('championselect/mock');\r\n }\r\n\r\n /** `GET championselect/bans` */\r\n async getBans(): Promise<Record<number, Record<number, simpleChampionData[]>>> {\r\n return this.client.get<Record<number, Record<number, simpleChampionData[]>>>('championselect/bans');\r\n }\r\n\r\n /** `GET championselect/frontend` */\r\n async getFrontendUrl(): Promise<string> {\r\n return this.client.get<string>('championselect/frontend');\r\n }\r\n\r\n /** `GET championselect/stage/{stageSide}/teamid` */\r\n async getTeamIdOnSide(stageSide: number): Promise<number> {\r\n return this.client.get<number>(`championselect/stage/${stageSide}/teamid`);\r\n }\r\n\r\n /** `POST championselect/frontend` */\r\n async changeRouting(uri: string): Promise<void> {\r\n return this.client.post<void>(`championselect/frontend?uri=${encodeURIComponent(String(uri))}`);\r\n }\r\n\r\n /** `GET championselect/stage/{stageside}/{slotid}` */\r\n async getPlayerPUUIDInSlot(stageside: number, slotid: number): Promise<string> {\r\n return this.client.get<string>(`championselect/stage/${stageside}/${slotid}`);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for Game CRUD and draft (picks/bans) endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-04\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { gameWithTeams } from \"#types/shared/gamewithteams\";\r\nimport type { simpleChampionData } from \"#types/shared/simplechampiondata\";\r\nimport type { teamWithMembers } from \"#types/shared/teamwithmembers\";\r\n\r\nexport class GameApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET game/current` */\r\n async getCurrentGame(): Promise<gameWithTeams> {\r\n return this.client.get<gameWithTeams>('game/current');\r\n }\r\n\r\n /** `GET game/previous` */\r\n async getPreviousGame(): Promise<number> {\r\n return this.client.get<number>('game/previous');\r\n }\r\n\r\n /** `GET game/{gameid}` */\r\n async getGame(gameid: number): Promise<gameWithTeams> {\r\n return this.client.get<gameWithTeams>(`game/${gameid}`);\r\n }\r\n\r\n /** `PATCH game/{gameid}` */\r\n async updateGame(gameid: number, game: unknown): Promise<void> {\r\n return this.client.patch<void>(`game/${gameid}`, game);\r\n }\r\n\r\n /** `PUT game/{gameid}/teams` */\r\n async setSideSelection(gameid: number, teams: number[]): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/teams`, teams);\r\n }\r\n\r\n /** `GET game/{gameid}/teams` */\r\n async getTeamsInGame(gameid: number): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>(`game/${gameid}/teams`);\r\n }\r\n\r\n /** `DELETE game/{gameid}/winner` */\r\n async removeGameWinner(gameid: number): Promise<void> {\r\n return this.client.delete<void>(`game/${gameid}/winner`);\r\n }\r\n\r\n /** `PUT game/{gameid}/winner/{teamid}` */\r\n async setGameWinner(gameid: number, teamid: number): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/winner/${teamid}`);\r\n }\r\n\r\n /** `GET game/{gameid}/bans` */\r\n async getBans(gameid: number): Promise<simpleChampionData[]> {\r\n return this.client.get<simpleChampionData[]>(`game/${gameid}/bans`);\r\n }\r\n\r\n /** `GET game/{gameid}/bans/{teamid}` */\r\n async getBansForTeam(gameid: number, teamid: number): Promise<simpleChampionData[]> {\r\n return this.client.get<simpleChampionData[]>(`game/${gameid}/bans/${teamid}`);\r\n }\r\n\r\n /** `PUT game/{gameid}/bans` */\r\n async setBans(gameid: number, bans: Record<number, (string | null)[]>): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/bans`, bans);\r\n }\r\n\r\n /** `PUT game/{gameid}/bans/{teamid}` */\r\n async setBansForTeam(gameid: number, teamid: number, bans: (string | null)[]): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/bans/${teamid}`, bans);\r\n }\r\n\r\n /** `GET game/{gameid}/picks` */\r\n async getPicks(gameid: number): Promise<Record<number, simpleChampionData[]>> {\r\n return this.client.get<Record<number, simpleChampionData[]>>(`game/${gameid}/picks`);\r\n }\r\n\r\n /** `GET game/{gameid}/picks/{teamid}` */\r\n async getPicksForTeam(gameid: number, teamid: number): Promise<simpleChampionData[]> {\r\n return this.client.get<simpleChampionData[]>(`game/${gameid}/picks/${teamid}`);\r\n }\r\n\r\n /** `PUT game/{gameid}/picks` */\r\n async setPicks(gameid: number, picks: Record<number, (string | null)[]>): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/picks`, picks);\r\n }\r\n\r\n /** `PUT game/{gameid}/picks/{teamid}` */\r\n async setPicksForTeam(gameid: number, teamid: number, picks: (string | null)[]): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/picks/${teamid}`, picks);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for Live game state endpoints (requires active game).\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-04\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { tabPlayer } from \"#types/ingame/tab/tabplayer\";\r\n\r\nexport class GameStateApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET game/state/time` */\r\n async getGameTime(): Promise<number> {\r\n return this.client.get<number>('game/state/time');\r\n }\r\n\r\n /** `GET game/state/team/{teamId}/dragons` */\r\n async getTeamDragons(teamId: number): Promise<string[]> {\r\n return this.client.get<string[]>(`game/state/team/${teamId}/dragons`);\r\n }\r\n\r\n /** `PATCH game/state/team/{teamId}/dragons` */\r\n async updateTeamDragons(teamId: number, dragons: string[]): Promise<void> {\r\n return this.client.patch<void>(`game/state/team/${teamId}/dragons`, dragons);\r\n }\r\n\r\n /** `GET game/state/team/all/index` */\r\n async getActiveTeams(): Promise<number[]> {\r\n return this.client.get<number[]>('game/state/team/all/index');\r\n }\r\n\r\n /** `GET game/state/team/all/participant` */\r\n async getAllTeamParticipants(): Promise<Record<number, tabPlayer[]>> {\r\n return this.client.get<Record<number, tabPlayer[]>>('game/state/team/all/participant');\r\n }\r\n\r\n /** `GET game/state/team/{teamId}/participant` */\r\n async getTeamParticipants(teamId: number): Promise<tabPlayer[]> {\r\n return this.client.get<tabPlayer[]>(`game/state/team/${teamId}/participant`);\r\n }\r\n\r\n /** `GET game/state/team/all/participant/order` */\r\n async getTeamParticipantOrder(): Promise<string[]> {\r\n return this.client.get<string[]>('game/state/team/all/participant/order');\r\n }\r\n\r\n /** `PUT game/state/team/all/participant/order` */\r\n async updateTeamParticipantOrder(orderedNames: string[]): Promise<void> {\r\n return this.client.put<void>('game/state/team/all/participant/order', orderedNames);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for Match (series) management endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-04\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { matchData } from \"#types/pregame/matchdata\";\r\nimport type { BestOfType } from \"#types/shared/bestoftype\";\r\nimport type { gameWithTeams } from \"#types/shared/gamewithteams\";\r\nimport type { MatchRuleSet } from \"#types/shared/matchruleset\";\r\nimport type { matchWithGamesAndTeams } from \"#types/shared/matchwithgamesandteams\";\r\nimport type { simpleChampionData } from \"#types/shared/simplechampiondata\";\r\nimport type { teamWithMembers } from \"#types/shared/teamwithmembers\";\r\n\r\nexport class MatchApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET match/season/{seasonId}/simple` */\r\n async getSimpleMatches(seasonId: number): Promise<matchData[]> {\r\n return this.client.get<matchData[]>(`match/season/${seasonId}/simple`);\r\n }\r\n\r\n /** `GET match/season/{seasonId}` */\r\n async getMatches(seasonId: number): Promise<matchWithGamesAndTeams[]> {\r\n return this.client.get<matchWithGamesAndTeams[]>(`match/season/${seasonId}`);\r\n }\r\n\r\n /** `GET match/simple` */\r\n async getAllSimpleMatches(): Promise<matchData[]> {\r\n return this.client.get<matchData[]>('match/simple');\r\n }\r\n\r\n /** `GET match` */\r\n async getAllMatches(): Promise<matchWithGamesAndTeams[]> {\r\n return this.client.get<matchWithGamesAndTeams[]>('match');\r\n }\r\n\r\n /** `GET match/current` */\r\n async getCurrentMatch(): Promise<matchWithGamesAndTeams> {\r\n return this.client.get<matchWithGamesAndTeams>('match/current');\r\n }\r\n\r\n /** `POST match/current` */\r\n async completeCurrentMatch(): Promise<void> {\r\n return this.client.post<void>('match/current');\r\n }\r\n\r\n /** `GET match/current/id` */\r\n async getCurrentMatchId(): Promise<number> {\r\n return this.client.get<number>('match/current/id');\r\n }\r\n\r\n /** `GET match/previous/id` */\r\n async getPreviousMatchId(): Promise<number> {\r\n return this.client.get<number>('match/previous/id');\r\n }\r\n\r\n /** `POST match/current/{seriesid}` */\r\n async setCurrentMatch(seriesid: number): Promise<void> {\r\n return this.client.post<void>(`match/current/${seriesid}`);\r\n }\r\n\r\n /** `GET match/current/bestof` */\r\n async getCurrentMatchBestOf(): Promise<BestOfType> {\r\n return this.client.get<BestOfType>('match/current/bestof');\r\n }\r\n\r\n /** `PUT match/current/bestof` */\r\n async setCurrentMatchBestOf(type: BestOfType): Promise<void> {\r\n return this.client.put<void>('match/current/bestof', type);\r\n }\r\n\r\n /** `GET match/current/teams` */\r\n async getCurrentMatchTeams(): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>('match/current/teams');\r\n }\r\n\r\n /** `PUT match/current/teams` */\r\n async setCurrentMatchTeams(teamIds: number[]): Promise<void> {\r\n return this.client.put<void>('match/current/teams', teamIds);\r\n }\r\n\r\n /** `GET match/current/game` */\r\n async getCurrentGame(): Promise<gameWithTeams> {\r\n return this.client.get<gameWithTeams>('match/current/game');\r\n }\r\n\r\n /** `GET match/current/ruleset` */\r\n async getCurrentMatchRuleset(): Promise<MatchRuleSet> {\r\n return this.client.get<MatchRuleSet>('match/current/ruleset');\r\n }\r\n\r\n /** `PUT match/current/ruleset/{ruleset}` */\r\n async setCurrentMatchRuleset(ruleset: MatchRuleSet): Promise<void> {\r\n return this.client.put<void>(`match/current/ruleset/${ruleset}`);\r\n }\r\n\r\n /** `GET match/current/fearless/bans` */\r\n async getBans(): Promise<Record<number, Record<number, simpleChampionData[]>>> {\r\n return this.client.get<Record<number, Record<number, simpleChampionData[]>>>('match/current/fearless/bans');\r\n }\r\n\r\n /** `GET match/current/onstage` */\r\n async getCurrentMatchOnStage(): Promise<boolean> {\r\n return this.client.get<boolean>('match/current/onstage');\r\n }\r\n\r\n /** `GET match/{matchid}` */\r\n async getMatch(matchid: number): Promise<matchWithGamesAndTeams> {\r\n return this.client.get<matchWithGamesAndTeams>(`match/${matchid}`);\r\n }\r\n\r\n /** `DELETE match/{matchid}` */\r\n async deleteMatch(matchid: number): Promise<boolean> {\r\n return this.client.delete<boolean>(`match/${matchid}`);\r\n }\r\n\r\n /** `GET match/{matchid}/teams` */\r\n async getMatchTeams(matchid: number): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>(`match/${matchid}/teams`);\r\n }\r\n\r\n /** `PUT match/{matchid}/teams` */\r\n async setMatchTeams(matchid: number, teamIds: number[]): Promise<void> {\r\n return this.client.put<void>(`match/${matchid}/teams`, teamIds);\r\n }\r\n\r\n /** `GET match/{matchid}/games` */\r\n async getMatchGames(matchid: number): Promise<gameWithTeams[]> {\r\n return this.client.get<gameWithTeams[]>(`match/${matchid}/games`);\r\n }\r\n\r\n /** `GET match/{matchid}/winner` */\r\n async getMatchWinner(matchid: number): Promise<teamWithMembers> {\r\n return this.client.get<teamWithMembers>(`match/${matchid}/winner`);\r\n }\r\n\r\n /** `PUT match/{matchid}/winner/{teamid}` */\r\n async setMatchWinner(matchid: number, teamid: number): Promise<void> {\r\n return this.client.put<void>(`match/${matchid}/winner/${teamid}`);\r\n }\r\n\r\n /** `DELETE match/{matchid}/winner` */\r\n async removeMatchWinner(matchid: number): Promise<void> {\r\n return this.client.delete<void>(`match/${matchid}/winner`);\r\n }\r\n\r\n /** `GET match/{matchid}/bestof` */\r\n async getMatchBestOf(matchid: number): Promise<BestOfType> {\r\n return this.client.get<BestOfType>(`match/${matchid}/bestof`);\r\n }\r\n\r\n /** `PUT match/{matchid}/bestof/{type}` */\r\n async setMatchBestOf(matchid: number, type: BestOfType): Promise<void> {\r\n return this.client.put<void>(`match/${matchid}/bestof/${type}`);\r\n }\r\n\r\n /** `GET match/{matchid}/ruleset` */\r\n async getMatchRuleset(matchid: number): Promise<MatchRuleSet> {\r\n return this.client.get<MatchRuleSet>(`match/${matchid}/ruleset`);\r\n }\r\n\r\n /** `PUT match/{matchid}/ruleset/{ruleset}` */\r\n async setMatchRuleset(matchid: number, ruleset: MatchRuleSet): Promise<void> {\r\n return this.client.put<void>(`match/${matchid}/ruleset/${ruleset}`);\r\n }\r\n\r\n /** `GET match/{matchid}/name` */\r\n async getMatchName(matchid: number): Promise<string> {\r\n return this.client.get<string>(`match/${matchid}/name`);\r\n }\r\n\r\n /** `PATCH match/{matchid}/name/{matchName}` */\r\n async setMatchName(matchid: number, matchName: string): Promise<void> {\r\n return this.client.patch<void>(`match/${matchid}/name/${matchName}`);\r\n }\r\n\r\n /** `PATCH match/{matchid}` */\r\n async updateMatch(matchid: number, matchUpdate: unknown): Promise<void> {\r\n return this.client.patch<void>(`match/${matchid}`, matchUpdate);\r\n }\r\n\r\n /** `GET match/{matchid}/fearless/bans` */\r\n async getMatchBans(matchid: number): Promise<Record<number, Record<number, simpleChampionData[]>>> {\r\n return this.client.get<Record<number, Record<number, simpleChampionData[]>>>(`match/${matchid}/fearless/bans`);\r\n }\r\n\r\n /** `GET match/{seriesid}/onstage` */\r\n async getMatchOnStage(seriesid: number): Promise<boolean> {\r\n return this.client.get<boolean>(`match/${seriesid}/onstage`);\r\n }\r\n\r\n /** `PUT match` */\r\n async addMatch(match: unknown): Promise<number> {\r\n return this.client.put<number>('match', match);\r\n }\r\n\r\n /** `GET match/{matchId}/stage/team/{stageSide}` */\r\n async getTeamOnStageSide(matchId: number, stageSide: number): Promise<teamWithMembers> {\r\n return this.client.get<teamWithMembers>(`match/${matchId}/stage/team/${stageSide}`);\r\n }\r\n\r\n /** `GET match/current/stage/team/{stageSide}` */\r\n async getTeamOnStageSideCurrent(stageSide: number): Promise<teamWithMembers> {\r\n return this.client.get<teamWithMembers>(`match/current/stage/team/${stageSide}`);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for Season management endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-04\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { matchWithGamesAndTeams } from \"#types/shared/matchwithgamesandteams\";\r\nimport type { seasonData } from \"#types/shared/seasondata\";\r\nimport type { teamData } from \"#types/shared/teamdata\";\r\nimport type { teamWithMembers } from \"#types/shared/teamwithmembers\";\r\n\r\nexport class SeasonApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET season/current` */\r\n async getCurrentSeason(): Promise<seasonData> {\r\n return this.client.get<seasonData>('season/current');\r\n }\r\n\r\n /** `GET season/current/match` */\r\n async getCurrentSeasonScheduledMatch(): Promise<matchWithGamesAndTeams> {\r\n return this.client.get<matchWithGamesAndTeams>('season/current/match');\r\n }\r\n\r\n /** `GET season/current/id` */\r\n async getCurrentSeasonId(): Promise<number> {\r\n return this.client.get<number>('season/current/id');\r\n }\r\n\r\n /** `POST season/current` */\r\n async setCurrentSeason(newCurrentSeasonId: number): Promise<void> {\r\n return this.client.post<void>('season/current', newCurrentSeasonId);\r\n }\r\n\r\n /** `GET season/current/teams` */\r\n async getCurrentSeasonTeams(): Promise<teamData[]> {\r\n return this.client.get<teamData[]>('season/current/teams');\r\n }\r\n\r\n /** `GET season/current/teamswithmembers` */\r\n async getCurrentSeasonTeamsWithMembers(): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>('season/current/teamswithmembers');\r\n }\r\n\r\n /** `GET season/current/icon` */\r\n async getCurrentSeasonIcon(): Promise<string> {\r\n return this.client.get<string>('season/current/icon');\r\n }\r\n\r\n /** `PUT season/current/icon` */\r\n async setCurrentSeasonIcon(): Promise<string> {\r\n return this.client.put<string>('season/current/icon');\r\n }\r\n\r\n /** `GET season` */\r\n async getAllSeasons(): Promise<seasonData[]> {\r\n return this.client.get<seasonData[]>('season');\r\n }\r\n\r\n /** `GET season/{seasonId}` */\r\n async getSeasonById(seasonId: number): Promise<seasonData> {\r\n return this.client.get<seasonData>(`season/${seasonId}`);\r\n }\r\n\r\n /** `GET season/{seasonId}/matches` */\r\n async getMatchesInSeason(seasonId: number): Promise<matchWithGamesAndTeams[]> {\r\n return this.client.get<matchWithGamesAndTeams[]>(`season/${seasonId}/matches`);\r\n }\r\n\r\n /** `GET season/{seasonId}/matches/count` */\r\n async getMatchesInSeasonCount(seasonId: number): Promise<number> {\r\n return this.client.get<number>(`season/${seasonId}/matches/count`);\r\n }\r\n\r\n /** `GET season/{seasonId}/matches/day/{day}` */\r\n async getMatchesInSeasonOnDay(seasonId: number, day: string): Promise<matchWithGamesAndTeams[]> {\r\n return this.client.get<matchWithGamesAndTeams[]>(`season/${seasonId}/matches/day/${day}`);\r\n }\r\n\r\n /** `GET season/{seasonId}/teams` */\r\n async getTeamsInSeason(seasonId: number): Promise<teamData[]> {\r\n return this.client.get<teamData[]>(`season/${seasonId}/teams`);\r\n }\r\n\r\n /** `GET season/{seasonId}/teamswithmembers` */\r\n async getTeamsWithMembersInSeason(seasonId: number): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>(`season/${seasonId}/teamswithmembers`);\r\n }\r\n\r\n /** `POST season` */\r\n async createOrUpdateSeason(seasonData: seasonData): Promise<number> {\r\n return this.client.post<number>('season', seasonData);\r\n }\r\n\r\n /** `GET season/{seasonId}/icon` */\r\n async getSeasonIcon(seasonId: number): Promise<string> {\r\n return this.client.get<string>(`season/${seasonId}/icon`);\r\n }\r\n\r\n /** `PUT season/{seasonId}/icon` */\r\n async setSeasonIcon(seasonId: number): Promise<string> {\r\n return this.client.put<string>(`season/${seasonId}/icon`);\r\n }\r\n\r\n /** `DELETE season/{seasonId}` */\r\n async deleteSeason(seasonId: number): Promise<void> {\r\n return this.client.delete<void>(`season/${seasonId}`);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for In-game overlay and serialization endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-04\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\n\r\nexport class IngameApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET ingame/status` */\r\n async getGameState(): Promise<number> {\r\n return this.client.get<number>('ingame/status');\r\n }\r\n\r\n /** `POST ingame/enable` */\r\n async enableComponent(): Promise<void> {\r\n return this.client.post<void>('ingame/enable');\r\n }\r\n\r\n /** `POST ingame/disable` */\r\n async disableComponent(): Promise<void> {\r\n return this.client.post<void>('ingame/disable');\r\n }\r\n\r\n /** `POST ingame/mock/{doMocking}` */\r\n async mockIngame(doMocking: boolean): Promise<void> {\r\n return this.client.post<void>(`ingame/mock/${doMocking}`);\r\n }\r\n\r\n /** `GET ingame/mock` */\r\n async getMockingStatus(): Promise<boolean> {\r\n return this.client.get<boolean>('ingame/mock');\r\n }\r\n\r\n /** `GET ingame/frontend` */\r\n async getFrontendUrl(): Promise<string> {\r\n return this.client.get<string>('ingame/frontend');\r\n }\r\n\r\n /** `GET ingame/showing` */\r\n async getCurrentCommonSerializationOptions(): Promise<Record<string, unknown>> {\r\n return this.client.get<Record<string, unknown>>('ingame/showing');\r\n }\r\n\r\n /** `POST ingame/showing` */\r\n async setCurrentCommonSerializationOptions(data: Record<string, unknown>): Promise<void> {\r\n return this.client.post<void>('ingame/showing', data);\r\n }\r\n\r\n /** `GET ingame/showing/{socketid}` */\r\n async getCurrentFrontendSerializationOptions(socketid: string): Promise<Record<string, unknown>> {\r\n return this.client.get<Record<string, unknown>>(`ingame/showing/${socketid}`);\r\n }\r\n\r\n /** `POST ingame/showing/{socketid}` */\r\n async setCurrentFrontendSerializationOptions(socketid: string, data: Record<string, unknown>): Promise<void> {\r\n return this.client.post<void>(`ingame/showing/${socketid}`, data);\r\n }\r\n\r\n /** `GET ingame/stage/{stageSide}/{playerSlot}/networkId` */\r\n async getPlayerPUUIDInSlot(stageSide: number, playerSlot: number): Promise<number> {\r\n return this.client.get<number>(`ingame/stage/${stageSide}/${playerSlot}/networkId`);\r\n }\r\n\r\n /** `GET ingame/stage/{stageSide}/ingameteamid` */\r\n async getIngameTeamOnStageSide(stageSide: number): Promise<number> {\r\n return this.client.get<number>(`ingame/stage/${stageSide}/ingameteamid`);\r\n }\r\n\r\n /** `GET ingame/state/activeOverlays` */\r\n async getActiveOverlays(): Promise<unknown> {\r\n return this.client.get<unknown>('ingame/state/activeOverlays');\r\n }\r\n}\r\n\r\n","/**\r\n * Composite REST API client that aggregates all generated API modules.\r\n *\r\n * Access individual API groups via the named properties:\r\n *\r\n * ```ts\r\n * const client = new LeagueBroadcastClient({ host: \"localhost\" });\r\n *\r\n * // Games\r\n * const game = await client.api.game.getCurrent();\r\n *\r\n * // Matches\r\n * const match = await client.api.match.getCurrent();\r\n * await client.api.match.setCurrentBestOf(BestOfType.BestOf3);\r\n *\r\n * // Seasons\r\n * const seasons = await client.api.season.getAll();\r\n *\r\n * // In-game overlay control\r\n * await client.api.ingame.enable();\r\n * const overlays = await client.api.ingame.getActiveOverlays();\r\n *\r\n * // Live game state (requires active game)\r\n * const time = await client.api.gameState.getGameTime();\r\n * const players = await client.api.gameState.getAllParticipants();\r\n *\r\n * // Pre-game / champion select\r\n * const frontendUrl = await client.api.preGame.getFrontendUrl();\r\n * ```\r\n */\r\n\r\nimport { ApiClient } from \"./ApiClient\";\r\nimport {\r\n IngameApi,\r\n GameApi,\r\n MatchApi,\r\n SeasonApi,\r\n PreGameApi,\r\n GameStateApi,\r\n} from \"./generated\";\r\n\r\nexport class RestApi {\r\n private readonly client: ApiClient;\r\n\r\n /** In-game overlay and serialization endpoints. */\r\n public readonly ingame: IngameApi;\r\n\r\n /** Game CRUD, picks/bans, and winner endpoints. */\r\n public readonly game: GameApi;\r\n\r\n /** Match (series) management — current match, teams, fearless bans, etc. */\r\n public readonly match: MatchApi;\r\n\r\n /** Season management — CRUD, teams, icons, match listings. */\r\n public readonly season: SeasonApi;\r\n\r\n /** Champion select (pre-game) mocking, bans, frontend routing. */\r\n public readonly preGame: PreGameApi;\r\n\r\n /** Live game state — participants, dragons, ordering. Requires active game. */\r\n public readonly gameState: GameStateApi;\r\n\r\n constructor(baseUrl: string) {\r\n this.client = new ApiClient(baseUrl);\r\n\r\n this.ingame = new IngameApi(this.client);\r\n this.game = new GameApi(this.client);\r\n this.match = new MatchApi(this.client);\r\n this.season = new SeasonApi(this.client);\r\n this.preGame = new PreGameApi(this.client);\r\n this.gameState = new GameStateApi(this.client);\r\n }\r\n\r\n /**\r\n * Update the base URL for all API modules (e.g. after changing host/port).\r\n */\r\n updateBaseUrl(baseUrl: string): void {\r\n this.client.updateBaseUrl(baseUrl);\r\n }\r\n\r\n /**\r\n * Get direct access to the underlying HTTP client for custom requests.\r\n */\r\n getHttpClient(): ApiClient {\r\n return this.client;\r\n }\r\n}\r\n","import { WebSocketManager } from \"./WebSocketManager\";\r\nimport { GameStateStore } from \"./reactivity/GameStateStore\";\r\nimport { ChampSelectStateStore } from \"./reactivity/ChampSelectStateStore\";\r\nimport { structuralShare } from \"./reactivity/structuralShare\";\r\nimport type { Subscribable, EqualityFn } from \"./reactivity/GameStateStore\";\r\nimport type { GameStateSnapshot } from \"./reactivity/GameStateStore\";\r\nimport type { ChampSelectSnapshot } from \"./reactivity/ChampSelectStateStore\";\r\nimport { ingameFrontendData } from \"#types/ingame/ingamefrontenddata\";\r\nimport { GameState } from \"#types/shared/gamestate\";\r\nimport type { transitionEvents } from \"#types/ingame/event/transitionevents\";\r\nimport type { playerUpdateEvent } from \"#types/ingame/event/playerUpdateEvent\";\r\nimport type { teamUpdateResults } from \"#types/ingame/event/teamUpdateResults\";\r\nimport type { ingameObjectiveEvent } from \"#types/ingame/event/ingameObjectiveEvent\";\r\nimport type { announcerEvent } from \"#types/ingame/announcer/announcerEvent\";\r\nimport type { killFeedEvent } from \"#types/ingame/event/killFeedEvent\";\r\nimport { Team } from \"#types/shared/style/Team\";\r\nimport { champSelectStateData } from \"#types/pregame/champselectstatedata\";\r\nimport type { pickBanActionEventArgs } from \"#types/pregame/pickbanactioneventargs\";\r\nimport { RestApi } from \"./api/RestApi\";\r\n\r\nexport interface LeagueBroadcastClientConfig {\r\n host: string;\r\n port?: number;\r\n /** In-game WebSocket route. @default \"/ws/in\" */\r\n ingameWsRoute?: string;\r\n /** Pre-game (champion select) WebSocket route. @default \"/ws/pre\" */\r\n preGameWsRoute?: string;\r\n apiRoute?: string;\r\n cacheRoute?: string;\r\n useHttps?: boolean;\r\n autoConnect?: boolean;\r\n}\r\n\r\nexport interface IngameEventHandlers {\r\n onPlayerEvent?: (event: playerUpdateEvent) => void;\r\n onTeamEvent?: (event: teamUpdateResults) => void;\r\n onObjectiveEvent?: (event: ingameObjectiveEvent) => void;\r\n onFirstTowerEvent?: (teamId: Team) => void;\r\n onAnnouncementEvent?: (event: announcerEvent) => void;\r\n onKillFeedEvent?: (event: killFeedEvent) => void;\r\n}\r\n\r\nexport interface ChampSelectEventHandlers {\r\n /** Fired for every pick/ban action (hover, lock, ban reveal, phase transition). */\r\n onAction?: (action: pickBanActionEventArgs) => void;\r\n /** Fired when champ select becomes active (first state update with `isActive === true`). */\r\n onChampSelectStart?: () => void;\r\n /** Fired when champ select ends (backend sends `isActive === false`). */\r\n onChampSelectEnd?: () => void;\r\n /** Fired when the frontend route changes (e.g. navigating between pre-game views). */\r\n onRouteUpdate?: (uri: string) => void;\r\n}\r\n\r\n/**\r\n * Main client for connecting to the League Broadcast backend.\r\n *\r\n * Internally manages **two** WebSocket connections:\r\n * - `/ws/in` — real-time in-game data\r\n * - `/ws/pre` — champion-select (pre-game) data\r\n *\r\n * Both connections are opened on {@link connect} (or automatically if\r\n * `autoConnect` is `true`) and share the same host / port.\r\n *\r\n * @example\r\n * ```ts\r\n * const client = new LeagueBroadcastClient({ host: \"localhost\" });\r\n *\r\n * // In-game\r\n * client.onIngameStateUpdate(data => console.log(\"Game time:\", data.gameTime));\r\n * client.watchIngame(s => s.gameData.scoreboard?.teams[0]?.kills, kills => { });\r\n *\r\n * // Pre-game\r\n * client.onChampSelectUpdate(data => console.log(\"Phase:\", data.timer.phaseName));\r\n * client.onChampSelectEvents({ onAction: a => console.log(a) });\r\n * client.selectChampSelect(s => s.champSelectData.timer);\r\n * ```\r\n */\r\nexport class LeagueBroadcastClient {\r\n // -- WebSocket connections --------------------------------------------------\r\n private ingameWs: WebSocketManager;\r\n private preGameWs: WebSocketManager;\r\n\r\n private config: Required<LeagueBroadcastClientConfig>;\r\n\r\n // -- In-game state ----------------------------------------------------------\r\n private gameData: ingameFrontendData;\r\n private gameState: GameState = GameState.OutOfGame;\r\n private _isTestingEnvironment: boolean = false;\r\n\r\n // -- Pre-game state ---------------------------------------------------------\r\n private champSelectData: champSelectStateData;\r\n private champSelectWasActive: boolean = false;\r\n\r\n // -- Reactive stores --------------------------------------------------------\r\n\r\n /** Reactive store for **in-game** state. */\r\n public readonly ingameStore: GameStateStore;\r\n\r\n /** Reactive store for **pre-game** (champion select) state. */\r\n public readonly preGameStore: ChampSelectStateStore;\r\n\r\n // -- REST API ---------------------------------------------------------------\r\n\r\n /**\r\n * Typed REST API client for all backend HTTP endpoints.\r\n *\r\n * Provides access to game, match, season, in-game, pre-game, and\r\n * game-state API groups:\r\n *\r\n * ```ts\r\n * const game = await client.api.game.getCurrent();\r\n * const match = await client.api.match.getCurrent();\r\n * await client.api.ingame.enable();\r\n * ```\r\n */\r\n public readonly api: RestApi;\r\n\r\n // -- In-game event handlers -------------------------------------------------\r\n private stateUpdateHandlers: Set<(state: ingameFrontendData) => void> =\r\n new Set();\r\n private gameStatusHandlers: Set<\r\n (status: GameState, isTestingEnv: boolean) => void\r\n > = new Set();\r\n private ingameEventHandlers: IngameEventHandlers = {};\r\n\r\n // -- Pre-game event handlers ------------------------------------------------\r\n private champSelectUpdateHandlers: Set<\r\n (state: champSelectStateData) => void\r\n > = new Set();\r\n private champSelectEventHandlers: ChampSelectEventHandlers = {};\r\n\r\n constructor(config: LeagueBroadcastClientConfig) {\r\n this.config = {\r\n host: config.host,\r\n port: config.port ?? 58869,\r\n ingameWsRoute: config.ingameWsRoute ?? \"/ws/in\",\r\n preGameWsRoute: config.preGameWsRoute ?? \"/ws/pre\",\r\n apiRoute: config.apiRoute ?? \"/api\",\r\n cacheRoute: config.cacheRoute ?? \"/cache\",\r\n useHttps: config.useHttps ?? false,\r\n autoConnect: config.autoConnect ?? true,\r\n };\r\n\r\n // REST API\r\n const httpProtocol = this.config.useHttps ? \"https\" : \"http\";\r\n const apiBaseUrl = `${httpProtocol}://${this.config.host}:${this.config.port}${this.config.apiRoute}`;\r\n this.api = new RestApi(apiBaseUrl);\r\n\r\n // Ingame\r\n this.ingameWs = new WebSocketManager();\r\n this.gameData = new ingameFrontendData();\r\n this.ingameStore = new GameStateStore(this.gameData, this.gameState);\r\n this.setupIngameMessageHandler();\r\n\r\n // Pre-game\r\n this.preGameWs = new WebSocketManager();\r\n this.champSelectData = new champSelectStateData();\r\n this.preGameStore = new ChampSelectStateStore(this.champSelectData);\r\n this.setupPreGameMessageHandler();\r\n\r\n if (this.config.autoConnect) {\r\n this.connect();\r\n }\r\n }\r\n\r\n // ===========================================================================\r\n // Connection management\r\n // ===========================================================================\r\n\r\n /**\r\n * Connect to both in-game and pre-game WebSocket endpoints.\r\n *\r\n * Both connections are attempted in parallel. If either fails the returned\r\n * promise rejects, but the other connection may still succeed.\r\n */\r\n async connect(): Promise<void> {\r\n const protocol = this.config.useHttps ? \"wss\" : \"ws\";\r\n const base = `${protocol}://${this.config.host}:${this.config.port}`;\r\n\r\n const ingameUrl = `${base}${this.config.ingameWsRoute}`;\r\n const preGameUrl = `${base}${this.config.preGameWsRoute}`;\r\n\r\n const results = await Promise.allSettled([\r\n this.ingameWs.connect(ingameUrl),\r\n this.preGameWs.connect(preGameUrl),\r\n ]);\r\n\r\n const failures = results.filter((r) => r.status === \"rejected\");\r\n if (failures.length > 0) {\r\n const reasons = (failures as PromiseRejectedResult[]).map(\r\n (r) => r.reason,\r\n );\r\n console.error(\r\n \"[LeagueBroadcastClient] One or more connections failed:\",\r\n reasons,\r\n );\r\n throw reasons[0];\r\n }\r\n }\r\n\r\n /**\r\n * Disconnect from both WebSocket endpoints.\r\n */\r\n disconnect(): void {\r\n this.ingameWs.disconnect();\r\n this.preGameWs.disconnect();\r\n }\r\n\r\n /**\r\n * Whether the in-game WebSocket is connected.\r\n */\r\n isIngameConnected(): boolean {\r\n return this.ingameWs.isConnected();\r\n }\r\n\r\n /**\r\n * Whether the pre-game WebSocket is connected.\r\n */\r\n isPreGameConnected(): boolean {\r\n return this.preGameWs.isConnected();\r\n }\r\n\r\n // ===========================================================================\r\n // In-game data access\r\n // ===========================================================================\r\n\r\n /** Get the current in-game data. */\r\n getIngameData(): ingameFrontendData {\r\n return this.gameData;\r\n }\r\n\r\n /** Get the current game state. */\r\n getIngameState(): GameState {\r\n return this.gameState;\r\n }\r\n\r\n /** Whether the backend is in a testing / replay environment. */\r\n isInTestingEnvironment(): boolean {\r\n return this._isTestingEnvironment;\r\n }\r\n\r\n // ===========================================================================\r\n // Pre-game data access\r\n // ===========================================================================\r\n\r\n /** Get the current champion-select state. */\r\n getChampSelectData(): champSelectStateData {\r\n return this.champSelectData;\r\n }\r\n\r\n /** Whether champion select is currently active. */\r\n isChampSelectActive(): boolean {\r\n return this.champSelectData.isActive;\r\n }\r\n\r\n // ===========================================================================\r\n // In-game event handlers\r\n // ===========================================================================\r\n\r\n /** Register a handler for in-game state updates. */\r\n onIngameStateUpdate(handler: (state: ingameFrontendData) => void): () => void {\r\n this.stateUpdateHandlers.add(handler);\r\n return () => this.stateUpdateHandlers.delete(handler);\r\n }\r\n\r\n /** Register a handler for in-game status changes (running, paused, out of game). */\r\n onIngameStatusChange(\r\n handler: (status: GameState, isTestingEnv: boolean) => void,\r\n ): () => void {\r\n this.gameStatusHandlers.add(handler);\r\n return () => this.gameStatusHandlers.delete(handler);\r\n }\r\n\r\n /** Register handlers for in-game events (kills, objectives, etc.). */\r\n onIngameEvents(handlers: IngameEventHandlers): void {\r\n this.ingameEventHandlers = { ...this.ingameEventHandlers, ...handlers };\r\n }\r\n\r\n // ===========================================================================\r\n // Pre-game event handlers\r\n // ===========================================================================\r\n\r\n /** Register a handler for champ-select state updates. */\r\n onChampSelectUpdate(\r\n handler: (state: champSelectStateData) => void,\r\n ): () => void {\r\n this.champSelectUpdateHandlers.add(handler);\r\n return () => this.champSelectUpdateHandlers.delete(handler);\r\n }\r\n\r\n /** Register handlers for champ-select lifecycle and action events. */\r\n onChampSelectEvents(handlers: ChampSelectEventHandlers): void {\r\n this.champSelectEventHandlers = {\r\n ...this.champSelectEventHandlers,\r\n ...handlers,\r\n };\r\n }\r\n\r\n // ===========================================================================\r\n // Connection event handlers\r\n // ===========================================================================\r\n\r\n /** Register a handler for in-game connection. */\r\n onIngameConnect(handler: () => void): () => void {\r\n return this.ingameWs.onConnect(handler);\r\n }\r\n\r\n /** Register a handler for in-game disconnection. */\r\n onIngameDisconnect(handler: () => void): () => void {\r\n return this.ingameWs.onDisconnect(handler);\r\n }\r\n\r\n /** Register a handler for in-game connection errors. */\r\n onIngameError(handler: (error: Event) => void): () => void {\r\n return this.ingameWs.onError(handler);\r\n }\r\n\r\n /** Register a handler for pre-game connection. */\r\n onPreGameConnect(handler: () => void): () => void {\r\n return this.preGameWs.onConnect(handler);\r\n }\r\n\r\n /** Register a handler for pre-game disconnection. */\r\n onPreGameDisconnect(handler: () => void): () => void {\r\n return this.preGameWs.onDisconnect(handler);\r\n }\r\n\r\n /** Register a handler for pre-game connection errors. */\r\n onPreGameError(handler: (error: Event) => void): () => void {\r\n return this.preGameWs.onError(handler);\r\n }\r\n\r\n // ===========================================================================\r\n // Reactive API — in-game (convenience wrappers around this.store)\r\n // ===========================================================================\r\n\r\n /**\r\n * Create a subscribable slice of **in-game** state.\r\n * The slice only notifies listeners when the selected value actually changes.\r\n *\r\n * Works directly with React 18+ `useSyncExternalStore`:\r\n * ```tsx\r\n * const kills = client.selectIngame(s => s.gameData.scoreboard?.teams[0]?.kills);\r\n * function Kills() {\r\n * const value = useSyncExternalStore(kills.subscribe, kills.getSnapshot);\r\n * return <span>{value}</span>;\r\n * }\r\n * ```\r\n */\r\n selectIngame<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n equalityFn?: EqualityFn<S>,\r\n ): Subscribable<S> {\r\n return this.ingameStore.select(selector, equalityFn);\r\n }\r\n\r\n /**\r\n * Watch a derived **in-game** value and invoke `callback` whenever it changes.\r\n * Returns an unsubscribe function.\r\n *\r\n * ```ts\r\n * client.watchIngame(\r\n * s => s.gameData.scoreboard?.teams[0]?.kills,\r\n * (kills, prev) => console.log(`Kills: ${prev} → ${kills}`),\r\n * );\r\n * ```\r\n */\r\n watchIngame<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn?: EqualityFn<S>,\r\n ): () => void {\r\n return this.ingameStore.watch(selector, callback, equalityFn);\r\n }\r\n\r\n // ===========================================================================\r\n // Reactive API — pre-game (convenience wrappers around this.preGameStore)\r\n // ===========================================================================\r\n\r\n /**\r\n * Create a subscribable slice of **pre-game** (champion select) state.\r\n *\r\n * ```tsx\r\n * const timer = client.selectChampSelect(s => s.champSelectData.timer);\r\n * function DraftTimer() {\r\n * const value = useSyncExternalStore(timer.subscribe, timer.getSnapshot);\r\n * return <span>{value?.timeRemaining}</span>;\r\n * }\r\n * ```\r\n */\r\n selectChampSelect<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n equalityFn?: EqualityFn<S>,\r\n ): Subscribable<S> {\r\n return this.preGameStore.select(selector, equalityFn);\r\n }\r\n\r\n /**\r\n * Watch a derived **pre-game** value and invoke `callback` whenever it\r\n * changes. Returns an unsubscribe function.\r\n *\r\n * ```ts\r\n * client.watchChampSelect(\r\n * s => s.champSelectData.timer.timeRemaining,\r\n * (remaining, prev) => console.log(`Time: ${prev} → ${remaining}`),\r\n * );\r\n * ```\r\n */\r\n watchChampSelect<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn?: EqualityFn<S>,\r\n ): () => void {\r\n return this.preGameStore.watch(selector, callback, equalityFn);\r\n }\r\n\r\n // ===========================================================================\r\n // URLs\r\n // ===========================================================================\r\n\r\n /** Get the base HTTP URL for API requests. */\r\n getApiUrl(): string {\r\n const protocol = this.config.useHttps ? \"https\" : \"http\";\r\n return `${protocol}://${this.config.host}:${this.config.port}${this.config.apiRoute}`;\r\n }\r\n\r\n /** Get the base URL for cache requests (optionally resolve a path). */\r\n getCacheUrl(path?: string): string {\r\n const protocol = this.config.useHttps ? \"https\" : \"http\";\r\n const baseUrl = `${protocol}://${this.config.host}:${this.config.port}${this.config.cacheRoute}`;\r\n\r\n if (!path) {\r\n return baseUrl;\r\n }\r\n\r\n // Clean up the path\r\n let cleanPath = path;\r\n if (cleanPath.startsWith(\"http\")) {\r\n return cleanPath;\r\n }\r\n if (cleanPath.startsWith(\"/\")) {\r\n cleanPath = cleanPath.slice(1);\r\n }\r\n if (cleanPath.startsWith(\"cache\")) {\r\n cleanPath = cleanPath.slice(5);\r\n }\r\n if (cleanPath.startsWith(\"/\")) {\r\n cleanPath = cleanPath.slice(1);\r\n }\r\n\r\n return `${baseUrl}/${cleanPath}`;\r\n }\r\n\r\n // ===========================================================================\r\n // Private — in-game message handling\r\n // ===========================================================================\r\n\r\n private setupIngameMessageHandler(): void {\r\n this.ingameWs.onMessage((messageData: any) => {\r\n switch (messageData.type) {\r\n case \"ingame-state-update\":\r\n this.handleStateUpdate(messageData.state, messageData.events);\r\n break;\r\n case \"gameStatus\":\r\n this.handleGameStatusUpdate(\r\n messageData.gameState,\r\n messageData.isTestingEnvironment,\r\n );\r\n break;\r\n }\r\n });\r\n }\r\n\r\n private handleStateUpdate(state: any, events?: transitionEvents): void {\r\n const nextData: ingameFrontendData = {\r\n gameTime: 0,\r\n playbackSpeed: 0,\r\n gameVersion: \"\",\r\n gameStatus: GameState.OutOfGame,\r\n ...state,\r\n };\r\n this.gameData = structuralShare(this.gameData, nextData);\r\n\r\n if (!state.gameTime || state.gameTime === 0) {\r\n this.handleGameStatusUpdate(GameState.OutOfGame, false);\r\n }\r\n\r\n this.ingameStore._setGameData(this.gameData);\r\n this.stateUpdateHandlers.forEach((handler) => handler(this.gameData));\r\n this.handleGameEvents(events);\r\n }\r\n\r\n private handleGameStatusUpdate(\r\n gameStatus: GameState,\r\n isTestingEnvironment: boolean = false,\r\n ): void {\r\n this._isTestingEnvironment = isTestingEnvironment;\r\n\r\n if (\r\n gameStatus === GameState.OutOfGame &&\r\n this.gameState !== GameState.OutOfGame\r\n ) {\r\n this.endGame();\r\n return;\r\n }\r\n\r\n this.gameState = gameStatus;\r\n this.ingameStore._setGameState(gameStatus);\r\n this.gameStatusHandlers.forEach((handler) =>\r\n handler(gameStatus, isTestingEnvironment),\r\n );\r\n }\r\n\r\n private handleGameEvents(events?: transitionEvents): void {\r\n if (!events) return;\r\n\r\n if (events.player && this.ingameEventHandlers.onPlayerEvent) {\r\n events.player.forEach((event) =>\r\n this.ingameEventHandlers.onPlayerEvent!(event),\r\n );\r\n }\r\n\r\n if (events.team && this.ingameEventHandlers.onTeamEvent) {\r\n events.team.forEach((event) =>\r\n this.ingameEventHandlers.onTeamEvent!(event),\r\n );\r\n }\r\n\r\n if (events.objective && this.ingameEventHandlers.onObjectiveEvent) {\r\n events.objective.forEach((event) =>\r\n this.ingameEventHandlers.onObjectiveEvent!(event),\r\n );\r\n }\r\n\r\n if (\r\n events.firstTower !== undefined &&\r\n this.ingameEventHandlers.onFirstTowerEvent\r\n ) {\r\n this.ingameEventHandlers.onFirstTowerEvent(events.firstTower);\r\n }\r\n\r\n if (events.announcements && this.ingameEventHandlers.onAnnouncementEvent) {\r\n events.announcements.forEach((event) =>\r\n this.ingameEventHandlers.onAnnouncementEvent!(event),\r\n );\r\n }\r\n\r\n if (events.killFeed && this.ingameEventHandlers.onKillFeedEvent) {\r\n events.killFeed.forEach((event) =>\r\n this.ingameEventHandlers.onKillFeedEvent!(event),\r\n );\r\n }\r\n }\r\n\r\n private endGame(): void {\r\n console.log(\"[LeagueBroadcastClient] Game ended, resetting data\");\r\n\r\n this.gameData = new ingameFrontendData();\r\n this.gameState = GameState.OutOfGame;\r\n this._isTestingEnvironment = false;\r\n\r\n this.ingameStore._reset(this.gameData, GameState.OutOfGame);\r\n\r\n this.gameStatusHandlers.forEach((handler) =>\r\n handler(GameState.OutOfGame, false),\r\n );\r\n this.stateUpdateHandlers.forEach((handler) => handler(this.gameData));\r\n }\r\n\r\n // ===========================================================================\r\n // Private — pre-game message handling\r\n // ===========================================================================\r\n\r\n private setupPreGameMessageHandler(): void {\r\n this.preGameWs.onMessage((messageData: any) => {\r\n switch (messageData.type) {\r\n case \"champion-select-state-update\":\r\n this.handleChampSelectStateUpdate(messageData.state);\r\n break;\r\n case \"champion-select-action\":\r\n this.handleChampSelectAction(messageData.action);\r\n break;\r\n case \"frontend-route-update\":\r\n this.handleRouteUpdate(messageData.uri);\r\n break;\r\n }\r\n });\r\n }\r\n\r\n private handleChampSelectStateUpdate(state: any): void {\r\n const nextData: champSelectStateData = {\r\n isActive: false,\r\n isConnected: false,\r\n isTestingEnvironment: false,\r\n blueTeam: {} as any,\r\n redTeam: {} as any,\r\n metaData: {} as any,\r\n timer: {} as any,\r\n ...state,\r\n };\r\n\r\n this.champSelectData = structuralShare(this.champSelectData, nextData);\r\n\r\n // Detect champ select start / end transitions\r\n if (nextData.isActive && !this.champSelectWasActive) {\r\n this.champSelectWasActive = true;\r\n this.champSelectEventHandlers.onChampSelectStart?.();\r\n } else if (!nextData.isActive && this.champSelectWasActive) {\r\n this.champSelectWasActive = false;\r\n this.endChampSelect();\r\n return; // endChampSelect handles notifications\r\n }\r\n\r\n this.preGameStore._setChampSelectData(this.champSelectData);\r\n this.champSelectUpdateHandlers.forEach((handler) =>\r\n handler(this.champSelectData),\r\n );\r\n }\r\n\r\n private handleChampSelectAction(action: any): void {\r\n this.champSelectEventHandlers.onAction?.(action as pickBanActionEventArgs);\r\n }\r\n\r\n private handleRouteUpdate(uri: string): void {\r\n this.champSelectEventHandlers.onRouteUpdate?.(uri);\r\n }\r\n\r\n private endChampSelect(): void {\r\n console.log(\"[LeagueBroadcastClient] Champ select ended, resetting data\");\r\n\r\n this.champSelectData = new champSelectStateData();\r\n this.preGameStore._reset(this.champSelectData);\r\n\r\n this.champSelectEventHandlers.onChampSelectEnd?.();\r\n this.champSelectUpdateHandlers.forEach((handler) =>\r\n handler(this.champSelectData),\r\n );\r\n }\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum PickBanPhase {\r\n BEGIN = 0,\r\n BAN1 = 1,\r\n BAN2 = 2,\r\n PICK1 = 3,\r\n PICK2 = 4,\r\n END = 5,\r\n WAIT = 6\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum ActionType {\r\n TEN_BANS_REVEAL = 0,\r\n PHASE_TRANSITION = 1,\r\n PICK = 2,\r\n BAN = 3\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum ActionSubType {\r\n START = 0,\r\n HOVER = 1,\r\n LOCK = 2\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum TimeLineActionType {\r\n HoverPick = 0,\r\n Pick = 1,\r\n Ban = 2\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum BestOfType {\r\n BestOf1 = 1,\r\n BestOf2 = 2,\r\n BestOf3 = 3,\r\n BestOf5 = 5,\r\n BestOf7 = 7\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum MatchRuleSet {\r\n Standard = 0,\r\n PartialFearless = 1,\r\n Fearless = 2\r\n}\r\n","import { itemWithAsset } from \"#types/ingame/itemWithAsset\";\r\nimport { ingameScoreboardBottomPlayerData } from \"#types/ingame/scoreboardBottom/ingameScoreboardBottomPlayerData\";\r\n\r\nexport function getSortedInventory(\r\n playerData: ingameScoreboardBottomPlayerData,\r\n): (itemWithAsset | undefined)[] {\r\n if (!playerData.items) return Array(6).fill({ id: 0 });\r\n\r\n const items =\r\n playerData.items?.filter((item) => item.slot < 6) ??\r\n ([] as (itemWithAsset | undefined)[]);\r\n\r\n //sort items by cost, with undefined items at the end\r\n const regularItems = items.sort(\r\n (a, b) => (a?.cost ?? 0) - (b?.cost ?? 0),\r\n ) as (itemWithAsset | undefined)[];\r\n\r\n //fill items with empty items if less than 6, undefined items at start\r\n while (regularItems.length < 6) {\r\n regularItems.unshift(undefined);\r\n }\r\n return regularItems ?? [];\r\n}\r\n\r\nexport function getTrinket(\r\n playerData: ingameScoreboardBottomPlayerData,\r\n): itemWithAsset | undefined {\r\n return playerData.items?.find((item) => item.slot === 6);\r\n}\r\n\r\nexport function getRoleQuest(\r\n playerData: ingameScoreboardBottomPlayerData,\r\n): itemWithAsset | undefined {\r\n return playerData.items?.find((item) => item.slot === 8);\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/WebSocketManager.ts","../src/reactivity/GameStateStore.ts","../src/reactivity/ChampSelectStateStore.ts","../src/reactivity/structuralShare.ts","../types/shared/gamestate.ts","../types/ingame/ingamefrontenddata.ts","../types/pregame/champselectstatedata.ts","../src/api/ApiClient.ts","../src/api/generated/PreGameApi.ts","../src/api/generated/GameApi.ts","../src/api/generated/GameStateApi.ts","../src/api/generated/MatchApi.ts","../src/api/generated/SeasonApi.ts","../src/api/generated/IngameApi.ts","../src/api/RestApi.ts","../src/LeagueBroadcastClient.ts","../types/pregame/pickbanphase.ts","../types/pregame/actiontype.ts","../types/pregame/actionsubtype.ts","../types/pregame/timelineactiontype.ts","../types/shared/bestoftype.ts","../types/shared/matchruleset.ts","../src/util/ingameScoreboardBottomPlayerDataUtils.ts"],"names":["changed","GameState","PickBanPhase","ActionType","ActionSubType","TimeLineActionType","BestOfType","MatchRuleSet"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * WebSocket connection manager for League Broadcast backend\r\n */\r\nexport class WebSocketManager {\r\n private socket: WebSocket | null = null;\r\n private url: string = \"\";\r\n private reconnectAttempts: number = 0;\r\n private maxReconnectAttempts: number = 10;\r\n private reconnectDelay: number = 5000;\r\n private reconnectTimeout: number | null = null;\r\n private messageHandlers: Set<(data: any) => void> = new Set();\r\n private connectionHandlers: Set<() => void> = new Set();\r\n private disconnectionHandlers: Set<() => void> = new Set();\r\n private errorHandlers: Set<(error: Event) => void> = new Set();\r\n\r\n /**\r\n * Connect to the WebSocket server\r\n */\r\n connect(url: string): Promise<void> {\r\n this.url = url;\r\n this.cleanup();\r\n\r\n return new Promise((resolve, reject) => {\r\n try {\r\n this.socket = new WebSocket(url);\r\n\r\n this.socket.onopen = () => {\r\n console.log(\"[WebSocketManager] Connected to\", url);\r\n this.reconnectAttempts = 0;\r\n this.connectionHandlers.forEach((handler) => handler());\r\n resolve();\r\n };\r\n\r\n this.socket.onmessage = (event: MessageEvent) => {\r\n // Ignore keep-alive messages\r\n if (event.data === \"KeepAlive\") {\r\n return;\r\n }\r\n\r\n try {\r\n const data = JSON.parse(event.data);\r\n this.messageHandlers.forEach((handler) => handler(data));\r\n } catch (error) {\r\n console.error(\r\n \"[WebSocketManager] Failed to parse message:\",\r\n event.data,\r\n );\r\n }\r\n };\r\n\r\n this.socket.onclose = () => {\r\n console.log(\"[WebSocketManager] Disconnected\");\r\n this.disconnectionHandlers.forEach((handler) => handler());\r\n this.attemptReconnect();\r\n };\r\n\r\n this.socket.onerror = (error: Event) => {\r\n console.error(\"[WebSocketManager] Error:\", error);\r\n this.errorHandlers.forEach((handler) => handler(error));\r\n reject(error);\r\n };\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disconnect from the WebSocket server\r\n */\r\n disconnect(): void {\r\n if (this.reconnectTimeout !== null) {\r\n clearTimeout(this.reconnectTimeout);\r\n this.reconnectTimeout = null;\r\n }\r\n\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if connected to the WebSocket server\r\n */\r\n isConnected(): boolean {\r\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\r\n }\r\n\r\n /**\r\n * Send a message to the server\r\n */\r\n send(message: string | object): void {\r\n if (!this.isConnected()) {\r\n console.warn(\"[WebSocketManager] Cannot send message: not connected\");\r\n return;\r\n }\r\n\r\n const data =\r\n typeof message === \"string\" ? message : JSON.stringify(message);\r\n this.socket!.send(data);\r\n }\r\n\r\n /**\r\n * Register a message handler\r\n */\r\n onMessage(handler: (data: any) => void): () => void {\r\n this.messageHandlers.add(handler);\r\n return () => this.messageHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Register a connection handler\r\n */\r\n onConnect(handler: () => void): () => void {\r\n this.connectionHandlers.add(handler);\r\n return () => this.connectionHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Register a disconnection handler\r\n */\r\n onDisconnect(handler: () => void): () => void {\r\n this.disconnectionHandlers.add(handler);\r\n return () => this.disconnectionHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Register an error handler\r\n */\r\n onError(handler: (error: Event) => void): () => void {\r\n this.errorHandlers.add(handler);\r\n return () => this.errorHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Attempt to reconnect to the server\r\n */\r\n private attemptReconnect(): void {\r\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\r\n console.error(\"[WebSocketManager] Max reconnect attempts reached\");\r\n return;\r\n }\r\n\r\n this.reconnectAttempts++;\r\n console.log(\r\n `[WebSocketManager] Reconnecting in ${this.reconnectDelay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`,\r\n );\r\n\r\n this.reconnectTimeout = window.setTimeout(() => {\r\n this.connect(this.url).catch((error) => {\r\n console.error(\"[WebSocketManager] Reconnect failed:\", error);\r\n });\r\n }, this.reconnectDelay);\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n private cleanup(): void {\r\n if (this.reconnectTimeout !== null) {\r\n clearTimeout(this.reconnectTimeout);\r\n this.reconnectTimeout = null;\r\n }\r\n\r\n if (this.socket) {\r\n this.socket.onopen = null;\r\n this.socket.onmessage = null;\r\n this.socket.onclose = null;\r\n this.socket.onerror = null;\r\n\r\n if (this.socket.readyState === WebSocket.OPEN) {\r\n this.socket.close();\r\n }\r\n\r\n this.socket = null;\r\n }\r\n }\r\n}\r\n","import type { ingameFrontendData } from \"#types/ingame/ingamefrontenddata\";\r\nimport type { GameState } from \"#types/shared/GameState\";\r\n\r\n/**\r\n * A subscribable slice of state produced by `select()`.\r\n *\r\n * Compatible with:\r\n * - React 18+ `useSyncExternalStore(slice.subscribe, slice.getSnapshot)`\r\n * - Vue `watchEffect(() => slice.getSnapshot())`\r\n * - Svelte `readable` / custom store contract\r\n * - Solid `createEffect(() => slice.getSnapshot())`\r\n * - Vanilla JS `slice.subscribe(() => console.log(slice.getSnapshot()))`\r\n */\r\nexport interface Subscribable<T> {\r\n /** Register a listener that fires when the selected value changes. Returns an unsubscribe function. */\r\n subscribe(listener: () => void): () => void;\r\n /** Return the current value of this slice. */\r\n getSnapshot(): T;\r\n}\r\n\r\n/** Equality function used to compare snapshots. */\r\nexport type EqualityFn<T> = (a: T, b: T) => boolean;\r\n\r\n/**\r\n * Reactive store for League Broadcast game state.\r\n *\r\n * The store holds an immutable snapshot that is replaced on every update.\r\n * Fine-grained subscriptions are achieved through **selectors**: a selector\r\n * derives a slice of the full state and only notifies listeners when the\r\n * derived value actually changes (compared with a configurable equality\r\n * function — shallow reference equality by default).\r\n *\r\n * @example Vanilla JS\r\n * ```ts\r\n * const scoreboard = store.select(s => s.scoreboard);\r\n * scoreboard.subscribe(() => {\r\n * console.log('Scoreboard changed:', scoreboard.getSnapshot());\r\n * });\r\n * ```\r\n *\r\n * @example React 18+\r\n * ```tsx\r\n * function Scoreboard() {\r\n * const scoreboard = useSyncExternalStore(\r\n * store.select(s => s.scoreboard).subscribe,\r\n * store.select(s => s.scoreboard).getSnapshot,\r\n * );\r\n * return <div>{scoreboard?.teams[0]?.kills}</div>;\r\n * }\r\n * // — or use the provided useGameState hook (see docs)\r\n * ```\r\n *\r\n * @example Vue 3\r\n * ```ts\r\n * const kills = useGameStateRef(store, s => s.scoreboard?.teams[0]?.kills);\r\n * ```\r\n */\r\nexport class GameStateStore {\r\n /** Current immutable snapshot. Replaced (never mutated) on every update. */\r\n private snapshot: GameStateSnapshot;\r\n\r\n /** Global listeners — called on every state change regardless of selector. */\r\n private listeners = new Set<() => void>();\r\n\r\n /** Monotonically increasing version — used for cheap stale checks. */\r\n private version = 0;\r\n\r\n constructor(initialState: ingameFrontendData, initialGameState: GameState) {\r\n this.snapshot = Object.freeze({\r\n gameData: initialState,\r\n gameState: initialGameState,\r\n version: this.version,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Core API\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Return the current full snapshot. */\r\n getSnapshot(): GameStateSnapshot {\r\n return this.snapshot;\r\n }\r\n\r\n /** Return the current version number. */\r\n getVersion(): number {\r\n return this.version;\r\n }\r\n\r\n /**\r\n * Subscribe to **all** state changes (unfiltered).\r\n * Returns an unsubscribe function.\r\n *\r\n * This satisfies the `subscribe` half of `useSyncExternalStore` when\r\n * combined with `getSnapshot`.\r\n */\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Selectors — the main reactivity primitive\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Create a **subscribable slice** that only triggers when the selected\r\n * value changes according to `equalityFn` (defaults to `===`).\r\n *\r\n * The returned object satisfies the `useSyncExternalStore` contract and\r\n * can also be used with `watch()` for callback-style subscriptions.\r\n *\r\n * Selector instances are lightweight — create them freely (e.g. inside\r\n * render functions). Referential identity of the *selector function* is\r\n * **not** required to be stable.\r\n */\r\n select<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): Subscribable<S> {\r\n let currentValue: S = selector(this.snapshot);\r\n let lastVersion: number = this.version;\r\n const sliceListeners = new Set<() => void>();\r\n\r\n const getSnapshot = (): S => {\r\n // Re-derive only if the store version bumped since last read\r\n if (lastVersion !== this.version) {\r\n const next = selector(this.snapshot);\r\n if (!equalityFn(currentValue, next)) {\r\n currentValue = next;\r\n }\r\n lastVersion = this.version;\r\n }\r\n return currentValue;\r\n };\r\n\r\n const subscribe = (listener: () => void): (() => void) => {\r\n sliceListeners.add(listener);\r\n\r\n // Subscribe to the root store; filter notifications through equality\r\n const unsub = this.subscribe(() => {\r\n const prev = currentValue;\r\n const next = selector(this.snapshot);\r\n lastVersion = this.version;\r\n if (!equalityFn(prev, next)) {\r\n currentValue = next;\r\n listener();\r\n }\r\n });\r\n\r\n return () => {\r\n sliceListeners.delete(listener);\r\n unsub();\r\n };\r\n };\r\n\r\n return { subscribe, getSnapshot };\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Convenience helpers\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Watch a derived value and invoke `callback` whenever it changes.\r\n * Returns an unsubscribe function.\r\n *\r\n * This is the simplest API for imperative / vanilla-JS usage:\r\n *\r\n * ```ts\r\n * store.watch(\r\n * s => s.gameData.scoreboard?.teams[0]?.kills,\r\n * kills => console.log('Blue kills:', kills),\r\n * );\r\n * ```\r\n */\r\n watch<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): () => void {\r\n let prev: S = selector(this.snapshot);\r\n return this.subscribe(() => {\r\n const next = selector(this.snapshot);\r\n if (!equalityFn(prev, next)) {\r\n const old = prev;\r\n prev = next;\r\n callback(next, old);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Watch a derived value and invoke `callback` whenever it changes,\r\n * **and** invoke it immediately with the current value.\r\n */\r\n watchImmediate<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n callback: (value: S, prev: S | undefined) => void,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): () => void {\r\n const current = selector(this.snapshot);\r\n callback(current, undefined);\r\n return this.watch(selector, callback, equalityFn);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Internal — called by LeagueBroadcastClient\r\n // ---------------------------------------------------------------------------\r\n\r\n /** @internal Replace game data snapshot and notify listeners. */\r\n _setGameData(data: ingameFrontendData): void {\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n ...this.snapshot,\r\n gameData: data,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n /** @internal Replace game state and notify listeners. */\r\n _setGameState(state: GameState): void {\r\n if (this.snapshot.gameState === state) return;\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n ...this.snapshot,\r\n gameState: state,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n /** @internal Replace entire snapshot (used on game end / reset). */\r\n _reset(data: ingameFrontendData, state: GameState): void {\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n gameData: data,\r\n gameState: state,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n private emit(): void {\r\n this.listeners.forEach((l) => l());\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Snapshot type\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface GameStateSnapshot {\r\n readonly gameData: ingameFrontendData;\r\n readonly gameState: GameState;\r\n /** Monotonic version counter — useful for cheap stale checks. */\r\n readonly version: number;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Utility: shallow equality for object slices\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Shallow-compare two objects by their own enumerable keys.\r\n * Useful as `equalityFn` when selecting an object whose identity changes\r\n * on every update but whose contents may not (e.g. `{ kills: 3, deaths: 1 }`).\r\n */\r\nexport function shallowEqual<T>(a: T, b: T): boolean {\r\n if (Object.is(a, b)) return true;\r\n if (\r\n typeof a !== \"object\" ||\r\n typeof b !== \"object\" ||\r\n a === null ||\r\n b === null\r\n ) {\r\n return false;\r\n }\r\n\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n for (const key of keysA) {\r\n if (\r\n !Object.prototype.hasOwnProperty.call(b, key) ||\r\n !Object.is((a as any)[key], (b as any)[key])\r\n ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","import type { champSelectStateData } from \"#types/pregame/champselectstatedata\";\r\n\r\n/**\r\n * A subscribable slice of state produced by `select()`.\r\n *\r\n * Compatible with:\r\n * - React 18+ `useSyncExternalStore(slice.subscribe, slice.getSnapshot)`\r\n * - Vue `watchEffect(() => slice.getSnapshot())`\r\n * - Svelte `readable` / custom store contract\r\n * - Solid `createEffect(() => slice.getSnapshot())`\r\n * - Vanilla JS `slice.subscribe(() => console.log(slice.getSnapshot()))`\r\n */\r\nexport type { Subscribable, EqualityFn } from \"./GameStateStore\";\r\n\r\n// Re-import locally for use within this file\r\nimport type { Subscribable, EqualityFn } from \"./GameStateStore\";\r\n\r\n/**\r\n * Reactive store for League Broadcast champion-select (pre-game) state.\r\n *\r\n * Follows the same selector-based model as {@link GameStateStore} but holds\r\n * `champSelectStateData` instead of ingame data.\r\n *\r\n * @example Vanilla JS\r\n * ```ts\r\n * const timer = store.select(s => s.champSelectData.timer);\r\n * timer.subscribe(() => {\r\n * console.log('Timer changed:', timer.getSnapshot());\r\n * });\r\n * ```\r\n *\r\n * @example React 18+\r\n * ```tsx\r\n * function Timer() {\r\n * const timer = useSyncExternalStore(\r\n * store.select(s => s.champSelectData.timer).subscribe,\r\n * store.select(s => s.champSelectData.timer).getSnapshot,\r\n * );\r\n * return <div>{timer?.timeRemaining}</div>;\r\n * }\r\n * ```\r\n */\r\nexport class ChampSelectStateStore {\r\n /** Current immutable snapshot. Replaced (never mutated) on every update. */\r\n private snapshot: ChampSelectSnapshot;\r\n\r\n /** Global listeners — called on every state change regardless of selector. */\r\n private listeners = new Set<() => void>();\r\n\r\n /** Monotonically increasing version — used for cheap stale checks. */\r\n private version = 0;\r\n\r\n constructor(initialState: champSelectStateData) {\r\n this.snapshot = Object.freeze({\r\n champSelectData: initialState,\r\n isActive: initialState.isActive,\r\n version: this.version,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Core API\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Return the current full snapshot. */\r\n getSnapshot(): ChampSelectSnapshot {\r\n return this.snapshot;\r\n }\r\n\r\n /** Return the current version number. */\r\n getVersion(): number {\r\n return this.version;\r\n }\r\n\r\n /**\r\n * Subscribe to **all** state changes (unfiltered).\r\n * Returns an unsubscribe function.\r\n */\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Selectors\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Create a **subscribable slice** that only triggers when the selected\r\n * value changes according to `equalityFn` (defaults to `===`).\r\n */\r\n select<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): Subscribable<S> {\r\n let currentValue: S = selector(this.snapshot);\r\n let lastVersion: number = this.version;\r\n const sliceListeners = new Set<() => void>();\r\n\r\n const getSnapshot = (): S => {\r\n if (lastVersion !== this.version) {\r\n const next = selector(this.snapshot);\r\n if (!equalityFn(currentValue, next)) {\r\n currentValue = next;\r\n }\r\n lastVersion = this.version;\r\n }\r\n return currentValue;\r\n };\r\n\r\n const subscribe = (listener: () => void): (() => void) => {\r\n sliceListeners.add(listener);\r\n\r\n const unsub = this.subscribe(() => {\r\n const prev = currentValue;\r\n const next = selector(this.snapshot);\r\n lastVersion = this.version;\r\n if (!equalityFn(prev, next)) {\r\n currentValue = next;\r\n listener();\r\n }\r\n });\r\n\r\n return () => {\r\n sliceListeners.delete(listener);\r\n unsub();\r\n };\r\n };\r\n\r\n return { subscribe, getSnapshot };\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Convenience helpers\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Watch a derived value and invoke `callback` whenever it changes.\r\n * Returns an unsubscribe function.\r\n */\r\n watch<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): () => void {\r\n let prev: S = selector(this.snapshot);\r\n return this.subscribe(() => {\r\n const next = selector(this.snapshot);\r\n if (!equalityFn(prev, next)) {\r\n const old = prev;\r\n prev = next;\r\n callback(next, old);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Watch a derived value and invoke `callback` whenever it changes,\r\n * **and** invoke it immediately with the current value.\r\n */\r\n watchImmediate<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n callback: (value: S, prev: S | undefined) => void,\r\n equalityFn: EqualityFn<S> = Object.is,\r\n ): () => void {\r\n const current = selector(this.snapshot);\r\n callback(current, undefined);\r\n return this.watch(selector, callback, equalityFn);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Internal — called by LeagueBroadcastClient\r\n // ---------------------------------------------------------------------------\r\n\r\n /** @internal Replace champ-select data snapshot and notify listeners. */\r\n _setChampSelectData(data: champSelectStateData): void {\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n champSelectData: data,\r\n isActive: data.isActive,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n /** @internal Replace entire snapshot (used on champ select end / reset). */\r\n _reset(data: champSelectStateData): void {\r\n this.version++;\r\n this.snapshot = Object.freeze({\r\n champSelectData: data,\r\n isActive: data.isActive,\r\n version: this.version,\r\n });\r\n this.emit();\r\n }\r\n\r\n private emit(): void {\r\n this.listeners.forEach((l) => l());\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Snapshot type\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface ChampSelectSnapshot {\r\n readonly champSelectData: champSelectStateData;\r\n /** Whether champ select is currently active. */\r\n readonly isActive: boolean;\r\n /** Monotonic version counter — useful for cheap stale checks. */\r\n readonly version: number;\r\n}\r\n","/**\r\n * Structural sharing utility.\r\n *\r\n * Creates a new object/array tree from `next`, but reuses references from\r\n * `prev` when values are deeply equal. This keeps nested references stable\r\n * across updates, so selectors only re-fire when their content actually\r\n * changes.\r\n */\r\nexport function structuralShare<T>(prev: T, next: T): T {\r\n if (Object.is(prev, next)) {\r\n return prev;\r\n }\r\n\r\n if (!isObject(prev) || !isObject(next)) {\r\n return next;\r\n }\r\n\r\n if (Array.isArray(prev) || Array.isArray(next)) {\r\n if (!Array.isArray(prev) || !Array.isArray(next)) {\r\n return next;\r\n }\r\n\r\n if (prev.length !== next.length) {\r\n return next.map((value, index) =>\r\n structuralShare(prev[index] as any, value as any),\r\n ) as unknown as T;\r\n }\r\n\r\n let changed = false;\r\n const shared = next.map((value, index) => {\r\n const nextValue = structuralShare(prev[index] as any, value as any);\r\n if (!Object.is(nextValue, prev[index])) {\r\n changed = true;\r\n }\r\n return nextValue;\r\n });\r\n\r\n return changed ? (shared as unknown as T) : prev;\r\n }\r\n\r\n const prevObj = prev as Record<string, unknown>;\r\n const nextObj = next as Record<string, unknown>;\r\n const nextKeys = Object.keys(nextObj);\r\n const prevKeys = Object.keys(prevObj);\r\n\r\n let changed = nextKeys.length !== prevKeys.length;\r\n if (!changed) {\r\n for (const key of prevKeys) {\r\n if (!Object.prototype.hasOwnProperty.call(nextObj, key)) {\r\n changed = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const result: Record<string, unknown> = Object.create(\r\n Object.getPrototypeOf(next),\r\n );\r\n\r\n for (const key of nextKeys) {\r\n const prevValue = prevObj[key];\r\n const nextValue = nextObj[key];\r\n const sharedValue = structuralShare(prevValue as any, nextValue as any);\r\n result[key] = sharedValue;\r\n if (!Object.is(sharedValue, prevValue)) {\r\n changed = true;\r\n }\r\n }\r\n\r\n return changed ? (result as T) : prev;\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return value !== null && typeof value === \"object\";\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum GameState {\r\n OutOfGame = 0,\r\n Loading = 1,\r\n Running = 2,\r\n Paused = 3,\r\n Mocking = 4,\r\n GameOver = 5,\r\n ChampionSelect = 6\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nimport { GameState } from \"../shared/gamestate\";\r\nimport { ingameDamageGraphData } from \"./damageGraph/ingameDamageGraphData\";\r\nimport { ingameGoldGraphData } from \"./graph/ingameGoldGraphData\";\r\nimport { ingameRuneData } from \"./rune/ingameRuneData\";\r\nimport { ingameScoreboardBottomData } from \"./scoreboardBottom/ingameScoreboardBottomData\";\r\nimport { ingameScoreboardData } from \"./topScoreboard/ingameScoreboardData\";\r\nimport { ingameSideInfoPage } from \"./tab/ingameSideInfoPage\";\r\nimport { tabTeam } from \"./tab/tabTeam\";\r\nimport { teamInhibitorData } from \"./inhibitor/teamInhibitorData\";\r\nimport { teamWithMembers } from \"../shared/teamWithMembers\";\r\nimport type { iObjectiveRespawnData } from \"./objective/iObjectiveRespawnData\";\r\n\r\nexport class ingameFrontendData {\r\n gameTime: number = 0;\r\n playbackSpeed: number = 0;\r\n isTestingEnvironment?: boolean;\r\n gameVersion: string = \"\";\r\n patch?: string;\r\n teams?: teamWithMembers[];\r\n gameStatus: GameState = GameState.OutOfGame;\r\n scoreboard?: ingameScoreboardData;\r\n tabs?: { [key: string]: tabTeam };\r\n scoreboardBottom?: ingameScoreboardBottomData;\r\n baronPitTimer?: iObjectiveRespawnData;\r\n dragonPitTimer?: iObjectiveRespawnData;\r\n inhibitors?: teamInhibitorData[];\r\n showTwitchPrediction: boolean = false;\r\n showTwitchPoll: boolean = false;\r\n showTwitchChatVote: boolean = false;\r\n sideInfoPage?: ingameSideInfoPage;\r\n goldGraph?: ingameGoldGraphData;\r\n runes?: ingameRuneData;\r\n damageGraph?: ingameDamageGraphData;\r\n teamfightDamageOverview?: ingameDamageGraphData;\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nimport { championSelectTeam } from \"./championSelectTeam\";\r\nimport { champSelectStateMetaData } from \"./champSelectStateMetaData\";\r\nimport { pickBanTimer } from \"./pickBanTimer\";\r\n\r\nexport class champSelectStateData {\r\n isActive: boolean = false;\r\n isConnected: boolean = false;\r\n isTestingEnvironment: boolean = false;\r\n blueTeam: championSelectTeam = {} as championSelectTeam;\r\n redTeam: championSelectTeam = {} as championSelectTeam;\r\n metaData: champSelectStateMetaData = {} as champSelectStateMetaData;\r\n timer: pickBanTimer = {} as pickBanTimer;\r\n}\r\n","/**\r\n * Base HTTP client for League Broadcast REST API calls.\r\n *\r\n * Provides typed `get`, `post`, `put`, `patch`, and `delete` helpers that\r\n * handle JSON serialization, error responses, and empty bodies.\r\n *\r\n * Used internally by the generated API modules — you normally access this\r\n * through `LeagueBroadcastClient.api.*` rather than constructing it directly.\r\n */\r\nexport class ApiClient {\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string) {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n /** Update the base URL (e.g. after reconnecting to a different host/port). */\r\n updateBaseUrl(baseUrl: string): void {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n /** Current base URL. */\r\n getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n // ── HTTP verbs ──────────────────────────────────────────────────────────\r\n\r\n async get<T>(path: string): Promise<T> {\r\n return this.request<T>(\"GET\", path);\r\n }\r\n\r\n async post<T = void>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>(\"POST\", path, body);\r\n }\r\n\r\n async put<T = void>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>(\"PUT\", path, body);\r\n }\r\n\r\n async patch<T = void>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>(\"PATCH\", path, body);\r\n }\r\n\r\n async delete<T = void>(path: string): Promise<T> {\r\n return this.request<T>(\"DELETE\", path);\r\n }\r\n\r\n /**\r\n * POST with a raw string body (e.g. base64 image data).\r\n * Sets Content-Type to text/plain instead of application/json.\r\n */\r\n async postRaw<T = void>(path: string, rawBody: string): Promise<T> {\r\n return this.request<T>(\"POST\", path, rawBody, \"text/plain\");\r\n }\r\n\r\n /**\r\n * PUT with a raw string body (e.g. base64 image data).\r\n * Sets Content-Type to text/plain instead of application/json.\r\n */\r\n async putRaw<T = void>(path: string, rawBody: string): Promise<T> {\r\n return this.request<T>(\"PUT\", path, rawBody, \"text/plain\");\r\n }\r\n\r\n // ── Internal ────────────────────────────────────────────────────────────\r\n\r\n private buildUrl(path: string): string {\r\n // Ensure no double slashes between base and path\r\n const base = this.baseUrl.endsWith(\"/\")\r\n ? this.baseUrl.slice(0, -1)\r\n : this.baseUrl;\r\n const cleanPath = path.startsWith(\"/\") ? path.slice(1) : path;\r\n return `${base}/${cleanPath}`;\r\n }\r\n\r\n private async request<T>(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n contentType?: string,\r\n ): Promise<T> {\r\n const url = this.buildUrl(path);\r\n\r\n const headers: Record<string, string> = {};\r\n let bodyStr: string | undefined;\r\n\r\n if (body !== undefined) {\r\n if (contentType === \"text/plain\") {\r\n headers[\"Content-Type\"] = \"text/plain\";\r\n bodyStr = String(body);\r\n } else {\r\n headers[\"Content-Type\"] = \"application/json\";\r\n bodyStr = JSON.stringify(body);\r\n }\r\n }\r\n\r\n const res = await fetch(url, {\r\n method,\r\n headers,\r\n body: bodyStr,\r\n });\r\n\r\n if (!res.ok) {\r\n const errorBody = await res.text().catch(() => \"\");\r\n throw new ApiError(res.status, res.statusText, errorBody, url);\r\n }\r\n\r\n return this.parseResponse<T>(res);\r\n }\r\n\r\n private async parseResponse<T>(res: Response): Promise<T> {\r\n const text = await res.text();\r\n if (!text || text.length === 0) return undefined as T;\r\n try {\r\n return JSON.parse(text) as T;\r\n } catch {\r\n // If it's not JSON, return the raw text (e.g. for string endpoints)\r\n return text as unknown as T;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a REST API call returns a non-2xx status.\r\n */\r\nexport class ApiError extends Error {\r\n constructor(\r\n public readonly status: number,\r\n public readonly statusText: string,\r\n public readonly body: string,\r\n public readonly url: string,\r\n ) {\r\n super(`API Error ${status} (${statusText}) at ${url}`);\r\n this.name = \"ApiError\";\r\n }\r\n}\r\n","/**\r\n * Auto-generated REST API client for Champion select (pre-game) endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-11\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { simpleChampionData } from \"#types/shared/simplechampiondata\";\r\n\r\nexport class PreGameApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `POST championselect/mock/{doMocking}` */\r\n async mockChampionSelect(doMocking: boolean, randomizationinterval?: number): Promise<boolean> {\r\n return this.client.post<boolean>(`championselect/mock/${doMocking}${randomizationinterval !== undefined ? `?randomizationinterval=${encodeURIComponent(String(randomizationinterval))}` : ''}`);\r\n }\r\n\r\n /** `GET championselect/mock` */\r\n async getMockingStatus(): Promise<boolean> {\r\n return this.client.get<boolean>('championselect/mock');\r\n }\r\n\r\n /** `GET championselect/bans` */\r\n async getBans(): Promise<Record<number, Record<number, simpleChampionData[]>>> {\r\n return this.client.get<Record<number, Record<number, simpleChampionData[]>>>('championselect/bans');\r\n }\r\n\r\n /** `GET championselect/frontend` */\r\n async getFrontendUrl(): Promise<string> {\r\n return this.client.get<string>('championselect/frontend');\r\n }\r\n\r\n /** `GET championselect/stage/{stageSide}/teamid` */\r\n async getTeamIdOnSide(stageSide: number): Promise<number> {\r\n return this.client.get<number>(`championselect/stage/${stageSide}/teamid`);\r\n }\r\n\r\n /** `POST championselect/frontend` */\r\n async changeRouting(uri: string): Promise<void> {\r\n return this.client.post<void>(`championselect/frontend?uri=${encodeURIComponent(String(uri))}`);\r\n }\r\n\r\n /** `GET championselect/stage/{stageside}/{slotid}` */\r\n async getPlayerPUUIDInSlot(stageside: number, slotid: number): Promise<string> {\r\n return this.client.get<string>(`championselect/stage/${stageside}/${slotid}`);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for Game CRUD and draft (picks/bans) endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-11\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { gameWithTeams } from \"#types/shared/gamewithteams\";\r\nimport type { simpleChampionData } from \"#types/shared/simplechampiondata\";\r\nimport type { Team } from \"#types/shared/style/team\";\r\nimport type { teamMember } from \"#types/shared/teammember\";\r\nimport type { teamWithMembers } from \"#types/shared/teamwithmembers\";\r\n\r\nexport class GameApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET game/current` */\r\n async getCurrentGame(): Promise<gameWithTeams> {\r\n return this.client.get<gameWithTeams>('game/current');\r\n }\r\n\r\n /** `GET game/previous` */\r\n async getPreviousGame(): Promise<number> {\r\n return this.client.get<number>('game/previous');\r\n }\r\n\r\n /** `GET game/{gameid}` */\r\n async getGame(gameid: number): Promise<gameWithTeams> {\r\n return this.client.get<gameWithTeams>(`game/${gameid}`);\r\n }\r\n\r\n /** `PATCH game/{gameid}` */\r\n async updateGame(gameid: number, game: unknown): Promise<void> {\r\n return this.client.patch<void>(`game/${gameid}`, game);\r\n }\r\n\r\n /** `PUT game/{gameid}/teams` */\r\n async setSideSelection(gameid: number, teams: number[]): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/teams`, teams);\r\n }\r\n\r\n /** `GET game/{gameid}/teams` */\r\n async getTeamsInGame(gameid: number): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>(`game/${gameid}/teams`);\r\n }\r\n\r\n /** `DELETE game/{gameid}/winner` */\r\n async removeGameWinner(gameid: number): Promise<void> {\r\n return this.client.delete<void>(`game/${gameid}/winner`);\r\n }\r\n\r\n /** `PUT game/{gameid}/winner/{teamid}` */\r\n async setGameWinner(gameid: number, teamid: number): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/winner/${teamid}`);\r\n }\r\n\r\n /** `GET game/{gameid}/bans` */\r\n async getBans(gameid: number): Promise<simpleChampionData[]> {\r\n return this.client.get<simpleChampionData[]>(`game/${gameid}/bans`);\r\n }\r\n\r\n /** `GET game/{gameid}/bans/{teamid}` */\r\n async getBansForTeam(gameid: number, teamid: number): Promise<simpleChampionData[]> {\r\n return this.client.get<simpleChampionData[]>(`game/${gameid}/bans/${teamid}`);\r\n }\r\n\r\n /** `PUT game/{gameid}/bans` */\r\n async setBans(gameid: number, bans: Record<number, (string | null)[]>): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/bans`, bans);\r\n }\r\n\r\n /** `PUT game/{gameid}/bans/{teamid}` */\r\n async setBansForTeam(gameid: number, teamid: number, bans: (string | null)[]): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/bans/${teamid}`, bans);\r\n }\r\n\r\n /** `GET game/{gameid}/picks` */\r\n async getPicks(gameid: number): Promise<Record<number, simpleChampionData[]>> {\r\n return this.client.get<Record<number, simpleChampionData[]>>(`game/${gameid}/picks`);\r\n }\r\n\r\n /** `GET game/{gameid}/picks/{teamid}` */\r\n async getPicksForTeam(gameid: number, teamid: number): Promise<simpleChampionData[]> {\r\n return this.client.get<simpleChampionData[]>(`game/${gameid}/picks/${teamid}`);\r\n }\r\n\r\n /** `PUT game/{gameid}/picks` */\r\n async setPicks(gameid: number, picks: Record<number, (string | null)[]>): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/picks`, picks);\r\n }\r\n\r\n /** `PUT game/{gameid}/picks/{teamid}` */\r\n async setPicksForTeam(gameid: number, teamid: number, picks: (string | null)[]): Promise<void> {\r\n return this.client.put<void>(`game/${gameid}/picks/${teamid}`, picks);\r\n }\r\n\r\n /** `GET game/{gameid}/teams/players` */\r\n async getPlayersInGame(gameid: number): Promise<Record<Team, teamMember[]>> {\r\n return this.client.get<Record<Team, teamMember[]>>(`game/${gameid}/teams/players`);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for Live game state endpoints (requires active game).\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-11\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { tabPlayer } from \"#types/ingame/tab/tabplayer\";\r\n\r\nexport class GameStateApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET game/state/time` */\r\n async getGameTime(): Promise<number> {\r\n return this.client.get<number>('game/state/time');\r\n }\r\n\r\n /** `GET game/state/team/{teamId}/dragons` */\r\n async getTeamDragons(teamId: number): Promise<string[]> {\r\n return this.client.get<string[]>(`game/state/team/${teamId}/dragons`);\r\n }\r\n\r\n /** `PATCH game/state/team/{teamId}/dragons` */\r\n async updateTeamDragons(teamId: number, dragons: string[]): Promise<void> {\r\n return this.client.patch<void>(`game/state/team/${teamId}/dragons`, dragons);\r\n }\r\n\r\n /** `GET game/state/team/all/index` */\r\n async getActiveTeams(): Promise<number[]> {\r\n return this.client.get<number[]>('game/state/team/all/index');\r\n }\r\n\r\n /** `GET game/state/team/all/participant` */\r\n async getAllTeamParticipants(): Promise<Record<number, tabPlayer[]>> {\r\n return this.client.get<Record<number, tabPlayer[]>>('game/state/team/all/participant');\r\n }\r\n\r\n /** `GET game/state/team/{teamId}/participant` */\r\n async getTeamParticipants(teamId: number): Promise<tabPlayer[]> {\r\n return this.client.get<tabPlayer[]>(`game/state/team/${teamId}/participant`);\r\n }\r\n\r\n /** `GET game/state/team/all/participant/order` */\r\n async getTeamParticipantOrder(): Promise<string[]> {\r\n return this.client.get<string[]>('game/state/team/all/participant/order');\r\n }\r\n\r\n /** `PUT game/state/team/all/participant/order` */\r\n async updateTeamParticipantOrder(orderedNames: string[]): Promise<void> {\r\n return this.client.put<void>('game/state/team/all/participant/order', orderedNames);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for Match (series) management endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-11\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { matchData } from \"#types/pregame/matchdata\";\r\nimport type { addMatchRequestArgs } from \"#types/rest/match/addmatchrequestargs\";\r\nimport type { optionalMatchData } from \"#types/rest/match/optionalmatchdata\";\r\nimport type { BestOfType } from \"#types/shared/bestoftype\";\r\nimport type { gameWithTeams } from \"#types/shared/gamewithteams\";\r\nimport type { MatchRuleSet } from \"#types/shared/matchruleset\";\r\nimport type { matchWithGamesAndTeams } from \"#types/shared/matchwithgamesandteams\";\r\nimport type { simpleChampionData } from \"#types/shared/simplechampiondata\";\r\nimport type { teamWithMembers } from \"#types/shared/teamwithmembers\";\r\n\r\nexport class MatchApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET match/season/{seasonId}/simple` */\r\n async getSimpleMatches(seasonId: number): Promise<matchData[]> {\r\n return this.client.get<matchData[]>(`match/season/${seasonId}/simple`);\r\n }\r\n\r\n /** `GET match/season/{seasonId}` */\r\n async getMatches(seasonId: number): Promise<matchWithGamesAndTeams[]> {\r\n return this.client.get<matchWithGamesAndTeams[]>(`match/season/${seasonId}`);\r\n }\r\n\r\n /** `GET match/simple` */\r\n async getAllSimpleMatches(): Promise<matchData[]> {\r\n return this.client.get<matchData[]>('match/simple');\r\n }\r\n\r\n /** `GET match` */\r\n async getAllMatches(): Promise<matchWithGamesAndTeams[]> {\r\n return this.client.get<matchWithGamesAndTeams[]>('match');\r\n }\r\n\r\n /** `GET match/current` */\r\n async getCurrentMatch(): Promise<matchWithGamesAndTeams> {\r\n return this.client.get<matchWithGamesAndTeams>('match/current');\r\n }\r\n\r\n /** `POST match/current` */\r\n async completeCurrentMatch(): Promise<void> {\r\n return this.client.post<void>('match/current');\r\n }\r\n\r\n /** `GET match/current/id` */\r\n async getCurrentMatchId(): Promise<number> {\r\n return this.client.get<number>('match/current/id');\r\n }\r\n\r\n /** `GET match/previous/id` */\r\n async getPreviousMatchId(): Promise<number> {\r\n return this.client.get<number>('match/previous/id');\r\n }\r\n\r\n /** `POST match/current/{seriesid}` */\r\n async setCurrentMatch(seriesid: number): Promise<void> {\r\n return this.client.post<void>(`match/current/${seriesid}`);\r\n }\r\n\r\n /** `GET match/current/bestof` */\r\n async getCurrentMatchBestOf(): Promise<BestOfType> {\r\n return this.client.get<BestOfType>('match/current/bestof');\r\n }\r\n\r\n /** `PUT match/current/bestof` */\r\n async setCurrentMatchBestOf(type: BestOfType): Promise<void> {\r\n return this.client.put<void>('match/current/bestof', type);\r\n }\r\n\r\n /** `GET match/current/teams` */\r\n async getCurrentMatchTeams(): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>('match/current/teams');\r\n }\r\n\r\n /** `PUT match/current/teams` */\r\n async setCurrentMatchTeams(teamIds: number[]): Promise<void> {\r\n return this.client.put<void>('match/current/teams', teamIds);\r\n }\r\n\r\n /** `GET match/current/game` */\r\n async getCurrentGame(): Promise<gameWithTeams> {\r\n return this.client.get<gameWithTeams>('match/current/game');\r\n }\r\n\r\n /** `GET match/current/ruleset` */\r\n async getCurrentMatchRuleset(): Promise<MatchRuleSet> {\r\n return this.client.get<MatchRuleSet>('match/current/ruleset');\r\n }\r\n\r\n /** `PUT match/current/ruleset/{ruleset}` */\r\n async setCurrentMatchRuleset(ruleset: MatchRuleSet): Promise<void> {\r\n return this.client.put<void>(`match/current/ruleset/${ruleset}`);\r\n }\r\n\r\n /** `GET match/current/fearless/bans` */\r\n async getBans(): Promise<Record<number, Record<number, simpleChampionData[]>>> {\r\n return this.client.get<Record<number, Record<number, simpleChampionData[]>>>('match/current/fearless/bans');\r\n }\r\n\r\n /** `GET match/current/onstage` */\r\n async getCurrentMatchOnStage(): Promise<boolean> {\r\n return this.client.get<boolean>('match/current/onstage');\r\n }\r\n\r\n /** `GET match/{matchid}` */\r\n async getMatch(matchid: number): Promise<matchWithGamesAndTeams> {\r\n return this.client.get<matchWithGamesAndTeams>(`match/${matchid}`);\r\n }\r\n\r\n /** `DELETE match/{matchid}` */\r\n async deleteMatch(matchid: number): Promise<boolean> {\r\n return this.client.delete<boolean>(`match/${matchid}`);\r\n }\r\n\r\n /** `GET match/{matchid}/teams` */\r\n async getMatchTeams(matchid: number): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>(`match/${matchid}/teams`);\r\n }\r\n\r\n /** `PUT match/{matchid}/teams` */\r\n async setMatchTeams(matchid: number, teamIds: number[]): Promise<void> {\r\n return this.client.put<void>(`match/${matchid}/teams`, teamIds);\r\n }\r\n\r\n /** `GET match/{matchid}/games` */\r\n async getMatchGames(matchid: number): Promise<gameWithTeams[]> {\r\n return this.client.get<gameWithTeams[]>(`match/${matchid}/games`);\r\n }\r\n\r\n /** `GET match/{matchid}/winner` */\r\n async getMatchWinner(matchid: number): Promise<teamWithMembers> {\r\n return this.client.get<teamWithMembers>(`match/${matchid}/winner`);\r\n }\r\n\r\n /** `PUT match/{matchid}/winner/{teamid}` */\r\n async setMatchWinner(matchid: number, teamid: number): Promise<void> {\r\n return this.client.put<void>(`match/${matchid}/winner/${teamid}`);\r\n }\r\n\r\n /** `DELETE match/{matchid}/winner` */\r\n async removeMatchWinner(matchid: number): Promise<void> {\r\n return this.client.delete<void>(`match/${matchid}/winner`);\r\n }\r\n\r\n /** `GET match/{matchid}/bestof` */\r\n async getMatchBestOf(matchid: number): Promise<BestOfType> {\r\n return this.client.get<BestOfType>(`match/${matchid}/bestof`);\r\n }\r\n\r\n /** `PUT match/{matchid}/bestof/{type}` */\r\n async setMatchBestOf(matchid: number, type: BestOfType): Promise<void> {\r\n return this.client.put<void>(`match/${matchid}/bestof/${type}`);\r\n }\r\n\r\n /** `GET match/{matchid}/ruleset` */\r\n async getMatchRuleset(matchid: number): Promise<MatchRuleSet> {\r\n return this.client.get<MatchRuleSet>(`match/${matchid}/ruleset`);\r\n }\r\n\r\n /** `PUT match/{matchid}/ruleset/{ruleset}` */\r\n async setMatchRuleset(matchid: number, ruleset: MatchRuleSet): Promise<void> {\r\n return this.client.put<void>(`match/${matchid}/ruleset/${ruleset}`);\r\n }\r\n\r\n /** `GET match/{matchid}/name` */\r\n async getMatchName(matchid: number): Promise<string> {\r\n return this.client.get<string>(`match/${matchid}/name`);\r\n }\r\n\r\n /** `PATCH match/{matchid}/name/{matchName}` */\r\n async setMatchName(matchid: number, matchName: string): Promise<void> {\r\n return this.client.patch<void>(`match/${matchid}/name/${matchName}`);\r\n }\r\n\r\n /** `PATCH match/{matchid}` */\r\n async updateMatch(matchid: number, matchUpdate: optionalMatchData): Promise<void> {\r\n return this.client.patch<void>(`match/${matchid}`, matchUpdate);\r\n }\r\n\r\n /** `GET match/{matchid}/fearless/bans` */\r\n async getMatchBans(matchid: number): Promise<Record<number, Record<number, simpleChampionData[]>>> {\r\n return this.client.get<Record<number, Record<number, simpleChampionData[]>>>(`match/${matchid}/fearless/bans`);\r\n }\r\n\r\n /** `GET match/{seriesid}/onstage` */\r\n async getMatchOnStage(seriesid: number): Promise<boolean> {\r\n return this.client.get<boolean>(`match/${seriesid}/onstage`);\r\n }\r\n\r\n /** `PUT match` */\r\n async addMatch(match: addMatchRequestArgs): Promise<number> {\r\n return this.client.put<number>('match', match);\r\n }\r\n\r\n /** `GET match/{matchId}/stage/team/{stageSide}` */\r\n async getTeamOnStageSide(matchId: number, stageSide: number): Promise<teamWithMembers> {\r\n return this.client.get<teamWithMembers>(`match/${matchId}/stage/team/${stageSide}`);\r\n }\r\n\r\n /** `GET match/current/stage/team/{stageSide}` */\r\n async getTeamOnStageSideCurrent(stageSide: number): Promise<teamWithMembers> {\r\n return this.client.get<teamWithMembers>(`match/current/stage/team/${stageSide}`);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for Season management endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-11\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\nimport type { matchWithGamesAndTeams } from \"#types/shared/matchwithgamesandteams\";\r\nimport type { seasonData } from \"#types/shared/seasondata\";\r\nimport type { teamData } from \"#types/shared/teamdata\";\r\nimport type { teamWithMembers } from \"#types/shared/teamwithmembers\";\r\n\r\nexport class SeasonApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET season/current` */\r\n async getCurrentSeason(): Promise<seasonData> {\r\n return this.client.get<seasonData>('season/current');\r\n }\r\n\r\n /** `GET season/current/match` */\r\n async getCurrentSeasonScheduledMatch(): Promise<matchWithGamesAndTeams> {\r\n return this.client.get<matchWithGamesAndTeams>('season/current/match');\r\n }\r\n\r\n /** `GET season/current/id` */\r\n async getCurrentSeasonId(): Promise<number> {\r\n return this.client.get<number>('season/current/id');\r\n }\r\n\r\n /** `POST season/current` */\r\n async setCurrentSeason(newCurrentSeasonId: number): Promise<void> {\r\n return this.client.post<void>('season/current', newCurrentSeasonId);\r\n }\r\n\r\n /** `GET season/current/teams` */\r\n async getCurrentSeasonTeams(): Promise<teamData[]> {\r\n return this.client.get<teamData[]>('season/current/teams');\r\n }\r\n\r\n /** `GET season/current/teamswithmembers` */\r\n async getCurrentSeasonTeamsWithMembers(): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>('season/current/teamswithmembers');\r\n }\r\n\r\n /** `GET season/current/icon` */\r\n async getCurrentSeasonIcon(): Promise<string> {\r\n return this.client.get<string>('season/current/icon');\r\n }\r\n\r\n /** `PUT season/current/icon` */\r\n async setCurrentSeasonIcon(): Promise<string> {\r\n return this.client.put<string>('season/current/icon');\r\n }\r\n\r\n /** `GET season` */\r\n async getAllSeasons(): Promise<seasonData[]> {\r\n return this.client.get<seasonData[]>('season');\r\n }\r\n\r\n /** `GET season/{seasonId}` */\r\n async getSeasonById(seasonId: number): Promise<seasonData> {\r\n return this.client.get<seasonData>(`season/${seasonId}`);\r\n }\r\n\r\n /** `GET season/{seasonId}/matches` */\r\n async getMatchesInSeason(seasonId: number): Promise<matchWithGamesAndTeams[]> {\r\n return this.client.get<matchWithGamesAndTeams[]>(`season/${seasonId}/matches`);\r\n }\r\n\r\n /** `GET season/{seasonId}/matches/count` */\r\n async getMatchesInSeasonCount(seasonId: number): Promise<number> {\r\n return this.client.get<number>(`season/${seasonId}/matches/count`);\r\n }\r\n\r\n /** `GET season/{seasonId}/matches/day/{day}` */\r\n async getMatchesInSeasonOnDay(seasonId: number, day: string): Promise<matchWithGamesAndTeams[]> {\r\n return this.client.get<matchWithGamesAndTeams[]>(`season/${seasonId}/matches/day/${day}`);\r\n }\r\n\r\n /** `GET season/{seasonId}/teams` */\r\n async getTeamsInSeason(seasonId: number): Promise<teamData[]> {\r\n return this.client.get<teamData[]>(`season/${seasonId}/teams`);\r\n }\r\n\r\n /** `GET season/{seasonId}/teamswithmembers` */\r\n async getTeamsWithMembersInSeason(seasonId: number): Promise<teamWithMembers[]> {\r\n return this.client.get<teamWithMembers[]>(`season/${seasonId}/teamswithmembers`);\r\n }\r\n\r\n /** `POST season` */\r\n async createOrUpdateSeason(seasonData: seasonData): Promise<number> {\r\n return this.client.post<number>('season', seasonData);\r\n }\r\n\r\n /** `GET season/{seasonId}/icon` */\r\n async getSeasonIcon(seasonId: number): Promise<string> {\r\n return this.client.get<string>(`season/${seasonId}/icon`);\r\n }\r\n\r\n /** `PUT season/{seasonId}/icon` */\r\n async setSeasonIcon(seasonId: number): Promise<string> {\r\n return this.client.put<string>(`season/${seasonId}/icon`);\r\n }\r\n\r\n /** `DELETE season/{seasonId}` */\r\n async deleteSeason(seasonId: number): Promise<void> {\r\n return this.client.delete<void>(`season/${seasonId}`);\r\n }\r\n}\r\n\r\n","/**\r\n * Auto-generated REST API client for In-game overlay and serialization endpoints.\r\n * Do not edit manually. Changes will be lost.\r\n *\r\n * @generated 2026-03-11\r\n */\r\n\r\nimport type { ApiClient } from \"../ApiClient\";\r\n\r\nexport class IngameApi {\r\n constructor(private readonly client: ApiClient) {}\r\n\r\n /** `GET ingame/status` */\r\n async getGameState(): Promise<number> {\r\n return this.client.get<number>('ingame/status');\r\n }\r\n\r\n /** `POST ingame/enable` */\r\n async enableComponent(): Promise<void> {\r\n return this.client.post<void>('ingame/enable');\r\n }\r\n\r\n /** `POST ingame/disable` */\r\n async disableComponent(): Promise<void> {\r\n return this.client.post<void>('ingame/disable');\r\n }\r\n\r\n /** `POST ingame/mock/{doMocking}` */\r\n async mockIngame(doMocking: boolean): Promise<void> {\r\n return this.client.post<void>(`ingame/mock/${doMocking}`);\r\n }\r\n\r\n /** `GET ingame/mock` */\r\n async getMockingStatus(): Promise<boolean> {\r\n return this.client.get<boolean>('ingame/mock');\r\n }\r\n\r\n /** `GET ingame/frontend` */\r\n async getFrontendUrl(): Promise<string> {\r\n return this.client.get<string>('ingame/frontend');\r\n }\r\n\r\n /** `GET ingame/showing` */\r\n async getCurrentCommonSerializationOptions(): Promise<Record<string, unknown>> {\r\n return this.client.get<Record<string, unknown>>('ingame/showing');\r\n }\r\n\r\n /** `POST ingame/showing` */\r\n async setCurrentCommonSerializationOptions(data: Record<string, unknown>): Promise<void> {\r\n return this.client.post<void>('ingame/showing', data);\r\n }\r\n\r\n /** `GET ingame/showing/{socketid}` */\r\n async getCurrentFrontendSerializationOptions(socketid: string): Promise<Record<string, unknown>> {\r\n return this.client.get<Record<string, unknown>>(`ingame/showing/${socketid}`);\r\n }\r\n\r\n /** `POST ingame/showing/{socketid}` */\r\n async setCurrentFrontendSerializationOptions(socketid: string, data: Record<string, unknown>): Promise<void> {\r\n return this.client.post<void>(`ingame/showing/${socketid}`, data);\r\n }\r\n\r\n /** `GET ingame/stage/{stageSide}/{playerSlot}/networkId` */\r\n async getPlayerPUUIDInSlot(stageSide: number, playerSlot: number): Promise<number> {\r\n return this.client.get<number>(`ingame/stage/${stageSide}/${playerSlot}/networkId`);\r\n }\r\n\r\n /** `GET ingame/stage/{stageSide}/ingameteamid` */\r\n async getIngameTeamOnStageSide(stageSide: number): Promise<number> {\r\n return this.client.get<number>(`ingame/stage/${stageSide}/ingameteamid`);\r\n }\r\n\r\n /** `GET ingame/state/activeOverlays` */\r\n async getActiveOverlays(): Promise<string[]> {\r\n return this.client.get<string[]>('ingame/state/activeOverlays');\r\n }\r\n}\r\n\r\n","/**\r\n * Composite REST API client that aggregates all generated API modules.\r\n *\r\n * Access individual API groups via the named properties:\r\n *\r\n * ```ts\r\n * const client = new LeagueBroadcastClient({ host: \"localhost\" });\r\n *\r\n * // Games\r\n * const game = await client.api.game.getCurrent();\r\n *\r\n * // Matches\r\n * const match = await client.api.match.getCurrent();\r\n * await client.api.match.setCurrentBestOf(BestOfType.BestOf3);\r\n *\r\n * // Seasons\r\n * const seasons = await client.api.season.getAll();\r\n *\r\n * // In-game overlay control\r\n * await client.api.ingame.enable();\r\n * const overlays = await client.api.ingame.getActiveOverlays();\r\n *\r\n * // Live game state (requires active game)\r\n * const time = await client.api.gameState.getGameTime();\r\n * const players = await client.api.gameState.getAllParticipants();\r\n *\r\n * // Pre-game / champion select\r\n * const frontendUrl = await client.api.preGame.getFrontendUrl();\r\n * ```\r\n */\r\n\r\nimport { ApiClient } from \"./ApiClient\";\r\nimport {\r\n IngameApi,\r\n GameApi,\r\n MatchApi,\r\n SeasonApi,\r\n PreGameApi,\r\n GameStateApi,\r\n} from \"./generated\";\r\n\r\nexport class RestApi {\r\n private readonly client: ApiClient;\r\n\r\n /** In-game overlay and serialization endpoints. */\r\n public readonly ingame: IngameApi;\r\n\r\n /** Game CRUD, picks/bans, and winner endpoints. */\r\n public readonly game: GameApi;\r\n\r\n /** Match (series) management — current match, teams, fearless bans, etc. */\r\n public readonly match: MatchApi;\r\n\r\n /** Season management — CRUD, teams, icons, match listings. */\r\n public readonly season: SeasonApi;\r\n\r\n /** Champion select (pre-game) mocking, bans, frontend routing. */\r\n public readonly preGame: PreGameApi;\r\n\r\n /** Live game state — participants, dragons, ordering. Requires active game. */\r\n public readonly gameState: GameStateApi;\r\n\r\n constructor(baseUrl: string) {\r\n this.client = new ApiClient(baseUrl);\r\n\r\n this.ingame = new IngameApi(this.client);\r\n this.game = new GameApi(this.client);\r\n this.match = new MatchApi(this.client);\r\n this.season = new SeasonApi(this.client);\r\n this.preGame = new PreGameApi(this.client);\r\n this.gameState = new GameStateApi(this.client);\r\n }\r\n\r\n /**\r\n * Update the base URL for all API modules (e.g. after changing host/port).\r\n */\r\n updateBaseUrl(baseUrl: string): void {\r\n this.client.updateBaseUrl(baseUrl);\r\n }\r\n\r\n /**\r\n * Get direct access to the underlying HTTP client for custom requests.\r\n */\r\n getHttpClient(): ApiClient {\r\n return this.client;\r\n }\r\n}\r\n","import { WebSocketManager } from \"./WebSocketManager\";\r\nimport { GameStateStore } from \"./reactivity/GameStateStore\";\r\nimport { ChampSelectStateStore } from \"./reactivity/ChampSelectStateStore\";\r\nimport { structuralShare } from \"./reactivity/structuralShare\";\r\nimport type { Subscribable, EqualityFn } from \"./reactivity/GameStateStore\";\r\nimport type { GameStateSnapshot } from \"./reactivity/GameStateStore\";\r\nimport type { ChampSelectSnapshot } from \"./reactivity/ChampSelectStateStore\";\r\nimport { ingameFrontendData } from \"#types/ingame/ingamefrontenddata\";\r\nimport { GameState } from \"#types/shared/gamestate\";\r\nimport type { transitionEvents } from \"#types/ingame/event/transitionevents\";\r\nimport type { playerUpdateEvent } from \"#types/ingame/event/playerUpdateEvent\";\r\nimport type { teamUpdateResults } from \"#types/ingame/event/teamUpdateResults\";\r\nimport type { ingameObjectiveEvent } from \"#types/ingame/event/ingameObjectiveEvent\";\r\nimport type { announcerEvent } from \"#types/ingame/announcer/announcerEvent\";\r\nimport type { killFeedEvent } from \"#types/ingame/event/killFeedEvent\";\r\nimport { Team } from \"#types/shared/style/Team\";\r\nimport { champSelectStateData } from \"#types/pregame/champselectstatedata\";\r\nimport type { pickBanActionEventArgs } from \"#types/pregame/pickbanactioneventargs\";\r\nimport { RestApi } from \"./api/RestApi\";\r\n\r\nexport interface LeagueBroadcastClientConfig {\r\n host: string;\r\n port?: number;\r\n /** In-game WebSocket route. @default \"/ws/in\" */\r\n ingameWsRoute?: string;\r\n /** Pre-game (champion select) WebSocket route. @default \"/ws/pre\" */\r\n preGameWsRoute?: string;\r\n apiRoute?: string;\r\n cacheRoute?: string;\r\n useHttps?: boolean;\r\n autoConnect?: boolean;\r\n}\r\n\r\nexport interface IngameEventHandlers {\r\n onPlayerEvent?: (event: playerUpdateEvent) => void;\r\n onTeamEvent?: (event: teamUpdateResults) => void;\r\n onObjectiveEvent?: (event: ingameObjectiveEvent) => void;\r\n onFirstTowerEvent?: (teamId: Team) => void;\r\n onAnnouncementEvent?: (event: announcerEvent) => void;\r\n onKillFeedEvent?: (event: killFeedEvent) => void;\r\n}\r\n\r\nexport interface ChampSelectEventHandlers {\r\n /** Fired for every pick/ban action (hover, lock, ban reveal, phase transition). */\r\n onAction?: (action: pickBanActionEventArgs) => void;\r\n /** Fired when champ select becomes active (first state update with `isActive === true`). */\r\n onChampSelectStart?: () => void;\r\n /** Fired when champ select ends (backend sends `isActive === false`). */\r\n onChampSelectEnd?: () => void;\r\n /** Fired when the frontend route changes (e.g. navigating between pre-game views). */\r\n onRouteUpdate?: (uri: string) => void;\r\n}\r\n\r\n/**\r\n * Main client for connecting to the League Broadcast backend.\r\n *\r\n * Internally manages **two** WebSocket connections:\r\n * - `/ws/in` — real-time in-game data\r\n * - `/ws/pre` — champion-select (pre-game) data\r\n *\r\n * Both connections are opened on {@link connect} (or automatically if\r\n * `autoConnect` is `true`) and share the same host / port.\r\n *\r\n * @example\r\n * ```ts\r\n * const client = new LeagueBroadcastClient({ host: \"localhost\" });\r\n *\r\n * // In-game\r\n * client.onIngameStateUpdate(data => console.log(\"Game time:\", data.gameTime));\r\n * client.watchIngame(s => s.gameData.scoreboard?.teams[0]?.kills, kills => { });\r\n *\r\n * // Pre-game\r\n * client.onChampSelectUpdate(data => console.log(\"Phase:\", data.timer.phaseName));\r\n * client.onChampSelectEvents({ onAction: a => console.log(a) });\r\n * client.selectChampSelect(s => s.champSelectData.timer);\r\n * ```\r\n */\r\nexport class LeagueBroadcastClient {\r\n // -- WebSocket connections --------------------------------------------------\r\n private ingameWs: WebSocketManager;\r\n private preGameWs: WebSocketManager;\r\n\r\n private config: Required<LeagueBroadcastClientConfig>;\r\n\r\n // -- In-game state ----------------------------------------------------------\r\n private gameData: ingameFrontendData;\r\n private gameState: GameState = GameState.OutOfGame;\r\n private _isTestingEnvironment: boolean = false;\r\n\r\n // -- Pre-game state ---------------------------------------------------------\r\n private champSelectData: champSelectStateData;\r\n private champSelectWasActive: boolean = false;\r\n\r\n // -- Reactive stores --------------------------------------------------------\r\n\r\n /** Reactive store for **in-game** state. */\r\n public readonly ingameStore: GameStateStore;\r\n\r\n /** Reactive store for **pre-game** (champion select) state. */\r\n public readonly preGameStore: ChampSelectStateStore;\r\n\r\n // -- REST API ---------------------------------------------------------------\r\n\r\n /**\r\n * Typed REST API client for all backend HTTP endpoints.\r\n *\r\n * Provides access to game, match, season, in-game, pre-game, and\r\n * game-state API groups:\r\n *\r\n * ```ts\r\n * const game = await client.api.game.getCurrent();\r\n * const match = await client.api.match.getCurrent();\r\n * await client.api.ingame.enable();\r\n * ```\r\n */\r\n public readonly api: RestApi;\r\n\r\n // -- In-game event handlers -------------------------------------------------\r\n private stateUpdateHandlers: Set<(state: ingameFrontendData) => void> =\r\n new Set();\r\n private gameStatusHandlers: Set<\r\n (status: GameState, isTestingEnv: boolean) => void\r\n > = new Set();\r\n private ingameEventHandlers: IngameEventHandlers = {};\r\n\r\n // -- Pre-game event handlers ------------------------------------------------\r\n private champSelectUpdateHandlers: Set<\r\n (state: champSelectStateData) => void\r\n > = new Set();\r\n private champSelectEventHandlers: ChampSelectEventHandlers = {};\r\n\r\n constructor(config: LeagueBroadcastClientConfig) {\r\n this.config = {\r\n host: config.host,\r\n port: config.port ?? 58869,\r\n ingameWsRoute: config.ingameWsRoute ?? \"/ws/in\",\r\n preGameWsRoute: config.preGameWsRoute ?? \"/ws/pre\",\r\n apiRoute: config.apiRoute ?? \"/api\",\r\n cacheRoute: config.cacheRoute ?? \"/cache\",\r\n useHttps: config.useHttps ?? false,\r\n autoConnect: config.autoConnect ?? true,\r\n };\r\n\r\n // REST API\r\n const httpProtocol = this.config.useHttps ? \"https\" : \"http\";\r\n const apiBaseUrl = `${httpProtocol}://${this.config.host}:${this.config.port}${this.config.apiRoute}`;\r\n this.api = new RestApi(apiBaseUrl);\r\n\r\n // Ingame\r\n this.ingameWs = new WebSocketManager();\r\n this.gameData = new ingameFrontendData();\r\n this.ingameStore = new GameStateStore(this.gameData, this.gameState);\r\n this.setupIngameMessageHandler();\r\n\r\n // Pre-game\r\n this.preGameWs = new WebSocketManager();\r\n this.champSelectData = new champSelectStateData();\r\n this.preGameStore = new ChampSelectStateStore(this.champSelectData);\r\n this.setupPreGameMessageHandler();\r\n\r\n if (this.config.autoConnect) {\r\n this.connect();\r\n }\r\n }\r\n\r\n // ===========================================================================\r\n // Connection management\r\n // ===========================================================================\r\n\r\n /**\r\n * Connect to both in-game and pre-game WebSocket endpoints.\r\n *\r\n * Both connections are attempted in parallel. If either fails the returned\r\n * promise rejects, but the other connection may still succeed.\r\n */\r\n async connect(): Promise<void> {\r\n const protocol = this.config.useHttps ? \"wss\" : \"ws\";\r\n const base = `${protocol}://${this.config.host}:${this.config.port}`;\r\n\r\n const ingameUrl = `${base}${this.config.ingameWsRoute}`;\r\n const preGameUrl = `${base}${this.config.preGameWsRoute}`;\r\n\r\n const results = await Promise.allSettled([\r\n this.ingameWs.connect(ingameUrl),\r\n this.preGameWs.connect(preGameUrl),\r\n ]);\r\n\r\n const failures = results.filter((r) => r.status === \"rejected\");\r\n if (failures.length > 0) {\r\n const reasons = (failures as PromiseRejectedResult[]).map(\r\n (r) => r.reason,\r\n );\r\n console.error(\r\n \"[LeagueBroadcastClient] One or more connections failed:\",\r\n reasons,\r\n );\r\n throw reasons[0];\r\n }\r\n }\r\n\r\n /**\r\n * Disconnect from both WebSocket endpoints.\r\n */\r\n disconnect(): void {\r\n this.ingameWs.disconnect();\r\n this.preGameWs.disconnect();\r\n }\r\n\r\n /**\r\n * Whether the in-game WebSocket is connected.\r\n */\r\n isIngameConnected(): boolean {\r\n return this.ingameWs.isConnected();\r\n }\r\n\r\n /**\r\n * Whether the pre-game WebSocket is connected.\r\n */\r\n isPreGameConnected(): boolean {\r\n return this.preGameWs.isConnected();\r\n }\r\n\r\n // ===========================================================================\r\n // In-game data access\r\n // ===========================================================================\r\n\r\n /** Get the current in-game data. */\r\n getIngameData(): ingameFrontendData {\r\n return this.gameData;\r\n }\r\n\r\n /** Get the current game state. */\r\n getIngameState(): GameState {\r\n return this.gameState;\r\n }\r\n\r\n /** Whether the backend is in a testing / replay environment. */\r\n isInTestingEnvironment(): boolean {\r\n return this._isTestingEnvironment;\r\n }\r\n\r\n // ===========================================================================\r\n // Pre-game data access\r\n // ===========================================================================\r\n\r\n /** Get the current champion-select state. */\r\n getChampSelectData(): champSelectStateData {\r\n return this.champSelectData;\r\n }\r\n\r\n /** Whether champion select is currently active. */\r\n isChampSelectActive(): boolean {\r\n return this.champSelectData.isActive;\r\n }\r\n\r\n // ===========================================================================\r\n // In-game event handlers\r\n // ===========================================================================\r\n\r\n /** Register a handler for in-game state updates. */\r\n onIngameStateUpdate(handler: (state: ingameFrontendData) => void): () => void {\r\n this.stateUpdateHandlers.add(handler);\r\n return () => this.stateUpdateHandlers.delete(handler);\r\n }\r\n\r\n /** Register a handler for in-game status changes (running, paused, out of game). */\r\n onIngameStatusChange(\r\n handler: (status: GameState, isTestingEnv: boolean) => void,\r\n ): () => void {\r\n this.gameStatusHandlers.add(handler);\r\n return () => this.gameStatusHandlers.delete(handler);\r\n }\r\n\r\n /** Register handlers for in-game events (kills, objectives, etc.). */\r\n onIngameEvents(handlers: IngameEventHandlers): void {\r\n this.ingameEventHandlers = { ...this.ingameEventHandlers, ...handlers };\r\n }\r\n\r\n // ===========================================================================\r\n // Pre-game event handlers\r\n // ===========================================================================\r\n\r\n /** Register a handler for champ-select state updates. */\r\n onChampSelectUpdate(\r\n handler: (state: champSelectStateData) => void,\r\n ): () => void {\r\n this.champSelectUpdateHandlers.add(handler);\r\n return () => this.champSelectUpdateHandlers.delete(handler);\r\n }\r\n\r\n /** Register handlers for champ-select lifecycle and action events. */\r\n onChampSelectEvents(handlers: ChampSelectEventHandlers): void {\r\n this.champSelectEventHandlers = {\r\n ...this.champSelectEventHandlers,\r\n ...handlers,\r\n };\r\n }\r\n\r\n // ===========================================================================\r\n // Connection event handlers\r\n // ===========================================================================\r\n\r\n /** Register a handler for in-game connection. */\r\n onIngameConnect(handler: () => void): () => void {\r\n return this.ingameWs.onConnect(handler);\r\n }\r\n\r\n /** Register a handler for in-game disconnection. */\r\n onIngameDisconnect(handler: () => void): () => void {\r\n return this.ingameWs.onDisconnect(handler);\r\n }\r\n\r\n /** Register a handler for in-game connection errors. */\r\n onIngameError(handler: (error: Event) => void): () => void {\r\n return this.ingameWs.onError(handler);\r\n }\r\n\r\n /** Register a handler for pre-game connection. */\r\n onPreGameConnect(handler: () => void): () => void {\r\n return this.preGameWs.onConnect(handler);\r\n }\r\n\r\n /** Register a handler for pre-game disconnection. */\r\n onPreGameDisconnect(handler: () => void): () => void {\r\n return this.preGameWs.onDisconnect(handler);\r\n }\r\n\r\n /** Register a handler for pre-game connection errors. */\r\n onPreGameError(handler: (error: Event) => void): () => void {\r\n return this.preGameWs.onError(handler);\r\n }\r\n\r\n // ===========================================================================\r\n // Reactive API — in-game (convenience wrappers around this.store)\r\n // ===========================================================================\r\n\r\n /**\r\n * Create a subscribable slice of **in-game** state.\r\n * The slice only notifies listeners when the selected value actually changes.\r\n *\r\n * Works directly with React 18+ `useSyncExternalStore`:\r\n * ```tsx\r\n * const kills = client.selectIngame(s => s.gameData.scoreboard?.teams[0]?.kills);\r\n * function Kills() {\r\n * const value = useSyncExternalStore(kills.subscribe, kills.getSnapshot);\r\n * return <span>{value}</span>;\r\n * }\r\n * ```\r\n */\r\n selectIngame<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n equalityFn?: EqualityFn<S>,\r\n ): Subscribable<S> {\r\n return this.ingameStore.select(selector, equalityFn);\r\n }\r\n\r\n /**\r\n * Watch a derived **in-game** value and invoke `callback` whenever it changes.\r\n * Returns an unsubscribe function.\r\n *\r\n * ```ts\r\n * client.watchIngame(\r\n * s => s.gameData.scoreboard?.teams[0]?.kills,\r\n * (kills, prev) => console.log(`Kills: ${prev} → ${kills}`),\r\n * );\r\n * ```\r\n */\r\n watchIngame<S>(\r\n selector: (snapshot: GameStateSnapshot) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn?: EqualityFn<S>,\r\n ): () => void {\r\n return this.ingameStore.watch(selector, callback, equalityFn);\r\n }\r\n\r\n // ===========================================================================\r\n // Reactive API — pre-game (convenience wrappers around this.preGameStore)\r\n // ===========================================================================\r\n\r\n /**\r\n * Create a subscribable slice of **pre-game** (champion select) state.\r\n *\r\n * ```tsx\r\n * const timer = client.selectChampSelect(s => s.champSelectData.timer);\r\n * function DraftTimer() {\r\n * const value = useSyncExternalStore(timer.subscribe, timer.getSnapshot);\r\n * return <span>{value?.timeRemaining}</span>;\r\n * }\r\n * ```\r\n */\r\n selectChampSelect<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n equalityFn?: EqualityFn<S>,\r\n ): Subscribable<S> {\r\n return this.preGameStore.select(selector, equalityFn);\r\n }\r\n\r\n /**\r\n * Watch a derived **pre-game** value and invoke `callback` whenever it\r\n * changes. Returns an unsubscribe function.\r\n *\r\n * ```ts\r\n * client.watchChampSelect(\r\n * s => s.champSelectData.timer.timeRemaining,\r\n * (remaining, prev) => console.log(`Time: ${prev} → ${remaining}`),\r\n * );\r\n * ```\r\n */\r\n watchChampSelect<S>(\r\n selector: (snapshot: ChampSelectSnapshot) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn?: EqualityFn<S>,\r\n ): () => void {\r\n return this.preGameStore.watch(selector, callback, equalityFn);\r\n }\r\n\r\n // ===========================================================================\r\n // URLs\r\n // ===========================================================================\r\n\r\n /** Get the base HTTP URL for API requests. */\r\n getApiUrl(): string {\r\n const protocol = this.config.useHttps ? \"https\" : \"http\";\r\n return `${protocol}://${this.config.host}:${this.config.port}${this.config.apiRoute}`;\r\n }\r\n\r\n /** Get the base URL for cache requests (optionally resolve a path). */\r\n getCacheUrl(path?: string): string {\r\n const protocol = this.config.useHttps ? \"https\" : \"http\";\r\n const baseUrl = `${protocol}://${this.config.host}:${this.config.port}${this.config.cacheRoute}`;\r\n\r\n if (!path) {\r\n return baseUrl;\r\n }\r\n\r\n // Clean up the path\r\n let cleanPath = path;\r\n if (cleanPath.startsWith(\"http\")) {\r\n return cleanPath;\r\n }\r\n if (cleanPath.startsWith(\"/\")) {\r\n cleanPath = cleanPath.slice(1);\r\n }\r\n if (cleanPath.startsWith(\"cache\")) {\r\n cleanPath = cleanPath.slice(5);\r\n }\r\n if (cleanPath.startsWith(\"/\")) {\r\n cleanPath = cleanPath.slice(1);\r\n }\r\n\r\n return `${baseUrl}/${cleanPath}`;\r\n }\r\n\r\n // ===========================================================================\r\n // Private — in-game message handling\r\n // ===========================================================================\r\n\r\n private setupIngameMessageHandler(): void {\r\n this.ingameWs.onMessage((messageData: any) => {\r\n switch (messageData.type) {\r\n case \"ingame-state-update\":\r\n this.handleStateUpdate(messageData.state, messageData.events);\r\n break;\r\n case \"gameStatus\":\r\n this.handleGameStatusUpdate(\r\n messageData.gameState,\r\n messageData.isTestingEnvironment,\r\n );\r\n break;\r\n }\r\n });\r\n }\r\n\r\n private handleStateUpdate(state: any, events?: transitionEvents): void {\r\n const nextData: ingameFrontendData = {\r\n gameTime: 0,\r\n playbackSpeed: 0,\r\n gameVersion: \"\",\r\n gameStatus: GameState.OutOfGame,\r\n ...state,\r\n };\r\n this.gameData = structuralShare(this.gameData, nextData);\r\n\r\n if (!state.gameTime || state.gameTime === 0) {\r\n this.handleGameStatusUpdate(GameState.OutOfGame, false);\r\n }\r\n\r\n this.ingameStore._setGameData(this.gameData);\r\n this.stateUpdateHandlers.forEach((handler) => handler(this.gameData));\r\n this.handleGameEvents(events);\r\n }\r\n\r\n private handleGameStatusUpdate(\r\n gameStatus: GameState,\r\n isTestingEnvironment: boolean = false,\r\n ): void {\r\n this._isTestingEnvironment = isTestingEnvironment;\r\n\r\n if (\r\n gameStatus === GameState.OutOfGame &&\r\n this.gameState !== GameState.OutOfGame\r\n ) {\r\n this.endGame();\r\n return;\r\n }\r\n\r\n this.gameState = gameStatus;\r\n this.ingameStore._setGameState(gameStatus);\r\n this.gameStatusHandlers.forEach((handler) =>\r\n handler(gameStatus, isTestingEnvironment),\r\n );\r\n }\r\n\r\n private handleGameEvents(events?: transitionEvents): void {\r\n if (!events) return;\r\n\r\n if (events.player && this.ingameEventHandlers.onPlayerEvent) {\r\n events.player.forEach((event) =>\r\n this.ingameEventHandlers.onPlayerEvent!(event),\r\n );\r\n }\r\n\r\n if (events.team && this.ingameEventHandlers.onTeamEvent) {\r\n events.team.forEach((event) =>\r\n this.ingameEventHandlers.onTeamEvent!(event),\r\n );\r\n }\r\n\r\n if (events.objective && this.ingameEventHandlers.onObjectiveEvent) {\r\n events.objective.forEach((event) =>\r\n this.ingameEventHandlers.onObjectiveEvent!(event),\r\n );\r\n }\r\n\r\n if (\r\n events.firstTower !== undefined &&\r\n this.ingameEventHandlers.onFirstTowerEvent\r\n ) {\r\n this.ingameEventHandlers.onFirstTowerEvent(events.firstTower);\r\n }\r\n\r\n if (events.announcements && this.ingameEventHandlers.onAnnouncementEvent) {\r\n events.announcements.forEach((event) =>\r\n this.ingameEventHandlers.onAnnouncementEvent!(event),\r\n );\r\n }\r\n\r\n if (events.killFeed && this.ingameEventHandlers.onKillFeedEvent) {\r\n events.killFeed.forEach((event) =>\r\n this.ingameEventHandlers.onKillFeedEvent!(event),\r\n );\r\n }\r\n }\r\n\r\n private endGame(): void {\r\n console.log(\"[LeagueBroadcastClient] Game ended, resetting data\");\r\n\r\n this.gameData = new ingameFrontendData();\r\n this.gameState = GameState.OutOfGame;\r\n this._isTestingEnvironment = false;\r\n\r\n this.ingameStore._reset(this.gameData, GameState.OutOfGame);\r\n\r\n this.gameStatusHandlers.forEach((handler) =>\r\n handler(GameState.OutOfGame, false),\r\n );\r\n this.stateUpdateHandlers.forEach((handler) => handler(this.gameData));\r\n }\r\n\r\n // ===========================================================================\r\n // Private — pre-game message handling\r\n // ===========================================================================\r\n\r\n private setupPreGameMessageHandler(): void {\r\n this.preGameWs.onMessage((messageData: any) => {\r\n switch (messageData.type) {\r\n case \"champion-select-state-update\":\r\n this.handleChampSelectStateUpdate(messageData.state);\r\n break;\r\n case \"champion-select-action\":\r\n this.handleChampSelectAction(messageData.action);\r\n break;\r\n case \"frontend-route-update\":\r\n this.handleRouteUpdate(messageData.uri);\r\n break;\r\n }\r\n });\r\n }\r\n\r\n private handleChampSelectStateUpdate(state: any): void {\r\n const nextData: champSelectStateData = {\r\n isActive: false,\r\n isConnected: false,\r\n isTestingEnvironment: false,\r\n blueTeam: {} as any,\r\n redTeam: {} as any,\r\n metaData: {} as any,\r\n timer: {} as any,\r\n ...state,\r\n };\r\n\r\n this.champSelectData = structuralShare(this.champSelectData, nextData);\r\n\r\n // Detect champ select start / end transitions\r\n if (nextData.isActive && !this.champSelectWasActive) {\r\n this.champSelectWasActive = true;\r\n this.champSelectEventHandlers.onChampSelectStart?.();\r\n } else if (!nextData.isActive && this.champSelectWasActive) {\r\n this.champSelectWasActive = false;\r\n this.endChampSelect();\r\n return; // endChampSelect handles notifications\r\n }\r\n\r\n this.preGameStore._setChampSelectData(this.champSelectData);\r\n this.champSelectUpdateHandlers.forEach((handler) =>\r\n handler(this.champSelectData),\r\n );\r\n }\r\n\r\n private handleChampSelectAction(action: any): void {\r\n this.champSelectEventHandlers.onAction?.(action as pickBanActionEventArgs);\r\n }\r\n\r\n private handleRouteUpdate(uri: string): void {\r\n this.champSelectEventHandlers.onRouteUpdate?.(uri);\r\n }\r\n\r\n private endChampSelect(): void {\r\n console.log(\"[LeagueBroadcastClient] Champ select ended, resetting data\");\r\n\r\n this.champSelectData = new champSelectStateData();\r\n this.preGameStore._reset(this.champSelectData);\r\n\r\n this.champSelectEventHandlers.onChampSelectEnd?.();\r\n this.champSelectUpdateHandlers.forEach((handler) =>\r\n handler(this.champSelectData),\r\n );\r\n }\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum PickBanPhase {\r\n BEGIN = 0,\r\n BAN1 = 1,\r\n BAN2 = 2,\r\n PICK1 = 3,\r\n PICK2 = 4,\r\n END = 5,\r\n WAIT = 6\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum ActionType {\r\n TEN_BANS_REVEAL = 0,\r\n PHASE_TRANSITION = 1,\r\n PICK = 2,\r\n BAN = 3\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum ActionSubType {\r\n START = 0,\r\n HOVER = 1,\r\n LOCK = 2\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum TimeLineActionType {\r\n HoverPick = 0,\r\n Pick = 1,\r\n Ban = 2\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum BestOfType {\r\n BestOf1 = 1,\r\n BestOf2 = 2,\r\n BestOf3 = 3,\r\n BestOf5 = 5,\r\n BestOf7 = 7\r\n}\r\n","/**\r\n * This is an auto-generated file.\r\n * Any changes made to this file can be lost when this file is regenerated.\r\n */\r\n\r\nexport enum MatchRuleSet {\r\n Standard = 0,\r\n PartialFearless = 1,\r\n Fearless = 2\r\n}\r\n","import { itemWithAsset } from \"#types/ingame/itemWithAsset\";\r\nimport { ingameScoreboardBottomPlayerData } from \"#types/ingame/scoreboardBottom/ingameScoreboardBottomPlayerData\";\r\n\r\nexport function getSortedInventory(\r\n playerData: ingameScoreboardBottomPlayerData,\r\n): (itemWithAsset | undefined)[] {\r\n if (!playerData.items) return Array(6).fill({ id: 0 });\r\n\r\n const items =\r\n playerData.items?.filter((item) => item.slot < 6) ??\r\n ([] as (itemWithAsset | undefined)[]);\r\n\r\n //sort items by cost, with undefined items at the end\r\n const regularItems = items.sort(\r\n (a, b) => (a?.cost ?? 0) - (b?.cost ?? 0),\r\n ) as (itemWithAsset | undefined)[];\r\n\r\n //fill items with empty items if less than 6, undefined items at start\r\n while (regularItems.length < 6) {\r\n regularItems.unshift(undefined);\r\n }\r\n return regularItems ?? [];\r\n}\r\n\r\nexport function getTrinket(\r\n playerData: ingameScoreboardBottomPlayerData,\r\n): itemWithAsset | undefined {\r\n return playerData.items?.find((item) => item.slot === 6);\r\n}\r\n\r\nexport function getRoleQuest(\r\n playerData: ingameScoreboardBottomPlayerData,\r\n): itemWithAsset | undefined {\r\n return playerData.items?.find((item) => item.slot === 8);\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bluebottle_gg/league-broadcast-client",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "TypeScript client library for League Broadcast game data",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -25,7 +25,8 @@
25
25
  "test": "tsx test/run.ts",
26
26
  "test:rest": "tsx test/run.ts --skip-ws",
27
27
  "test:ws": "tsx test/run.ts --skip-rest",
28
- "prepublishOnly": "npm run build"
28
+ "prepublishOnly": "npm run build",
29
+ "type-check": "tsc --noEmit"
29
30
  },
30
31
  "keywords": [
31
32
  "league-of-legends",
@@ -50,6 +51,6 @@
50
51
  "rimraf": "^6.0.1",
51
52
  "tsup": "^8.3.5",
52
53
  "tsx": "^4.21.0",
53
- "typescript": "^5.7.2"
54
+ "typescript": "~5.9.3"
54
55
  }
55
56
  }