@smoregg/sdk 1.2.0 → 2.0.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.
Files changed (179) hide show
  1. package/dist/cjs/config.cjs.map +1 -1
  2. package/dist/cjs/controller.cjs +215 -145
  3. package/dist/cjs/controller.cjs.map +1 -1
  4. package/dist/cjs/screen.cjs +220 -178
  5. package/dist/cjs/screen.cjs.map +1 -1
  6. package/dist/cjs/testing.cjs +160 -151
  7. package/dist/cjs/testing.cjs.map +1 -1
  8. package/dist/esm/config.js.map +1 -1
  9. package/dist/esm/controller.js +216 -146
  10. package/dist/esm/controller.js.map +1 -1
  11. package/dist/esm/screen.js +221 -179
  12. package/dist/esm/screen.js.map +1 -1
  13. package/dist/esm/testing.js +160 -151
  14. package/dist/esm/testing.js.map +1 -1
  15. package/dist/types/config.d.ts +1 -2
  16. package/dist/types/config.d.ts.map +1 -1
  17. package/dist/types/controller.d.ts +22 -43
  18. package/dist/types/controller.d.ts.map +1 -1
  19. package/dist/types/index.d.ts +14 -14
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/screen.d.ts +26 -37
  22. package/dist/types/screen.d.ts.map +1 -1
  23. package/dist/types/testing.d.ts +16 -0
  24. package/dist/types/testing.d.ts.map +1 -1
  25. package/dist/types/types.d.ts +244 -338
  26. package/dist/types/types.d.ts.map +1 -1
  27. package/dist/umd/smore-sdk.umd.js +595 -474
  28. package/dist/umd/smore-sdk.umd.js.map +1 -1
  29. package/dist/umd/smore-sdk.umd.min.js +1 -1
  30. package/dist/umd/smore-sdk.umd.min.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/cjs/SmoreHost.cjs +0 -306
  33. package/dist/cjs/SmoreHost.cjs.map +0 -1
  34. package/dist/cjs/SmorePlayer.cjs +0 -229
  35. package/dist/cjs/SmorePlayer.cjs.map +0 -1
  36. package/dist/cjs/components/DirectionPad.cjs +0 -68
  37. package/dist/cjs/components/DirectionPad.cjs.map +0 -1
  38. package/dist/cjs/components/DirectionPad.module.css.cjs +0 -12
  39. package/dist/cjs/components/DirectionPad.module.css.cjs.map +0 -1
  40. package/dist/cjs/components/HoldButton.cjs +0 -57
  41. package/dist/cjs/components/HoldButton.cjs.map +0 -1
  42. package/dist/cjs/components/HoldButton.module.css.cjs +0 -12
  43. package/dist/cjs/components/HoldButton.module.css.cjs.map +0 -1
  44. package/dist/cjs/components/IframeGameBridge.cjs +0 -115
  45. package/dist/cjs/components/IframeGameBridge.cjs.map +0 -1
  46. package/dist/cjs/components/SwipeArea.cjs +0 -58
  47. package/dist/cjs/components/SwipeArea.cjs.map +0 -1
  48. package/dist/cjs/components/SwipeArea.module.css.cjs +0 -12
  49. package/dist/cjs/components/SwipeArea.module.css.cjs.map +0 -1
  50. package/dist/cjs/components/TapButton.cjs +0 -58
  51. package/dist/cjs/components/TapButton.cjs.map +0 -1
  52. package/dist/cjs/components/TapButton.module.css.cjs +0 -12
  53. package/dist/cjs/components/TapButton.module.css.cjs.map +0 -1
  54. package/dist/cjs/context/RoomProvider.cjs +0 -118
  55. package/dist/cjs/context/RoomProvider.cjs.map +0 -1
  56. package/dist/cjs/hooks/useExternalGames.cjs +0 -49
  57. package/dist/cjs/hooks/useExternalGames.cjs.map +0 -1
  58. package/dist/cjs/hooks/useGameHost.cjs +0 -206
  59. package/dist/cjs/hooks/useGameHost.cjs.map +0 -1
  60. package/dist/cjs/hooks/useGamePlayer.cjs +0 -134
  61. package/dist/cjs/hooks/useGamePlayer.cjs.map +0 -1
  62. package/dist/cjs/iframe/index.cjs +0 -260
  63. package/dist/cjs/iframe/index.cjs.map +0 -1
  64. package/dist/cjs/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs +0 -33
  65. package/dist/cjs/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs.map +0 -1
  66. package/dist/cjs/server/index.cjs +0 -45
  67. package/dist/cjs/server/index.cjs.map +0 -1
  68. package/dist/cjs/transport/DirectTransport.cjs +0 -23
  69. package/dist/cjs/transport/DirectTransport.cjs.map +0 -1
  70. package/dist/cjs/utils/connectionMonitor.cjs +0 -77
  71. package/dist/cjs/utils/connectionMonitor.cjs.map +0 -1
  72. package/dist/cjs/utils/preloadAssets.cjs +0 -66
  73. package/dist/cjs/utils/preloadAssets.cjs.map +0 -1
  74. package/dist/cjs/utils/serverTime.cjs +0 -43
  75. package/dist/cjs/utils/serverTime.cjs.map +0 -1
  76. package/dist/esm/SmoreHost.js +0 -304
  77. package/dist/esm/SmoreHost.js.map +0 -1
  78. package/dist/esm/SmorePlayer.js +0 -227
  79. package/dist/esm/SmorePlayer.js.map +0 -1
  80. package/dist/esm/components/DirectionPad.js +0 -66
  81. package/dist/esm/components/DirectionPad.js.map +0 -1
  82. package/dist/esm/components/DirectionPad.module.css.js +0 -8
  83. package/dist/esm/components/DirectionPad.module.css.js.map +0 -1
  84. package/dist/esm/components/HoldButton.js +0 -55
  85. package/dist/esm/components/HoldButton.js.map +0 -1
  86. package/dist/esm/components/HoldButton.module.css.js +0 -8
  87. package/dist/esm/components/HoldButton.module.css.js.map +0 -1
  88. package/dist/esm/components/IframeGameBridge.js +0 -113
  89. package/dist/esm/components/IframeGameBridge.js.map +0 -1
  90. package/dist/esm/components/SwipeArea.js +0 -56
  91. package/dist/esm/components/SwipeArea.js.map +0 -1
  92. package/dist/esm/components/SwipeArea.module.css.js +0 -8
  93. package/dist/esm/components/SwipeArea.module.css.js.map +0 -1
  94. package/dist/esm/components/TapButton.js +0 -56
  95. package/dist/esm/components/TapButton.js.map +0 -1
  96. package/dist/esm/components/TapButton.module.css.js +0 -8
  97. package/dist/esm/components/TapButton.module.css.js.map +0 -1
  98. package/dist/esm/context/RoomProvider.js +0 -109
  99. package/dist/esm/context/RoomProvider.js.map +0 -1
  100. package/dist/esm/hooks/useExternalGames.js +0 -47
  101. package/dist/esm/hooks/useExternalGames.js.map +0 -1
  102. package/dist/esm/hooks/useGameHost.js +0 -204
  103. package/dist/esm/hooks/useGameHost.js.map +0 -1
  104. package/dist/esm/hooks/useGamePlayer.js +0 -132
  105. package/dist/esm/hooks/useGamePlayer.js.map +0 -1
  106. package/dist/esm/iframe/index.js +0 -257
  107. package/dist/esm/iframe/index.js.map +0 -1
  108. package/dist/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +0 -29
  109. package/dist/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +0 -1
  110. package/dist/esm/server/index.js +0 -43
  111. package/dist/esm/server/index.js.map +0 -1
  112. package/dist/esm/transport/DirectTransport.js +0 -21
  113. package/dist/esm/transport/DirectTransport.js.map +0 -1
  114. package/dist/esm/utils/connectionMonitor.js +0 -75
  115. package/dist/esm/utils/connectionMonitor.js.map +0 -1
  116. package/dist/esm/utils/preloadAssets.js +0 -63
  117. package/dist/esm/utils/preloadAssets.js.map +0 -1
  118. package/dist/esm/utils/serverTime.js +0 -41
  119. package/dist/esm/utils/serverTime.js.map +0 -1
  120. package/dist/types/SmoreHost.d.ts +0 -187
  121. package/dist/types/SmoreHost.d.ts.map +0 -1
  122. package/dist/types/SmorePlayer.d.ts +0 -146
  123. package/dist/types/SmorePlayer.d.ts.map +0 -1
  124. package/dist/types/components/DirectionPad.d.ts +0 -21
  125. package/dist/types/components/DirectionPad.d.ts.map +0 -1
  126. package/dist/types/components/HoldButton.d.ts +0 -22
  127. package/dist/types/components/HoldButton.d.ts.map +0 -1
  128. package/dist/types/components/IframeGameBridge.d.ts +0 -38
  129. package/dist/types/components/IframeGameBridge.d.ts.map +0 -1
  130. package/dist/types/components/SwipeArea.d.ts +0 -19
  131. package/dist/types/components/SwipeArea.d.ts.map +0 -1
  132. package/dist/types/components/TapButton.d.ts +0 -19
  133. package/dist/types/components/TapButton.d.ts.map +0 -1
  134. package/dist/types/components/index.d.ts +0 -6
  135. package/dist/types/components/index.d.ts.map +0 -1
  136. package/dist/types/context/RoomProvider.d.ts +0 -69
  137. package/dist/types/context/RoomProvider.d.ts.map +0 -1
  138. package/dist/types/context/index.d.ts +0 -3
  139. package/dist/types/context/index.d.ts.map +0 -1
  140. package/dist/types/dev/DevSimulator.d.ts +0 -31
  141. package/dist/types/dev/DevSimulator.d.ts.map +0 -1
  142. package/dist/types/dev/index.d.ts +0 -2
  143. package/dist/types/dev/index.d.ts.map +0 -1
  144. package/dist/types/hooks/index.d.ts +0 -7
  145. package/dist/types/hooks/index.d.ts.map +0 -1
  146. package/dist/types/hooks/useExternalGames.d.ts +0 -32
  147. package/dist/types/hooks/useExternalGames.d.ts.map +0 -1
  148. package/dist/types/hooks/useGameHost.d.ts +0 -67
  149. package/dist/types/hooks/useGameHost.d.ts.map +0 -1
  150. package/dist/types/hooks/useGamePlayer.d.ts +0 -55
  151. package/dist/types/hooks/useGamePlayer.d.ts.map +0 -1
  152. package/dist/types/iframe/IframeRoomProvider.d.ts +0 -31
  153. package/dist/types/iframe/IframeRoomProvider.d.ts.map +0 -1
  154. package/dist/types/iframe/index.d.ts +0 -18
  155. package/dist/types/iframe/index.d.ts.map +0 -1
  156. package/dist/types/iframe/vanilla-entry.d.ts +0 -7
  157. package/dist/types/iframe/vanilla-entry.d.ts.map +0 -1
  158. package/dist/types/iframe/vanilla.d.ts +0 -49
  159. package/dist/types/iframe/vanilla.d.ts.map +0 -1
  160. package/dist/types/server/createGameRelay.d.ts +0 -26
  161. package/dist/types/server/createGameRelay.d.ts.map +0 -1
  162. package/dist/types/server/index.d.ts +0 -3
  163. package/dist/types/server/index.d.ts.map +0 -1
  164. package/dist/types/utils/connectionMonitor.d.ts +0 -57
  165. package/dist/types/utils/connectionMonitor.d.ts.map +0 -1
  166. package/dist/types/utils/index.d.ts +0 -7
  167. package/dist/types/utils/index.d.ts.map +0 -1
  168. package/dist/types/utils/preloadAssets.d.ts +0 -29
  169. package/dist/types/utils/preloadAssets.d.ts.map +0 -1
  170. package/dist/types/utils/serverTime.d.ts +0 -28
  171. package/dist/types/utils/serverTime.d.ts.map +0 -1
  172. package/dist/umd/smore-sdk-iframe.umd.js +0 -266
  173. package/dist/umd/smore-sdk-iframe.umd.js.map +0 -1
  174. package/dist/umd/smore-sdk-iframe.umd.min.js +0 -2
  175. package/dist/umd/smore-sdk-iframe.umd.min.js.map +0 -1
  176. package/dist/umd/smore-sdk-vanilla.umd.js +0 -1275
  177. package/dist/umd/smore-sdk-vanilla.umd.js.map +0 -1
  178. package/dist/umd/smore-sdk-vanilla.umd.min.js +0 -2
  179. package/dist/umd/smore-sdk-vanilla.umd.min.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"screen.cjs","sources":["../../src/screen.ts"],"sourcesContent":["/**\n * createScreen - Factory function for Screen instances (Host/TV side)\n *\n * Promise-based factory with type-safe event handling and comprehensive error management.\n *\n * @example Promise-based (recommended)\n * ```ts\n * interface MyEvents {\n * tap: { x: number; y: number };\n * 'phase-update': { phase: 'lobby' | 'playing' | 'results' };\n * }\n *\n * const screen = await createScreen<MyEvents>({\n * listeners: {\n * tap: (playerIndex, data) => console.log(`Player ${playerIndex} tapped at`, data.x, data.y),\n * },\n * });\n *\n * screen.broadcast('phase-update', { phase: 'playing' });\n * ```\n *\n * @example Callback-based\n * ```ts\n * const screen = createScreen<MyEvents>({\n * onReady: () => screen.broadcast('ready', {}),\n * listeners: { ... },\n * });\n * // Use screen.instance for immediate access\n * ```\n */\n\nimport type {\n EventMap,\n EventNames,\n EventData,\n Screen,\n ScreenConfig,\n ScreenEventHandler,\n ControllerInfo,\n PlayerIndex,\n RoomCode,\n GameResults,\n} from './types';\nimport type { Transport, TransportEventHandler } from './transport/types';\nimport { PostMessageTransport } from './transport/PostMessageTransport';\nimport { isBridgeMessage, validateInitPayload, type BridgeInitMessage, type BridgeUpdateMessage } from './transport/protocol';\nimport { SmoreSDKError } from './errors';\nimport { SMORE_EVENTS, validateEventName } from './events';\nimport { DebugLogger } from './logger';\nimport { getGlobalConfig } from './config';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst DEFAULT_TIMEOUT = 10000;\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\nfunction validatePlayerIndex(playerIndex: PlayerIndex, controllers: readonly ControllerInfo[]): void {\n if (typeof playerIndex !== 'number' || !Number.isInteger(playerIndex)) {\n throw new SmoreSDKError('INVALID_PLAYER', 'Player index must be an integer');\n }\n if (!controllers.some(c => c.playerIndex === playerIndex)) {\n throw new SmoreSDKError(\n 'INVALID_PLAYER',\n `No controller found with player index ${playerIndex}`,\n { details: { playerIndex } }\n );\n }\n}\n\n// =============================================================================\n// SCREEN IMPLEMENTATION\n// =============================================================================\n\nclass ScreenImpl<TEvents extends EventMap> implements Screen<TEvents> {\n private transport: Transport | null = null;\n private config: ScreenConfig<TEvents>;\n private logger: DebugLogger;\n\n private _controllers: ControllerInfo[] = [];\n private _roomCode: RoomCode = '';\n private _isReady = false;\n private _isDestroyed = false;\n\n private eventHandlers = new Map<string, Set<ScreenEventHandler<unknown>>>();\n private registeredTransportHandlers: Array<{ event: string; handler: TransportEventHandler }> = [];\n private boundMessageHandler: ((e: MessageEvent) => void) | null = null;\n // Maps user-facing handler → transport wrappedHandler for proper cleanup in on()/off()\n private handlerToTransport = new Map<Function, { event: string; transportHandler: TransportEventHandler }>();\n // Tracks event names registered via config.listeners so off(event) without handler won't remove them\n private _configListenerEvents = new Set<string>();\n\n constructor(config: ScreenConfig<TEvents> = {}) {\n this.config = config;\n this.logger = new DebugLogger(config.debug, '[SmoreScreen]');\n\n // Validate event names in initial listeners\n if (config.listeners) {\n for (const event of Object.keys(config.listeners)) {\n validateEventName(event);\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Initialization (called by factory)\n // ---------------------------------------------------------------------------\n\n async initialize(): Promise<void> {\n this.logger.lifecycle('Initializing screen...');\n\n const parentOrigin = this.config.parentOrigin ?? '*';\n const timeout = this.config.timeout ?? DEFAULT_TIMEOUT;\n\n return new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.cleanup();\n const error = new SmoreSDKError(\n 'TIMEOUT',\n `Screen initialization timed out after ${timeout}ms. ` +\n `Make sure the parent frame sends _bridge:init. ` +\n `Check that the iframe has correct sandbox attributes (allow-scripts required) and same-origin/cross-origin settings. ` +\n `Create a new Screen instance to retry (this instance has been cleaned up).`,\n { details: { timeout } }\n );\n this.handleError(error);\n reject(error);\n }, timeout);\n\n this.boundMessageHandler = (e: MessageEvent) => {\n if (parentOrigin !== '*' && e.origin !== parentOrigin) return;\n\n const msg = e.data;\n if (!isBridgeMessage(msg)) return;\n\n if (msg.type === '_bridge:init') {\n clearTimeout(timeoutId);\n const initPayload = (msg as BridgeInitMessage).payload;\n\n // MIN-A1-1: Runtime validation of _bridge:init payload structure\n try {\n validateInitPayload(initPayload);\n } catch (err) {\n const error = new SmoreSDKError(\n 'INIT_FAILED',\n `Invalid _bridge:init payload: ${err instanceof Error ? err.message : String(err)}`,\n { details: { payload: initPayload } }\n );\n this.logger.warn('_bridge:init validation failed', error);\n this.handleError(error);\n reject(error);\n return;\n }\n\n const initData = initPayload;\n\n if (initData.side !== 'host') {\n const error = new SmoreSDKError(\n 'INIT_FAILED',\n `Received init for wrong side: ${initData.side}. Expected \"host\".`,\n { details: { side: initData.side } }\n );\n this.handleError(error);\n reject(error);\n return;\n }\n\n // Initialize transport\n this.transport = new PostMessageTransport(parentOrigin);\n this._roomCode = initData.roomCode;\n this._controllers = this.mapControllersFromInit(initData.players);\n\n // MIN-14: Warn if initialized with zero controllers\n if (this._controllers.length === 0) {\n this.logger.warn('Screen initialized with zero controllers');\n }\n\n this.setupEventHandlers();\n this._isReady = true;\n\n this.logger.lifecycle('Screen ready', {\n roomCode: this._roomCode,\n controllers: this._controllers.length,\n });\n\n this.config.onReady?.();\n\n // Auto-signal ready unless explicitly disabled\n // Check: instance config > global config > default (true)\n const autoReady = this.config.autoReady ?? getGlobalConfig().autoReady ?? true;\n if (autoReady) {\n this.logger.lifecycle('Auto-signaling ready (autoReady enabled)');\n this.signalReady();\n }\n\n resolve();\n } else if (msg.type === '_bridge:update') {\n if (!this._isReady) {\n this.logger.debug('Ignoring _bridge:update before init completes');\n return;\n }\n const updateData = (msg as BridgeUpdateMessage).payload;\n\n if (updateData.players && Array.isArray(updateData.players)) {\n const oldControllers = this._controllers;\n const newControllers = this.mapControllersFromInit(updateData.players);\n this._controllers = newControllers;\n\n // NOTE: _bridge:update is only delivered during initialization or when GameOverlay\n // re-renders (rare). Mid-game player updates are handled by transport events\n // (smore:player-joined, smore:player-left, etc.) which bypass _bridge:update entirely.\n // The join/leave detection below is a defensive fallback, not the primary update path.\n\n // Detect joins\n for (const nc of newControllers) {\n if (!oldControllers.some(oc => oc.playerIndex === nc.playerIndex)) {\n this.logger.lifecycle('Controller joined (via update)', { playerIndex: nc.playerIndex });\n this.config.onControllerJoin?.(nc.playerIndex, nc);\n }\n }\n\n // Detect leaves\n for (const oc of oldControllers) {\n if (!newControllers.some(nc => nc.playerIndex === oc.playerIndex)) {\n this.logger.lifecycle('Controller left (via update)', { playerIndex: oc.playerIndex });\n this.config.onControllerLeave?.(oc.playerIndex);\n }\n }\n }\n this.logger.lifecycle('Room updated', {\n controllers: this._controllers.length,\n });\n }\n };\n\n window.addEventListener('message', this.boundMessageHandler);\n\n // Signal ready to parent\n window.parent.postMessage({ type: '_bridge:ready' }, parentOrigin);\n this.logger.lifecycle('Sent _bridge:ready to parent');\n });\n }\n\n private mapControllersFromInit(players: unknown[]): ControllerInfo[] {\n return (players as Record<string, unknown>[]).map((p, index) => ({\n playerIndex: (p.playerIndex as number) ?? index,\n // Fallback to `nickname` for defensive compatibility (server currently always sends `name`)\n nickname: (p.nickname as string) || (p.name as string) || `Player ${index + 1}`,\n connected: p.connected !== false,\n // Fallback to `appearance` for defensive compatibility (server currently always sends `character`)\n appearance: (p.appearance ?? p.character) as ControllerInfo['appearance'],\n }));\n }\n\n\n private setupEventHandlers(): void {\n if (!this.transport) return;\n\n // System events: player join/leave/reconnect\n // These smore:* events are forwarded by IframeGameBridge's GAME_FACING_EVENTS allowlist.\n // Each handler updates _controllers to stay consistent and prevent duplicate\n // callbacks if _bridge:update also fires with the same data.\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_JOINED, (data: unknown) => {\n const payload = data as { player?: Record<string, unknown> };\n const playerData = payload?.player;\n if (playerData && typeof playerData.playerIndex === 'number') {\n const controllerInfo: ControllerInfo = {\n playerIndex: playerData.playerIndex as number,\n nickname: (playerData.nickname as string) || (playerData.name as string) || `Player ${(playerData.playerIndex as number) + 1}`,\n connected: playerData.connected !== false,\n appearance: (playerData.appearance ?? playerData.character) as ControllerInfo['appearance'],\n };\n if (this._controllers.some(c => c.playerIndex === controllerInfo.playerIndex)) return;\n this._controllers = [...this._controllers, controllerInfo];\n this.logger.lifecycle('Controller joined', { playerIndex: controllerInfo.playerIndex });\n this.config.onControllerJoin?.(controllerInfo.playerIndex, controllerInfo);\n }\n });\n\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_LEFT, (data: unknown) => {\n const payload = data as { player?: { playerIndex?: number }; playerIndex?: number };\n const playerIndex = payload?.player?.playerIndex ?? payload?.playerIndex;\n if (typeof playerIndex === 'number') {\n if (!this._controllers.some(c => c.playerIndex === playerIndex)) return;\n this._controllers = this._controllers.filter(c => c.playerIndex !== playerIndex);\n this.logger.lifecycle('Controller left', { playerIndex });\n this.config.onControllerLeave?.(playerIndex);\n }\n });\n\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_DISCONNECTED, (data: unknown) => {\n const payload = data as { player?: { playerIndex?: number }; playerIndex?: number };\n const playerIndex = payload?.player?.playerIndex ?? payload?.playerIndex;\n if (typeof playerIndex === 'number') {\n this._controllers = this._controllers.map(c =>\n c.playerIndex === playerIndex ? { ...c, connected: false } : c\n );\n this.logger.lifecycle('Controller disconnected', { playerIndex });\n this.config.onControllerDisconnect?.(playerIndex);\n }\n });\n\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_RECONNECTED, (data: unknown) => {\n const payload = data as { player?: Record<string, unknown> };\n const playerData = payload?.player;\n if (playerData && typeof playerData.playerIndex === 'number') {\n const controllerInfo: ControllerInfo = {\n playerIndex: playerData.playerIndex as number,\n nickname: (playerData.nickname as string) || (playerData.name as string) || `Player ${(playerData.playerIndex as number) + 1}`,\n connected: true,\n appearance: (playerData.appearance ?? playerData.character) as ControllerInfo['appearance'],\n };\n this._controllers = this._controllers.map(c =>\n c.playerIndex === controllerInfo.playerIndex ? controllerInfo : c\n );\n this.logger.lifecycle('Controller reconnected', { playerIndex: controllerInfo.playerIndex });\n this.config.onControllerReconnect?.(controllerInfo.playerIndex, controllerInfo);\n }\n });\n\n // Character updated: update appearance in _controllers\n // Server emits { player: player.toDTO(), room: room.toDTO() }\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_CHARACTER_UPDATED, (data: unknown) => {\n const payload = data as { player?: { playerIndex?: number; character?: Record<string, unknown> | null; name?: string; nickname?: string } };\n const playerData = payload?.player;\n if (playerData && typeof playerData.playerIndex === 'number') {\n const appearance = (playerData.character ?? null) as ControllerInfo['appearance'];\n this._controllers = this._controllers.map(c =>\n c.playerIndex === playerData.playerIndex ? { ...c, appearance } : c\n );\n this.logger.lifecycle('Player character updated', { playerIndex: playerData.playerIndex });\n this.config.onCharacterUpdated?.(playerData.playerIndex, appearance ?? null);\n }\n });\n\n // Rate limited: notify when server rate-limits an event\n this.registerTransportHandler(SMORE_EVENTS.RATE_LIMITED, (data: unknown) => {\n const payload = data as { event?: string };\n const event = payload?.event ?? 'unknown';\n this.logger.warn(`Rate limited: ${event}`);\n this.config.onRateLimited?.(event);\n });\n\n // All ready: all participants have signaled ready\n this.registerTransportHandler(SMORE_EVENTS.ALL_READY, () => {\n this.logger.lifecycle('All participants ready');\n this.config.onAllReady?.();\n });\n\n // User event listeners from config\n // These are tracked in _configListenerEvents so off(event) without handler won't remove them.\n if (this.config.listeners) {\n for (const [event, handler] of Object.entries(this.config.listeners)) {\n if (!handler) continue;\n this._configListenerEvents.add(event);\n this.setupUserEventHandler(event, handler as ScreenEventHandler<unknown>);\n }\n }\n }\n\n /**\n * Sets up a user event handler with playerIndex extraction.\n *\n * Events received from controllers are dropped if they lack a playerIndex field.\n * This is a security measure to prevent controller impersonation - the relay server\n * automatically attaches playerIndex based on the sender's authenticated session,\n * ensuring controllers cannot forge events as other players.\n *\n * Note: `playerIndex` is a reserved field name in event payloads.\n * It is automatically extracted by the SDK and passed as the first argument\n * to Screen event handlers. Game developers must NOT use `playerIndex` as\n * a custom data field name -- it will be stripped from the data object.\n */\n private setupUserEventHandler(event: string, handler: ScreenEventHandler<unknown>): void {\n const wrappedHandler = (data: unknown) => {\n this.logger.receive(event, data);\n const payload = data as { playerIndex?: number };\n // `playerIndex` is a reserved field injected by the relay server.\n // It is extracted here and passed as the first argument to the handler.\n const { playerIndex, ...rest } = payload as { playerIndex?: number; [key: string]: unknown };\n if (typeof playerIndex === 'number') {\n try {\n handler(playerIndex, rest);\n } catch (err) {\n this.handleError(\n new SmoreSDKError('UNKNOWN', `Error in handler for event \"${event}\"`, {\n cause: err instanceof Error ? err : undefined,\n details: { event, playerIndex },\n })\n );\n }\n } else {\n // Drop events without playerIndex to prevent impersonation.\n // The relay server attaches playerIndex automatically based on sender's session.\n this.logger.debug(`Dropping event \"${event}\" without playerIndex`, data);\n }\n };\n\n this.registerTransportHandler(event, wrappedHandler);\n\n // Also store in eventHandlers for on/off management\n let handlers = this.eventHandlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this.eventHandlers.set(event, handlers);\n }\n handlers.add(handler);\n }\n\n private registerTransportHandler(event: string, handler: TransportEventHandler): void {\n if (!this.transport) return;\n this.transport.on(event, handler);\n this.registeredTransportHandlers.push({ event, handler });\n }\n\n // ---------------------------------------------------------------------------\n // Properties (readonly)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a new shallow copy of the controllers array on every access.\n * Cache the result if accessing repeatedly in the same frame/tick.\n */\n get controllers(): readonly ControllerInfo[] {\n return [...this._controllers];\n }\n\n get roomCode(): RoomCode {\n return this._roomCode;\n }\n\n get isReady(): boolean {\n return this._isReady;\n }\n\n get isDestroyed(): boolean {\n return this._isDestroyed;\n }\n\n // ---------------------------------------------------------------------------\n // Communication Methods\n // ---------------------------------------------------------------------------\n\n /**\n * Send type-safe events to all controllers.\n *\n * Uses EventMap generic for compile-time type checking of event names and data payloads.\n * Runtime behavior is identical to broadcastRaw - both call validateEventName at runtime.\n *\n * @note Data should be an object. Primitive values will be wrapped as `{ data: value }` by the relay server.\n * @note Maximum payload size is 64KB. Data exceeding this limit will be silently dropped by the server.\n * @note Fire-and-forget sends (no callback) will silently fail if rate-limited.\n * Use the onError callback or smore:rate-limited event to detect rate limiting.\n *\n * Warning: Avoid sending primitive values directly (string, number, boolean).\n * Wrap in an object: broadcast('event', { value: 42 }) instead of broadcast('event', 42)\n *\n * @see broadcastRaw for bypassing TypeScript type checking (runtime behavior identical)\n */\n broadcast<K extends EventNames<TEvents>>(event: K, data: EventData<TEvents, K>): void {\n this.ensureReady('broadcast');\n validateEventName(event);\n this.logger.send(event, data);\n this.transport!.emit(event, data);\n }\n\n /**\n * Send events to all controllers without TypeScript type checking.\n *\n * Bypasses EventMap generic type checks at compile time.\n * Runtime behavior is identical to broadcast - both call validateEventName at runtime.\n *\n * Use this when you need dynamic event names or when working without a predefined EventMap.\n *\n * @note Data should be an object. Primitive values will be wrapped as `{ data: value }` by the relay server.\n * @note Maximum payload size is 64KB. Data exceeding this limit will be silently dropped by the server.\n *\n * @see broadcast for type-safe version using EventMap generic\n */\n broadcastRaw(event: string, data?: unknown): void {\n this.ensureReady('broadcastRaw');\n validateEventName(event);\n this.logger.send(event, data);\n this.transport!.emit(event, data);\n }\n\n /**\n * Send an event to a specific controller.\n *\n * **Reserved field:** `targetPlayerIndex` is automatically merged into the data payload\n * to route the event to the specified controller. Game developers should avoid using\n * `targetPlayerIndex` as a custom data field name to prevent conflicts.\n *\n * @note Data should be an object. Primitive values will be wrapped as `{ data: value }` by the relay server.\n * @note Maximum payload size is 64KB. Data exceeding this limit will be silently dropped by the server.\n *\n * @param playerIndex - Target controller's player index\n * @param event - Event name\n * @param data - Event data payload\n */\n sendToController<K extends EventNames<TEvents>>(\n playerIndex: PlayerIndex,\n event: K,\n data: EventData<TEvents, K>\n ): void {\n this.ensureReady('sendToController');\n validateEventName(event);\n validatePlayerIndex(playerIndex, this._controllers);\n\n // MIN-A2-2: Warn if targetPlayerIndex already exists in data (reserved field)\n if (data && typeof data === 'object' && 'targetPlayerIndex' in data) {\n this.logger.warn(\n `Event \"${event}\" data contains reserved field \"targetPlayerIndex\" which will be overwritten for routing.`\n );\n }\n\n this.logger.send(`${event} -> Player ${playerIndex}`, data);\n this.transport!.emit(event, {\n targetPlayerIndex: playerIndex,\n ...(data && typeof data === 'object' ? data : { data }),\n });\n }\n\n sendToControllerRaw(playerIndex: PlayerIndex, event: string, data?: unknown): void {\n this.ensureReady('sendToControllerRaw');\n validateEventName(event);\n validatePlayerIndex(playerIndex, this._controllers);\n\n // MIN-A2-2: Warn if targetPlayerIndex already exists in data (reserved field)\n if (data && typeof data === 'object' && 'targetPlayerIndex' in data) {\n this.logger.warn(\n `Event \"${event}\" data contains reserved field \"targetPlayerIndex\" which will be overwritten for routing.`\n );\n }\n\n this.logger.send(`${event} -> Player ${playerIndex}`, data);\n this.transport!.emit(event, {\n targetPlayerIndex: playerIndex,\n ...(data && typeof data === 'object' ? data : { data }),\n });\n }\n\n // ---------------------------------------------------------------------------\n // Game Lifecycle\n // ---------------------------------------------------------------------------\n\n gameOver(results?: GameResults): void {\n this.ensureReady('gameOver');\n this.logger.lifecycle('Game over', results);\n this.transport!.emit(SMORE_EVENTS.GAME_OVER, { results });\n }\n\n signalReady(): void {\n this.ensureReady('signalReady');\n this.logger.lifecycle('Signaling ready');\n this.transport!.emit(SMORE_EVENTS.GAME_READY, {});\n }\n\n // ---------------------------------------------------------------------------\n // Event Subscription\n // ---------------------------------------------------------------------------\n\n /**\n * Register an event handler for messages from controllers.\n *\n * **Important:** If called before the Screen is ready (i.e., before `await createScreen()`\n * resolves or before the `onReady` callback fires), the handler is stored locally but\n * will NOT be registered with the transport layer. This means the handler will never\n * fire for events received during the pre-ready window. Always call `on()` after\n * initialization completes, or use `config.listeners` for handlers needed from the start.\n */\n on<K extends EventNames<TEvents>>(\n event: K,\n handler: ScreenEventHandler<EventData<TEvents, K>>\n ): () => void {\n validateEventName(event);\n\n let handlers = this.eventHandlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this.eventHandlers.set(event, handlers);\n }\n handlers.add(handler as ScreenEventHandler<unknown>);\n\n // Also register on transport if ready\n let wrappedHandler: TransportEventHandler | null = null;\n if (this.transport) {\n wrappedHandler = (data: unknown) => {\n this.logger.receive(event, data);\n const payload = data as { playerIndex?: number };\n const { playerIndex, ...rest } = payload as { playerIndex?: number; [key: string]: unknown };\n if (typeof playerIndex === 'number') {\n try {\n handler(playerIndex, rest as EventData<TEvents, K>);\n } catch (err) {\n this.handleError(\n new SmoreSDKError('UNKNOWN', `Error in handler for event \"${event}\"`, {\n cause: err instanceof Error ? err : undefined,\n })\n );\n }\n } else {\n this.logger.debug(`Dropping event \"${event}\" without playerIndex`, data);\n }\n };\n this.registerTransportHandler(event, wrappedHandler);\n this.handlerToTransport.set(handler as Function, { event, transportHandler: wrappedHandler });\n }\n\n // Return unsubscribe function\n return () => {\n handlers?.delete(handler as ScreenEventHandler<unknown>);\n if (handlers?.size === 0) {\n this.eventHandlers.delete(event);\n }\n if (wrappedHandler) {\n this.transport?.off(event, wrappedHandler);\n this.registeredTransportHandlers = this.registeredTransportHandlers.filter(\n h => h.handler !== wrappedHandler\n );\n this.handlerToTransport.delete(handler as Function);\n }\n };\n }\n\n /**\n * Register an event handler that will be called only once.\n *\n * The handler is automatically removed after the first invocation.\n *\n * **Important:** The wrapped handler cannot be removed via `off(event, originalHandler)`.\n * Use the returned unsubscribe function instead.\n *\n * @param event - Event name to listen for\n * @param handler - Handler function to call once\n * @returns Unsubscribe function to remove the handler before it fires\n *\n * @example\n * ```ts\n * const unsubscribe = screen.once('ready', (playerIndex, data) => {\n * console.log('Ready event received');\n * });\n *\n * // To remove before the event fires:\n * unsubscribe();\n * ```\n */\n once<K extends EventNames<TEvents>>(\n event: K,\n handler: ScreenEventHandler<EventData<TEvents, K>>\n ): () => void {\n const wrappedHandler: ScreenEventHandler<EventData<TEvents, K>> = (playerIndex, data) => {\n unsubscribe();\n handler(playerIndex, data);\n };\n const unsubscribe = this.on(event, wrappedHandler);\n return unsubscribe;\n }\n\n off<K extends EventNames<TEvents>>(\n event: K,\n handler?: ScreenEventHandler<EventData<TEvents, K>>\n ): void {\n if (!handler) {\n // Remove all dynamically-added handlers for this event, but preserve\n // config listeners (registered via ScreenConfig.listeners) which are\n // permanent for the lifetime of the Screen instance.\n if (this._configListenerEvents.has(event)) {\n // Only remove handlers that were added via on(), not config listeners.\n // Remove handlerToTransport entries (these are from on() calls only).\n for (const [key, val] of this.handlerToTransport) {\n if (val.event === event) {\n this.transport?.off(event, val.transportHandler);\n this.registeredTransportHandlers = this.registeredTransportHandlers.filter(\n h => h.handler !== val.transportHandler\n );\n this.handlerToTransport.delete(key);\n }\n }\n // Remove dynamically-added entries from eventHandlers but don't delete the Set\n // (config handler is still in it)\n } else {\n // No config listener for this event -- safe to remove everything\n this.eventHandlers.delete(event);\n this.transport?.off(event);\n this.registeredTransportHandlers = this.registeredTransportHandlers.filter(h => h.event !== event);\n for (const [key, val] of this.handlerToTransport) {\n if (val.event === event) this.handlerToTransport.delete(key);\n }\n }\n } else {\n const handlers = this.eventHandlers.get(event);\n handlers?.delete(handler as ScreenEventHandler<unknown>);\n if (handlers?.size === 0) {\n this.eventHandlers.delete(event);\n }\n // Remove specific transport handler\n const entry = this.handlerToTransport.get(handler as Function);\n if (entry) {\n this.transport?.off(event, entry.transportHandler);\n this.registeredTransportHandlers = this.registeredTransportHandlers.filter(\n h => h.handler !== entry.transportHandler\n );\n this.handlerToTransport.delete(handler as Function);\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Utilities\n // ---------------------------------------------------------------------------\n\n getController(playerIndex: PlayerIndex): ControllerInfo | undefined {\n return this._controllers.find((c) => c.playerIndex === playerIndex);\n }\n\n getControllerCount(): number {\n return this._controllers.filter((c) => c.connected).length;\n }\n\n /**\n * Check if there is at least one connected controller.\n * Useful for detecting when all players have disconnected\n * (e.g., to pause the game or show a waiting screen).\n *\n * Use this in onControllerDisconnect callback to detect when all controllers have disconnected.\n *\n * @example\n * ```ts\n * const screen = await createScreen<MyEvents>({\n * onControllerDisconnect: (playerIndex) => {\n * if (!screen.hasAnyConnectedControllers()) {\n * console.log('All controllers disconnected!');\n * screen.broadcast('waiting-for-players', {});\n * }\n * },\n * });\n * ```\n */\n hasAnyConnectedControllers(): boolean {\n return this._controllers.some((c) => c.connected);\n }\n\n // ---------------------------------------------------------------------------\n // Cleanup\n // ---------------------------------------------------------------------------\n\n destroy(): void {\n if (this._isDestroyed) return;\n\n this.logger.lifecycle('Destroying screen...');\n this._isDestroyed = true;\n this._isReady = false;\n\n this.cleanup();\n this.logger.lifecycle('Screen destroyed');\n }\n\n private cleanup(): void {\n // Remove all registered transport handlers\n for (const { event, handler } of this.registeredTransportHandlers) {\n this.transport?.off(event, handler);\n }\n this.registeredTransportHandlers = [];\n\n // Clear event handlers\n this.eventHandlers.clear();\n this.handlerToTransport.clear();\n\n // Destroy transport\n if (this.transport instanceof PostMessageTransport) {\n this.transport.destroy();\n }\n this.transport = null;\n\n // Remove message listener\n if (this.boundMessageHandler) {\n window.removeEventListener('message', this.boundMessageHandler);\n this.boundMessageHandler = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Error Handling\n // ---------------------------------------------------------------------------\n\n private handleError(error: SmoreSDKError): void {\n // Always log at warn level so errors are never completely silent\n this.logger.warn(`Error in handler: ${error.message}`);\n const smoreError = error.toSmoreError();\n if (this.config.onError) {\n this.config.onError(smoreError);\n } else {\n this.logger.error(error.message, error.details);\n }\n }\n\n private ensureReady(method: string): void {\n if (this._isDestroyed) {\n throw new SmoreSDKError(\n 'DESTROYED',\n `Cannot call ${method}() after destroy()`,\n { details: { method } }\n );\n }\n if (!this._isReady || !this.transport) {\n throw new SmoreSDKError(\n 'NOT_READY',\n `Cannot call ${method}() before screen is ready. Use await createScreen() or onReady callback.`,\n { details: { method } }\n );\n }\n }\n}\n\n// =============================================================================\n// FACTORY FUNCTION\n// =============================================================================\n\n/**\n * Create a Screen instance for the host/TV side of your game.\n *\n * Returns a Promise that resolves when the screen is ready.\n * The promise also has an `instance` property for immediate access (use with onReady callback).\n *\n * @template TEvents - Event map type for type-safe events\n * @param config - Screen configuration\n * @returns Promise that resolves to the Screen instance when ready\n *\n * @example Promise-based (recommended)\n * ```ts\n * const screen = await createScreen<MyEvents>({\n * listeners: {\n * tap: (playerIndex, data) => handleTap(playerIndex, data),\n * },\n * });\n *\n * screen.broadcast('game-start', { countdown: 3 });\n * ```\n *\n * @example Callback-based\n * ```ts\n * const { instance: screen } = createScreen<MyEvents>({\n * onReady: () => {\n * screen.broadcast('game-start', { countdown: 3 });\n * },\n * listeners: { ... },\n * });\n * ```\n */\nexport function createScreen<TEvents extends EventMap = EventMap>(\n config?: ScreenConfig<TEvents>\n): Promise<Screen<TEvents>> & { instance: Screen<TEvents> } {\n const screen = new ScreenImpl<TEvents>(config);\n\n const promise = screen.initialize().then(() => screen as Screen<TEvents>);\n\n // Attach instance for callback-based usage\n (promise as Promise<Screen<TEvents>> & { instance: Screen<TEvents> }).instance =\n screen as Screen<TEvents>;\n\n return promise as Promise<Screen<TEvents>> & { instance: Screen<TEvents> };\n}\n"],"names":["SmoreSDKError","DebugLogger","validateEventName","isBridgeMessage","validateInitPayload","PostMessageTransport","getGlobalConfig","SMORE_EVENTS"],"mappings":"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"}
