@vizbeetv/homesso-sdk-qa 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/es6/index.cjs CHANGED
@@ -404,16 +404,16 @@ class Logger {
404
404
  const logger = new Logger();
405
405
 
406
406
  const LOG_TAG$1 = 'VizbeeHomeSSOManager';
407
- /* eslint-disable @typescript-eslint/no-explicit-any */
408
407
  class VizbeeMetricsManager {
409
408
  constructor() {
410
- var _a, _b, _c;
409
+ var _a, _b;
410
+ this.metricsManager = null;
411
411
  this.senderInfo = null;
412
412
  this.getSignInInfo = () => __awaiter(this, void 0, void 0, function* () { return []; });
413
- if ((_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.vizbee) === null || _a === void 0 ? void 0 : _a.continuity) === null || _b === void 0 ? void 0 : _b.analytics) === null || _c === void 0 ? void 0 : _c.AnalyticsProvider) {
413
+ const vizbee = window === null || window === void 0 ? void 0 : window.vizbee;
414
+ if ((_b = (_a = vizbee === null || vizbee === void 0 ? void 0 : vizbee.continuity) === null || _a === void 0 ? void 0 : _a.analytics) === null || _b === void 0 ? void 0 : _b.AnalyticsProvider) {
414
415
  this.metricsManager =
415
- new window.vizbee.continuity.analytics.AnalyticsProvider();
416
- // Create a wrapper with 'provider' property
416
+ new vizbee.continuity.analytics.AnalyticsProvider();
417
417
  const attributesProvider = {
418
418
  getAttributes: () => this.getAttributes(),
419
419
  };
@@ -441,7 +441,8 @@ class VizbeeMetricsManager {
441
441
  this.metricsManager.logMetrics(event, attributesToBeSent);
442
442
  }
443
443
  setCustomAttributes(customAttributes) {
444
- this.metricsManager.setCustomAttributes(customAttributes);
444
+ var _a;
445
+ (_a = this.metricsManager) === null || _a === void 0 ? void 0 : _a.setCustomAttributes(customAttributes);
445
446
  }
446
447
  getAttributes() {
447
448
  return this.createAttributesJson();
@@ -481,7 +482,7 @@ class VizbeeMetricsManager {
481
482
  var _a, _b, _c, _d;
482
483
  const attributes = {};
483
484
  attributes[VizbeeMetricsConstants.METRICS_ATTR_SCREEN_HOMESSO_SDK_VERSION] =
484
- '1.0.1';
485
+ '1.0.5';
485
486
  attributes['REMOTE_FRIENDLY_NAME'] = (_a = this.senderInfo) === null || _a === void 0 ? void 0 : _a.friendlyName;
486
487
  attributes['REMOTE_DEVICE_ID'] = (_b = this.senderInfo) === null || _b === void 0 ? void 0 : _b.deviceId;
487
488
  attributes['REMOTE_DEVICE_TYPE'] = (_c = this.senderInfo) === null || _c === void 0 ? void 0 : _c.deviceType;
@@ -514,15 +515,24 @@ const VizbeeConstants = {
514
515
  // SDK events types
515
516
  VIZBEE_SESSION_READY: 'vizbee-bicast-session-ready',
516
517
  };
518
+ /**
519
+ * Numeric session states reported by the Continuity SDK's bicast session manager.
520
+ * Mirrors SessionState in the VTV SDK — defined here so HomeSSO has no magic numbers.
521
+ */
522
+ const VizbeeSessionState = {
523
+ NOT_CONNECTED: 1,
524
+ CONNECTING: 2,
525
+ CONNECTED: 3,
526
+ };
517
527
  // Enum for sign in states
518
- var VizbeeSignInState;
528
+ exports.VizbeeSignInState = void 0;
519
529
  (function (VizbeeSignInState) {
520
530
  VizbeeSignInState["SIGN_IN_NOT_STARTED"] = "not_started";
521
531
  VizbeeSignInState["SIGN_IN_IN_PROGRESS"] = "in_progress";
522
532
  VizbeeSignInState["SIGN_IN_COMPLETED"] = "completed";
523
533
  VizbeeSignInState["SIGN_IN_FAILED"] = "failed";
524
534
  VizbeeSignInState["SIGN_IN_CANCELLED"] = "cancelled";
525
- })(VizbeeSignInState || (VizbeeSignInState = {}));
535
+ })(exports.VizbeeSignInState || (exports.VizbeeSignInState = {}));
526
536
 
527
537
  /* eslint-disable @typescript-eslint/no-explicit-any */
528
538
  // Base abstract class for sign in status
@@ -547,7 +557,7 @@ class ProgressStatus extends VizbeeSignInStatus {
547
557
  this.customData = customData;
548
558
  }
549
559
  getState() {
550
- return VizbeeSignInState.SIGN_IN_IN_PROGRESS;
560
+ return exports.VizbeeSignInState.SIGN_IN_IN_PROGRESS;
551
561
  }
552
562
  }
553
563
  // Success status class
@@ -559,7 +569,7 @@ class SuccessStatus extends VizbeeSignInStatus {
559
569
  this.customData = customData;
560
570
  }
561
571
  getState() {
562
- return VizbeeSignInState.SIGN_IN_COMPLETED;
572
+ return exports.VizbeeSignInState.SIGN_IN_COMPLETED;
563
573
  }
564
574
  }
565
575
  // Failure status class
@@ -574,8 +584,8 @@ class FailureStatus extends VizbeeSignInStatus {
574
584
  }
575
585
  getState() {
576
586
  return this.isCancelled
577
- ? VizbeeSignInState.SIGN_IN_CANCELLED
578
- : VizbeeSignInState.SIGN_IN_FAILED;
587
+ ? exports.VizbeeSignInState.SIGN_IN_CANCELLED
588
+ : exports.VizbeeSignInState.SIGN_IN_FAILED;
579
589
  }
580
590
  }
