@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,65 +1,44 @@
1
1
  /**
2
2
  * createController - Factory function for creating a Controller instance.
3
3
  *
4
- * Returns a Promise that resolves when the controller is ready and initialized.
5
- * Uses PostMessageTransport for iframe communication with parent window.
4
+ * Returns a Controller instance synchronously. The controller begins listening
5
+ * for the bridge init message immediately. Use `.ready` to await full
6
+ * initialization, and `.on()` / lifecycle methods to register handlers
7
+ * (can be called before ready).
6
8
  *
7
- * @example Promise-based (recommended)
9
+ * @example
8
10
  * ```ts
9
- * const controller = await createController<MyEvents>({
10
- * listeners: {
11
- * 'phase-update': (data) => setPhase(data.phase),
12
- * },
13
- * });
11
+ * const controller = createController<MyEvents>({ debug: true });
14
12
  *
15
- * console.log(`Ready! My index: ${controller.myIndex}`);
16
- * controller.send('tap', { x: 100, y: 200 });
17
- * ```
13
+ * controller.on('phase-update', (data) => setPhase(data.phase));
14
+ * controller.onAllReady(() => console.log('Ready!'));
18
15
  *
19
- * @example Callback-based
20
- * ```ts
21
- * const controller = createController<MyEvents>({
22
- * onReady: () => {
23
- * console.log('Ready!');
24
- * },
25
- * listeners: { ... },
26
- * });
27
- * // Use controller.instance for immediate access
16
+ * await controller.ready;
17
+ * controller.send('tap', { x: 100, y: 200 });
28
18
  * ```
29
19
  */
30
20
  import type { Controller, ControllerConfig, EventMap } from './types';
31
21
  /**
32
22
  * Create a Controller instance for the player/phone side of your game.
33
23
  *
34
- * Returns a Promise that resolves when the controller is ready.
35
- * The returned object also has an `instance` property for immediate access.
24
+ * Returns a Controller instance synchronously. The controller begins listening
25
+ * for the bridge init message immediately. Register event handlers and
26
+ * lifecycle callbacks on the instance, then await `.ready` if needed.
36
27
  *
37
28
  * @template TEvents - Event map type for type-safe events
38
- * @param config - Controller configuration
39
- * @returns Promise that resolves to the Controller instance when ready
29
+ * @param config - Controller configuration (debug, parentOrigin, timeout)
30
+ * @returns Controller instance
40
31
  *
41
- * @example Promise-based (recommended)
32
+ * @example
42
33
  * ```ts
43
- * const controller = await createController<MyEvents>({
44
- * listeners: {
45
- * 'phase-update': (data) => setPhase(data.phase),
46
- * },
47
- * });
34
+ * const controller = createController<MyEvents>({ debug: true });
48
35
  *
49
- * controller.send('tap', { x: 100, y: 200 });
50
- * ```
36
+ * controller.on('phase-update', (data) => setPhase(data.phase));
37
+ * controller.onAllReady(() => console.log('Ready!'));
51
38
  *
52
- * @example Callback-based
53
- * ```ts
54
- * const result = createController<MyEvents>({
55
- * onReady: () => {
56
- * result.instance.send('ready', {});
57
- * },
58
- * listeners: { ... },
59
- * });
39
+ * await controller.ready;
40
+ * controller.send('tap', { x: 100, y: 200 });
60
41
  * ```
61
42
  */
62
- export declare function createController<TEvents extends EventMap = EventMap>(config?: ControllerConfig<TEvents>): Promise<Controller<TEvents>> & {
63
- instance: Controller<TEvents>;
64
- };
43
+ export declare function createController<TEvents extends EventMap = EventMap>(config?: ControllerConfig<TEvents>): Controller<TEvents>;
65
44
  //# sourceMappingURL=controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAIhB,QAAQ,EAIT,MAAM,SAAS,CAAC;AAosBjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EAClE,MAAM,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,GACjC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG;IAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;CAAE,CAUlE"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAIhB,QAAQ,EAMT,MAAM,SAAS,CAAC;AA0wBjB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EAClE,MAAM,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,GACjC,UAAU,CAAC,OAAO,CAAC,CAErB"}
