@smoregg/sdk 0.5.0 → 0.6.1

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 (40) hide show
  1. package/README.md +199 -0
  2. package/dist/cjs/controller.cjs +379 -0
  3. package/dist/cjs/controller.cjs.map +1 -0
  4. package/dist/cjs/index.cjs +8 -4
  5. package/dist/cjs/index.cjs.map +1 -1
  6. package/dist/cjs/screen.cjs +526 -0
  7. package/dist/cjs/screen.cjs.map +1 -0
  8. package/dist/cjs/testing.cjs +257 -0
  9. package/dist/cjs/testing.cjs.map +1 -0
  10. package/dist/cjs/transport/protocol.cjs.map +1 -1
  11. package/dist/esm/controller.js +376 -0
  12. package/dist/esm/controller.js.map +1 -0
  13. package/dist/esm/index.js +3 -2
  14. package/dist/esm/index.js.map +1 -1
  15. package/dist/esm/screen.js +523 -0
  16. package/dist/esm/screen.js.map +1 -0
  17. package/dist/esm/testing.js +254 -0
  18. package/dist/esm/testing.js.map +1 -0
  19. package/dist/esm/transport/protocol.js.map +1 -1
  20. package/dist/types/controller.d.ts +78 -0
  21. package/dist/types/controller.d.ts.map +1 -0
  22. package/dist/types/index.d.ts +17 -18
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/dist/types/screen.d.ts +79 -0
  25. package/dist/types/screen.d.ts.map +1 -0
  26. package/dist/types/testing.d.ts +61 -0
  27. package/dist/types/testing.d.ts.map +1 -0
  28. package/dist/types/transport/protocol.d.ts +1 -4
  29. package/dist/types/transport/protocol.d.ts.map +1 -1
  30. package/dist/types/types.d.ts +869 -4
  31. package/dist/types/types.d.ts.map +1 -1
  32. package/dist/umd/smore-sdk-vanilla.umd.js +956 -331
  33. package/dist/umd/smore-sdk-vanilla.umd.js.map +1 -1
  34. package/dist/umd/smore-sdk-vanilla.umd.min.js +1 -1
  35. package/dist/umd/smore-sdk-vanilla.umd.min.js.map +1 -1
  36. package/dist/umd/smore-sdk.umd.js +956 -331
  37. package/dist/umd/smore-sdk.umd.js.map +1 -1
  38. package/dist/umd/smore-sdk.umd.min.js +1 -1
  39. package/dist/umd/smore-sdk.umd.min.js.map +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,526 @@