581
591
 
@@ -586,12 +596,12 @@ class FailureStatus extends VizbeeSignInStatus {
586
596
  /**
587
597
  * Enum defining the different types of sign-in modals available in the system
588
598
  */
589
- var SignInModalType;
599
+ exports.SignInModalType = void 0;
590
600
  (function (SignInModalType) {
591
601
  SignInModalType["INFORMATION"] = "information";
592
602
  SignInModalType["PROGRESS"] = "progress";
593
603
  SignInModalType["SUCCESS"] = "success";
594
- })(SignInModalType || (SignInModalType = {}));
604
+ })(exports.SignInModalType || (exports.SignInModalType = {}));
595
605
  /**
596
606
  * Default theme configuration with basic color scheme
597
607
  */
@@ -1229,7 +1239,11 @@ class VizbeeSnackbar {
1229
1239
  }
1230
1240
  }
1231
1241
 
1232
- /* eslint-disable @typescript-eslint/no-explicit-any */
1242
+ /**
1243
+ * @fileoverview Manages Single Sign-On (SSO) functionality for Vizbee home devices.
1244
+ * Handles communication between mobile and TV devices for authentication purposes.
1245
+ * @module VizbeeHomeSSOManager
1246
+ */
1233
1247
  const LOG_TAG = 'VizbeeHomeSSOManager';
1234
1248
  /**
1235
1249
  * Manages Single Sign-On (SSO) functionality between mobile and TV devices in the Vizbee ecosystem.
@@ -1261,8 +1275,14 @@ class VizbeeHomeSSOManager {
1261
1275
  this.isScreenSignedIn = false;
1262
1276
  /** @internal Tracks if sign-in process is currently active */
1263
1277
  this.isSignInInProgress = false;
1278
+ /**
1279
+ * @internal Tracks which modal is currently shown so the same progress modal
1280
+ * is not re-shown (snackbar.show() hides + re-mounts, which would flicker).
1281
+ */
1282
+ this.shownModal = 'none';
1264
1283
  /** @internal Information about the sender device */
1265
1284
  this.senderInfo = null;
1285
+ this.signInHandler = null;
1266
1286
  /**
1267
1287
  * Modal display preferences for the SSO UI
1268
1288
  * @public
@@ -1415,12 +1435,11 @@ class VizbeeHomeSSOManager {
1415
1435
  var _a, _b;
1416
1436
  try {
1417
1437
  logger.info(`[${LOG_TAG}][initializeVizbeeSession] - Initializing Vizbee session`);
1418
- // Check if vizbee and continuity exist before accessing xmessages
1419
- if (!((_b = (_a = window.vizbee) === null || _a === void 0 ? void 0 : _a.continuity) === null || _b === void 0 ? void 0 : _b.xmessages)) {
1438
+ const xmessages = (_b = (_a = window.vizbee) === null || _a === void 0 ? void 0 : _a.continuity) === null || _b === void 0 ? void 0 : _b.xmessages;
1439
+ if (!xmessages) {
1420
1440
  throw new Error('Vizbee continuity or xmessages not initialized');
1421
1441
  }
1422
- // Access VizbeeBicastSessionManager directly from the existing object
1423
- const sessionManager = new window.vizbee.continuity.xmessages.VizbeeBicastSessionManager();
1442
+ const sessionManager = new xmessages.VizbeeBicastSessionManager();
1424
1443
  if (!sessionManager) {
1425
1444
  throw new Error('Session manager initialization failed');
1426
1445
  }
@@ -1429,7 +1448,7 @@ class VizbeeHomeSSOManager {
1429
1448
  sessionManager.addSessionStateListener({
1430
1449
  onSessionStateChanged: (state) => {
1431
1450
  logger.info(`[${LOG_TAG}][onSessionStateChanged] - Session state changed:`, state);
1432
- if (state === 3) {
1451
+ if (state === VizbeeSessionState.CONNECTED) {
1433
1452
  this.vizbeeSession = sessionManager.getSession();
1434
1453
  this.vizbeeMessagingClient =
1435
1454
  this.vizbeeSession.getMessagingClient();
@@ -1481,6 +1500,8 @@ class VizbeeHomeSSOManager {
1481
1500
  if (yield this.shouldIgnoreSignInRequest()) {
1482
1501
  return;
1483
1502
  }
1503
+ this.isSignInInProgress = true;
1504
+ this.updateProgressUI();
1484
1505
  const signInInfo = {
1485
1506
  isSignedIn: this.isRemoteSignedIn,
1486
1507
  signInType: signInType,
@@ -1521,9 +1542,9 @@ class VizbeeHomeSSOManager {
1521
1542
  const attributes = yield ((_b = (_a = this.vizbeeMetricsManager) === null || _a === void 0 ? void 0 : _a.getAttributes) === null || _b === void 0 ? void 0 : _b.call(_a));
1522
1543
  const signInInfoList = attributes === null || attributes === void 0 ? void 0 : attributes['SCREEN_HOMESSO_USER_INFO'];
1523
1544
  logger.info(`[${LOG_TAG}][isUserAlreadySignedIn] - signInInfoList`, signInInfoList);
1524
- const tvSignInInfo = signInInfoList.find((info) => info.user_login_type === signInType);
1545
+ const tvSignInInfo = signInInfoList === null || signInInfoList === void 0 ? void 0 : signInInfoList.find((info) => info.user_login_type === signInType);
1525
1546
  logger.debug(`[${LOG_TAG}][isUserAlreadySignedIn] - TV sign in status fetched:`, tvSignInInfo);
1526
- return tvSignInInfo === null || tvSignInInfo === void 0 ? void 0 : tvSignInInfo.user_is_signed_in;
1547
+ return (tvSignInInfo === null || tvSignInInfo === void 0 ? void 0 : tvSignInInfo.user_is_signed_in) === true;
1527
1548
  }
1528
1549
  catch (error) {
1529
1550
  logger.warn(`[${LOG_TAG}][isUserAlreadySignedIn] - Error checking sign-in status:`, error);
@@ -1563,12 +1584,14 @@ class VizbeeHomeSSOManager {
1563
1584
  * @internal
1564
1585
  */