@@ -2,7 +2,7 @@
2
2
  * S'MORE Game SDK
3
3
  *
4
4
  * Pure SDK package for building party games.
5
- * Provides factory-based API with type-safe events.
5
+ * Provides event emitter pattern API with type-safe events.
6
6
  *
7
7
  * Works in any environment: React, Phaser, Vanilla JS.
8
8
  *
@@ -10,13 +10,13 @@
10
10
  * ```ts
11
11
  * import { createScreen } from '@smoregg/sdk';
12
12
  *
13
- * const screen = await createScreen<MyEvents>({
14
- * onControllerJoin: (playerIndex) => console.log('Player joined:', playerIndex),
15
- * listeners: {
16
- * tap: (playerIndex, data) => handleTap(playerIndex),
17
- * },
18
- * });
13
+ * const screen = createScreen<MyEvents>({ debug: true });
19
14
  *
15
+ * screen.on('tap', (playerIndex, data) => handleTap(playerIndex, data));
16
+ * screen.onAllReady(() => startGame());
17
+ * screen.onControllerJoin((pi, info) => console.log('Player joined:', pi));
18
+ *
19
+ * await screen.ready;
20
20
  * screen.broadcast('phase-update', { phase: 'playing' });
21
21
  * screen.gameOver({ scores: { 0: 100, 1: 50 } });
22
22
  * ```
@@ -25,13 +25,13 @@
25
25
  * ```ts
26
26
  * import { createController } from '@smoregg/sdk';
27
27
  *
28
- * const controller = await createController<MyEvents>({
29
- * listeners: {
30
- * 'phase-update': (data) => handlePhase(data.phase),
31
- * },
32
- * });
28
+ * const controller = createController<MyEvents>({ debug: true });
29
+ *
30
+ * controller.on('phase-update', (data) => handlePhase(data.phase));
31
+ * controller.onAllReady(() => console.log('Ready!'));
33
32
  *
34
- * console.log('Ready! My index:', controller.myIndex);
33
+ * await controller.ready;
34
+ * console.log('My index:', controller.myIndex);
35
35
  * controller.send('tap', { timestamp: Date.now() });
36
36
  * ```
37
37
  */
@@ -41,7 +41,7 @@ export { SmoreSDKError } from './errors';
41
41
  export { validateEventName } from './events';
42
42
  export { configure } from './config';
43
43
  export type { SmoreGlobalConfig } from './config';
44
- export type { PlayerIndex, RoomCode, EventMap, EventNames, EventData, Controller, ControllerConfig, ControllerEventHandler, ControllerListeners, ControllerInfo, CharacterAppearance, Screen, ScreenConfig, ScreenEventHandler, ScreenListeners, GameResults, SmoreError, SmoreErrorCode, LogLevel, DebugOptions, GameMetadata, } from './types';
44
+ export type { PlayerIndex, RoomCode, EventMap, EventNames, EventData, Controller, ControllerConfig, ControllerEventHandler, ControllerInfo, CharacterAppearance, Screen, ScreenConfig, ScreenEventHandler, GameResults, SmoreError, SmoreErrorCode, LogLevel, DebugOptions, GameMetadata, } from './types';
45
45
  export { createMockScreen, createMockController } from './testing';
46
46
  export type { MockScreen, MockController, MockOptions } from './testing';
