@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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/WebSocketManager.ts","../src/reactivity/GameStateStore.ts","../src/reactivity/structuralShare.ts","../types/shared/gamestate.ts","../types/ingame/ingamefrontenddata.ts","../src/LeagueBroadcastClient.ts"],"names":["changed","GameState"],"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","/**\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 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","import { WebSocketManager } from \"./WebSocketManager\";\r\nimport { GameStateStore } from \"./reactivity/GameStateStore\";\r\nimport { structuralShare } from \"./reactivity/structuralShare\";\r\nimport type { Subscribable } from \"./reactivity/GameStateStore\";\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\n\r\nexport interface LeagueBroadcastClientConfig {\r\n host: string;\r\n port?: number;\r\n wsRoute?: string;\r\n apiRoute?: string;\r\n cacheRoute?: string;\r\n useHttps?: boolean;\r\n autoConnect?: boolean;\r\n}\r\n\r\nexport interface GameDataEventHandlers {\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\n/**\r\n * Main client for connecting to League Broadcast backend and receiving game data\r\n */\r\nexport class LeagueBroadcastClient {\r\n private ws: WebSocketManager;\r\n private config: Required<LeagueBroadcastClientConfig>;\r\n private gameData: ingameFrontendData;\r\n private gameState: GameState = GameState.OutOfGame;\r\n private isTestingEnvironment: boolean = false;\r\n\r\n /** Reactive store — subscribe to fine-grained state slices. */\r\n public readonly store: GameStateStore;\r\n\r\n // 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 eventHandlers: GameDataEventHandlers = {};\r\n\r\n constructor(config: LeagueBroadcastClientConfig) {\r\n this.config = {\r\n host: config.host,\r\n port: config.port ?? 58869,\r\n wsRoute: config.wsRoute ?? \"/ws/in\",\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 this.ws = new WebSocketManager();\r\n this.gameData = new ingameFrontendData();\r\n this.store = new GameStateStore(this.gameData, this.gameState);\r\n this.setupMessageHandler();\r\n\r\n if (this.config.autoConnect) {\r\n this.connect();\r\n }\r\n }\r\n\r\n /**\r\n * Connect to the League Broadcast backend\r\n */\r\n async connect(): Promise<void> {\r\n const protocol = this.config.useHttps ? \"wss\" : \"ws\";\r\n const url = `${protocol}://${this.config.host}:${this.config.port}${this.config.wsRoute}`;\r\n\r\n try {\r\n await this.ws.connect(url);\r\n } catch (error) {\r\n console.error(\"[LeagueBroadcastClient] Connection failed:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Disconnect from the League Broadcast backend\r\n */\r\n disconnect(): void {\r\n this.ws.disconnect();\r\n }\r\n\r\n /**\r\n * Check if connected to the backend\r\n */\r\n isConnected(): boolean {\r\n return this.ws.isConnected();\r\n }\r\n\r\n /**\r\n * Get the current game data\r\n */\r\n getGameData(): ingameFrontendData {\r\n return this.gameData;\r\n }\r\n\r\n /**\r\n * Get the current game state\r\n */\r\n getGameState(): GameState {\r\n return this.gameState;\r\n }\r\n\r\n /**\r\n * Check if in testing environment\r\n */\r\n isInTestingEnvironment(): boolean {\r\n return this.isTestingEnvironment;\r\n }\r\n\r\n /**\r\n * Register a handler for state updates\r\n */\r\n onStateUpdate(handler: (state: ingameFrontendData) => void): () => void {\r\n this.stateUpdateHandlers.add(handler);\r\n return () => this.stateUpdateHandlers.delete(handler);\r\n }\r\n\r\n /**\r\n * Register a handler for game status changes\r\n */\r\n onGameStatusChange(\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 /**\r\n * Register handlers for game events\r\n */\r\n onGameEvents(handlers: GameDataEventHandlers): void {\r\n this.eventHandlers = { ...this.eventHandlers, ...handlers };\r\n }\r\n\r\n /**\r\n * Register a handler for connection events\r\n */\r\n onConnect(handler: () => void): () => void {\r\n return this.ws.onConnect(handler);\r\n }\r\n\r\n /**\r\n * Register a handler for disconnection events\r\n */\r\n onDisconnect(handler: () => void): () => void {\r\n return this.ws.onDisconnect(handler);\r\n }\r\n\r\n /**\r\n * Register a handler for error events\r\n */\r\n onError(handler: (error: Event) => void): () => void {\r\n return this.ws.onError(handler);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Reactive API — convenience wrappers around this.store\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Create a subscribable slice of 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.select(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 select<S>(\r\n selector: (\r\n snapshot: import(\"./reactivity/GameStateStore\").GameStateSnapshot,\r\n ) => S,\r\n equalityFn?: import(\"./reactivity/GameStateStore\").EqualityFn<S>,\r\n ): Subscribable<S> {\r\n return this.store.select(selector, equalityFn);\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 * ```ts\r\n * client.watch(\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 watch<S>(\r\n selector: (\r\n snapshot: import(\"./reactivity/GameStateStore\").GameStateSnapshot,\r\n ) => S,\r\n callback: (value: S, prev: S) => void,\r\n equalityFn?: import(\"./reactivity/GameStateStore\").EqualityFn<S>,\r\n ): () => void {\r\n return this.store.watch(selector, callback, equalityFn);\r\n }\r\n\r\n /**\r\n * Get the base HTTP URL for API requests\r\n */\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 /**\r\n * Get the base URL for cache requests\r\n */\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 * Setup message handler for WebSocket messages\r\n */\r\n private setupMessageHandler(): void {\r\n this.ws.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 /**\r\n * Handle state update from backend\r\n */\r\n private handleStateUpdate(state: any, events?: transitionEvents): void {\r\n // Replace game data entirely — the backend sends the full state each time.\r\n // Null fields mean \"not available / don't show\", so we must not carry over\r\n // stale values from the previous state via Object.assign / merge.\r\n //\r\n // Structural sharing keeps nested references stable when values are\r\n // unchanged, so selectors only re-fire when their content changes.\r\n const nextData = Object.assign(new ingameFrontendData(), state);\r\n this.gameData = structuralShare(this.gameData, nextData);\r\n\r\n // Check if game ended\r\n if (!state.gameTime || state.gameTime === 0) {\r\n this.handleGameStatusUpdate(GameState.OutOfGame, false);\r\n }\r\n\r\n // Update reactive store with the new object (fresh reference so selectors\r\n // that compare by identity will correctly detect changes)\r\n this.store._setGameData(this.gameData);\r\n\r\n // Notify state update handlers\r\n this.stateUpdateHandlers.forEach((handler) => handler(this.gameData));\r\n\r\n // Handle game events\r\n this.handleGameEvents(events);\r\n }\r\n\r\n /**\r\n * Handle game status update\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.store._setGameState(gameStatus);\r\n this.gameStatusHandlers.forEach((handler) =>\r\n handler(gameStatus, isTestingEnvironment),\r\n );\r\n }\r\n\r\n /**\r\n * Handle game events\r\n */\r\n private handleGameEvents(events?: transitionEvents): void {\r\n if (!events) {\r\n return;\r\n }\r\n\r\n if (events.player && this.eventHandlers.onPlayerEvent) {\r\n events.player.forEach((event) =>\r\n this.eventHandlers.onPlayerEvent!(event),\r\n );\r\n }\r\n\r\n if (events.team && this.eventHandlers.onTeamEvent) {\r\n events.team.forEach((event) => this.eventHandlers.onTeamEvent!(event));\r\n }\r\n\r\n if (events.objective && this.eventHandlers.onObjectiveEvent) {\r\n events.objective.forEach((event) =>\r\n this.eventHandlers.onObjectiveEvent!(event),\r\n );\r\n }\r\n\r\n if (\r\n events.firstTower !== undefined &&\r\n this.eventHandlers.onFirstTowerEvent\r\n ) {\r\n this.eventHandlers.onFirstTowerEvent(events.firstTower);\r\n }\r\n\r\n if (events.announcements && this.eventHandlers.onAnnouncementEvent) {\r\n events.announcements.forEach((event) =>\r\n this.eventHandlers.onAnnouncementEvent!(event),\r\n );\r\n }\r\n\r\n if (events.killFeed && this.eventHandlers.onKillFeedEvent) {\r\n events.killFeed.forEach((event) =>\r\n this.eventHandlers.onKillFeedEvent!(event),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * End the game and reset state\r\n */\r\n private endGame(): void {\r\n console.log(\"[LeagueBroadcastClient] Game ended, resetting data\");\r\n\r\n // Reset game data\r\n this.gameData = new ingameFrontendData();\r\n this.gameState = GameState.OutOfGame;\r\n this.isTestingEnvironment = false;\r\n\r\n // Reset reactive store\r\n this.store._reset(this.gameData, GameState.OutOfGame);\r\n\r\n // Notify handlers\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"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bluebottle_gg/league-broadcast-client",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "TypeScript client library for League Broadcast game data",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,8 +22,10 @@
22
22
  "build": "tsup",
23
23
  "dev": "tsup --watch",
24
24
  "clean": "rimraf dist",
25
- "prepublishOnly": "npm run build",
26
- "sync-types": "node scripts/sync-types.mjs"
25
+ "test": "tsx test/run.ts",
26
+ "test:rest": "tsx test/run.ts --skip-ws",
27
+ "test:ws": "tsx test/run.ts --skip-rest",
28
+ "prepublishOnly": "npm run build"
27
29
  },
28
30
  "keywords": [
29
31
  "league-of-legends",
@@ -37,7 +39,7 @@
37
39
  "license": "GPL-3.0-only",
38
40
  "repository": {
39
41
  "type": "git",
40
- "url": "https://github.com/BlueBottleGG/leaguebroadcast-js-client"
42
+ "url": "git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git"
41
43
  },
42
44
  "bugs": {
43
45
  "url": "https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"
@@ -47,7 +49,7 @@
47
49
  "@types/node": "^22.10.5",
48
50
  "rimraf": "^6.0.1",
49
51
  "tsup": "^8.3.5",
52
+ "tsx": "^4.21.0",
50
53
  "typescript": "^5.7.2"
51
- },
52
- "dependencies": {}
54
+ }
53
55
  }