1565
1586
  sendStatusToSender(status) {
1566
- const signInStatus = this.serializeStatus(status);
1567
- const data = {
1568
- [VizbeeConstants.KEY_SUB_TYPE]: VizbeeConstants.EVENT_SUBTYPE_SIGN_IN_STATUS,
1569
- [VizbeeConstants.KEY_SIGN_IN_STATUS]: signInStatus,
1570
- };
1571
- this.vizbeeMessagingClient.send(data, VizbeeConstants.EVENT_SSO_NAME);
1587
+ return __awaiter(this, void 0, void 0, function* () {
1588
+ const signInStatus = this.serializeStatus(status);
1589
+ const data = {
1590
+ [VizbeeConstants.KEY_SUB_TYPE]: VizbeeConstants.EVENT_SUBTYPE_SIGN_IN_STATUS,
1591
+ [VizbeeConstants.KEY_SIGN_IN_STATUS]: signInStatus,
1592
+ };
1593
+ yield this.vizbeeMessagingClient.send(data, VizbeeConstants.EVENT_SSO_NAME);
1594
+ });
1572
1595
  }
1573
1596
  /**
1574
1597
  * Serializes status objects for transmission to mobile device
@@ -1578,16 +1601,7 @@ class VizbeeHomeSSOManager {
1578
1601
  * @internal
1579
1602
  */
1580
1603
  serializeStatus(status) {
1581
- if (status instanceof ProgressStatus) {
1582
- return status.serialize();
1583
- }
1584
- else if (status instanceof SuccessStatus) {
1585
- return status.serialize();
1586
- }
1587
- else if (status instanceof FailureStatus) {
1588
- return status.serialize();
1589
- }
1590
- return null;
1604
+ return status.serialize();
1591
1605
  }
1592
1606
  /**
1593
1607
  * Updates UI for sign-in progress state
@@ -1596,6 +1610,12 @@ class VizbeeHomeSSOManager {
1596
1610
  * @internal
1597
1611
  */
1598
1612
  updateProgressUI() {
1613
+ const targetModal = this.isRemoteSignedIn ? 'progress' : 'informational';
1614
+ // Avoid re-showing the same modal
1615
+ if (this.shownModal === targetModal) {
1616
+ return;
1617
+ }
1618
+ this.shownModal = targetModal;
1599
1619
  if (!this.isRemoteSignedIn) {
1600
1620
  const modalOptions = this.vizbeeHomeSSOUIManager.getInformationalSignInModalConfig();
1601
1621
  this.snackbar.show(modalOptions);
@@ -1617,6 +1637,7 @@ class VizbeeHomeSSOManager {
1617
1637
  // themed/localized like the informational and progress modals.
1618
1638
  this.vizbeeHomeSSOUIManager.setSuccessSignInModalConfig({ duration: 10000 });
1619
1639
  const modalOptions = this.vizbeeHomeSSOUIManager.getSuccessSignInModalConfig();
1640
+ this.shownModal = 'success';
1620
1641
  this.snackbar.show(modalOptions);
1621
1642
  }
1622
1643
  /**
@@ -1626,6 +1647,7 @@ class VizbeeHomeSSOManager {
1626
1647
  * @internal
1627
1648
  */
1628
1649
  updateFailureUI() {
1650
+ this.shownModal = 'none';
1629
1651
  this.snackbar.hide();
1630
1652
  }
1631
1653
  }
@@ -1696,6 +1718,8 @@ const init = () => {
1696
1718
  }
1697
1719
  };