47
47
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,YAAY,EAEV,WAAW,EACX,QAAQ,EAER,QAAQ,EACR,UAAU,EACV,SAAS,EAET,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EAEnB,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAEf,WAAW,EAEX,UAAU,EACV,cAAc,EAEd,QAAQ,EACR,YAAY,EAEZ,YAAY,GACb,MAAM,SAAS,CAAC;AAMjB,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACnE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,YAAY,EAEV,WAAW,EACX,QAAQ,EAER,QAAQ,EACR,UAAU,EACV,SAAS,EAET,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EAEnB,MAAM,EACN,YAAY,EACZ,kBAAkB,EAElB,WAAW,EAEX,UAAU,EACV,cAAc,EAEd,QAAQ,EACR,YAAY,EAEZ,YAAY,GACb,MAAM,SAAS,CAAC;AAMjB,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACnE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
@@ -1,66 +1,55 @@
1
1
  /**
2
2
  * createScreen - Factory function for Screen instances (Host/TV side)
3
3
  *
4
- * Promise-based factory with type-safe event handling and comprehensive error management.
4
+ * Synchronous factory with event emitter pattern. Returns a Screen instance
5
+ * immediately. Use `.ready` to await full initialization, and `.on()` /
6
+ * lifecycle methods to register handlers (can be called before ready).
5
7
  *
6
- * @example Promise-based (recommended)
8
+ * @example
7
9
  * ```ts
8
10
  * interface MyEvents {
9
11
  * tap: { x: number; y: number };
10
12
  * 'phase-update': { phase: 'lobby' | 'playing' | 'results' };
11
13
  * }
12
14
  *
13
- * const screen = await createScreen<MyEvents>({
14
- * listeners: {
15
- * tap: (playerIndex, data) => console.log(`Player ${playerIndex} tapped at`, data.x, data.y),
16
- * },
15
+ * const screen = createScreen<MyEvents>({ debug: true });
16
+ *
17
+ * screen.on('tap', (playerIndex, data) => {
18
+ * console.log(`Player ${playerIndex} tapped at`, data.x, data.y);
17
19
  * });
18
20
  *
19
- * screen.broadcast('phase-update', { phase: 'playing' });
20
- * ```
21
+ * screen.onAllReady(() => startGame());
22
+ * screen.onControllerJoin((pi, info) => addPlayer(pi, info));
21
23
  *
22
- * @example Callback-based
23
- * ```ts
24
- * const screen = createScreen<MyEvents>({
25
- * onReady: () => screen.broadcast('ready', {}),
26
- * listeners: { ... },
27
- * });
28
- * // Use screen.instance for immediate access
24
+ * await screen.ready;
25
+ * screen.broadcast('phase-update', { phase: 'playing' });
29
26
  * ```
30
27
  */
31
28
  import type { EventMap, Screen, ScreenConfig } from './types';
32
29
  /**
33
30
  * Create a Screen instance for the host/TV side of your game.
34
31
  *
35
- * Returns a Promise that resolves when the screen is ready.
36
- * The promise also has an `instance` property for immediate access (use with onReady callback).
32
+ * Returns a Screen instance synchronously. The screen begins listening
33
+ * for the bridge init message immediately. Register event handlers and
34
+ * lifecycle callbacks on the instance, then await `.ready` if needed.
37
35
  *
38
36
  * @template TEvents - Event map type for type-safe events
39
- * @param config - Screen configuration
40
- * @returns Promise that resolves to the Screen instance when ready
37
+ * @param config - Screen configuration (debug, parentOrigin, timeout)
38
+ * @returns Screen instance
41
39
  *
42
- * @example Promise-based (recommended)
40
+ * @example
43
41
  * ```ts
44
- * const screen = await createScreen<MyEvents>({
45
- * listeners: {
46
- * tap: (playerIndex, data) => handleTap(playerIndex, data),
47
- * },
42
+ * const screen = createScreen<MyEvents>({ debug: true });
43
+ *
44
+ * screen.on('tap', (playerIndex, data) => {
45
+ * screen.broadcast('round-result', { winner: playerIndex });
48
46
  * });
49
47
  *
50
- * screen.broadcast('game-start', { countdown: 3 });
51
- * ```
48
+ * screen.onAllReady(() => startGame());
49
+ * screen.onControllerJoin((pi, info) => addPlayer(pi, info));
52
50
  *
53
- * @example Callback-based
54
- * ```ts
55
- * const { instance: screen } = createScreen<MyEvents>({
56
- * onReady: () => {
57
- * screen.broadcast('game-start', { countdown: 3 });
58
- * },
59
- * listeners: { ... },
60
- * });
51
+ * await screen.ready;
61
52
  * ```
62
53
  */