1
+ 'use strict';
2
+
3
+ var PostMessageTransport = require('./transport/PostMessageTransport.cjs');
4
+ var protocol = require('./transport/protocol.cjs');
5
+
6
+ const SYSTEM_PREFIX = "smore:";
7
+ const SYSTEM_EVENTS = {
8
+ PLAYER_JOIN: `${SYSTEM_PREFIX}player-join`,
9
+ PLAYER_LEAVE: `${SYSTEM_PREFIX}player-leave`,
10
+ PLAYER_RECONNECT: `${SYSTEM_PREFIX}player-reconnect`,
11
+ GAME_OVER: `${SYSTEM_PREFIX}game-over`
12
+ };
13
+ const DEFAULT_TIMEOUT = 1e4;
14
+ class SmoreSDKError extends Error {
15
+ code;
16
+ cause;
17
+ details;
18
+ constructor(code, message, options) {
19
+ super(message);
20
+ this.name = "SmoreSDKError";
21
+ this.code = code;
22
+ this.cause = options?.cause;
23
+ this.details = options?.details;
24
+ const ErrorWithCapture = Error;
25
+ if (typeof ErrorWithCapture.captureStackTrace === "function") {
26
+ ErrorWithCapture.captureStackTrace(this, SmoreSDKError);
27
+ }
28
+ }
29
+ toSmoreError() {
30
+ return {
31
+ code: this.code,
32
+ message: this.message,
33
+ cause: this.cause,
34
+ details: this.details
35
+ };
36
+ }
37
+ }
38
+ const EVENT_NAME_REGEX = /^[a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])?$/;
39
+ function validateEventName(event) {
40
+ if (!event || typeof event !== "string") {
41
+ throw new SmoreSDKError("INVALID_EVENT", "Event name must be a non-empty string");
42
+ }
43
+ if (!EVENT_NAME_REGEX.test(event)) {
44
+ throw new SmoreSDKError(
45
+ "INVALID_EVENT",
46
+ `Invalid event name "${event}". Event names must start with a letter, contain only letters, numbers, hyphens, or underscores, and end with a letter or number.`,
47
+ { details: { event } }
48
+ );
49
+ }
50
+ }
51
+ function validatePlayerIndex(playerIndex, controllersCount) {
52
+ if (typeof playerIndex !== "number" || !Number.isInteger(playerIndex)) {
53
+ throw new SmoreSDKError("INVALID_PLAYER", "Player index must be an integer");
54
+ }
55
+ if (playerIndex < 0 || playerIndex >= controllersCount) {
56
+ throw new SmoreSDKError(
57
+ "INVALID_PLAYER",
58
+ `Invalid player index ${playerIndex}. Valid range: 0-${controllersCount - 1}`,
59
+ { details: { playerIndex, controllersCount } }
60
+ );
61
+ }
62
+ }
63
+ class DebugLogger {
64
+ enabled;
65
+ level;
66
+ prefix;
67
+ logSend;
68
+ logReceive;
69
+ logLifecycle;
70
+ customLogger;
71
+ static levelOrder = {
72
+ debug: 0,
73
+ info: 1,
74
+ warn: 2,
75
+ error: 3
76
+ };
77
+ constructor(options) {
78
+ if (typeof options === "boolean") {
79
+ this.enabled = options;
80
+ this.level = "debug";
81
+ this.prefix = "[SmoreScreen]";
82
+ this.logSend = true;
83
+ this.logReceive = true;
84
+ this.logLifecycle = true;
85
+ } else if (options) {
86
+ this.enabled = options.enabled ?? false;
87
+ this.level = options.level ?? "debug";
88
+ this.prefix = options.prefix ?? "[SmoreScreen]";
89
+ this.logSend = options.logSend ?? true;
90
+ this.logReceive = options.logReceive ?? true;
91
+ this.logLifecycle = options.logLifecycle ?? true;
92
+ this.customLogger = options.logger;
93
+ } else {
94
+ this.enabled = false;
95
+ this.level = "debug";
96
+ this.prefix = "[SmoreScreen]";
97
+ this.logSend = true;
98
+ this.logReceive = true;
99
+ this.logLifecycle = true;
100
+ }
101
+ }
102
+ shouldLog(level) {
103
+ return this.enabled && DebugLogger.levelOrder[level] >= DebugLogger.levelOrder[this.level];
104
+ }
105
+ log(level, message, data) {
106
+ if (!this.shouldLog(level)) return;
107
+ if (this.customLogger) {
108
+ this.customLogger(level, `${this.prefix} ${message}`, data);
109
+ return;
110
+ }
111
+ const consoleMethod = level === "error" ? "error" : level === "warn" ? "warn" : "log";
112
+ if (data !== void 0) {
113
+ console[consoleMethod](`${this.prefix} ${message}`, data);
114
+ } else {
115
+ console[consoleMethod](`${this.prefix} ${message}`);
116
+ }
117
+ }
118
+ debug(message, data) {
119
+ this.log("debug", message, data);
120
+ }
121
+ info(message, data) {
122
+ this.log("info", message, data);
123
+ }
124
+ warn(message, data) {
125
+ this.log("warn", message, data);
126
+ }
127
+ error(message, data) {
128
+ this.log("error", message, data);
129
+ }
130
+ send(event, data) {
131
+ if (this.logSend) {
132
+ this.debug(`-> SEND: ${event}`, data);
133
+ }
134
+ }
135
+ receive(event, data) {
136
+ if (this.logReceive) {
137
+ this.debug(`<- RECV: ${event}`, data);
138
+ }
139
+ }
140
+ lifecycle(message, data) {
141
+ if (this.logLifecycle) {
142
+ this.info(`[Lifecycle] ${message}`, data);
143
+ }
144
+ }
145
+ }
146
+ class ScreenImpl {
147
+ transport = null;
148
+ config;
149
+ logger;
150
+ _controllers = [];
151
+ _roomCode = "";
152
+ _leaderIndex = -1;
153
+ _isReady = false;
154
+ _isDestroyed = false;
155
+ eventHandlers = /* @__PURE__ */ new Map();
156
+ registeredTransportHandlers = [];
157
+ boundMessageHandler = null;
158
+ constructor(config = {}) {
159
+ this.config = config;
160
+ this.logger = new DebugLogger(config.debug);
161
+ if (config.listeners) {
162
+ for (const event of Object.keys(config.listeners)) {
163
+ validateEventName(event);
164
+ }
165
+ }
166
+ }
167
+ // ---------------------------------------------------------------------------
168
+ // Initialization (called by factory)
169
+ // ---------------------------------------------------------------------------
170
+ async initialize() {
171
+ this.logger.lifecycle("Initializing screen...");
172
+ const parentOrigin = this.config.parentOrigin ?? "*";
173
+ const timeout = this.config.timeout ?? DEFAULT_TIMEOUT;
174
+ return new Promise((resolve, reject) => {
175
+ const timeoutId = setTimeout(() => {
176
+ this.cleanup();
177
+ const error = new SmoreSDKError(
178
+ "TIMEOUT",
179
+ `Screen initialization timed out after ${timeout}ms. Make sure the parent frame sends smore:init.`,
180
+ { details: { timeout } }
181
+ );
182
+ this.handleError(error);
183
+ reject(error);
184
+ }, timeout);
185
+ this.boundMessageHandler = (e) => {
186
+ if (parentOrigin !== "*" && e.origin !== parentOrigin) return;
187
+ const msg = e.data;
188
+ if (!protocol.isSmoreMessage(msg)) return;
189
+ if (msg.type === "smore:init") {
190
+ clearTimeout(timeoutId);
191
+ const initData = msg.payload;
192
+ if (initData.side !== "host") {
193
+ const error = new SmoreSDKError(
194
+ "INIT_FAILED",
195
+ `Received init for wrong side: ${initData.side}. Expected "host".`,
196
+ { details: { side: initData.side } }
197
+ );
198
+ this.handleError(error);
199
+ reject(error);
200
+ return;
201
+ }
202
+ this.transport = new PostMessageTransport.PostMessageTransport(parentOrigin);
203
+ this._roomCode = initData.roomCode;
204
+ this._controllers = this.mapControllersFromInit(initData.players);
205
+ this._leaderIndex = this.findLeaderIndex(initData.players, initData.leaderId);
206
+ this.setupEventHandlers();
207
+ this._isReady = true;
208
+ this.logger.lifecycle("Screen ready", {
209
+ roomCode: this._roomCode,
210
+ controllers: this._controllers.length,
211
+ leaderIndex: this._leaderIndex
212
+ });
213
+ this.config.onReady?.();
214
+ resolve();
215
+ } else if (msg.type === "smore:update") {
216
+ const updateData = msg.payload;
217
+ if (updateData.players) {
218
+ this._controllers = this.mapControllersFromInit(updateData.players);
219
+ }
220
+ if (updateData.leaderId !== void 0) {
221
+ this._leaderIndex = this.findLeaderIndex(
222
+ updateData.players ?? [],
223
+ updateData.leaderId
224
+ );
225
+ }
226
+ this.logger.lifecycle("Room updated", {
227
+ controllers: this._controllers.length,
228
+ leaderIndex: this._leaderIndex
229
+ });
230
+ }
231
+ };
232
+ window.addEventListener("message", this.boundMessageHandler);
233
+ window.parent.postMessage({ type: "smore:ready" }, parentOrigin);
234
+ this.logger.lifecycle("Sent smore:ready to parent");
235
+ });
236
+ }
237
+ mapControllersFromInit(players) {
238
+ return players.map((p, index) => ({
239
+ playerIndex: p.playerIndex ?? index,
240
+ nickname: p.nickname || `Player ${index + 1}`,
241
+ connected: p.connected !== false,
242
+ appearance: p.appearance
243
+ }));
244
+ }
245
+ findLeaderIndex(players, leaderId) {
246
+ if (!leaderId) return -1;
247
+ const idx = players.findIndex(
248
+ (p) => p.sessionId === leaderId
249
+ );
250
+ return idx >= 0 ? idx : -1;
251
+ }
252
+ setupEventHandlers() {
253
+ if (!this.transport) return;
254
+ this.registerTransportHandler(SYSTEM_EVENTS.PLAYER_JOIN, (data) => {
255
+ const payload = data;
256
+ const player = payload?.player;
257
+ if (player && typeof player.playerIndex === "number") {
258
+ this.logger.lifecycle("Controller joined", { playerIndex: player.playerIndex });
259
+ this.config.onControllerJoin?.(player.playerIndex, player);
260
+ }
261
+ });
262
+ this.registerTransportHandler(SYSTEM_EVENTS.PLAYER_LEAVE, (data) => {
263
+ const payload = data;
264
+ if (typeof payload?.playerIndex === "number") {
265
+ this.logger.lifecycle("Controller left", { playerIndex: payload.playerIndex });
266
+ this.config.onControllerLeave?.(payload.playerIndex);
267
+ }
268
+ });
269
+ this.registerTransportHandler(SYSTEM_EVENTS.PLAYER_RECONNECT, (data) => {
270
+ const payload = data;
271
+ const player = payload?.player;
272
+ if (player && typeof player.playerIndex === "number") {
273
+ this.logger.lifecycle("Controller reconnected", { playerIndex: player.playerIndex });
274
+ this.config.onControllerReconnect?.(player.playerIndex, player);
275
+ }
276
+ });
277
+ this.registerTransportHandler("room:player-joined", (data) => {
278
+ const payload = data;
279
+ const playerIndex = payload?.player?.playerIndex ?? payload?.playerIndex;
280
+ if (typeof playerIndex === "number") {
281
+ this.config.onControllerJoin?.(playerIndex, {
282
+ playerIndex,
283
+ nickname: `Player ${playerIndex + 1}`,
284
+ connected: true
285
+ });
286
+ }
287
+ });
288
+ this.registerTransportHandler("room:player-left", (data) => {
289
+ const payload = data;
290
+ const playerIndex = payload?.playerIndex ?? payload?.player?.playerIndex;
291
+ if (typeof playerIndex === "number") {
292
+ this.config.onControllerLeave?.(playerIndex);
293
+ }
294
+ });
295
+ if (this.config.listeners) {
296
+ for (const [event, handler] of Object.entries(this.config.listeners)) {
297
+ if (!handler) continue;
298
+ this.setupUserEventHandler(event, handler);
299
+ }
300
+ }
301
+ }
302
+ setupUserEventHandler(event, handler) {
303
+ const wrappedHandler = (data) => {
304
+ this.logger.receive(event, data);
305
+ const payload = data;
306
+ const { playerIndex, ...rest } = payload;
307
+ if (typeof playerIndex === "number") {
308
+ try {
309
+ handler(playerIndex, rest);
310
+ } catch (err) {
311
+ this.handleError(
312
+ new SmoreSDKError("UNKNOWN", `Error in handler for event "${event}"`, {
313
+ cause: err instanceof Error ? err : void 0,
314
+ details: { event, playerIndex }
315
+ })
316
+ );
317
+ }
318
+ }
319
+ };
320
+ this.registerTransportHandler(event, wrappedHandler);
321
+ let handlers = this.eventHandlers.get(event);
322
+ if (!handlers) {
323
+ handlers = /* @__PURE__ */ new Set();
324
+ this.eventHandlers.set(event, handlers);
325
+ }
326
+ handlers.add(handler);
327
+ }
328
+ registerTransportHandler(event, handler) {
329
+ if (!this.transport) return;
330
+ this.transport.on(event, handler);
331
+ this.registeredTransportHandlers.push({ event, handler });
332
+ }
333
+ // ---------------------------------------------------------------------------
334
+ // Properties (readonly)
335
+ // ---------------------------------------------------------------------------
336
+ get controllers() {
337
+ return [...this._controllers];
338
+ }
339
+ get roomCode() {
340
+ return this._roomCode;
341
+ }
342
+ get leaderIndex() {
343
+ return this._leaderIndex;
344
+ }
345
+ get isReady() {
346
+ return this._isReady;
347
+ }
348
+ get isDestroyed() {
349
+ return this._isDestroyed;
350
+ }
351
+ // ---------------------------------------------------------------------------
352
+ // Communication Methods
353
+ // ---------------------------------------------------------------------------
354
+ broadcast(event, data) {
355
+ this.ensureReady("broadcast");
356
+ validateEventName(event);
357
+ this.logger.send(event, data);
358
+ this.transport.emit(event, data);
359
+ }
360
+ broadcastRaw(event, data) {
361
+ this.ensureReady("broadcastRaw");
362
+ validateEventName(event);
363
+ this.logger.send(event, data);
364
+ this.transport.emit(event, data);
365
+ }
366
+ sendToController(playerIndex, event, data) {
367
+ this.ensureReady("sendToController");
368
+ validateEventName(event);
369
+ validatePlayerIndex(playerIndex, this._controllers.length);
370
+ this.logger.send(`${event} -> Player ${playerIndex}`, data);
371
+ this.transport.emit(event, {
372
+ targetPlayerIndex: playerIndex,
373
+ ...data && typeof data === "object" ? data : { data }
374
+ });
375
+ }
376
+ sendToControllerRaw(playerIndex, event, data) {
377
+ this.ensureReady("sendToControllerRaw");
378
+ validateEventName(event);
379
+ validatePlayerIndex(playerIndex, this._controllers.length);
380
+ this.logger.send(`${event} -> Player ${playerIndex}`, data);
381
+ this.transport.emit(event, {
382
+ targetPlayerIndex: playerIndex,
383
+ ...data && typeof data === "object" ? data : { data }
384
+ });
385
+ }
386
+ // ---------------------------------------------------------------------------
387
+ // Game Lifecycle
388
+ // ---------------------------------------------------------------------------
389
+ gameOver(results) {
390
+ this.ensureReady("gameOver");
391
+ this.logger.lifecycle("Game over", results);
392
+ this.transport.emit(SYSTEM_EVENTS.GAME_OVER, { results });
393
+ }
394
+ // ---------------------------------------------------------------------------
395
+ // Event Subscription
396
+ // ---------------------------------------------------------------------------
397
+ on(event, handler) {
398
+ validateEventName(event);
399
+ let handlers = this.eventHandlers.get(event);
400
+ if (!handlers) {
401
+ handlers = /* @__PURE__ */ new Set();
402
+ this.eventHandlers.set(event, handlers);
403
+ }
404
+ handlers.add(handler);
405
+ if (this.transport) {
406
+ const wrappedHandler = (data) => {
407
+ this.logger.receive(event, data);
408
+ const payload = data;
409
+ const { playerIndex, ...rest } = payload;
410
+ if (typeof playerIndex === "number") {
411
+ try {
412
+ handler(playerIndex, rest);
413
+ } catch (err) {
414
+ this.handleError(
415
+ new SmoreSDKError("UNKNOWN", `Error in handler for event "${event}"`, {
416
+ cause: err instanceof Error ? err : void 0
417
+ })
418
+ );
419
+ }
420
+ }
421
+ };
422
+ this.registerTransportHandler(event, wrappedHandler);
423
+ }
424
+ return () => {
425
+ handlers?.delete(handler);
426
+ if (handlers?.size === 0) {
427
+ this.eventHandlers.delete(event);
428
+ }
429
+ };
430
+ }
431
+ once(event, handler) {
432
+ const wrappedHandler = (playerIndex, data) => {
433
+ unsubscribe();
434
+ handler(playerIndex, data);
435
+ };
436
+ const unsubscribe = this.on(event, wrappedHandler);
437
+ return unsubscribe;
438
+ }
439
+ off(event, handler) {
440
+ if (!handler) {
441
+ this.eventHandlers.delete(event);
442
+ this.transport?.off(event);
443
+ } else {
444
+ const handlers = this.eventHandlers.get(event);
445
+ handlers?.delete(handler);
446
+ if (handlers?.size === 0) {
447
+ this.eventHandlers.delete(event);
448
+ }
449
+ }
450
+ }
451
+ // ---------------------------------------------------------------------------
452
+ // Utilities
453
+ // ---------------------------------------------------------------------------
454
+ getController(playerIndex) {
455
+ return this._controllers.find((c) => c.playerIndex === playerIndex);
456
+ }
457
+ isLeader(playerIndex) {
458
+ return playerIndex === this._leaderIndex;
459
+ }
460
+ getControllerCount() {
461
+ return this._controllers.filter((c) => c.connected).length;
462
+ }
463
+ // ---------------------------------------------------------------------------
464
+ // Cleanup
465
+ // ---------------------------------------------------------------------------
466
+ destroy() {
467
+ if (this._isDestroyed) return;
468
+ this.logger.lifecycle("Destroying screen...");
469
+ this._isDestroyed = true;
470
+ this._isReady = false;
471
+ this.cleanup();
472
+ this.logger.lifecycle("Screen destroyed");
473
+ }
474
+ cleanup() {
475
+ for (const { event, handler } of this.registeredTransportHandlers) {
476
+ this.transport?.off(event, handler);
477
+ }
478
+ this.registeredTransportHandlers = [];
479
+ this.eventHandlers.clear();
480
+ if (this.transport instanceof PostMessageTransport.PostMessageTransport) {
481
+ this.transport.destroy();
482
+ }
483
+ this.transport = null;
484
+ if (this.boundMessageHandler) {
485
+ window.removeEventListener("message", this.boundMessageHandler);
486
+ this.boundMessageHandler = null;
487
+ }
488
+ }
489
+ // ---------------------------------------------------------------------------
490
+ // Error Handling
491
+ // ---------------------------------------------------------------------------
492
+ handleError(error) {
493
+ const smoreError = error.toSmoreError();
494
+ if (this.config.onError) {
495
+ this.config.onError(smoreError);
496
+ } else {
497
+ this.logger.error(error.message, error.details);
498
+ }
499
+ }
500
+ ensureReady(method) {
501
+ if (this._isDestroyed) {
502
+ throw new SmoreSDKError(
503
+ "DESTROYED",
504
+ `Cannot call ${method}() after destroy()`,
505
+ { details: { method } }
506
+ );
507
+ }
508
+ if (!this._isReady || !this.transport) {
509
+ throw new SmoreSDKError(
510
+ "NOT_READY",
511
+ `Cannot call ${method}() before screen is ready. Use await createScreen() or onReady callback.`,
512
+ { details: { method } }
513
+ );
514
+ }
515
+ }
516
+ }
517
+ function createScreen(config) {
518
+ const screen = new ScreenImpl(config);
519
+ const promise = screen.initialize().then(() => screen);
520
+ promise.instance = screen;
521
+ return promise;
522
+ }
523
+
524
+ exports.SmoreSDKError = SmoreSDKError;
525
+ exports.createScreen = createScreen;
526
+ //# sourceMappingURL=screen.cjs.map
@@ -0,0 +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 SmoreError,\n SmoreErrorCode,\n DebugOptions,\n LogLevel,\n} from './types';\nimport type { Transport, TransportEventHandler } from './transport/types';\nimport { PostMessageTransport } from './transport/PostMessageTransport';\nimport { isSmoreMessage, type SmoreInitMessage, type SmoreUpdateMessage } from './transport/protocol';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SYSTEM_PREFIX = 'smore:';\n\nconst SYSTEM_EVENTS = {\n READY: `${SYSTEM_PREFIX}ready`,\n PLAYER_JOIN: `${SYSTEM_PREFIX}player-join`,\n PLAYER_LEAVE: `${SYSTEM_PREFIX}player-leave`,\n PLAYER_RECONNECT: `${SYSTEM_PREFIX}player-reconnect`,\n GAME_OVER: `${SYSTEM_PREFIX}game-over`,\n} as const;\n\nconst DEFAULT_TIMEOUT = 10000;\n\n// =============================================================================\n// ERROR CLASS\n// =============================================================================\n\n/**\n * Custom error class for SDK errors with structured error handling.\n */\nexport class SmoreSDKError extends Error {\n readonly code: SmoreErrorCode;\n readonly cause?: Error;\n readonly details?: Record<string, unknown>;\n\n constructor(\n code: SmoreErrorCode,\n message: string,\n options?: { cause?: Error; details?: Record<string, unknown> }\n ) {\n super(message);\n this.name = 'SmoreSDKError';\n this.code = code;\n this.cause = options?.cause;\n this.details = options?.details;\n\n // Maintain proper stack trace in V8 environments\n const ErrorWithCapture = Error as typeof Error & {\n captureStackTrace?: (target: object, constructor?: Function) => void;\n };\n if (typeof ErrorWithCapture.captureStackTrace === 'function') {\n ErrorWithCapture.captureStackTrace(this, SmoreSDKError);\n }\n }\n\n toSmoreError(): SmoreError {\n return {\n code: this.code,\n message: this.message,\n cause: this.cause,\n details: this.details,\n };\n }\n}\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\nconst EVENT_NAME_REGEX = /^[a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])?$/;\n\nfunction validateEventName(event: string): void {\n if (!event || typeof event !== 'string') {\n throw new SmoreSDKError('INVALID_EVENT', 'Event name must be a non-empty string');\n }\n if (!EVENT_NAME_REGEX.test(event)) {\n throw new SmoreSDKError(\n 'INVALID_EVENT',\n `Invalid event name \"${event}\". Event names must start with a letter, ` +\n `contain only letters, numbers, hyphens, or underscores, and end with a letter or number.`,\n { details: { event } }\n );\n }\n}\n\nfunction validatePlayerIndex(playerIndex: PlayerIndex, controllersCount: number): void {\n if (typeof playerIndex !== 'number' || !Number.isInteger(playerIndex)) {\n throw new SmoreSDKError('INVALID_PLAYER', 'Player index must be an integer');\n }\n if (playerIndex < 0 || playerIndex >= controllersCount) {\n throw new SmoreSDKError(\n 'INVALID_PLAYER',\n `Invalid player index ${playerIndex}. Valid range: 0-${controllersCount - 1}`,\n { details: { playerIndex, controllersCount } }\n );\n }\n}\n\n// =============================================================================\n// DEBUG LOGGER\n// =============================================================================\n\nclass DebugLogger {\n private enabled: boolean;\n private level: LogLevel;\n private prefix: string;\n private logSend: boolean;\n private logReceive: boolean;\n private logLifecycle: boolean;\n private customLogger?: (level: LogLevel, message: string, data?: unknown) => void;\n\n private static levelOrder: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n };\n\n constructor(options?: boolean | DebugOptions) {\n if (typeof options === 'boolean') {\n this.enabled = options;\n this.level = 'debug';\n this.prefix = '[SmoreScreen]';\n this.logSend = true;\n this.logReceive = true;\n this.logLifecycle = true;\n } else if (options) {\n this.enabled = options.enabled ?? false;\n this.level = options.level ?? 'debug';\n this.prefix = options.prefix ?? '[SmoreScreen]';\n this.logSend = options.logSend ?? true;\n this.logReceive = options.logReceive ?? true;\n this.logLifecycle = options.logLifecycle ?? true;\n this.customLogger = options.logger;\n } else {\n this.enabled = false;\n this.level = 'debug';\n this.prefix = '[SmoreScreen]';\n this.logSend = true;\n this.logReceive = true;\n this.logLifecycle = true;\n }\n }\n\n private shouldLog(level: LogLevel): boolean {\n return this.enabled && DebugLogger.levelOrder[level] >= DebugLogger.levelOrder[this.level];\n }\n\n private log(level: LogLevel, message: string, data?: unknown): void {\n if (!this.shouldLog(level)) return;\n\n if (this.customLogger) {\n this.customLogger(level, `${this.prefix} ${message}`, data);\n return;\n }\n\n const consoleMethod = level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log';\n if (data !== undefined) {\n console[consoleMethod](`${this.prefix} ${message}`, data);\n } else {\n console[consoleMethod](`${this.prefix} ${message}`);\n }\n }\n\n debug(message: string, data?: unknown): void {\n this.log('debug', message, data);\n }\n\n info(message: string, data?: unknown): void {\n this.log('info', message, data);\n }\n\n warn(message: string, data?: unknown): void {\n this.log('warn', message, data);\n }\n\n error(message: string, data?: unknown): void {\n this.log('error', message, data);\n }\n\n send(event: string, data?: unknown): void {\n if (this.logSend) {\n this.debug(`-> SEND: ${event}`, data);\n }\n }\n\n receive(event: string, data?: unknown): void {\n if (this.logReceive) {\n this.debug(`<- RECV: ${event}`, data);\n }\n }\n\n lifecycle(message: string, data?: unknown): void {\n if (this.logLifecycle) {\n this.info(`[Lifecycle] ${message}`, data);\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 _leaderIndex: PlayerIndex = -1;\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\n constructor(config: ScreenConfig<TEvents> = {}) {\n this.config = config;\n this.logger = new DebugLogger(config.debug);\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. Make sure the parent frame sends smore:init.`,\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 (!isSmoreMessage(msg)) return;\n\n if (msg.type === 'smore:init') {\n clearTimeout(timeoutId);\n const initData = (msg as SmoreInitMessage).payload;\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 this._leaderIndex = this.findLeaderIndex(initData.players, initData.leaderId);\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 leaderIndex: this._leaderIndex,\n });\n\n this.config.onReady?.();\n resolve();\n } else if (msg.type === 'smore:update') {\n const updateData = (msg as SmoreUpdateMessage).payload;\n\n if (updateData.players) {\n this._controllers = this.mapControllersFromInit(updateData.players);\n }\n if (updateData.leaderId !== undefined) {\n this._leaderIndex = this.findLeaderIndex(\n updateData.players ?? [],\n updateData.leaderId\n );\n }\n\n this.logger.lifecycle('Room updated', {\n controllers: this._controllers.length,\n leaderIndex: this._leaderIndex,\n });\n }\n };\n\n window.addEventListener('message', this.boundMessageHandler);\n\n // Signal ready to parent\n window.parent.postMessage({ type: 'smore:ready' }, parentOrigin);\n this.logger.lifecycle('Sent smore: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 nickname: (p.nickname as string) || `Player ${index + 1}`,\n connected: p.connected !== false,\n appearance: p.appearance as ControllerInfo['appearance'],\n }));\n }\n\n private findLeaderIndex(players: unknown[], leaderId: string | null): PlayerIndex {\n if (!leaderId) return -1;\n const idx = (players as Record<string, unknown>[]).findIndex(\n (p) => p.sessionId === leaderId\n );\n return idx >= 0 ? idx : -1;\n }\n\n private setupEventHandlers(): void {\n if (!this.transport) return;\n\n // System events: player join/leave/reconnect\n this.registerTransportHandler(SYSTEM_EVENTS.PLAYER_JOIN, (data: unknown) => {\n const payload = data as { player?: ControllerInfo };\n const player = payload?.player;\n if (player && typeof player.playerIndex === 'number') {\n this.logger.lifecycle('Controller joined', { playerIndex: player.playerIndex });\n this.config.onControllerJoin?.(player.playerIndex, player);\n }\n });\n\n this.registerTransportHandler(SYSTEM_EVENTS.PLAYER_LEAVE, (data: unknown) => {\n const payload = data as { playerIndex?: number };\n if (typeof payload?.playerIndex === 'number') {\n this.logger.lifecycle('Controller left', { playerIndex: payload.playerIndex });\n this.config.onControllerLeave?.(payload.playerIndex);\n }\n });\n\n this.registerTransportHandler(SYSTEM_EVENTS.PLAYER_RECONNECT, (data: unknown) => {\n const payload = data as { player?: ControllerInfo };\n const player = payload?.player;\n if (player && typeof player.playerIndex === 'number') {\n this.logger.lifecycle('Controller reconnected', { playerIndex: player.playerIndex });\n this.config.onControllerReconnect?.(player.playerIndex, player);\n }\n });\n\n // Legacy room events (backward compatibility)\n this.registerTransportHandler('room:player-joined', (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.config.onControllerJoin?.(playerIndex, {\n playerIndex,\n nickname: `Player ${playerIndex + 1}`,\n connected: true,\n });\n }\n });\n\n this.registerTransportHandler('room:player-left', (data: unknown) => {\n const payload = data as { playerIndex?: number; player?: { playerIndex?: number } };\n const playerIndex = payload?.playerIndex ?? payload?.player?.playerIndex;\n if (typeof playerIndex === 'number') {\n this.config.onControllerLeave?.(playerIndex);\n }\n });\n\n // User event listeners from config\n if (this.config.listeners) {\n for (const [event, handler] of Object.entries(this.config.listeners)) {\n if (!handler) continue;\n this.setupUserEventHandler(event, handler as ScreenEventHandler<unknown>);\n }\n }\n }\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 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 }\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 get controllers(): readonly ControllerInfo[] {\n return [...this._controllers];\n }\n\n get roomCode(): RoomCode {\n return this._roomCode;\n }\n\n get leaderIndex(): PlayerIndex {\n return this._leaderIndex;\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 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 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 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.length);\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.length);\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(SYSTEM_EVENTS.GAME_OVER, { results });\n }\n\n // ---------------------------------------------------------------------------\n // Event Subscription\n // ---------------------------------------------------------------------------\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 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 }\n };\n this.registerTransportHandler(event, 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 };\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 handlers for this event\n this.eventHandlers.delete(event);\n this.transport?.off(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 }\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 isLeader(playerIndex: PlayerIndex): boolean {\n return playerIndex === this._leaderIndex;\n }\n\n getControllerCount(): number {\n return this._controllers.filter((c) => c.connected).length;\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\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 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":["isSmoreMessage","PostMessageTransport"],"mappings":"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"}