1698
1720
  const setupHomeSSO = () => {
1721
+ if (!window.vizbee)
1722
+ return;
1699
1723
  window.vizbee.homesso = {
1700
1724
  HomeSSOContext: HomeSSOContext,
1701
1725
  messages: {
@@ -1707,7 +1731,7 @@ const setupHomeSSO = () => {
1707
1731
  // Replaced at build time with package.json's version by
1708
1732
  // @rollup/plugin-replace (same token the metrics manager uses), so
1709
1733
  // integrators can read the loaded SDK version off the namespace.
1710
- VERSION: '1.0.1',
1734
+ VERSION: '1.0.5',
1711
1735
  };
1712
1736
  window.dispatchEvent(new Event('VIZBEE_HOMESSO_READY'));
1713
1737
  };
package/es6/index.mjs CHANGED
@@ -400,16 +400,16 @@ class Logger {
400
400
  const logger = new Logger();
401
401
 
402
402
  const LOG_TAG$1 = 'VizbeeHomeSSOManager';
403
- /* eslint-disable @typescript-eslint/no-explicit-any */
404
403
  class VizbeeMetricsManager {
405
404
  constructor() {
406
- var _a, _b, _c;
405
+ var _a, _b;
406
+ this.metricsManager = null;
407
407
  this.senderInfo = null;
408
408
  this.getSignInInfo = () => __awaiter(this, void 0, void 0, function* () { return []; });
409
- if ((_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.vizbee) === null || _a === void 0 ? void 0 : _a.continuity) === null || _b === void 0 ? void 0 : _b.analytics) === null || _c === void 0 ? void 0 : _c.AnalyticsProvider) {
409
+ const vizbee = window === null || window === void 0 ? void 0 : window.vizbee;
410
+ if ((_b = (_a = vizbee === null || vizbee === void 0 ? void 0 : vizbee.continuity) === null || _a === void 0 ? void 0 : _a.analytics) === null || _b === void 0 ? void 0 : _b.AnalyticsProvider) {
410
411
  this.metricsManager =
411
- new window.vizbee.continuity.analytics.AnalyticsProvider();
412
- // Create a wrapper with 'provider' property
412
+ new vizbee.continuity.analytics.AnalyticsProvider();
413
413
  const attributesProvider = {
414
414
  getAttributes: () => this.getAttributes(),
415
415
  };
@@ -437,7 +437,8 @@ class VizbeeMetricsManager {
437
437
  this.metricsManager.logMetrics(event, attributesToBeSent);
438
438
  }
439
439
  setCustomAttributes(customAttributes) {
440
- this.metricsManager.setCustomAttributes(customAttributes);
440
+ var _a;
441
+ (_a = this.metricsManager) === null || _a === void 0 ? void 0 : _a.setCustomAttributes(customAttributes);
441
442
  }
442
443
  getAttributes() {
443
444
  return this.createAttributesJson();
@@ -477,7 +478,7 @@ class VizbeeMetricsManager {
477
478
  var _a, _b, _c, _d;
478
479
  const attributes = {};
479
480
  attributes[VizbeeMetricsConstants.METRICS_ATTR_SCREEN_HOMESSO_SDK_VERSION] =
480
- '1.0.1';
481
+ '1.0.5';
481
482
  attributes['REMOTE_FRIENDLY_NAME'] = (_a = this.senderInfo) === null || _a === void 0 ? void 0 : _a.friendlyName;
482
483
  attributes['REMOTE_DEVICE_ID'] = (_b = this.senderInfo) === null || _b === void 0 ? void 0 : _b.deviceId;
483
484
  attributes['REMOTE_DEVICE_TYPE'] = (_c = this.senderInfo) === null || _c === void 0 ? void 0 : _c.deviceType;
@@ -510,6 +511,15 @@ const VizbeeConstants = {
510
511
  // SDK events types
511
512
  VIZBEE_SESSION_READY: 'vizbee-bicast-session-ready',
512
513
  };
514
+ /**
515
+ * Numeric session states reported by the Continuity SDK's bicast session manager.
516
+ * Mirrors SessionState in the VTV SDK — defined here so HomeSSO has no magic numbers.
517
+ */
518
+ const VizbeeSessionState = {
519
+ NOT_CONNECTED: 1,
520
+ CONNECTING: 2,
521
+ CONNECTED: 3,
522
+ };
513
523
  // Enum for sign in states
514
524
  var VizbeeSignInState;
515
525
  (function (VizbeeSignInState) {
@@ -1225,7 +1235,11 @@ class VizbeeSnackbar {
1225
1235
  }
1226
1236
  }
1227
1237
 
1228
- /* eslint-disable @typescript-eslint/no-explicit-any */
1238
+ /**
1239
+ * @fileoverview Manages Single Sign-On (SSO) functionality for Vizbee home devices.
1240
+ * Handles communication between mobile and TV devices for authentication purposes.
1241
+ * @module VizbeeHomeSSOManager
1242
+ */
1229
1243
  const LOG_TAG = 'VizbeeHomeSSOManager';
1230
1244
  /**
1231
1245
  * Manages Single Sign-On (SSO) functionality between mobile and TV devices in the Vizbee ecosystem.
@@ -1257,8 +1271,14 @@ class VizbeeHomeSSOManager {
1257
1271
  this.isScreenSignedIn = false;
1258
1272
  /** @internal Tracks if sign-in process is currently active */
1259
1273
  this.isSignInInProgress = false;
1274
+ /**
1275
+ * @internal Tracks which modal is currently shown so the same progress modal
1276
+ * is not re-shown (snackbar.show() hides + re-mounts, which would flicker).
1277
+ */
1278
+ this.shownModal = 'none';
1260
1279
  /** @internal Information about the sender device */
1261
1280
  this.senderInfo = null;
1281
+ this.signInHandler = null;
1262
1282
  /**
1263
1283
  * Modal display preferences for the SSO UI
1264
1284
  * @public
@@ -1411,12 +1431,11 @@ class VizbeeHomeSSOManager {
1411
1431
  var _a, _b;
1412
1432
  try {
1413
1433
  logger.info(`[${LOG_TAG}][initializeVizbeeSession] - Initializing Vizbee session`);
1414
- // Check if vizbee and continuity exist before accessing xmessages
1415
- if (!((_b = (_a = window.vizbee) === null || _a === void 0 ? void 0 : _a.continuity) === null || _b === void 0 ? void 0 : _b.xmessages)) {
1434
+ const xmessages = (_b = (_a = window.vizbee) === null || _a === void 0 ? void 0 : _a.continuity) === null || _b === void 0 ? void 0 : _b.xmessages;
1435
+ if (!xmessages) {
1416
1436
  throw new Error('Vizbee continuity or xmessages not initialized');
1417
1437
  }
1418
- // Access VizbeeBicastSessionManager directly from the existing object
1419
- const sessionManager = new window.vizbee.continuity.xmessages.VizbeeBicastSessionManager();
1438
+ const sessionManager = new xmessages.VizbeeBicastSessionManager();
1420
1439
  if (!sessionManager) {
1421
1440
  throw new Error('Session manager initialization failed');
1422
1441
  }
@@ -1425,7 +1444,7 @@ class VizbeeHomeSSOManager {
1425
1444
  sessionManager.addSessionStateListener({
1426
1445
  onSessionStateChanged: (state) => {
1427
1446
  logger.info(`[${LOG_TAG}][onSessionStateChanged] - Session state changed:`, state);
1428
- if (state === 3) {
1447
+ if (state === VizbeeSessionState.CONNECTED) {
1429
1448
  this.vizbeeSession = sessionManager.getSession();
1430
1449
  this.vizbeeMessagingClient =
1431
1450
  this.vizbeeSession.getMessagingClient();
@@ -1477,6 +1496,8 @@ class VizbeeHomeSSOManager {
1477
1496
  if (yield this.shouldIgnoreSignInRequest()) {
1478
1497
  return;
1479
1498
  }
1499
+ this.isSignInInProgress = true;
1500
+ this.updateProgressUI();
1480
1501
  const signInInfo = {
1481
1502
  isSignedIn: this.isRemoteSignedIn,
1482
1503
  signInType: signInType,
@@ -1517,9 +1538,9 @@ class VizbeeHomeSSOManager {
1517
1538
  const attributes = yield ((_b = (_a = this.vizbeeMetricsManager) === null || _a === void 0 ? void 0 : _a.getAttributes) === null || _b === void 0 ? void 0 : _b.call(_a));
1518
1539
  const signInInfoList = attributes === null || attributes === void 0 ? void 0 : attributes['SCREEN_HOMESSO_USER_INFO'];
1519
1540
  logger.info(`[${LOG_TAG}][isUserAlreadySignedIn] - signInInfoList`, signInInfoList);
1520
- const tvSignInInfo = signInInfoList.find((info) => info.user_login_type === signInType);
1541
+ const tvSignInInfo = signInInfoList === null || signInInfoList === void 0 ? void 0 : signInInfoList.find((info) => info.user_login_type === signInType);
1521
1542
  logger.debug(`[${LOG_TAG}][isUserAlreadySignedIn] - TV sign in status fetched:`, tvSignInInfo);
1522
- return tvSignInInfo === null || tvSignInInfo === void 0 ? void 0 : tvSignInInfo.user_is_signed_in;
1543
+ return (tvSignInInfo === null || tvSignInInfo === void 0 ? void 0 : tvSignInInfo.user_is_signed_in) === true;
1523
1544
  }
1524
1545
  catch (error) {
1525
1546
  logger.warn(`[${LOG_TAG}][isUserAlreadySignedIn] - Error checking sign-in status:`, error);
@@ -1559,12 +1580,14 @@ class VizbeeHomeSSOManager {
1559
1580
  * @internal
1560
1581
  */
1561
1582
  sendStatusToSender(status) {
1562
- const signInStatus = this.serializeStatus(status);
1563
- const data = {
1564
- [VizbeeConstants.KEY_SUB_TYPE]: VizbeeConstants.EVENT_SUBTYPE_SIGN_IN_STATUS,
1565
- [VizbeeConstants.KEY_SIGN_IN_STATUS]: signInStatus,
1566
- };
1567
- this.vizbeeMessagingClient.send(data, VizbeeConstants.EVENT_SSO_NAME);
1583
+ return __awaiter(this, void 0, void 0, function* () {
1584
+ const signInStatus = this.serializeStatus(status);
1585
+ const data = {
1586
+ [VizbeeConstants.KEY_SUB_TYPE]: VizbeeConstants.EVENT_SUBTYPE_SIGN_IN_STATUS,
1587
+ [VizbeeConstants.KEY_SIGN_IN_STATUS]: signInStatus,
1588
+ };
1589
+ yield this.vizbeeMessagingClient.send(data, VizbeeConstants.EVENT_SSO_NAME);
1590
+ });
1568
1591
  }
1569
1592
  /**
1570
1593
  * Serializes status objects for transmission to mobile device
@@ -1574,16 +1597,7 @@ class VizbeeHomeSSOManager {
1574
1597
  * @internal
1575
1598
  */
1576
1599
  serializeStatus(status) {
1577
- if (status instanceof ProgressStatus) {
1578
- return status.serialize();
1579
- }
1580
- else if (status instanceof SuccessStatus) {
1581
- return status.serialize();
1582
- }
1583
- else if (status instanceof FailureStatus) {
1584
- return status.serialize();
1585
- }
1586
- return null;
1600
+ return status.serialize();
1587
1601
  }
1588
1602
  /**
1589
1603
  * Updates UI for sign-in progress state
@@ -1592,6 +1606,12 @@ class VizbeeHomeSSOManager {
1592
1606
  * @internal
1593
1607
  */
1594
1608
  updateProgressUI() {
1609
+ const targetModal = this.isRemoteSignedIn ? 'progress' : 'informational';
1610
+ // Avoid re-showing the same modal
1611
+ if (this.shownModal === targetModal) {
1612
+ return;
1613
+ }
1614
+ this.shownModal = targetModal;
1595
1615
  if (!this.isRemoteSignedIn) {
1596
1616
  const modalOptions = this.vizbeeHomeSSOUIManager.getInformationalSignInModalConfig();
1597
1617
  this.snackbar.show(modalOptions);
@@ -1613,6 +1633,7 @@ class VizbeeHomeSSOManager {
1613
1633
  // themed/localized like the informational and progress modals.
1614
1634
  this.vizbeeHomeSSOUIManager.setSuccessSignInModalConfig({ duration: 10000 });
1615
1635
  const modalOptions = this.vizbeeHomeSSOUIManager.getSuccessSignInModalConfig();
1636
+ this.shownModal = 'success';
1616
1637
  this.snackbar.show(modalOptions);
1617
1638
  }
1618
1639
  /**
@@ -1622,6 +1643,7 @@ class VizbeeHomeSSOManager {
1622
1643
  * @internal
1623
1644
  */
1624
1645
  updateFailureUI() {
1646
+ this.shownModal = 'none';
1625
1647
  this.snackbar.hide();
1626
1648
  }
1627
1649
  }
@@ -1692,6 +1714,8 @@ const init = () => {
1692
1714
  }
1693
1715
  };
1694
1716
  const setupHomeSSO = () => {
1717
+ if (!window.vizbee)
1718
+ return;
1695
1719
  window.vizbee.homesso = {
1696
1720
  HomeSSOContext: HomeSSOContext,
1697
1721
  messages: {
@@ -1703,10 +1727,10 @@ const setupHomeSSO = () => {
1703
1727
  // Replaced at build time with package.json's version by
1704
1728
  // @rollup/plugin-replace (same token the metrics manager uses), so
1705
1729
  // integrators can read the loaded SDK version off the namespace.
1706
- VERSION: '1.0.1',
1730
+ VERSION: '1.0.5',
1707
1731
  };
1708
1732
  window.dispatchEvent(new Event('VIZBEE_HOMESSO_READY'));
1709
1733
  };
1710
1734
  init();
1711
1735
 
1712
- export { FailureStatus, HomeSSOContext, LogLevel, ProgressStatus, SuccessStatus, UNKNOWN_VALUE, VizbeeHomeSSOManager, VizbeeHomeSSOUIManager };
1736
+ export { FailureStatus, HomeSSOContext, LogLevel, ProgressStatus, SignInModalType, SuccessStatus, UNKNOWN_VALUE, VizbeeHomeSSOManager, VizbeeHomeSSOUIManager, VizbeeSignInState };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vizbeetv/homesso-sdk-qa",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "TV app authentication library (QA)",
5
5
  "main": "./es5/index.cjs",
6
6
  "module": "./es5/index.mjs",
@@ -1,6 +1,11 @@
1
+ /**
2
+ * @fileoverview Manages Single Sign-On (SSO) functionality for Vizbee home devices.
3
+ * Handles communication between mobile and TV devices for authentication purposes.
4
+ * @module VizbeeHomeSSOManager
5
+ */
1
6
  import { VizbeeSignInInfo } from './model/VizbeeSignInInfo';
2
7
  import { FailureStatus, ProgressStatus, SuccessStatus } from './model/VizbeeSignInStatus';
3
- import { MessagePayload, VizbeeModalPreferences, VizbeeSignInStatusCallback } from './types';
8
+ import { IVizbeeSignInInfo, StatusCallback, VizbeeModalPreferences, VizbeeSignInStatusCallback } from './types';
4
9
  /**
5
10
  * Manages Single Sign-On (SSO) functionality between mobile and TV devices in the Vizbee ecosystem.
6
11
  * Implements singleton pattern for global state management.
@@ -32,6 +37,11 @@ export declare class VizbeeHomeSSOManager implements VizbeeSignInStatusCallback
32
37
  private isScreenSignedIn;
33
38
  /** @internal Tracks if sign-in process is currently active */
34
39
  private isSignInInProgress;
40
+ /**
41
+ * @internal Tracks which modal is currently shown so the same progress modal
42
+ * is not re-shown (snackbar.show() hides + re-mounts, which would flicker).
43
+ */
44
+ private shownModal;
35
45
  /** @internal UI manager instance for handling SSO-related displays */
36
46
  private vizbeeHomeSSOUIManager;
37
47
  /** @internal Snackbar instance for showing notifications */
@@ -68,7 +78,7 @@ export declare class VizbeeHomeSSOManager implements VizbeeSignInStatusCallback
68
78
  * @param handler - Callback function to process sign-in information and provide status updates
69
79
  * @public
70
80
  */
71
- setSignInHandler(handler: (signInInfo: MessagePayload, statusCallback: (signInStatus: ProgressStatus | SuccessStatus | FailureStatus) => void) => void): void;
81
+ setSignInHandler(handler: (signInInfo: IVizbeeSignInInfo, statusCallback: StatusCallback) => void): void;
72
82
  /**
73
83
  * Sets the callback for retrieving sign-in information
74
84
  *
package/types/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { VizbeeHomeSSOManager } from './VizbeeHomeSSOManager';
2
2
  import { ProgressStatus, SuccessStatus, FailureStatus } from './model/VizbeeSignInStatus';
3
- import { IVizbeeAnalyticsProvider, IVizbeeXMessages } from './types';
4
3
  import { VizbeeHomeSSOUIManager } from './ui/VizbeeHomeSSOUIManager';
5
4
  import { LogLevel } from './utils/Logger';
6
5
  /**
@@ -30,34 +29,59 @@ declare class HomeSSOContext {
30
29
  enableLogger(enable: boolean): void;
31
30
  setLoggerLevel(level: LogLevel): void;
32
31
  }
32
+ /**
33
+ * Augmentable global interface for window.vizbee.
34
+ *
35
+ * Each Vizbee SDK package re-opens this interface to add only its own slice.
36
+ * TypeScript merges all augmentations so the full window.vizbee shape is
37
+ * available to consumers without any one package overriding another's types.
38
+ *
39
+ * - HomeSSO SDK adds: `homesso`
40
+ * - Continuity SDK adds: `continuity` (augment this interface in your project)
41
+ *
42
+ * Consumer bridging example (add to your project's global.d.ts):
43
+ * @example
44
+ * ```ts
45
+ * import type { ContinuityFramework } from '@vizbee/sdk/lg'; // or xbox, etc.
46
+ * declare global {
47
+ * interface VizbeeNamespace {
48
+ * continuity: ContinuityFramework;
49
+ * }
50
+ * }
51
+ * ```
52
+ */
33
53
  declare global {
54
+ interface VizbeeNamespace {
55
+ homesso: HomeSSONamespace;
56
+ }
34
57
  interface Window {
35
- vizbee: {
36
- continuity?: {
37
- xmessages: IVizbeeXMessages;
38
- analytics: {
39
- AnalyticsProvider: new () => IVizbeeAnalyticsProvider;
40
- };
41
- };
42
- homesso: {
43
- HomeSSOContext: typeof HomeSSOContext;
44
- messages: {
45
- ProgressStatus: typeof ProgressStatus;
46
- SuccessStatus: typeof SuccessStatus;
47
- FailureStatus: typeof FailureStatus;
48
- };
49
- LoggerLevel: typeof LogLevel;
50
- VERSION: string;
51
- };
52
- };
58
+ vizbee?: VizbeeNamespace;
53
59
  }
54
60
  }
61
+ /**
62
+ * The shape HomeSSO SDK adds to window.vizbee.homesso.
63
+ * Export this so consumers can reference it when augmenting VizbeeSDK or
64
+ * VizbeeNamespace in their own global declarations.
65
+ */
66
+ export type HomeSSONamespace = {
67
+ HomeSSOContext: typeof HomeSSOContext;
68
+ messages: {
69
+ ProgressStatus: typeof ProgressStatus;
70
+ SuccessStatus: typeof SuccessStatus;
71
+ FailureStatus: typeof FailureStatus;
72
+ };
73
+ LoggerLevel: typeof LogLevel;
74
+ VERSION: string;
75
+ };
55
76
  export { HomeSSOContext };
56
77
  export { ProgressStatus, SuccessStatus, FailureStatus } from './model/VizbeeSignInStatus';
57
78
  export { LogLevel } from './utils/Logger';
79
+ export { VizbeeSignInState } from './utils/constants';
58
80
  export { VizbeeHomeSSOManager } from './VizbeeHomeSSOManager';
59
81
  export { VizbeeHomeSSOUIManager } from './ui/VizbeeHomeSSOUIManager';
82
+ export { SignInModalType } from './ui/VizbeeHomeSSOUIConfig';
60
83
  export { UNKNOWN_VALUE } from './model/VizbeeSignInInfo';
61
- export type { VizbeeSignInInfo } from './model/VizbeeSignInInfo';
62
- export type { VizbeeSignInStatusCallback, IVizbeeAnalyticsProvider, IVizbeeXMessages, IVizbeeMessagingClient, IVizbeeSession, IVizbeeBicastSessionManager, ISessionStateListener, MessagePayload, VizbeeSenderDevice, } from './types';
63
- export type { VizbeeHomeSSOTheme, CommonModalPreferenceOptions, InformationalSignInPreferenceOptions, ProgressSignInPreferenceOptions, SuccessSignInPreferenceOptions, } from './ui/VizbeeHomeSSOUIConfig';
84
+ export type { VizbeeSignInInfo, ISignInInfo } from './model/VizbeeSignInInfo';
85
+ export type { VizbeeSignInStatusCallback, IVizbeeSignInInfo, StatusCallback, IVizbeeAnalyticsProvider, IVizbeeXMessages, IVizbeeMessagingClient, IVizbeeSession, IVizbeeBicastSessionManager, ISessionStateListener, MessagePayload, VizbeeSenderDevice, } from './types';
86
+ export type { SnackbarPosition, ModalDirection } from './ui/VizbeeSnackBar';
87
+ export type { VizbeeHomeSSOTheme, CommonModalPreferenceOptions, InformationalSignInPreferenceOptions, ProgressSignInPreferenceOptions, SuccessSignInPreferenceOptions, VizbeeHomeSSOUIConfig, VizbeeHomeSSODefaultConfig, InformationalSignInPreferenceConfig, ProgressSignInPreferenceConfig, SuccessSignInPreferenceConfig, } from './ui/VizbeeHomeSSOUIConfig';
@@ -6,9 +6,9 @@ export declare class VizbeeMetricsManager implements IVizbeeAttributesProvider {
6
6
  senderInfo: SenderInfo | null;
7
7
  getSignInInfo: () => Promise<VizbeeSignInInfo[]>;
8
8
  constructor();
9
- log(event: string, attributes: Record<string, any>, bypassAttributeProviders?: boolean): void;
10
- setCustomAttributes(customAttributes: Record<string, any>): void;
11
- getAttributes(): Promise<Record<string, any>>;
9
+ log(event: string, attributes: Record<string, unknown>, bypassAttributeProviders?: boolean): void;
10
+ setCustomAttributes(customAttributes: Record<string, unknown>): void;
11
+ getAttributes(): Promise<Record<string, unknown>>;
12
12
  private createAttributesJson;
13
13
  private createUserInfoObject;
14
14
  private addDefaultAttributes;
@@ -15,6 +15,6 @@ export interface SenderInfo {
15
15
  export interface VizbeeSenderSignInInfo {
16
16
  isSignedIn: boolean;
17
17
  signInType: string;
18
- customData: Record<string, any>;
18
+ customData: Record<string, unknown>;
19
19
  senderInfo: SenderInfo | null;
20
20
  }
@@ -1,11 +1,18 @@
1
1
  export declare const UNKNOWN_VALUE = "UNKNOWN";
2
+ /**
3
+ * Sign-in state of the TV app user, returned by the getter registered via
4
+ * VizbeeHomeSSOManager.setSignInInfoGetter(). The SDK uses this to decide
5
+ * whether to skip or proceed with a sign-in request from a mobile sender.
6
+ */
2
7
  export interface VizbeeSignInInfo {
3
8
  userLoginType: string;
4
9
  isSignedIn: boolean;
5
- userLogin: string;
10
+ userLogin?: string;
6
11
  userName?: string;
7
12
  userSubscriptionType?: string;
8
13
  userSubscriptionValue?: string;
9
14
  userSubscriptionRenewalType?: string;
10
- userAdditionalInfo?: Record<string, any>;
15
+ userAdditionalInfo?: Record<string, unknown>;
11
16
  }
17
+ /** Canonical interface alias — prefer this name in new integrations. */
18
+ export type ISignInInfo = VizbeeSignInInfo;