63
- export declare function createScreen<TEvents extends EventMap = EventMap>(config?: ScreenConfig<TEvents>): Promise<Screen<TEvents>> & {
64
- instance: Screen<TEvents>;
65
- };
54
+ export declare function createScreen<TEvents extends EventMap = EventMap>(config?: ScreenConfig<TEvents>): Screen<TEvents>;
66
55
  //# sourceMappingURL=screen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/screen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EACV,QAAQ,EAGR,MAAM,EACN,YAAY,EAMb,MAAM,SAAS,CAAC;AA6wBjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,YAAY,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EAC9D,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;CAAE,CAU1D"}
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/screen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EACV,QAAQ,EAGR,MAAM,EACN,YAAY,EAQb,MAAM,SAAS,CAAC;AA8zBjB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EAC9D,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,GAC7B,MAAM,CAAC,OAAO,CAAC,CAEjB"}
@@ -4,6 +4,10 @@
4
4
  * Mock implementations of Screen and Controller for unit testing.
5
5
  * All methods work synchronously for predictable test execution.
6
6
  *
7
+ * Mocks use the same event emitter pattern as the real implementations:
8
+ * lifecycle callbacks are registered via methods (onAllReady, onControllerJoin, etc.)
9
+ * on the returned instance rather than via config options.
10
+ *
7
11
  * @packageDocumentation
8
12
  */
9
13
  import type { EventMap, MockScreen, MockController, MockOptions } from './types';
@@ -13,6 +17,9 @@ import type { EventMap, MockScreen, MockController, MockOptions } from './types'
13
17
  * All methods work synchronously. Events can be simulated and recorded
14
18
  * for assertions in unit tests.
15
19
  *
20
+ * Uses the same event emitter pattern as real Screen: register lifecycle
21
+ * callbacks via methods on the returned instance.
22
+ *
16
23
  * @example
17
24
  * ```ts
18
25
  * const screen = createMockScreen<MyEvents>({
@@ -22,6 +29,9 @@ import type { EventMap, MockScreen, MockController, MockOptions } from './types'
22
29
  * ],
23
30
  * });
24
31
  *
32
+ * screen.on('tap', (pi, data) => handleTap(pi, data));
33
+ * screen.onAllReady(() => startGame());
34
+ *
25
35
  * // Simulate player input
26
36
  * screen.simulateEvent(0, 'tap', { x: 100, y: 200 });
27
37
  *
@@ -39,12 +49,18 @@ export declare function createMockScreen<TEvents extends EventMap = EventMap>(op
39
49
  * All methods work synchronously. Events can be simulated and recorded
40
50
  * for assertions in unit tests.
41
51
  *
52
+ * Uses the same event emitter pattern as real Controller: register lifecycle
53
+ * callbacks via methods on the returned instance.
54
+ *
42
55
  * @example
43
56
  * ```ts
44
57
  * const controller = createMockController<MyEvents>({
45
58
  * myIndex: 0,
46
59
  * });
47
60
  *
61
+ * controller.on('your-turn', (data) => handleTurn(data));
62
+ * controller.onAllReady(() => console.log('Ready!'));
63
+ *
48
64
  * // Simulate receiving from screen
49
65
  * controller.simulateEvent('your-turn', { timeLimit: 30 });
50
66
  *
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,QAAQ,EASR,UAAU,EACV,cAAc,EACd,WAAW,EACZ,MAAM,SAAS,CAAC;AAkBjB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EAClE,OAAO,GAAE,WAAgB,GACxB,UAAU,CAAC,OAAO,CAAC,CAgXrB;AAWD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EACtE,OAAO,GAAE,WAAgB,GACxB,cAAc,CAAC,OAAO,CAAC,CAiTzB;AAMD,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,QAAQ,EASR,UAAU,EACV,cAAc,EACd,WAAW,EAEZ,MAAM,SAAS,CAAC;AAkBjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EAClE,OAAO,GAAE,WAAgB,GACxB,UAAU,CAAC,OAAO,CAAC,CA+WrB;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EACtE,OAAO,GAAE,WAAgB,GACxB,cAAc,CAAC,OAAO,CAAC,CAoSzB;AAMD,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC"}