1
+ {"version":3,"file":"screen.cjs","sources":["../../src/screen.ts"],"sourcesContent":["/**\n * createScreen - Factory function for Screen instances (Host/TV side)\n *\n * Synchronous factory with event emitter pattern. Returns a Screen instance\n * immediately. Use `.ready` to await full initialization, and `.on()` /\n * lifecycle methods to register handlers (can be called before ready).\n *\n * @example\n * ```ts\n * interface MyEvents {\n * tap: { x: number; y: number };\n * 'phase-update': { phase: 'lobby' | 'playing' | 'results' };\n * }\n *\n * const screen = createScreen<MyEvents>({ debug: true });\n *\n * screen.on('tap', (playerIndex, data) => {\n * console.log(`Player ${playerIndex} tapped at`, data.x, data.y);\n * });\n *\n * screen.onAllReady(() => startGame());\n * screen.onControllerJoin((pi, info) => addPlayer(pi, info));\n *\n * await screen.ready;\n * screen.broadcast('phase-update', { phase: 'playing' });\n * ```\n */\n\nimport type {\n EventMap,\n EventNames,\n EventData,\n Screen,\n ScreenConfig,\n ScreenEventHandler,\n ControllerInfo,\n PlayerIndex,\n RoomCode,\n GameResults,\n SmoreError,\n CharacterAppearance,\n} from './types';\nimport type { Transport, TransportEventHandler } from './transport/types';\nimport { PostMessageTransport } from './transport/PostMessageTransport';\nimport { isBridgeMessage, validateInitPayload, type BridgeInitMessage, type BridgeUpdateMessage } from './transport/protocol';\nimport { SmoreSDKError } from './errors';\nimport { SMORE_EVENTS, validateEventName } from './events';\nimport { DebugLogger } from './logger';\nimport { getGlobalConfig } from './config';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst DEFAULT_TIMEOUT = 10000;\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\nfunction validatePlayerIndex(playerIndex: PlayerIndex, controllers: readonly ControllerInfo[]): void {\n if (typeof playerIndex !== 'number' || !Number.isInteger(playerIndex)) {\n throw new SmoreSDKError('INVALID_PLAYER', 'Player index must be an integer');\n }\n if (!controllers.some(c => c.playerIndex === playerIndex)) {\n throw new SmoreSDKError(\n 'INVALID_PLAYER',\n `No controller found with player index ${playerIndex}`,\n { details: { playerIndex } }\n );\n }\n}\n\n// =============================================================================\n// SCREEN IMPLEMENTATION\n// =============================================================================\n\nclass ScreenImpl<TEvents extends EventMap> implements Screen<TEvents> {\n private transport: Transport | null = null;\n private config: ScreenConfig<TEvents>;\n private logger: DebugLogger;\n\n private _controllers: ControllerInfo[] = [];\n private _roomCode: RoomCode = '';\n private _isReady = false;\n private _isDestroyed = false;\n private _initTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n private eventHandlers = new Map<string, Set<ScreenEventHandler<unknown>>>();\n private registeredTransportHandlers: Array<{ event: string; handler: TransportEventHandler }> = [];\n private boundMessageHandler: ((e: MessageEvent) => void) | null = null;\n // Maps user-facing handler -> transport wrappedHandler for proper cleanup in on()/off()\n private handlerToTransport = new Map<Function, { event: string; transportHandler: TransportEventHandler }>();\n\n // Pending handlers registered via on() before transport is ready\n private _pendingHandlers: Array<{ event: string; handler: ScreenEventHandler<unknown> }> = [];\n\n // Lifecycle callback arrays\n private _onAllReadyCallbacks: Set<() => void> = new Set();\n private _onControllerJoinCallbacks: Set<(playerIndex: PlayerIndex, info: ControllerInfo) => void> = new Set();\n private _onControllerLeaveCallbacks: Set<(playerIndex: PlayerIndex) => void> = new Set();\n private _onControllerDisconnectCallbacks: Set<(playerIndex: PlayerIndex) => void> = new Set();\n private _onControllerReconnectCallbacks: Set<(playerIndex: PlayerIndex, info: ControllerInfo) => void> = new Set();\n private _onCharacterUpdatedCallbacks: Set<(playerIndex: PlayerIndex, appearance: CharacterAppearance | null) => void> = new Set();\n private _onRateLimitedCallbacks: Set<(event: string) => void> = new Set();\n private _onErrorCallbacks: Set<(error: SmoreError) => void> = new Set();\n\n // Whether all-ready has fired\n private _allReadyFired = false;\n\n // Ready promise\n private _readyResolve!: () => void;\n private _readyReject!: (err: Error) => void;\n readonly ready: Promise<void>;\n\n constructor(config: ScreenConfig<TEvents> = {}) {\n this.config = config;\n this.logger = new DebugLogger(config.debug, '[SmoreScreen]');\n\n // Create ready promise\n this.ready = new Promise<void>((resolve, reject) => {\n this._readyResolve = resolve;\n this._readyReject = reject;\n });\n\n // Start initialization immediately\n this.startInitialization();\n }\n\n // ---------------------------------------------------------------------------\n // Initialization (called in constructor)\n // ---------------------------------------------------------------------------\n\n private startInitialization(): void {\n this.logger.lifecycle('Initializing screen...');\n\n const parentOrigin = this.config.parentOrigin ?? '*';\n const timeout = this.config.timeout ?? DEFAULT_TIMEOUT;\n\n this._initTimeoutId = setTimeout(() => {\n this.cleanup();\n const error = new SmoreSDKError(\n 'TIMEOUT',\n `Screen initialization timed out after ${timeout}ms. ` +\n `Make sure the parent frame sends _bridge:init. ` +\n `Check that the iframe has correct sandbox attributes (allow-scripts required) and same-origin/cross-origin settings. ` +\n `Create a new Screen instance to retry (this instance has been cleaned up).`,\n { details: { timeout } }\n );\n this.handleError(error);\n this._readyReject(error);\n }, timeout);\n\n this.boundMessageHandler = (e: MessageEvent) => {\n if (parentOrigin !== '*' && e.origin !== parentOrigin) return;\n\n const msg = e.data;\n if (!isBridgeMessage(msg)) return;\n\n if (msg.type === '_bridge:init') {\n clearTimeout(this._initTimeoutId!);\n const initPayload = (msg as BridgeInitMessage).payload;\n\n // MIN-A1-1: Runtime validation of _bridge:init payload structure\n try {\n validateInitPayload(initPayload);\n } catch (err) {\n const error = new SmoreSDKError(\n 'INIT_FAILED',\n `Invalid _bridge:init payload: ${err instanceof Error ? err.message : String(err)}`,\n { details: { payload: initPayload } }\n );\n this.logger.warn('_bridge:init validation failed', error);\n this.handleError(error);\n this._readyReject(error);\n return;\n }\n\n const initData = initPayload;\n\n if (initData.side !== 'host') {\n const error = new SmoreSDKError(\n 'INIT_FAILED',\n `Received init for wrong side: ${initData.side}. Expected \"host\".`,\n { details: { side: initData.side } }\n );\n this.handleError(error);\n this._readyReject(error);\n return;\n }\n\n // Initialize transport\n this.transport = new PostMessageTransport(parentOrigin);\n this._roomCode = initData.roomCode;\n this._controllers = this.mapControllersFromInit(initData.players);\n\n // MIN-14: Warn if initialized with zero controllers\n if (this._controllers.length === 0) {\n this.logger.warn('Screen initialized with zero controllers');\n }\n\n this.setupEventHandlers();\n\n // Register all pending user event handlers\n for (const { event, handler } of this._pendingHandlers) {\n this.setupUserEventHandler(event, handler);\n }\n this._pendingHandlers = [];\n\n this._isReady = true;\n\n this.logger.lifecycle('Screen ready', {\n roomCode: this._roomCode,\n controllers: this._controllers.length,\n });\n\n // Auto-signal ready unless explicitly disabled via configure()\n const autoReady = getGlobalConfig().autoReady ?? true;\n if (autoReady) {\n this.logger.lifecycle('Auto-signaling ready (autoReady enabled)');\n this.signalReady();\n }\n\n this._readyResolve();\n } else if (msg.type === '_bridge:update') {\n if (!this._isReady) {\n this.logger.debug('Ignoring _bridge:update before init completes');\n return;\n }\n const updateData = (msg as BridgeUpdateMessage).payload;\n\n if (updateData.players && Array.isArray(updateData.players)) {\n const oldControllers = this._controllers;\n const newControllers = this.mapControllersFromInit(updateData.players);\n this._controllers = newControllers;\n\n // NOTE: _bridge:update is only delivered during initialization or when GameOverlay\n // re-renders (rare). Mid-game player updates are handled by transport events\n // (smore:player-joined, smore:player-left, etc.) which bypass _bridge:update entirely.\n // The join/leave detection below is a defensive fallback, not the primary update path.\n\n // Detect joins\n for (const nc of newControllers) {\n if (!oldControllers.some(oc => oc.playerIndex === nc.playerIndex)) {\n this.logger.lifecycle('Controller joined (via update)', { playerIndex: nc.playerIndex });\n this._onControllerJoinCallbacks.forEach(cb => cb(nc.playerIndex, nc));\n }\n }\n\n // Detect leaves\n for (const oc of oldControllers) {\n if (!newControllers.some(nc => nc.playerIndex === oc.playerIndex)) {\n this.logger.lifecycle('Controller left (via update)', { playerIndex: oc.playerIndex });\n this._onControllerLeaveCallbacks.forEach(cb => cb(oc.playerIndex));\n }\n }\n }\n this.logger.lifecycle('Room updated', {\n controllers: this._controllers.length,\n });\n }\n };\n\n window.addEventListener('message', this.boundMessageHandler);\n\n // Signal ready to parent\n window.parent.postMessage({ type: '_bridge:ready' }, parentOrigin);\n this.logger.lifecycle('Sent _bridge:ready to parent');\n }\n\n private mapControllersFromInit(players: unknown[]): ControllerInfo[] {\n return (players as Record<string, unknown>[]).map((p, index) => ({\n playerIndex: (p.playerIndex as number) ?? index,\n // Fallback to `nickname` for defensive compatibility (server currently always sends `name`)\n nickname: (p.nickname as string) || (p.name as string) || `Player ${index + 1}`,\n connected: p.connected !== false,\n // Fallback to `appearance` for defensive compatibility (server currently always sends `character`)\n appearance: (p.appearance ?? p.character) as ControllerInfo['appearance'],\n }));\n }\n\n\n private setupEventHandlers(): void {\n if (!this.transport) return;\n\n // System events: player join/leave/reconnect\n // These smore:* events are forwarded by IframeGameBridge's GAME_FACING_EVENTS allowlist.\n // Each handler updates _controllers to stay consistent and prevent duplicate\n // callbacks if _bridge:update also fires with the same data.\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_JOINED, (data: unknown) => {\n const payload = data as { player?: Record<string, unknown> };\n const playerData = payload?.player;\n if (playerData && typeof playerData.playerIndex === 'number') {\n const controllerInfo: ControllerInfo = {\n playerIndex: playerData.playerIndex as number,\n nickname: (playerData.nickname as string) || (playerData.name as string) || `Player ${(playerData.playerIndex as number) + 1}`,\n connected: playerData.connected !== false,\n appearance: (playerData.appearance ?? playerData.character) as ControllerInfo['appearance'],\n };\n if (this._controllers.some(c => c.playerIndex === controllerInfo.playerIndex)) return;\n this._controllers = [...this._controllers, controllerInfo];\n this.logger.lifecycle('Controller joined', { playerIndex: controllerInfo.playerIndex });\n this._onControllerJoinCallbacks.forEach(cb => cb(controllerInfo.playerIndex, controllerInfo));\n }\n });\n\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_LEFT, (data: unknown) => {\n const payload = data as { player?: { playerIndex?: number }; playerIndex?: number };\n const playerIndex = payload?.player?.playerIndex ?? payload?.playerIndex;\n if (typeof playerIndex === 'number') {\n if (!this._controllers.some(c => c.playerIndex === playerIndex)) return;\n this._controllers = this._controllers.filter(c => c.playerIndex !== playerIndex);\n this.logger.lifecycle('Controller left', { playerIndex });\n this._onControllerLeaveCallbacks.forEach(cb => cb(playerIndex));\n }\n });\n\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_DISCONNECTED, (data: unknown) => {\n const payload = data as { player?: { playerIndex?: number }; playerIndex?: number };\n const playerIndex = payload?.player?.playerIndex ?? payload?.playerIndex;\n if (typeof playerIndex === 'number') {\n this._controllers = this._controllers.map(c =>\n c.playerIndex === playerIndex ? { ...c, connected: false } : c\n );\n this.logger.lifecycle('Controller disconnected', { playerIndex });\n this._onControllerDisconnectCallbacks.forEach(cb => cb(playerIndex));\n }\n });\n\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_RECONNECTED, (data: unknown) => {\n const payload = data as { player?: Record<string, unknown> };\n const playerData = payload?.player;\n if (playerData && typeof playerData.playerIndex === 'number') {\n const controllerInfo: ControllerInfo = {\n playerIndex: playerData.playerIndex as number,\n nickname: (playerData.nickname as string) || (playerData.name as string) || `Player ${(playerData.playerIndex as number) + 1}`,\n connected: true,\n appearance: (playerData.appearance ?? playerData.character) as ControllerInfo['appearance'],\n };\n this._controllers = this._controllers.map(c =>\n c.playerIndex === controllerInfo.playerIndex ? controllerInfo : c\n );\n this.logger.lifecycle('Controller reconnected', { playerIndex: controllerInfo.playerIndex });\n this._onControllerReconnectCallbacks.forEach(cb => cb(controllerInfo.playerIndex, controllerInfo));\n }\n });\n\n // Character updated: update appearance in _controllers\n // Server emits { player: player.toDTO(), room: room.toDTO() }\n this.registerTransportHandler(SMORE_EVENTS.PLAYER_CHARACTER_UPDATED, (data: unknown) => {\n const payload = data as { player?: { playerIndex?: number; character?: Record<string, unknown> | null; name?: string; nickname?: string } };\n const playerData = payload?.player;\n if (playerData && typeof playerData.playerIndex === 'number') {\n const pi = playerData.playerIndex;\n const appearance = (playerData.character ?? null) as ControllerInfo['appearance'];\n this._controllers = this._controllers.map(c =>\n c.playerIndex === pi ? { ...c, appearance } : c\n );\n this.logger.lifecycle('Player character updated', { playerIndex: pi });\n this._onCharacterUpdatedCallbacks.forEach(cb => cb(pi, appearance ?? null));\n }\n });\n\n // Rate limited: notify when server rate-limits an event\n this.registerTransportHandler(SMORE_EVENTS.RATE_LIMITED, (data: unknown) => {\n const payload = data as { event?: string };\n const event = payload?.event ?? 'unknown';\n this.logger.warn(`Rate limited: ${event}`);\n this._onRateLimitedCallbacks.forEach(cb => cb(event));\n });\n\n // All ready: all participants have signaled ready\n this.registerTransportHandler(SMORE_EVENTS.ALL_READY, () => {\n this.logger.lifecycle('All participants ready');\n this._allReadyFired = true;\n this._onAllReadyCallbacks.forEach(cb => cb());\n });\n }\n\n /**\n * Sets up a user event handler with playerIndex extraction.\n *\n * Events received from controllers are dropped if they lack a playerIndex field.\n * This is a security measure to prevent controller impersonation - the relay server\n * automatically attaches playerIndex based on the sender's authenticated session,\n * ensuring controllers cannot forge events as other players.\n *\n * Note: `playerIndex` is a reserved field name in event payloads.\n * It is automatically extracted by the SDK and passed as the first argument\n * to Screen event handlers. Game developers must NOT use `playerIndex` as\n * a custom data field name -- it will be stripped from the data object.\n */\n private setupUserEventHandler(event: string, handler: ScreenEventHandler<unknown>): void {\n const wrappedHandler = (data: unknown) => {\n this.logger.receive(event, data);\n const payload = data as { playerIndex?: number };\n // `playerIndex` is a reserved field injected by the relay server.\n // It is extracted here and passed as the first argument to the handler.\n const { playerIndex, ...rest } = payload as { playerIndex?: number; [key: string]: unknown };\n if (typeof playerIndex === 'number') {\n try {\n handler(playerIndex, rest);\n } catch (err) {\n this.handleError(\n new SmoreSDKError('UNKNOWN', `Error in handler for event \"${event}\"`, {\n cause: err instanceof Error ? err : undefined,\n details: { event, playerIndex },\n })\n );\n }\n } else {\n // Drop events without playerIndex to prevent impersonation.\n // The relay server attaches playerIndex automatically based on sender's session.\n this.logger.debug(`Dropping event \"${event}\" without playerIndex`, data);\n }\n };\n\n this.registerTransportHandler(event, wrappedHandler);\n\n // Also store in eventHandlers for on/off management\n let handlers = this.eventHandlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this.eventHandlers.set(event, handlers);\n }\n handlers.add(handler);\n\n // Map user handler to transport handler for cleanup\n this.handlerToTransport.set(handler as Function, { event, transportHandler: wrappedHandler });\n }\n\n private registerTransportHandler(event: string, handler: TransportEventHandler): void {\n if (!this.transport) return;\n this.transport.on(event, handler);\n this.registeredTransportHandlers.push({ event, handler });\n }\n\n // ---------------------------------------------------------------------------\n // Properties (readonly)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a new shallow copy of the controllers array on every access.\n * Cache the result if accessing repeatedly in the same frame/tick.\n */\n get controllers(): readonly ControllerInfo[] {\n return [...this._controllers];\n }\n\n get roomCode(): RoomCode {\n return this._roomCode;\n }\n\n get isReady(): boolean {\n return this._isReady;\n }\n\n get isDestroyed(): boolean {\n return this._isDestroyed;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle Methods\n // ---------------------------------------------------------------------------\n\n onAllReady(callback: () => void): () => void {\n // jQuery $(document).ready pattern: if already fired, invoke immediately\n if (this._allReadyFired) {\n callback();\n }\n this._onAllReadyCallbacks.add(callback);\n return () => { this._onAllReadyCallbacks.delete(callback); };\n }\n\n onControllerJoin(callback: (playerIndex: PlayerIndex, info: ControllerInfo) => void): () => void {\n this._onControllerJoinCallbacks.add(callback);\n return () => { this._onControllerJoinCallbacks.delete(callback); };\n }\n\n onControllerLeave(callback: (playerIndex: PlayerIndex) => void): () => void {\n this._onControllerLeaveCallbacks.add(callback);\n return () => { this._onControllerLeaveCallbacks.delete(callback); };\n }\n\n onControllerDisconnect(callback: (playerIndex: PlayerIndex) => void): () => void {\n this._onControllerDisconnectCallbacks.add(callback);\n return () => { this._onControllerDisconnectCallbacks.delete(callback); };\n }\n\n onControllerReconnect(callback: (playerIndex: PlayerIndex, info: ControllerInfo) => void): () => void {\n this._onControllerReconnectCallbacks.add(callback);\n return () => { this._onControllerReconnectCallbacks.delete(callback); };\n }\n\n onCharacterUpdated(callback: (playerIndex: PlayerIndex, appearance: CharacterAppearance | null) => void): () => void {\n this._onCharacterUpdatedCallbacks.add(callback);\n return () => { this._onCharacterUpdatedCallbacks.delete(callback); };\n }\n\n onRateLimited(callback: (event: string) => void): () => void {\n this._onRateLimitedCallbacks.add(callback);\n return () => { this._onRateLimitedCallbacks.delete(callback); };\n }\n\n onError(callback: (error: SmoreError) => void): () => void {\n this._onErrorCallbacks.add(callback);\n return () => { this._onErrorCallbacks.delete(callback); };\n }\n\n // ---------------------------------------------------------------------------\n // Communication Methods\n // ---------------------------------------------------------------------------\n\n /**\n * Send type-safe events to all controllers.\n *\n * Uses EventMap generic for compile-time type checking of event names and data payloads.\n * Runtime behavior is identical to broadcastRaw - both call validateEventName at runtime.\n *\n * @note Data should be an object. Primitive values will be wrapped as `{ data: value }` by the relay server.\n * @note Maximum payload size is 64KB. Data exceeding this limit will be silently dropped by the server.\n * @note Fire-and-forget sends (no callback) will silently fail if rate-limited.\n * Use the onError callback or smore:rate-limited event to detect rate limiting.\n *\n * Warning: Avoid sending primitive values directly (string, number, boolean).\n * Wrap in an object: broadcast('event', { value: 42 }) instead of broadcast('event', 42)\n *\n * @see broadcastRaw for bypassing TypeScript type checking (runtime behavior identical)\n */\n broadcast<K extends EventNames<TEvents>>(event: K, data: EventData<TEvents, K>): void {\n this.ensureReady('broadcast');\n validateEventName(event);\n this.logger.send(event, data);\n this.transport!.emit(event, data);\n }\n\n /**\n * Send events to all controllers without TypeScript type checking.\n *\n * Bypasses EventMap generic type checks at compile time.\n * Runtime behavior is identical to broadcast - both call validateEventName at runtime.\n *\n * Use this when you need dynamic event names or when working without a predefined EventMap.\n *\n * @note Data should be an object. Primitive values will be wrapped as `{ data: value }` by the relay server.\n * @note Maximum payload size is 64KB. Data exceeding this limit will be silently dropped by the server.\n *\n * @see broadcast for type-safe version using EventMap generic\n */\n broadcastRaw(event: string, data?: unknown): void {\n this.ensureReady('broadcastRaw');\n validateEventName(event);\n this.logger.send(event, data);\n this.transport!.emit(event, data);\n }\n\n /**\n * Send an event to a specific controller.\n *\n * **Reserved field:** `targetPlayerIndex` is automatically merged into the data payload\n * to route the event to the specified controller. Game developers should avoid using\n * `targetPlayerIndex` as a custom data field name to prevent conflicts.\n *\n * @note Data should be an object. Primitive values will be wrapped as `{ data: value }` by the relay server.\n * @note Maximum payload size is 64KB. Data exceeding this limit will be silently dropped by the server.\n *\n * @param playerIndex - Target controller's player index\n * @param event - Event name\n * @param data - Event data payload\n */\n sendToController<K extends EventNames<TEvents>>(\n playerIndex: PlayerIndex,\n event: K,\n data: EventData<TEvents, K>\n ): void {\n this.ensureReady('sendToController');\n validateEventName(event);\n validatePlayerIndex(playerIndex, this._controllers);\n\n // MIN-A2-2: Warn if targetPlayerIndex already exists in data (reserved field)\n if (data && typeof data === 'object' && 'targetPlayerIndex' in data) {\n this.logger.warn(\n `Event \"${event}\" data contains reserved field \"targetPlayerIndex\" which will be overwritten for routing.`\n );\n }\n\n this.logger.send(`${event} -> Player ${playerIndex}`, data);\n this.transport!.emit(event, {\n targetPlayerIndex: playerIndex,\n ...(data && typeof data === 'object' ? data : { data }),\n });\n }\n\n sendToControllerRaw(playerIndex: PlayerIndex, event: string, data?: unknown): void {\n this.ensureReady('sendToControllerRaw');\n validateEventName(event);\n validatePlayerIndex(playerIndex, this._controllers);\n\n // MIN-A2-2: Warn if targetPlayerIndex already exists in data (reserved field)\n if (data && typeof data === 'object' && 'targetPlayerIndex' in data) {\n this.logger.warn(\n `Event \"${event}\" data contains reserved field \"targetPlayerIndex\" which will be overwritten for routing.`\n );\n }\n\n this.logger.send(`${event} -> Player ${playerIndex}`, data);\n this.transport!.emit(event, {\n targetPlayerIndex: playerIndex,\n ...(data && typeof data === 'object' ? data : { data }),\n });\n }\n\n // ---------------------------------------------------------------------------\n // Game Lifecycle\n // ---------------------------------------------------------------------------\n\n gameOver(results?: GameResults): void {\n this.ensureReady('gameOver');\n this.logger.lifecycle('Game over', results);\n this.transport!.emit(SMORE_EVENTS.GAME_OVER, { results });\n }\n\n signalReady(): void {\n this.ensureReady('signalReady');\n this.logger.lifecycle('Signaling ready');\n this.transport!.emit(SMORE_EVENTS.GAME_READY, {});\n }\n\n // ---------------------------------------------------------------------------\n // Event Subscription\n // ---------------------------------------------------------------------------\n\n /**\n * Register an event handler for messages from controllers.\n *\n * Can be called before the Screen is ready. Handlers registered before ready\n * are queued and activated when the transport becomes available.\n */\n on<K extends EventNames<TEvents>>(\n event: K,\n handler: ScreenEventHandler<EventData<TEvents, K>>\n ): () => void {\n validateEventName(event);\n\n let handlers = this.eventHandlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this.eventHandlers.set(event, handlers);\n }\n handlers.add(handler as ScreenEventHandler<unknown>);\n\n // If transport ready, register immediately\n if (this.transport) {\n const wrappedHandler = (data: unknown) => {\n this.logger.receive(event, data);\n const payload = data as { playerIndex?: number };\n const { playerIndex, ...rest } = payload as { playerIndex?: number; [key: string]: unknown };\n if (typeof playerIndex === 'number') {\n try {\n handler(playerIndex, rest as EventData<TEvents, K>);\n } catch (err) {\n this.handleError(\n new SmoreSDKError('UNKNOWN', `Error in handler for event \"${event}\"`, {\n cause: err instanceof Error ? err : undefined,\n })\n );\n }\n } else {\n this.logger.debug(`Dropping event \"${event}\" without playerIndex`, data);\n }\n };\n this.registerTransportHandler(event, wrappedHandler);\n this.handlerToTransport.set(handler as Function, { event, transportHandler: wrappedHandler });\n } else {\n // Store for later registration when transport becomes available\n this._pendingHandlers.push({ event: event as string, handler: handler as ScreenEventHandler<unknown> });\n }\n\n // Return unsubscribe function\n return () => {\n handlers?.delete(handler as ScreenEventHandler<unknown>);\n if (handlers?.size === 0) {\n this.eventHandlers.delete(event);\n }\n\n // Remove from pending if not yet registered\n this._pendingHandlers = this._pendingHandlers.filter(\n p => !(p.event === event && p.handler === handler)\n );\n\n // Remove from transport if registered\n const entry = this.handlerToTransport.get(handler as Function);\n if (entry) {\n this.transport?.off(event, entry.transportHandler);\n this.registeredTransportHandlers = this.registeredTransportHandlers.filter(\n h => h.handler !== entry.transportHandler\n );\n this.handlerToTransport.delete(handler as Function);\n }\n };\n }\n\n /**\n * Register an event handler that will be called only once.\n *\n * The handler is automatically removed after the first invocation.\n *\n * **Important:** The wrapped handler cannot be removed via `off(event, originalHandler)`.\n * Use the returned unsubscribe function instead.\n *\n * @param event - Event name to listen for\n * @param handler - Handler function to call once\n * @returns Unsubscribe function to remove the handler before it fires\n */\n once<K extends EventNames<TEvents>>(\n event: K,\n handler: ScreenEventHandler<EventData<TEvents, K>>\n ): () => void {\n const wrappedHandler: ScreenEventHandler<EventData<TEvents, K>> = (playerIndex, data) => {\n unsubscribe();\n handler(playerIndex, data);\n };\n const unsubscribe = this.on(event, wrappedHandler);\n return unsubscribe;\n }\n\n off<K extends EventNames<TEvents>>(\n event: K,\n handler?: ScreenEventHandler<EventData<TEvents, K>>\n ): void {\n if (!handler) {\n // Remove all handlers for this event\n this.eventHandlers.delete(event);\n this.transport?.off(event);\n this.registeredTransportHandlers = this.registeredTransportHandlers.filter(h => h.event !== event);\n for (const [key, val] of this.handlerToTransport) {\n if (val.event === event) this.handlerToTransport.delete(key);\n }\n // Remove from pending\n this._pendingHandlers = this._pendingHandlers.filter(p => p.event !== event);\n } else {\n const handlers = this.eventHandlers.get(event);\n handlers?.delete(handler as ScreenEventHandler<unknown>);\n if (handlers?.size === 0) {\n this.eventHandlers.delete(event);\n }\n // Remove specific transport handler\n const entry = this.handlerToTransport.get(handler as Function);\n if (entry) {\n this.transport?.off(event, entry.transportHandler);\n this.registeredTransportHandlers = this.registeredTransportHandlers.filter(\n h => h.handler !== entry.transportHandler\n );\n this.handlerToTransport.delete(handler as Function);\n }\n // Remove from pending\n this._pendingHandlers = this._pendingHandlers.filter(\n p => !(p.event === event && p.handler === handler)\n );\n }\n }\n\n // ---------------------------------------------------------------------------\n // Utilities\n // ---------------------------------------------------------------------------\n\n getController(playerIndex: PlayerIndex): ControllerInfo | undefined {\n return this._controllers.find((c) => c.playerIndex === playerIndex);\n }\n\n getControllerCount(): number {\n return this._controllers.filter((c) => c.connected).length;\n }\n\n hasAnyConnectedControllers(): boolean {\n return this._controllers.some((c) => c.connected);\n }\n\n // ---------------------------------------------------------------------------\n // Cleanup\n // ---------------------------------------------------------------------------\n\n destroy(): void {\n if (this._isDestroyed) return;\n\n this.logger.lifecycle('Destroying screen...');\n this._isDestroyed = true;\n this._isReady = false;\n\n this.cleanup();\n this.logger.lifecycle('Screen destroyed');\n }\n\n private cleanup(): void {\n // Clear init timeout if still pending\n if (this._initTimeoutId) {\n clearTimeout(this._initTimeoutId);\n this._initTimeoutId = null;\n }\n\n // Remove all registered transport handlers\n for (const { event, handler } of this.registeredTransportHandlers) {\n this.transport?.off(event, handler);\n }\n this.registeredTransportHandlers = [];\n\n // Clear event handlers\n this.eventHandlers.clear();\n this.handlerToTransport.clear();\n this._pendingHandlers = [];\n\n // Clear lifecycle callbacks\n this._onAllReadyCallbacks.clear();\n this._onControllerJoinCallbacks.clear();\n this._onControllerLeaveCallbacks.clear();\n this._onControllerDisconnectCallbacks.clear();\n this._onControllerReconnectCallbacks.clear();\n this._onCharacterUpdatedCallbacks.clear();\n this._onRateLimitedCallbacks.clear();\n this._onErrorCallbacks.clear();\n\n // Destroy transport\n if (this.transport instanceof PostMessageTransport) {\n this.transport.destroy();\n }\n this.transport = null;\n\n // Remove message listener\n if (this.boundMessageHandler) {\n window.removeEventListener('message', this.boundMessageHandler);\n this.boundMessageHandler = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Error Handling\n // ---------------------------------------------------------------------------\n\n private handleError(error: SmoreSDKError): void {\n // Always log at warn level so errors are never completely silent\n this.logger.warn(`Error in handler: ${error.message}`);\n const smoreError = error.toSmoreError();\n if (this._onErrorCallbacks.size > 0) {\n this._onErrorCallbacks.forEach(cb => cb(smoreError));\n } else {\n this.logger.error(error.message, error.details);\n }\n }\n\n private ensureReady(method: string): void {\n if (this._isDestroyed) {\n throw new SmoreSDKError(\n 'DESTROYED',\n `Cannot call ${method}() after destroy()`,\n { details: { method } }\n );\n }\n if (!this._isReady || !this.transport) {\n throw new SmoreSDKError(\n 'NOT_READY',\n `Cannot call ${method}() before screen is ready. Use await screen.ready.`,\n { details: { method } }\n );\n }\n }\n}\n\n// =============================================================================\n// FACTORY FUNCTION\n// =============================================================================\n\n/**\n * Create a Screen instance for the host/TV side of your game.\n *\n * Returns a Screen instance synchronously. The screen begins listening\n * for the bridge init message immediately. Register event handlers and\n * lifecycle callbacks on the instance, then await `.ready` if needed.\n *\n * @template TEvents - Event map type for type-safe events\n * @param config - Screen configuration (debug, parentOrigin, timeout)\n * @returns Screen instance\n *\n * @example\n * ```ts\n * const screen = createScreen<MyEvents>({ debug: true });\n *\n * screen.on('tap', (playerIndex, data) => {\n * screen.broadcast('round-result', { winner: playerIndex });\n * });\n *\n * screen.onAllReady(() => startGame());\n * screen.onControllerJoin((pi, info) => addPlayer(pi, info));\n *\n * await screen.ready;\n * ```\n */\nexport function createScreen<TEvents extends EventMap = EventMap>(\n config?: ScreenConfig<TEvents>\n): Screen<TEvents> {\n return new ScreenImpl<TEvents>(config);\n}\n"],"names":["SmoreSDKError","DebugLogger","isBridgeMessage","validateInitPayload","PostMessageTransport","getGlobalConfig","SMORE_EVENTS","validateEventName"],"mappings":"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"}