@bluebottle_gg/league-broadcast-client 0.1.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/LICENSE +674 -0
- package/README.md +530 -0
- package/dist/index.d.ts +1052 -0
- package/dist/index.js +670 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bluebottle_gg/league-broadcast-client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript client library for League Broadcast game data",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"clean": "rimraf dist",
|
|
25
|
+
"prepublishOnly": "npm run build",
|
|
26
|
+
"sync-types": "node scripts/sync-types.mjs"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"league-of-legends",
|
|
30
|
+
"league-broadcast",
|
|
31
|
+
"esports",
|
|
32
|
+
"broadcast",
|
|
33
|
+
"websocket",
|
|
34
|
+
"typescript"
|
|
35
|
+
],
|
|
36
|
+
"author": "BlueBottleGG",
|
|
37
|
+
"license": "GPL-3.0-only",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/BlueBottleGG/leaguebroadcast-js-client"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme",
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^22.10.5",
|
|
48
|
+
"rimraf": "^6.0.1",
|
|
49
|
+
"tsup": "^8.3.5",
|
|
50
|
+
"typescript": "^5.7.2"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {}
|
|
53
|
+
}
|