@bluebottle_gg/league-broadcast-client 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -87,7 +87,7 @@ declare class itemWithAsset {
87
87
  * This is an auto-generated file.
88
88
  * Any changes made to this file can be lost when this file is regenerated.
89
89
  */
90
- declare class simpleChampionData {
90
+ declare class simpleChampionData$1 {
91
91
  id: number;
92
92
  alias: string;
93
93
  name: string;
@@ -104,7 +104,7 @@ declare class simpleChampionData {
104
104
  */
105
105
 
106
106
  declare class damageGraphEntry {
107
- champion?: simpleChampionData;
107
+ champion?: simpleChampionData$1;
108
108
  abilities?: ingameAbilityInfo[];
109
109
  activeItems?: itemWithAsset[];
110
110
  name: string;
@@ -172,7 +172,7 @@ declare class cDragonPerkInfo {
172
172
  */
173
173
 
174
174
  declare class ingameSingleRuneData {
175
- champion?: simpleChampionData;
175
+ champion?: simpleChampionData$1;
176
176
  perks: cDragonPerkInfo[];
177
177
  name: string;
178
178
  team: number;
@@ -193,7 +193,7 @@ declare class ingameRuneData {
193
193
  */
194
194
 
195
195
  declare class ingameScoreboardBottomPlayerData {
196
- champion?: simpleChampionData;
196
+ champion?: simpleChampionData$1;
197
197
  name: string;
198
198
  kills: number;
199
199
  deaths: number;
@@ -234,7 +234,7 @@ declare class ingameScoreboardBottomData {
234
234
  * This is an auto-generated file.
235
235
  * Any changes made to this file can be lost when this file is regenerated.
236
236
  */
237
- declare enum BestOfType {
237
+ declare enum BestOfType$1 {
238
238
  BestOf1 = 1,
239
239
  BestOf2 = 2,
240
240
  BestOf3 = 3,
@@ -293,7 +293,7 @@ declare class ingameScoreboardTeamData {
293
293
  declare class ingameScoreboardData {
294
294
  teams: ingameScoreboardTeamData[];
295
295
  gameTime: number;
296
- bestOf: BestOfType;
296
+ bestOf: BestOfType$1;
297
297
  }
298
298
 
299
299
  /**
@@ -314,7 +314,7 @@ declare class ingameSideInfoPageDisplayData {
314
314
  */
315
315
 
316
316
  declare class ingameSideInfoPageRow {
317
- champion?: simpleChampionData;
317
+ champion?: simpleChampionData$1;
318
318
  playerName?: string;
319
319
  team?: number;
320
320
  minValue?: number;
@@ -419,11 +419,11 @@ declare class perkInfoV2 {
419
419
  * Any changes made to this file can be lost when this file is regenerated.
420
420
  */
421
421
 
422
- declare class tabPlayer {
422
+ declare class tabPlayer$1 {
423
423
  id: string;
424
424
  playerName: string;
425
425
  playerHashtag: string;
426
- championAssets?: simpleChampionData;
426
+ championAssets?: simpleChampionData$1;
427
427
  abilities: ingameAbilityInfo[];
428
428
  perks: perkInfoV2[];
429
429
  health: ingameHealthData;
@@ -443,7 +443,7 @@ declare class tabPlayer {
443
443
 
444
444
  declare class tabTeam {
445
445
  id: number;
446
- players: tabPlayer[];
446
+ players: tabPlayer$1[];
447
447
  }
448
448
 
449
449
  /**
@@ -538,7 +538,7 @@ declare class teamMember {
538
538
  * Any changes made to this file can be lost when this file is regenerated.
539
539
  */
540
540
 
541
- declare class teamWithMembers {
541
+ declare class teamWithMembers$1 {
542
542
  members: teamMember[];
543
543
  teamId: number;
544
544
  name: string;
@@ -563,7 +563,7 @@ declare class ingameFrontendData {
563
563
  isTestingEnvironment?: boolean;
564
564
  gameVersion: string;
565
565
  patch?: string;
566
- teams?: teamWithMembers[];
566
+ teams?: teamWithMembers$1[];
567
567
  gameStatus: GameState$1;
568
568
  scoreboard?: ingameScoreboardData;
569
569
  tabs?: {
@@ -718,6 +718,269 @@ interface GameStateSnapshot {
718
718
  */
719
719
  declare function shallowEqual<T>(a: T, b: T): boolean;
720
720
 
721
+ /**
722
+ * This is an auto-generated file.
723
+ * Any changes made to this file can be lost when this file is regenerated.
724
+ */
725
+
726
+ declare class championData {
727
+ id: number;
728
+ alias: string;
729
+ name: string;
730
+ attackSpeed: number;
731
+ splashCenteredImg: string;
732
+ splashImg: string;
733
+ loadingImg: string;
734
+ squareImg: string;
735
+ tileImg: string;
736
+ spells: championAbilityData[];
737
+ }
738
+
739
+ /**
740
+ * This is an auto-generated file.
741
+ * Any changes made to this file can be lost when this file is regenerated.
742
+ */
743
+
744
+ declare class banSlot$1 {
745
+ isActive: boolean;
746
+ champion?: championData;
747
+ }
748
+
749
+ /**
750
+ * This is an auto-generated file.
751
+ * Any changes made to this file can be lost when this file is regenerated.
752
+ */
753
+ declare class championStatistics {
754
+ winRate: number;
755
+ pickRate: number;
756
+ banRate: number;
757
+ }
758
+
759
+ /**
760
+ * This is an auto-generated file.
761
+ * Any changes made to this file can be lost when this file is regenerated.
762
+ */
763
+ declare class summonerSpellData {
764
+ id?: number;
765
+ name: string;
766
+ spellIcon: string;
767
+ localAsset: string;
768
+ }
769
+
770
+ /**
771
+ * This is an auto-generated file.
772
+ * Any changes made to this file can be lost when this file is regenerated.
773
+ */
774
+
775
+ declare class pickSlot$1 {
776
+ id: number;
777
+ isActive: boolean;
778
+ player: string;
779
+ summonerSpells: summonerSpellData[];
780
+ champion?: championData;
781
+ championStatistics?: championStatistics;
782
+ }
783
+
784
+ /**
785
+ * This is an auto-generated file.
786
+ * Any changes made to this file can be lost when this file is regenerated.
787
+ */
788
+ declare enum PickBanPhase$1 {
789
+ BEGIN = 0,
790
+ BAN1 = 1,
791
+ BAN2 = 2,
792
+ PICK1 = 3,
793
+ PICK2 = 4,
794
+ END = 5,
795
+ WAIT = 6
796
+ }
797
+
798
+ /**
799
+ * This is an auto-generated file.
800
+ * Any changes made to this file can be lost when this file is regenerated.
801
+ */
802
+
803
+ declare class pickBanTimer$1 {
804
+ phaseName: PickBanPhase$1;
805
+ phaseDuration: number;
806
+ timeRemaining: number;
807
+ }
808
+
809
+ /**
810
+ * This is an auto-generated file.
811
+ * Any changes made to this file can be lost when this file is regenerated.
812
+ */
813
+ declare enum TimeLineActionType$1 {
814
+ HoverPick = 0,
815
+ Pick = 1,
816
+ Ban = 2
817
+ }
818
+
819
+ /**
820
+ * This is an auto-generated file.
821
+ * Any changes made to this file can be lost when this file is regenerated.
822
+ */
823
+
824
+ declare class timelineEntry$1 {
825
+ type: TimeLineActionType$1;
826
+ champion: championData;
827
+ timer: pickBanTimer$1;
828
+ }
829
+
830
+ /**
831
+ * This is an auto-generated file.
832
+ * Any changes made to this file can be lost when this file is regenerated.
833
+ */
834
+
835
+ declare class championSelectTeam$1 {
836
+ metaData?: teamWithMembers$1;
837
+ bans: banSlot$1[];
838
+ slots: pickSlot$1[];
839
+ timeline: timelineEntry$1[];
840
+ index: number;
841
+ scoreMatch: teamScore;
842
+ scoreSeason: teamScore;
843
+ fearlessBans?: {
844
+ [key: number]: simpleChampionData$1[];
845
+ };
846
+ }
847
+
848
+ /**
849
+ * This is an auto-generated file.
850
+ * Any changes made to this file can be lost when this file is regenerated.
851
+ */
852
+ declare class champSelectStatePerformanceData {
853
+ updateDuration: number;
854
+ }
855
+
856
+ /**
857
+ * This is an auto-generated file.
858
+ * Any changes made to this file can be lost when this file is regenerated.
859
+ */
860
+ declare enum MatchRuleSet$1 {
861
+ Standard = 0,
862
+ PartialFearless = 1,
863
+ Fearless = 2
864
+ }
865
+
866
+ /**
867
+ * This is an auto-generated file.
868
+ * Any changes made to this file can be lost when this file is regenerated.
869
+ */
870
+
871
+ declare class matchData$1 {
872
+ matchId: number;
873
+ seasonId: number;
874
+ winnerId?: number;
875
+ isActive: boolean;
876
+ type: BestOfType$1;
877
+ nextMatchId?: number;
878
+ winnerNextMatchId?: number;
879
+ loserNextMatchId?: number;
880
+ name?: string;
881
+ date?: Date;
882
+ ruleSet: MatchRuleSet$1;
883
+ onStage: boolean;
884
+ }
885
+
886
+ /**
887
+ * This is an auto-generated file.
888
+ * Any changes made to this file can be lost when this file is regenerated.
889
+ */
890
+
891
+ declare class champSelectStateMetaData$1 {
892
+ bestOfType: BestOfType$1;
893
+ patch: string;
894
+ performanceData: champSelectStatePerformanceData;
895
+ matchData?: matchData$1;
896
+ }
897
+
898
+ /**
899
+ * This is an auto-generated file.
900
+ * Any changes made to this file can be lost when this file is regenerated.
901
+ */
902
+
903
+ declare class champSelectStateData {
904
+ isActive: boolean;
905
+ isConnected: boolean;
906
+ isTestingEnvironment: boolean;
907
+ blueTeam: championSelectTeam$1;
908
+ redTeam: championSelectTeam$1;
909
+ metaData: champSelectStateMetaData$1;
910
+ timer: pickBanTimer$1;
911
+ }
912
+
913
+ /**
914
+ * Reactive store for League Broadcast champion-select (pre-game) state.
915
+ *
916
+ * Follows the same selector-based model as {@link GameStateStore} but holds
917
+ * `champSelectStateData` instead of ingame data.
918
+ *
919
+ * @example Vanilla JS
920
+ * ```ts
921
+ * const timer = store.select(s => s.champSelectData.timer);
922
+ * timer.subscribe(() => {
923
+ * console.log('Timer changed:', timer.getSnapshot());
924
+ * });
925
+ * ```
926
+ *
927
+ * @example React 18+
928
+ * ```tsx
929
+ * function Timer() {
930
+ * const timer = useSyncExternalStore(
931
+ * store.select(s => s.champSelectData.timer).subscribe,
932
+ * store.select(s => s.champSelectData.timer).getSnapshot,
933
+ * );
934
+ * return <div>{timer?.timeRemaining}</div>;
935
+ * }
936
+ * ```
937
+ */
938
+ declare class ChampSelectStateStore {
939
+ /** Current immutable snapshot. Replaced (never mutated) on every update. */
940
+ private snapshot;
941
+ /** Global listeners — called on every state change regardless of selector. */
942
+ private listeners;
943
+ /** Monotonically increasing version — used for cheap stale checks. */
944
+ private version;
945
+ constructor(initialState: champSelectStateData);
946
+ /** Return the current full snapshot. */
947
+ getSnapshot(): ChampSelectSnapshot;
948
+ /** Return the current version number. */
949
+ getVersion(): number;
950
+ /**
951
+ * Subscribe to **all** state changes (unfiltered).
952
+ * Returns an unsubscribe function.
953
+ */
954
+ subscribe(listener: () => void): () => void;
955
+ /**
956
+ * Create a **subscribable slice** that only triggers when the selected
957
+ * value changes according to `equalityFn` (defaults to `===`).
958
+ */
959
+ select<S>(selector: (snapshot: ChampSelectSnapshot) => S, equalityFn?: EqualityFn<S>): Subscribable<S>;
960
+ /**
961
+ * Watch a derived value and invoke `callback` whenever it changes.
962
+ * Returns an unsubscribe function.
963
+ */
964
+ watch<S>(selector: (snapshot: ChampSelectSnapshot) => S, callback: (value: S, prev: S) => void, equalityFn?: EqualityFn<S>): () => void;
965
+ /**
966
+ * Watch a derived value and invoke `callback` whenever it changes,
967
+ * **and** invoke it immediately with the current value.
968
+ */
969
+ watchImmediate<S>(selector: (snapshot: ChampSelectSnapshot) => S, callback: (value: S, prev: S | undefined) => void, equalityFn?: EqualityFn<S>): () => void;
970
+ /** @internal Replace champ-select data snapshot and notify listeners. */
971
+ _setChampSelectData(data: champSelectStateData): void;
972
+ /** @internal Replace entire snapshot (used on champ select end / reset). */
973
+ _reset(data: champSelectStateData): void;
974
+ private emit;
975
+ }
976
+ interface ChampSelectSnapshot {
977
+ readonly champSelectData: champSelectStateData;
978
+ /** Whether champ select is currently active. */
979
+ readonly isActive: boolean;
980
+ /** Monotonic version counter — useful for cheap stale checks. */
981
+ readonly version: number;
982
+ }
983
+
721
984
  /**
722
985
  * This is an auto-generated file.
723
986
  * Any changes made to this file can be lost when this file is regenerated.
@@ -763,7 +1026,7 @@ declare class ingameObjectiveEvent {
763
1026
  */
764
1027
 
765
1028
  declare class announcementParameter {
766
- champion?: simpleChampionData;
1029
+ champion?: simpleChampionData$1;
767
1030
  member?: teamMember;
768
1031
  asset?: string;
769
1032
  team: number;
@@ -827,9 +1090,9 @@ declare class announcerEvent {
827
1090
 
828
1091
  declare class killFeedEvent {
829
1092
  ingameTeamId: number;
830
- killer?: simpleChampionData;
831
- victim: simpleChampionData;
832
- assisters?: simpleChampionData[];
1093
+ killer?: simpleChampionData$1;
1094
+ victim: simpleChampionData$1;
1095
+ assisters?: simpleChampionData$1[];
833
1096
  }
834
1097
 
835
1098
  /**
@@ -843,16 +1106,602 @@ declare enum Team {
843
1106
  Neutral = 3
844
1107
  }
845
1108
 
1109
+ /**
1110
+ * This is an auto-generated file.
1111
+ * Any changes made to this file can be lost when this file is regenerated.
1112
+ */
1113
+
1114
+ declare class pickBanActionEventArgs {
1115
+ type: string;
1116
+ subType: string;
1117
+ actorId: number;
1118
+ id: number;
1119
+ gameTeamId: number;
1120
+ champion?: championData;
1121
+ puuid?: string;
1122
+ }
1123
+
1124
+ /**
1125
+ * Base HTTP client for League Broadcast REST API calls.
1126
+ *
1127
+ * Provides typed `get`, `post`, `put`, `patch`, and `delete` helpers that
1128
+ * handle JSON serialization, error responses, and empty bodies.
1129
+ *
1130
+ * Used internally by the generated API modules — you normally access this
1131
+ * through `LeagueBroadcastClient.api.*` rather than constructing it directly.
1132
+ */
1133
+ declare class ApiClient {
1134
+ private baseUrl;
1135
+ constructor(baseUrl: string);
1136
+ /** Update the base URL (e.g. after reconnecting to a different host/port). */
1137
+ updateBaseUrl(baseUrl: string): void;
1138
+ /** Current base URL. */
1139
+ getBaseUrl(): string;
1140
+ get<T>(path: string): Promise<T>;
1141
+ post<T = void>(path: string, body?: unknown): Promise<T>;
1142
+ put<T = void>(path: string, body?: unknown): Promise<T>;
1143
+ patch<T = void>(path: string, body?: unknown): Promise<T>;
1144
+ delete<T = void>(path: string): Promise<T>;
1145
+ /**
1146
+ * POST with a raw string body (e.g. base64 image data).
1147
+ * Sets Content-Type to text/plain instead of application/json.
1148
+ */
1149
+ postRaw<T = void>(path: string, rawBody: string): Promise<T>;
1150
+ /**
1151
+ * PUT with a raw string body (e.g. base64 image data).
1152
+ * Sets Content-Type to text/plain instead of application/json.
1153
+ */
1154
+ putRaw<T = void>(path: string, rawBody: string): Promise<T>;
1155
+ private buildUrl;
1156
+ private request;
1157
+ private parseResponse;
1158
+ }
1159
+ /**
1160
+ * Error thrown when a REST API call returns a non-2xx status.
1161
+ */
1162
+ declare class ApiError extends Error {
1163
+ readonly status: number;
1164
+ readonly statusText: string;
1165
+ readonly body: string;
1166
+ readonly url: string;
1167
+ constructor(status: number, statusText: string, body: string, url: string);
1168
+ }
1169
+
1170
+ /**
1171
+ * This is an auto-generated file.
1172
+ * Any changes made to this file can be lost when this file is regenerated.
1173
+ */
1174
+ declare class simpleChampionData {
1175
+ id: number;
1176
+ alias: string;
1177
+ name: string;
1178
+ splashCenteredImg: string;
1179
+ splashImg: string;
1180
+ loadingImg: string;
1181
+ squareImg: string;
1182
+ tileImg: string;
1183
+ }
1184
+
1185
+ /**
1186
+ * Auto-generated REST API client for Champion select (pre-game) endpoints.
1187
+ * Do not edit manually. Changes will be lost.
1188
+ *
1189
+ * @generated 2026-03-04
1190
+ */
1191
+
1192
+ declare class PreGameApi {
1193
+ private readonly client;
1194
+ constructor(client: ApiClient);
1195
+ /** `POST championselect/mock/{doMocking}` */
1196
+ mockChampionSelect(doMocking: boolean, randomizationinterval?: number): Promise<boolean>;
1197
+ /** `GET championselect/mock` */
1198
+ getMockingStatus(): Promise<boolean>;
1199
+ /** `GET championselect/bans` */
1200
+ getBans(): Promise<Record<number, Record<number, simpleChampionData[]>>>;
1201
+ /** `GET championselect/frontend` */
1202
+ getFrontendUrl(): Promise<string>;
1203
+ /** `GET championselect/stage/{stageSide}/teamid` */
1204
+ getTeamIdOnSide(stageSide: number): Promise<number>;
1205
+ /** `POST championselect/frontend` */
1206
+ changeRouting(uri: string): Promise<void>;
1207
+ /** `GET championselect/stage/{stageside}/{slotid}` */
1208
+ getPlayerPUUIDInSlot(stageside: number, slotid: number): Promise<string>;
1209
+ }
1210
+
1211
+ /**
1212
+ * This is an auto-generated file.
1213
+ * Any changes made to this file can be lost when this file is regenerated.
1214
+ */
1215
+
1216
+ declare class gameWithTeams$1 {
1217
+ teams: teamWithMembers$1[];
1218
+ gameId: number;
1219
+ matchId: number;
1220
+ gameNumber: number;
1221
+ gameWinnerId?: number;
1222
+ isActive: boolean;
1223
+ isComplete: boolean;
1224
+ gameTime?: number;
1225
+ gameDate?: Date;
1226
+ ruleSet: MatchRuleSet$1;
1227
+ patch: string;
1228
+ gameVersion: string;
1229
+ assetPatch: string;
1230
+ }
1231
+
1232
+ /**
1233
+ * This is an auto-generated file.
1234
+ * Any changes made to this file can be lost when this file is regenerated.
1235
+ */
1236
+
1237
+ declare class teamWithMembers {
1238
+ members: teamMember[];
1239
+ teamId: number;
1240
+ name: string;
1241
+ tag: string;
1242
+ description?: string;
1243
+ iconUri?: string;
1244
+ isActive: boolean;
1245
+ primaryColor?: number;
1246
+ secondaryColor?: number;
1247
+ tertiaryColor?: number;
1248
+ backgroundColor?: number;
1249
+ }
1250
+
1251
+ /**
1252
+ * Auto-generated REST API client for Game CRUD and draft (picks/bans) endpoints.
1253
+ * Do not edit manually. Changes will be lost.
1254
+ *
1255
+ * @generated 2026-03-04
1256
+ */
1257
+
1258
+ declare class GameApi {
1259
+ private readonly client;
1260
+ constructor(client: ApiClient);
1261
+ /** `GET game/current` */
1262
+ getCurrentGame(): Promise<gameWithTeams$1>;
1263
+ /** `GET game/previous` */
1264
+ getPreviousGame(): Promise<number>;
1265
+ /** `GET game/{gameid}` */
1266
+ getGame(gameid: number): Promise<gameWithTeams$1>;
1267
+ /** `PATCH game/{gameid}` */
1268
+ updateGame(gameid: number, game: unknown): Promise<void>;
1269
+ /** `PUT game/{gameid}/teams` */
1270
+ setSideSelection(gameid: number, teams: number[]): Promise<void>;
1271
+ /** `GET game/{gameid}/teams` */
1272
+ getTeamsInGame(gameid: number): Promise<teamWithMembers[]>;
1273
+ /** `DELETE game/{gameid}/winner` */
1274
+ removeGameWinner(gameid: number): Promise<void>;
1275
+ /** `PUT game/{gameid}/winner/{teamid}` */
1276
+ setGameWinner(gameid: number, teamid: number): Promise<void>;
1277
+ /** `GET game/{gameid}/bans` */
1278
+ getBans(gameid: number): Promise<simpleChampionData[]>;
1279
+ /** `GET game/{gameid}/bans/{teamid}` */
1280
+ getBansForTeam(gameid: number, teamid: number): Promise<simpleChampionData[]>;
1281
+ /** `PUT game/{gameid}/bans` */
1282
+ setBans(gameid: number, bans: Record<number, (string | null)[]>): Promise<void>;
1283
+ /** `PUT game/{gameid}/bans/{teamid}` */
1284
+ setBansForTeam(gameid: number, teamid: number, bans: (string | null)[]): Promise<void>;
1285
+ /** `GET game/{gameid}/picks` */
1286
+ getPicks(gameid: number): Promise<Record<number, simpleChampionData[]>>;
1287
+ /** `GET game/{gameid}/picks/{teamid}` */
1288
+ getPicksForTeam(gameid: number, teamid: number): Promise<simpleChampionData[]>;
1289
+ /** `PUT game/{gameid}/picks` */
1290
+ setPicks(gameid: number, picks: Record<number, (string | null)[]>): Promise<void>;
1291
+ /** `PUT game/{gameid}/picks/{teamid}` */
1292
+ setPicksForTeam(gameid: number, teamid: number, picks: (string | null)[]): Promise<void>;
1293
+ }
1294
+
1295
+ /**
1296
+ * This is an auto-generated file.
1297
+ * Any changes made to this file can be lost when this file is regenerated.
1298
+ */
1299
+
1300
+ declare class tabPlayer {
1301
+ id: string;
1302
+ playerName: string;
1303
+ playerHashtag: string;
1304
+ championAssets?: simpleChampionData$1;
1305
+ abilities: ingameAbilityInfo[];
1306
+ perks: perkInfoV2[];
1307
+ health: ingameHealthData;
1308
+ resource: ingameResourceData;
1309
+ stacksData?: number;
1310
+ hasBaron: boolean;
1311
+ hasElder: boolean;
1312
+ level: number;
1313
+ experience: ingameExperienceData;
1314
+ timeToRespawn?: number;
1315
+ }
1316
+
1317
+ /**
1318
+ * Auto-generated REST API client for Live game state endpoints (requires active game).
1319
+ * Do not edit manually. Changes will be lost.
1320
+ *
1321
+ * @generated 2026-03-04
1322
+ */
1323
+
1324
+ declare class GameStateApi {
1325
+ private readonly client;
1326
+ constructor(client: ApiClient);
1327
+ /** `GET game/state/time` */
1328
+ getGameTime(): Promise<number>;
1329
+ /** `GET game/state/team/{teamId}/dragons` */
1330
+ getTeamDragons(teamId: number): Promise<string[]>;
1331
+ /** `PATCH game/state/team/{teamId}/dragons` */
1332
+ updateTeamDragons(teamId: number, dragons: string[]): Promise<void>;
1333
+ /** `GET game/state/team/all/index` */
1334
+ getActiveTeams(): Promise<number[]>;
1335
+ /** `GET game/state/team/all/participant` */
1336
+ getAllTeamParticipants(): Promise<Record<number, tabPlayer[]>>;
1337
+ /** `GET game/state/team/{teamId}/participant` */
1338
+ getTeamParticipants(teamId: number): Promise<tabPlayer[]>;
1339
+ /** `GET game/state/team/all/participant/order` */
1340
+ getTeamParticipantOrder(): Promise<string[]>;
1341
+ /** `PUT game/state/team/all/participant/order` */
1342
+ updateTeamParticipantOrder(orderedNames: string[]): Promise<void>;
1343
+ }
1344
+
1345
+ /**
1346
+ * This is an auto-generated file.
1347
+ * Any changes made to this file can be lost when this file is regenerated.
1348
+ */
1349
+
1350
+ declare class matchData {
1351
+ matchId: number;
1352
+ seasonId: number;
1353
+ winnerId?: number;
1354
+ isActive: boolean;
1355
+ type: BestOfType$1;
1356
+ nextMatchId?: number;
1357
+ winnerNextMatchId?: number;
1358
+ loserNextMatchId?: number;
1359
+ name?: string;
1360
+ date?: Date;
1361
+ ruleSet: MatchRuleSet$1;
1362
+ onStage: boolean;
1363
+ }
1364
+
1365
+ /**
1366
+ * This is an auto-generated file.
1367
+ * Any changes made to this file can be lost when this file is regenerated.
1368
+ */
1369
+ declare enum BestOfType {
1370
+ BestOf1 = 1,
1371
+ BestOf2 = 2,
1372
+ BestOf3 = 3,
1373
+ BestOf5 = 5,
1374
+ BestOf7 = 7
1375
+ }
1376
+
1377
+ /**
1378
+ * This is an auto-generated file.
1379
+ * Any changes made to this file can be lost when this file is regenerated.
1380
+ */
1381
+ declare enum MatchRuleSet {
1382
+ Standard = 0,
1383
+ PartialFearless = 1,
1384
+ Fearless = 2
1385
+ }
1386
+
1387
+ /**
1388
+ * This is an auto-generated file.
1389
+ * Any changes made to this file can be lost when this file is regenerated.
1390
+ */
1391
+
1392
+ declare class gameWithTeams {
1393
+ teams: teamWithMembers$1[];
1394
+ gameId: number;
1395
+ matchId: number;
1396
+ gameNumber: number;
1397
+ gameWinnerId?: number;
1398
+ isActive: boolean;
1399
+ isComplete: boolean;
1400
+ gameTime?: number;
1401
+ gameDate?: Date;
1402
+ ruleSet: MatchRuleSet$1;
1403
+ patch: string;
1404
+ gameVersion: string;
1405
+ assetPatch: string;
1406
+ }
1407
+
1408
+ /**
1409
+ * This is an auto-generated file.
1410
+ * Any changes made to this file can be lost when this file is regenerated.
1411
+ */
1412
+
1413
+ declare class matchWithGamesAndTeams {
1414
+ games: gameWithTeams[];
1415
+ teams: teamWithMembers$1[];
1416
+ matchId: number;
1417
+ seasonId: number;
1418
+ winnerId?: number;
1419
+ isActive: boolean;
1420
+ type: BestOfType$1;
1421
+ nextMatchId?: number;
1422
+ winnerNextMatchId?: number;
1423
+ loserNextMatchId?: number;
1424
+ name?: string;
1425
+ date?: Date;
1426
+ ruleSet: MatchRuleSet$1;
1427
+ onStage: boolean;
1428
+ }
1429
+
1430
+ /**
1431
+ * Auto-generated REST API client for Match (series) management endpoints.
1432
+ * Do not edit manually. Changes will be lost.
1433
+ *
1434
+ * @generated 2026-03-04
1435
+ */
1436
+
1437
+ declare class MatchApi {
1438
+ private readonly client;
1439
+ constructor(client: ApiClient);
1440
+ /** `GET match/season/{seasonId}/simple` */
1441
+ getSimpleMatches(seasonId: number): Promise<matchData[]>;
1442
+ /** `GET match/season/{seasonId}` */
1443
+ getMatches(seasonId: number): Promise<matchWithGamesAndTeams[]>;
1444
+ /** `GET match/simple` */
1445
+ getAllSimpleMatches(): Promise<matchData[]>;
1446
+ /** `GET match` */
1447
+ getAllMatches(): Promise<matchWithGamesAndTeams[]>;
1448
+ /** `GET match/current` */
1449
+ getCurrentMatch(): Promise<matchWithGamesAndTeams>;
1450
+ /** `POST match/current` */
1451
+ completeCurrentMatch(): Promise<void>;
1452
+ /** `GET match/current/id` */
1453
+ getCurrentMatchId(): Promise<number>;
1454
+ /** `GET match/previous/id` */
1455
+ getPreviousMatchId(): Promise<number>;
1456
+ /** `POST match/current/{seriesid}` */
1457
+ setCurrentMatch(seriesid: number): Promise<void>;
1458
+ /** `GET match/current/bestof` */
1459
+ getCurrentMatchBestOf(): Promise<BestOfType>;
1460
+ /** `PUT match/current/bestof` */
1461
+ setCurrentMatchBestOf(type: BestOfType): Promise<void>;
1462
+ /** `GET match/current/teams` */
1463
+ getCurrentMatchTeams(): Promise<teamWithMembers[]>;
1464
+ /** `PUT match/current/teams` */
1465
+ setCurrentMatchTeams(teamIds: number[]): Promise<void>;
1466
+ /** `GET match/current/game` */
1467
+ getCurrentGame(): Promise<gameWithTeams$1>;
1468
+ /** `GET match/current/ruleset` */
1469
+ getCurrentMatchRuleset(): Promise<MatchRuleSet>;
1470
+ /** `PUT match/current/ruleset/{ruleset}` */
1471
+ setCurrentMatchRuleset(ruleset: MatchRuleSet): Promise<void>;
1472
+ /** `GET match/current/fearless/bans` */
1473
+ getBans(): Promise<Record<number, Record<number, simpleChampionData[]>>>;
1474
+ /** `GET match/current/onstage` */
1475
+ getCurrentMatchOnStage(): Promise<boolean>;
1476
+ /** `GET match/{matchid}` */
1477
+ getMatch(matchid: number): Promise<matchWithGamesAndTeams>;
1478
+ /** `DELETE match/{matchid}` */
1479
+ deleteMatch(matchid: number): Promise<boolean>;
1480
+ /** `GET match/{matchid}/teams` */
1481
+ getMatchTeams(matchid: number): Promise<teamWithMembers[]>;
1482
+ /** `PUT match/{matchid}/teams` */
1483
+ setMatchTeams(matchid: number, teamIds: number[]): Promise<void>;
1484
+ /** `GET match/{matchid}/games` */
1485
+ getMatchGames(matchid: number): Promise<gameWithTeams$1[]>;
1486
+ /** `GET match/{matchid}/winner` */
1487
+ getMatchWinner(matchid: number): Promise<teamWithMembers>;
1488
+ /** `PUT match/{matchid}/winner/{teamid}` */
1489
+ setMatchWinner(matchid: number, teamid: number): Promise<void>;
1490
+ /** `DELETE match/{matchid}/winner` */
1491
+ removeMatchWinner(matchid: number): Promise<void>;
1492
+ /** `GET match/{matchid}/bestof` */
1493
+ getMatchBestOf(matchid: number): Promise<BestOfType>;
1494
+ /** `PUT match/{matchid}/bestof/{type}` */
1495
+ setMatchBestOf(matchid: number, type: BestOfType): Promise<void>;
1496
+ /** `GET match/{matchid}/ruleset` */
1497
+ getMatchRuleset(matchid: number): Promise<MatchRuleSet>;
1498
+ /** `PUT match/{matchid}/ruleset/{ruleset}` */
1499
+ setMatchRuleset(matchid: number, ruleset: MatchRuleSet): Promise<void>;
1500
+ /** `GET match/{matchid}/name` */
1501
+ getMatchName(matchid: number): Promise<string>;
1502
+ /** `PATCH match/{matchid}/name/{matchName}` */
1503
+ setMatchName(matchid: number, matchName: string): Promise<void>;
1504
+ /** `PATCH match/{matchid}` */
1505
+ updateMatch(matchid: number, matchUpdate: unknown): Promise<void>;
1506
+ /** `GET match/{matchid}/fearless/bans` */
1507
+ getMatchBans(matchid: number): Promise<Record<number, Record<number, simpleChampionData[]>>>;
1508
+ /** `GET match/{seriesid}/onstage` */
1509
+ getMatchOnStage(seriesid: number): Promise<boolean>;
1510
+ /** `PUT match` */
1511
+ addMatch(match: unknown): Promise<number>;
1512
+ /** `GET match/{matchId}/stage/team/{stageSide}` */
1513
+ getTeamOnStageSide(matchId: number, stageSide: number): Promise<teamWithMembers>;
1514
+ /** `GET match/current/stage/team/{stageSide}` */
1515
+ getTeamOnStageSideCurrent(stageSide: number): Promise<teamWithMembers>;
1516
+ }
1517
+
1518
+ /**
1519
+ * This is an auto-generated file.
1520
+ * Any changes made to this file can be lost when this file is regenerated.
1521
+ */
1522
+ declare class seasonData {
1523
+ seasonId: number;
1524
+ seasonName: string;
1525
+ isActive: boolean;
1526
+ startDate?: Date;
1527
+ endDate?: Date;
1528
+ iconUri?: string;
1529
+ }
1530
+
1531
+ /**
1532
+ * This is an auto-generated file.
1533
+ * Any changes made to this file can be lost when this file is regenerated.
1534
+ */
1535
+ declare class teamData {
1536
+ teamId: number;
1537
+ name: string;
1538
+ tag: string;
1539
+ description?: string;
1540
+ iconUri?: string;
1541
+ isActive: boolean;
1542
+ primaryColor?: number;
1543
+ secondaryColor?: number;
1544
+ tertiaryColor?: number;
1545
+ backgroundColor?: number;
1546
+ }
1547
+
1548
+ /**
1549
+ * Auto-generated REST API client for Season management endpoints.
1550
+ * Do not edit manually. Changes will be lost.
1551
+ *
1552
+ * @generated 2026-03-04
1553
+ */
1554
+
1555
+ declare class SeasonApi {
1556
+ private readonly client;
1557
+ constructor(client: ApiClient);
1558
+ /** `GET season/current` */
1559
+ getCurrentSeason(): Promise<seasonData>;
1560
+ /** `GET season/current/match` */
1561
+ getCurrentSeasonScheduledMatch(): Promise<matchWithGamesAndTeams>;
1562
+ /** `GET season/current/id` */
1563
+ getCurrentSeasonId(): Promise<number>;
1564
+ /** `POST season/current` */
1565
+ setCurrentSeason(newCurrentSeasonId: number): Promise<void>;
1566
+ /** `GET season/current/teams` */
1567
+ getCurrentSeasonTeams(): Promise<teamData[]>;
1568
+ /** `GET season/current/teamswithmembers` */
1569
+ getCurrentSeasonTeamsWithMembers(): Promise<teamWithMembers[]>;
1570
+ /** `GET season/current/icon` */
1571
+ getCurrentSeasonIcon(): Promise<string>;
1572
+ /** `PUT season/current/icon` */
1573
+ setCurrentSeasonIcon(): Promise<string>;
1574
+ /** `GET season` */
1575
+ getAllSeasons(): Promise<seasonData[]>;
1576
+ /** `GET season/{seasonId}` */
1577
+ getSeasonById(seasonId: number): Promise<seasonData>;
1578
+ /** `GET season/{seasonId}/matches` */
1579
+ getMatchesInSeason(seasonId: number): Promise<matchWithGamesAndTeams[]>;
1580
+ /** `GET season/{seasonId}/matches/count` */
1581
+ getMatchesInSeasonCount(seasonId: number): Promise<number>;
1582
+ /** `GET season/{seasonId}/matches/day/{day}` */
1583
+ getMatchesInSeasonOnDay(seasonId: number, day: string): Promise<matchWithGamesAndTeams[]>;
1584
+ /** `GET season/{seasonId}/teams` */
1585
+ getTeamsInSeason(seasonId: number): Promise<teamData[]>;
1586
+ /** `GET season/{seasonId}/teamswithmembers` */
1587
+ getTeamsWithMembersInSeason(seasonId: number): Promise<teamWithMembers[]>;
1588
+ /** `POST season` */
1589
+ createOrUpdateSeason(seasonData: seasonData): Promise<number>;
1590
+ /** `GET season/{seasonId}/icon` */
1591
+ getSeasonIcon(seasonId: number): Promise<string>;
1592
+ /** `PUT season/{seasonId}/icon` */
1593
+ setSeasonIcon(seasonId: number): Promise<string>;
1594
+ /** `DELETE season/{seasonId}` */
1595
+ deleteSeason(seasonId: number): Promise<void>;
1596
+ }
1597
+
1598
+ /**
1599
+ * Auto-generated REST API client for In-game overlay and serialization endpoints.
1600
+ * Do not edit manually. Changes will be lost.
1601
+ *
1602
+ * @generated 2026-03-04
1603
+ */
1604
+
1605
+ declare class IngameApi {
1606
+ private readonly client;
1607
+ constructor(client: ApiClient);
1608
+ /** `GET ingame/status` */
1609
+ getGameState(): Promise<number>;
1610
+ /** `POST ingame/enable` */
1611
+ enableComponent(): Promise<void>;
1612
+ /** `POST ingame/disable` */
1613
+ disableComponent(): Promise<void>;
1614
+ /** `POST ingame/mock/{doMocking}` */
1615
+ mockIngame(doMocking: boolean): Promise<void>;
1616
+ /** `GET ingame/mock` */
1617
+ getMockingStatus(): Promise<boolean>;
1618
+ /** `GET ingame/frontend` */
1619
+ getFrontendUrl(): Promise<string>;
1620
+ /** `GET ingame/showing` */
1621
+ getCurrentCommonSerializationOptions(): Promise<Record<string, unknown>>;
1622
+ /** `POST ingame/showing` */
1623
+ setCurrentCommonSerializationOptions(data: Record<string, unknown>): Promise<void>;
1624
+ /** `GET ingame/showing/{socketid}` */
1625
+ getCurrentFrontendSerializationOptions(socketid: string): Promise<Record<string, unknown>>;
1626
+ /** `POST ingame/showing/{socketid}` */
1627
+ setCurrentFrontendSerializationOptions(socketid: string, data: Record<string, unknown>): Promise<void>;
1628
+ /** `GET ingame/stage/{stageSide}/{playerSlot}/networkId` */
1629
+ getPlayerPUUIDInSlot(stageSide: number, playerSlot: number): Promise<number>;
1630
+ /** `GET ingame/stage/{stageSide}/ingameteamid` */
1631
+ getIngameTeamOnStageSide(stageSide: number): Promise<number>;
1632
+ /** `GET ingame/state/activeOverlays` */
1633
+ getActiveOverlays(): Promise<unknown>;
1634
+ }
1635
+
1636
+ /**
1637
+ * Composite REST API client that aggregates all generated API modules.
1638
+ *
1639
+ * Access individual API groups via the named properties:
1640
+ *
1641
+ * ```ts
1642
+ * const client = new LeagueBroadcastClient({ host: "localhost" });
1643
+ *
1644
+ * // Games
1645
+ * const game = await client.api.game.getCurrent();
1646
+ *
1647
+ * // Matches
1648
+ * const match = await client.api.match.getCurrent();
1649
+ * await client.api.match.setCurrentBestOf(BestOfType.BestOf3);
1650
+ *
1651
+ * // Seasons
1652
+ * const seasons = await client.api.season.getAll();
1653
+ *
1654
+ * // In-game overlay control
1655
+ * await client.api.ingame.enable();
1656
+ * const overlays = await client.api.ingame.getActiveOverlays();
1657
+ *
1658
+ * // Live game state (requires active game)
1659
+ * const time = await client.api.gameState.getGameTime();
1660
+ * const players = await client.api.gameState.getAllParticipants();
1661
+ *
1662
+ * // Pre-game / champion select
1663
+ * const frontendUrl = await client.api.preGame.getFrontendUrl();
1664
+ * ```
1665
+ */
1666
+
1667
+ declare class RestApi {
1668
+ private readonly client;
1669
+ /** In-game overlay and serialization endpoints. */
1670
+ readonly ingame: IngameApi;
1671
+ /** Game CRUD, picks/bans, and winner endpoints. */
1672
+ readonly game: GameApi;
1673
+ /** Match (series) management — current match, teams, fearless bans, etc. */
1674
+ readonly match: MatchApi;
1675
+ /** Season management — CRUD, teams, icons, match listings. */
1676
+ readonly season: SeasonApi;
1677
+ /** Champion select (pre-game) mocking, bans, frontend routing. */
1678
+ readonly preGame: PreGameApi;
1679
+ /** Live game state — participants, dragons, ordering. Requires active game. */
1680
+ readonly gameState: GameStateApi;
1681
+ constructor(baseUrl: string);
1682
+ /**
1683
+ * Update the base URL for all API modules (e.g. after changing host/port).
1684
+ */
1685
+ updateBaseUrl(baseUrl: string): void;
1686
+ /**
1687
+ * Get direct access to the underlying HTTP client for custom requests.
1688
+ */
1689
+ getHttpClient(): ApiClient;
1690
+ }
1691
+
846
1692
  interface LeagueBroadcastClientConfig {
847
1693
  host: string;
848
1694
  port?: number;
849
- wsRoute?: string;
1695
+ /** In-game WebSocket route. @default "/ws/in" */
1696
+ ingameWsRoute?: string;
1697
+ /** Pre-game (champion select) WebSocket route. @default "/ws/pre" */
1698
+ preGameWsRoute?: string;
850
1699
  apiRoute?: string;
851
1700
  cacheRoute?: string;
852
1701
  useHttps?: boolean;
853
1702
  autoConnect?: boolean;
854
1703
  }
855
- interface GameDataEventHandlers {
1704
+ interface IngameEventHandlers {
856
1705
  onPlayerEvent?: (event: playerUpdateEvent) => void;
857
1706
  onTeamEvent?: (event: teamUpdateResults) => void;
858
1707
  onObjectiveEvent?: (event: ingameObjectiveEvent) => void;
@@ -860,123 +1709,187 @@ interface GameDataEventHandlers {
860
1709
  onAnnouncementEvent?: (event: announcerEvent) => void;
861
1710
  onKillFeedEvent?: (event: killFeedEvent) => void;
862
1711
  }
1712
+ interface ChampSelectEventHandlers {
1713
+ /** Fired for every pick/ban action (hover, lock, ban reveal, phase transition). */
1714
+ onAction?: (action: pickBanActionEventArgs) => void;
1715
+ /** Fired when champ select becomes active (first state update with `isActive === true`). */
1716
+ onChampSelectStart?: () => void;
1717
+ /** Fired when champ select ends (backend sends `isActive === false`). */
1718
+ onChampSelectEnd?: () => void;
1719
+ /** Fired when the frontend route changes (e.g. navigating between pre-game views). */
1720
+ onRouteUpdate?: (uri: string) => void;
1721
+ }
863
1722
  /**
864
- * Main client for connecting to League Broadcast backend and receiving game data
1723
+ * Main client for connecting to the League Broadcast backend.
1724
+ *
1725
+ * Internally manages **two** WebSocket connections:
1726
+ * - `/ws/in` — real-time in-game data
1727
+ * - `/ws/pre` — champion-select (pre-game) data
1728
+ *
1729
+ * Both connections are opened on {@link connect} (or automatically if
1730
+ * `autoConnect` is `true`) and share the same host / port.
1731
+ *
1732
+ * @example
1733
+ * ```ts
1734
+ * const client = new LeagueBroadcastClient({ host: "localhost" });
1735
+ *
1736
+ * // In-game
1737
+ * client.onIngameStateUpdate(data => console.log("Game time:", data.gameTime));
1738
+ * client.watchIngame(s => s.gameData.scoreboard?.teams[0]?.kills, kills => { });
1739
+ *
1740
+ * // Pre-game
1741
+ * client.onChampSelectUpdate(data => console.log("Phase:", data.timer.phaseName));
1742
+ * client.onChampSelectEvents({ onAction: a => console.log(a) });
1743
+ * client.selectChampSelect(s => s.champSelectData.timer);
1744
+ * ```
865
1745
  */
866
1746
  declare class LeagueBroadcastClient {
867
- private ws;
1747
+ private ingameWs;
1748
+ private preGameWs;
868
1749
  private config;
869
1750
  private gameData;
870
1751
  private gameState;
871
- private isTestingEnvironment;
872
- /** Reactive store — subscribe to fine-grained state slices. */
873
- readonly store: GameStateStore;
1752
+ private _isTestingEnvironment;
1753
+ private champSelectData;
1754
+ private champSelectWasActive;
1755
+ /** Reactive store for **in-game** state. */
1756
+ readonly ingameStore: GameStateStore;
1757
+ /** Reactive store for **pre-game** (champion select) state. */
1758
+ readonly preGameStore: ChampSelectStateStore;
1759
+ /**
1760
+ * Typed REST API client for all backend HTTP endpoints.
1761
+ *
1762
+ * Provides access to game, match, season, in-game, pre-game, and
1763
+ * game-state API groups:
1764
+ *
1765
+ * ```ts
1766
+ * const game = await client.api.game.getCurrent();
1767
+ * const match = await client.api.match.getCurrent();
1768
+ * await client.api.ingame.enable();
1769
+ * ```
1770
+ */
1771
+ readonly api: RestApi;
874
1772
  private stateUpdateHandlers;
875
1773
  private gameStatusHandlers;
876
- private eventHandlers;
1774
+ private ingameEventHandlers;
1775
+ private champSelectUpdateHandlers;
1776
+ private champSelectEventHandlers;
877
1777
  constructor(config: LeagueBroadcastClientConfig);
878
1778
  /**
879
- * Connect to the League Broadcast backend
1779
+ * Connect to both in-game and pre-game WebSocket endpoints.
1780
+ *
1781
+ * Both connections are attempted in parallel. If either fails the returned
1782
+ * promise rejects, but the other connection may still succeed.
880
1783
  */
881
1784
  connect(): Promise<void>;
882
1785
  /**
883
- * Disconnect from the League Broadcast backend
1786
+ * Disconnect from both WebSocket endpoints.
884
1787
  */
885
1788
  disconnect(): void;
886
1789
  /**
887
- * Check if connected to the backend
888
- */
889
- isConnected(): boolean;
890
- /**
891
- * Get the current game data
892
- */
893
- getGameData(): ingameFrontendData;
894
- /**
895
- * Get the current game state
1790
+ * Whether the in-game WebSocket is connected.
896
1791
  */
897
- getGameState(): GameState$1;
1792
+ isIngameConnected(): boolean;
898
1793
  /**
899
- * Check if in testing environment
1794
+ * Whether the pre-game WebSocket is connected.
900
1795
  */
1796
+ isPreGameConnected(): boolean;
1797
+ /** Get the current in-game data. */
1798
+ getIngameData(): ingameFrontendData;
1799
+ /** Get the current game state. */
1800
+ getIngameState(): GameState$1;
1801
+ /** Whether the backend is in a testing / replay environment. */
901
1802
  isInTestingEnvironment(): boolean;
1803
+ /** Get the current champion-select state. */
1804
+ getChampSelectData(): champSelectStateData;
1805
+ /** Whether champion select is currently active. */
1806
+ isChampSelectActive(): boolean;
1807
+ /** Register a handler for in-game state updates. */
1808
+ onIngameStateUpdate(handler: (state: ingameFrontendData) => void): () => void;
1809
+ /** Register a handler for in-game status changes (running, paused, out of game). */
1810
+ onIngameStatusChange(handler: (status: GameState$1, isTestingEnv: boolean) => void): () => void;
1811
+ /** Register handlers for in-game events (kills, objectives, etc.). */
1812
+ onIngameEvents(handlers: IngameEventHandlers): void;
1813
+ /** Register a handler for champ-select state updates. */
1814
+ onChampSelectUpdate(handler: (state: champSelectStateData) => void): () => void;
1815
+ /** Register handlers for champ-select lifecycle and action events. */
1816
+ onChampSelectEvents(handlers: ChampSelectEventHandlers): void;
1817
+ /** Register a handler for in-game connection. */
1818
+ onIngameConnect(handler: () => void): () => void;
1819
+ /** Register a handler for in-game disconnection. */
1820
+ onIngameDisconnect(handler: () => void): () => void;
1821
+ /** Register a handler for in-game connection errors. */
1822
+ onIngameError(handler: (error: Event) => void): () => void;
1823
+ /** Register a handler for pre-game connection. */
1824
+ onPreGameConnect(handler: () => void): () => void;
1825
+ /** Register a handler for pre-game disconnection. */
1826
+ onPreGameDisconnect(handler: () => void): () => void;
1827
+ /** Register a handler for pre-game connection errors. */
1828
+ onPreGameError(handler: (error: Event) => void): () => void;
902
1829
  /**
903
- * Register a handler for state updates
904
- */
905
- onStateUpdate(handler: (state: ingameFrontendData) => void): () => void;
906
- /**
907
- * Register a handler for game status changes
908
- */
909
- onGameStatusChange(handler: (status: GameState$1, isTestingEnv: boolean) => void): () => void;
910
- /**
911
- * Register handlers for game events
912
- */
913
- onGameEvents(handlers: GameDataEventHandlers): void;
914
- /**
915
- * Register a handler for connection events
916
- */
917
- onConnect(handler: () => void): () => void;
918
- /**
919
- * Register a handler for disconnection events
920
- */
921
- onDisconnect(handler: () => void): () => void;
922
- /**
923
- * Register a handler for error events
924
- */
925
- onError(handler: (error: Event) => void): () => void;
926
- /**
927
- * Create a subscribable slice of game state.
1830
+ * Create a subscribable slice of **in-game** state.
928
1831
  * The slice only notifies listeners when the selected value actually changes.
929
1832
  *
930
1833
  * Works directly with React 18+ `useSyncExternalStore`:
931
1834
  * ```tsx
932
- * const kills = client.select(s => s.gameData.scoreboard?.teams[0]?.kills);
1835
+ * const kills = client.selectIngame(s => s.gameData.scoreboard?.teams[0]?.kills);
933
1836
  * function Kills() {
934
1837
  * const value = useSyncExternalStore(kills.subscribe, kills.getSnapshot);
935
1838
  * return <span>{value}</span>;
936
1839
  * }
937
1840
  * ```
938
1841
  */
939
- select<S>(selector: (snapshot: GameStateSnapshot) => S, equalityFn?: EqualityFn<S>): Subscribable<S>;
1842
+ selectIngame<S>(selector: (snapshot: GameStateSnapshot) => S, equalityFn?: EqualityFn<S>): Subscribable<S>;
940
1843
  /**
941
- * Watch a derived value and invoke `callback` whenever it changes.
1844
+ * Watch a derived **in-game** value and invoke `callback` whenever it changes.
942
1845
  * Returns an unsubscribe function.
943
1846
  *
944
1847
  * ```ts
945
- * client.watch(
1848
+ * client.watchIngame(
946
1849
  * s => s.gameData.scoreboard?.teams[0]?.kills,
947
1850
  * (kills, prev) => console.log(`Kills: ${prev} → ${kills}`),
948
1851
  * );
949
1852
  * ```
950
1853
  */
951
- watch<S>(selector: (snapshot: GameStateSnapshot) => S, callback: (value: S, prev: S) => void, equalityFn?: EqualityFn<S>): () => void;
1854
+ watchIngame<S>(selector: (snapshot: GameStateSnapshot) => S, callback: (value: S, prev: S) => void, equalityFn?: EqualityFn<S>): () => void;
952
1855
  /**
953
- * Get the base HTTP URL for API requests
1856
+ * Create a subscribable slice of **pre-game** (champion select) state.
1857
+ *
1858
+ * ```tsx
1859
+ * const timer = client.selectChampSelect(s => s.champSelectData.timer);
1860
+ * function DraftTimer() {
1861
+ * const value = useSyncExternalStore(timer.subscribe, timer.getSnapshot);
1862
+ * return <span>{value?.timeRemaining}</span>;
1863
+ * }
1864
+ * ```
954
1865
  */
955
- getApiUrl(): string;
1866
+ selectChampSelect<S>(selector: (snapshot: ChampSelectSnapshot) => S, equalityFn?: EqualityFn<S>): Subscribable<S>;
956
1867
  /**
957
- * Get the base URL for cache requests
1868
+ * Watch a derived **pre-game** value and invoke `callback` whenever it
1869
+ * changes. Returns an unsubscribe function.
1870
+ *
1871
+ * ```ts
1872
+ * client.watchChampSelect(
1873
+ * s => s.champSelectData.timer.timeRemaining,
1874
+ * (remaining, prev) => console.log(`Time: ${prev} → ${remaining}`),
1875
+ * );
1876
+ * ```
958
1877
  */
1878
+ watchChampSelect<S>(selector: (snapshot: ChampSelectSnapshot) => S, callback: (value: S, prev: S) => void, equalityFn?: EqualityFn<S>): () => void;
1879
+ /** Get the base HTTP URL for API requests. */
1880
+ getApiUrl(): string;
1881
+ /** Get the base URL for cache requests (optionally resolve a path). */
959
1882
  getCacheUrl(path?: string): string;
960
- /**
961
- * Setup message handler for WebSocket messages
962
- */
963
- private setupMessageHandler;
964
- /**
965
- * Handle state update from backend
966
- */
1883
+ private setupIngameMessageHandler;
967
1884
  private handleStateUpdate;
968
- /**
969
- * Handle game status update
970
- */
971
1885
  private handleGameStatusUpdate;
972
- /**
973
- * Handle game events
974
- */
975
1886
  private handleGameEvents;
976
- /**
977
- * End the game and reset state
978
- */
979
1887
  private endGame;
1888
+ private setupPreGameMessageHandler;
1889
+ private handleChampSelectStateUpdate;
1890
+ private handleChampSelectAction;
1891
+ private handleRouteUpdate;
1892
+ private endChampSelect;
980
1893
  }
981
1894
 
982
1895
  /**
@@ -1044,9 +1957,134 @@ declare class transitionEvents {
1044
1957
  player?: playerUpdateEvent[];
1045
1958
  team?: teamUpdateResults[];
1046
1959
  objective?: ingameObjectiveEvent[];
1047
- firstTower?: Team;
1960
+ firstTower?: number;
1048
1961
  announcements?: announcerEvent[];
1049
1962
  killFeed?: killFeedEvent[];
1050
1963
  }
1051
1964
 
1052
- export { type EqualityFn, type GameDataEventHandlers, GameState$1 as GameState, type GameStateSnapshot, GameStateStore, LeagueBroadcastClient, type LeagueBroadcastClientConfig, type Subscribable, WebSocketManager, announcerEvent, ingameFrontendData, ingameObjectiveEvent, killFeedEvent, playerUpdateEvent, shallowEqual, teamUpdateResults, transitionEvents };
1965
+ /**
1966
+ * This is an auto-generated file.
1967
+ * Any changes made to this file can be lost when this file is regenerated.
1968
+ */
1969
+
1970
+ declare class championSelectTeam {
1971
+ metaData?: teamWithMembers$1;
1972
+ bans: banSlot$1[];
1973
+ slots: pickSlot$1[];
1974
+ timeline: timelineEntry$1[];
1975
+ index: number;
1976
+ scoreMatch: teamScore;
1977
+ scoreSeason: teamScore;
1978
+ fearlessBans?: {
1979
+ [key: number]: simpleChampionData$1[];
1980
+ };
1981
+ }
1982
+
1983
+ /**
1984
+ * This is an auto-generated file.
1985
+ * Any changes made to this file can be lost when this file is regenerated.
1986
+ */
1987
+
1988
+ declare class pickBanTimer {
1989
+ phaseName: PickBanPhase$1;
1990
+ phaseDuration: number;
1991
+ timeRemaining: number;
1992
+ }
1993
+
1994
+ /**
1995
+ * This is an auto-generated file.
1996
+ * Any changes made to this file can be lost when this file is regenerated.
1997
+ */
1998
+ declare enum PickBanPhase {
1999
+ BEGIN = 0,
2000
+ BAN1 = 1,
2001
+ BAN2 = 2,
2002
+ PICK1 = 3,
2003
+ PICK2 = 4,
2004
+ END = 5,
2005
+ WAIT = 6
2006
+ }
2007
+
2008
+ /**
2009
+ * This is an auto-generated file.
2010
+ * Any changes made to this file can be lost when this file is regenerated.
2011
+ */
2012
+
2013
+ declare class banSlot {
2014
+ isActive: boolean;
2015
+ champion?: championData;
2016
+ }
2017
+
2018
+ /**
2019
+ * This is an auto-generated file.
2020
+ * Any changes made to this file can be lost when this file is regenerated.
2021
+ */
2022
+
2023
+ declare class pickSlot {
2024
+ id: number;
2025
+ isActive: boolean;
2026
+ player: string;
2027
+ summonerSpells: summonerSpellData[];
2028
+ champion?: championData;
2029
+ championStatistics?: championStatistics;
2030
+ }
2031
+
2032
+ /**
2033
+ * This is an auto-generated file.
2034
+ * Any changes made to this file can be lost when this file is regenerated.
2035
+ */
2036
+
2037
+ declare class champSelectStateMetaData {
2038
+ bestOfType: BestOfType$1;
2039
+ patch: string;
2040
+ performanceData: champSelectStatePerformanceData;
2041
+ matchData?: matchData$1;
2042
+ }
2043
+
2044
+ /**
2045
+ * This is an auto-generated file.
2046
+ * Any changes made to this file can be lost when this file is regenerated.
2047
+ */
2048
+ declare enum ActionType {
2049
+ TEN_BANS_REVEAL = 0,
2050
+ PHASE_TRANSITION = 1,
2051
+ PICK = 2,
2052
+ BAN = 3
2053
+ }
2054
+
2055
+ /**
2056
+ * This is an auto-generated file.
2057
+ * Any changes made to this file can be lost when this file is regenerated.
2058
+ */
2059
+ declare enum ActionSubType {
2060
+ START = 0,
2061
+ HOVER = 1,
2062
+ LOCK = 2
2063
+ }
2064
+
2065
+ /**
2066
+ * This is an auto-generated file.
2067
+ * Any changes made to this file can be lost when this file is regenerated.
2068
+ */
2069
+
2070
+ declare class timelineEntry {
2071
+ type: TimeLineActionType$1;
2072
+ champion: championData;
2073
+ timer: pickBanTimer$1;
2074
+ }
2075
+
2076
+ /**
2077
+ * This is an auto-generated file.
2078
+ * Any changes made to this file can be lost when this file is regenerated.
2079
+ */
2080
+ declare enum TimeLineActionType {
2081
+ HoverPick = 0,
2082
+ Pick = 1,
2083
+ Ban = 2
2084
+ }
2085
+
2086
+ declare function getSortedInventory(playerData: ingameScoreboardBottomPlayerData): (itemWithAsset | undefined)[];
2087
+ declare function getTrinket(playerData: ingameScoreboardBottomPlayerData): itemWithAsset | undefined;
2088
+ declare function getRoleQuest(playerData: ingameScoreboardBottomPlayerData): itemWithAsset | undefined;
2089
+
2090
+ export { ActionSubType, ActionType, ApiClient, ApiError, BestOfType, type ChampSelectEventHandlers, type ChampSelectSnapshot, ChampSelectStateStore, type EqualityFn, GameApi, GameState$1 as GameState, GameStateApi, type GameStateSnapshot, GameStateStore, IngameApi, type IngameEventHandlers, LeagueBroadcastClient, type LeagueBroadcastClientConfig, MatchApi, MatchRuleSet, PickBanPhase, PreGameApi, RestApi, SeasonApi, type Subscribable, TimeLineActionType, WebSocketManager, announcerEvent, banSlot, champSelectStateData, champSelectStateMetaData, championSelectTeam, gameWithTeams$1 as gameWithTeams, getRoleQuest, getSortedInventory, getTrinket, ingameFrontendData, ingameObjectiveEvent, killFeedEvent, matchData, matchWithGamesAndTeams, pickBanActionEventArgs, pickBanTimer, pickSlot, playerUpdateEvent, seasonData, shallowEqual, simpleChampionData, tabPlayer, teamData, teamUpdateResults, teamWithMembers, timelineEntry, transitionEvents };