senza-sdk 4.2.51-d3779b1.0 → 4.2.51-f4d1f9b.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "senza-sdk",
3
- "version": "4.2.51-d3779b1.0",
3
+ "version": "4.2.51-f4d1f9b.0",
4
4
  "main": "./src/api.js",
5
5
  "description": "API for Senza application",
6
6
  "license": "MIT",
@@ -1424,8 +1424,7 @@ class RemotePlayer extends EventTarget {
1424
1424
  * @param {string} prevSelectedTextTrack - The previously selected text track ID.
1425
1425
  * @returns {Promise<void>} Resolves when the operation is complete.
1426
1426
  * */
1427
- async _selectTextTrackV3(textTrackId, prevSelectedTextTrack) {
1428
- sdkLogger.log(`remotePlayer _selectTextTrackV3: prevAudioTrack=${prevSelectedTextTrack} textTrackId=${textTrackId} isPlaying=${this._isPlaying}`);
1427
+ async _selectTextTrackV3(textTrackId) {
1429
1428
  if (window.cefQuery) {
1430
1429
  const FCID = getFCID();
1431
1430
  const logger = sdkLogger.withFields({ FCID });
@@ -1701,62 +1700,225 @@ class RemotePlayer extends EventTarget {
1701
1700
  sdkLogger.info("Seeking: local video element seeking end");
1702
1701
  }
1703
1702
 
1703
+ async _stopAudio() {
1704
+ if (window.cefQuery) {
1705
+ if (this._remotePlayerApiVersion >= 2) {
1706
+ return new Promise((resolve, reject) => {
1707
+ const FCID = getFCID();
1708
+ const logger = sdkLogger.withFields({ FCID });
1709
+ logger.log(`remotePlayer _stopAudio: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
1710
+ const message = {
1711
+ type: "remotePlayer.stop",
1712
+ class: "remotePlayer",
1713
+ action: "stop",
1714
+ streamType: StreamType.AUDIO,
1715
+ fcid: FCID
1716
+ };
1717
+ let timerId = 0;
1718
+ const timeBeforeSendingRequest = Date.now();
1719
+ const queryId = window.cefQuery({
1720
+ request: JSON.stringify({ target: "TC", waitForResponse: true, internalAction: "uiActive", message: JSON.stringify(message) }),
1721
+ persistent: false,
1722
+ onSuccess: () => {
1723
+ const duration = Date.now() - timeBeforeSendingRequest;
1724
+ logger.withFields({ duration }).log(`stop audio completed successfully after ${duration} ms`);
1725
+ this._inTransition = false;
1726
+ timerId = clearTimer(timerId);
1727
+ resolve(true);
1728
+ },
1729
+ onFailure: (code, msg) => {
1730
+ const duration = Date.now() - timeBeforeSendingRequest;
1731
+ logger.withFields({ duration }).log(`stop audio failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
1732
+ this._inTransition = false;
1733
+ timerId = clearTimer(timerId);
1734
+ reject(new SenzaError(code, msg));
1735
+ }
1736
+ });
1737
+ logger.log(`window.cefQuery for stop audio returned query id ${queryId}`);
1738
+ const timeout = this._remotePlayerConfirmationTimeout + 1000;
1739
+ timerId = setTimeout(() => {
1740
+ logger.log(`stop audio reached timeout of ${timeout} ms, canceling query id ${queryId}`);
1741
+ this._inTransition = false;
1742
+ window.cefQueryCancel(queryId);
1743
+ reject(new SenzaError(6000, `stop audio reached timeout of ${timeout} ms`));
1744
+ }, timeout, queryId);
1745
+ });
1746
+ }
1747
+ }
1748
+
1749
+ }
1750
+
1751
+ async _stopSubtitle() {
1752
+ if (window.cefQuery) {
1753
+ if (this._remotePlayerApiVersion >= 2) {
1754
+ return new Promise((resolve, reject) => {
1755
+ const FCID = getFCID();
1756
+ const logger = sdkLogger.withFields({ FCID });
1757
+ logger.log(`remotePlayer _stopSubtitle: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
1758
+ const message = {
1759
+ type: "remotePlayer.stop",
1760
+ class: "remotePlayer",
1761
+ action: "stop",
1762
+ streamType: StreamType.SUBTITLE,
1763
+ fcid: FCID
1764
+ };
1765
+ let timerId = 0;
1766
+ const timeBeforeSendingRequest = Date.now();
1767
+ const queryId = window.cefQuery({
1768
+ request: JSON.stringify({ target: "TC", waitForResponse: true, message: JSON.stringify(message) }),
1769
+ persistent: false,
1770
+ onSuccess: () => {
1771
+ const duration = Date.now() - timeBeforeSendingRequest;
1772
+ logger.withFields({ duration }).log(`stopSubtitle completed successfully after ${duration} ms`);
1773
+ this._inTransition = false;
1774
+ timerId = clearTimer(timerId);
1775
+ resolve(true);
1776
+ },
1777
+ onFailure: (code, msg) => {
1778
+ const duration = Date.now() - timeBeforeSendingRequest;
1779
+ logger.withFields({ duration }).log(`stopSubtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
1780
+ this._inTransition = false;
1781
+ timerId = clearTimer(timerId);
1782
+ reject(new SenzaError(code, msg));
1783
+ }
1784
+ });
1785
+ logger.log(`window.cefQuery for stopSubtitle returned query id ${queryId}`);
1786
+ const timeout = this._remotePlayerConfirmationTimeout + 1000;
1787
+ timerId = setTimeout(() => {
1788
+ logger.log(`stopSubtitle reached timeout of ${timeout} ms, canceling query id ${queryId}`);
1789
+ window.cefQueryCancel(queryId);
1790
+ reject(new SenzaError(6000, `stopSubtitle reached timeout of ${timeout} ms`));
1791
+ }, timeout, queryId);
1792
+ });
1793
+ }
1794
+ }
1795
+
1796
+ }
1797
+
1798
+ async _playSubtitle() {
1799
+ if (window.cefQuery) {
1800
+ if (this._remotePlayerApiVersion >= 2) {
1801
+ return new Promise((resolve, reject) => {
1802
+ const FCID = getFCID();
1803
+ const logger = sdkLogger.withFields({ FCID });
1804
+ logger.log("remotePlayer play subtitle: sending play action");
1805
+ const configuration = remotePlayer.getConfiguration();
1806
+ if (!remotePlayer.textTrackVisibility) {
1807
+ sdkLogger.info("override selected track on _playSubtitle with \"\"");
1808
+ }
1809
+ const subtitlesLanguage = remotePlayer.textTrackVisibility && (remotePlayer._selectedSubtitlesTrack || configuration.preferredSubtitlesLanguage) || "";
1810
+ let request;
1811
+ const message = {
1812
+ action: "play",
1813
+ fcid: FCID,
1814
+ subtitlesLanguage
1815
+ };
1816
+ if (this._remotePlayerApiVersion >= 2) {
1817
+ message.type = "remotePlayer.play";
1818
+ message.class = "remotePlayer";
1819
+ message.streamType = StreamType.SUBTITLE;
1820
+ request = {
1821
+ target: "TC",
1822
+ waitForResponse: true,
1823
+ message: JSON.stringify(message)
1824
+ };
1825
+ } else {
1826
+ request = message;
1827
+ }
1828
+ let timerId = 0;
1829
+ const timeBeforeSendingRequest = Date.now();
1830
+ const queryId = window.cefQuery({
1831
+ request: JSON.stringify(request),
1832
+ persistent: false,
1833
+ onSuccess: () => {
1834
+ const duration = Date.now() - timeBeforeSendingRequest;
1835
+ logger.withFields({ duration }).log(`play subtitle completed successfully after ${duration} ms`);
1836
+ this._inTransition = false;
1837
+ timerId = clearTimer(timerId);
1838
+ resolve();
1839
+ },
1840
+ onFailure: (code, msg) => {
1841
+ const duration = Date.now() - timeBeforeSendingRequest;
1842
+ logger.withFields({ duration }).log(`play subtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
1843
+ this._inTransition = false;
1844
+ timerId = clearTimer(timerId);
1845
+ reject(new SenzaError(code, msg));
1846
+ }
1847
+ });
1848
+ if (this._remotePlayerApiVersion >= 2) {
1849
+ logger.log(`window.cefQuery for play subtitle returned query id ${queryId}`);
1850
+ const timeout = this._remotePlayerConfirmationTimeout + 1000;
1851
+ timerId = setTimeout(() => {
1852
+ logger.log(`play subtitle reached timeout of ${timeout} ms, canceling query id ${queryId}`);
1853
+ this._inTransition = false;
1854
+ window.cefQueryCancel(queryId);
1855
+ reject(new SenzaError(6000, `play subtitle reached timeout of ${timeout} ms`));
1856
+ }, timeout, queryId);
1857
+ }
1858
+ });
1859
+ }
1860
+
1861
+ }
1862
+ sdkLogger.error("remotePlayer play subtitle: window.cefQuery is undefined");
1863
+ return Promise.resolve(undefined);
1864
+ }
1865
+
1704
1866
  async _atomicSetSubtitleLanguage() {
1705
1867
  sdkLogger.info("SetSubtitleLanguage: local video element set start while isPLaying=", this._isPlaying);
1706
1868
 
1707
- this._targetSeekPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
1869
+ this._targetSetSubtitlePlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
1708
1870
  this._abortSetSubtitleLanguage = false;
1709
1871
  this._isSetSubtitleByApplication = true;
1710
1872
 
1711
1873
  let state = SetSubtitleLanguageState.INIT;
1712
1874
 
1713
- let previousPendingSubtitleLanguage = this._pendingSubtitleLanguage;
1714
- let initialSubtitleLanguage= this._pendingSubtitleLanguage;
1875
+ let initialSubtitleLanguage = this._pendingSubtitleLanguage;
1715
1876
  let res;
1716
1877
 
1717
1878
  while (!this._abortSetSubtitleLanguage && state !== SetSubtitleLanguageState.DONE) {
1718
1879
  try {
1719
- // TODO - Implement the logic for setting audio language
1720
1880
  switch(state) {
1721
1881
  case SetSubtitleLanguageState.INIT:
1722
- state = this._isPlaying ? SetSubtitleLanguageState.STOPPED : SetSubtitleLanguageState.SET;
1882
+ state = SetSubtitleLanguageState.STOPPED; // always stop
1723
1883
  break;
1724
1884
  case SetSubtitleLanguageState.STOPPED:
1725
- await lifecycle.moveToForeground();
1885
+ sdkLogger.info("BEFORE STOP BEFORE SET SUBTITLE");
1886
+ await this._stopSubtitle();
1887
+ sdkLogger.info("AFTER STOP BEFORE SET SUBTITLE");
1726
1888
  state = SetSubtitleLanguageState.SET;
1727
1889
  break;
1728
1890
  case SetSubtitleLanguageState.SET:
1729
1891
  initialSubtitleLanguage = this._pendingSubtitleLanguage;
1730
- previousPendingSubtitleLanguage = this._selectedSubtitleTrack;
1731
- res = await this._selectTextTrackV3(initialSubtitleLanguage, previousPendingSubtitleLanguage);
1892
+ sdkLogger.log(`remotePlayer _selectTextTrackV3: textTrackId=${textTrackId} isPlaying=${this._isPlaying}`);
1893
+ res = await this._selectTextTrackV3(initialSubtitleLanguage);
1894
+ sdkLogger.info("AFTER SET SUBTITLE 1");
1895
+ state = this._isPlaying ? SetSubtitleLanguageState.PLAYING: SetSubtitleLanguageState.DONE;
1896
+ break;
1897
+ case SetSubtitleLanguageState.PLAYING:
1898
+ if (!this._abortSetSubtitleLanguage) {
1899
+ sdkLogger.info("TARGET PLAYING STATE", this._targetSetSubtitlePlayingState);
1900
+ sdkLogger.info("BEFORE PLAY AFTER SET SUBTITLE");
1901
+ this._playSubtitle();
1902
+ }
1732
1903
  state = SetSubtitleLanguageState.DONE;
1733
1904
  break;
1734
1905
  }
1735
1906
  } catch (error) {
1736
- sdkLogger.error(`Error during set subtitle process: ${error.message}`);
1907
+ sdkLogger.info(`Error during set subtitle process: ${error.message}`);
1737
1908
  state = SetSubtitleLanguageState.DONE;
1738
1909
  res = Promise.reject(error);
1739
- } finally {
1740
- if (!this._abortSetSubtitleLanguage) {
1741
- if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_UI) {
1742
- console.log("BEFORE PLAY AFTER SET SUBTITLE");
1743
- await this._play();
1744
- } else if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_ABR) {
1745
- console.log("BEFORE MOVE_TO_BACKGROUND AFTER SET SUBTITLE");
1746
- await lifecycle._moveToBackground();
1747
- }
1748
- }
1749
- this._isSetSubtitleByApplication = false;
1750
- sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
1751
1910
  }
1752
1911
  }
1912
+
1913
+ this._isSetSubtitleByApplication = false;
1914
+ sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
1753
1915
  return res
1754
1916
  }
1755
1917
 
1756
1918
  async _atomicSetAudioLanguage() {
1757
1919
  sdkLogger.info("SetAudioLanguage: local video element set start while isPLaying=", this._isPlaying);
1758
1920
 
1759
- this._targetSeekPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
1921
+ this._targetSetAudioPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
1760
1922
  this._abortSetAudioLanguage = false;
1761
1923
  this._isSetAudioByApplication = true;
1762
1924
 
@@ -1768,40 +1930,42 @@ class RemotePlayer extends EventTarget {
1768
1930
 
1769
1931
  while (!this._abortSetAudioLanguage && state !== SetAudioLanguageState.DONE) {
1770
1932
  try {
1771
- // TODO - Implement the logic for setting audio language
1933
+
1772
1934
  switch(state) {
1773
1935
  case SetAudioLanguageState.INIT:
1774
- state = this._isPlaying ? SetAudioLanguageState.STOPPED : SetAudioLanguageState.SET;
1936
+ sdkLogger.info("BEFORE STOP BEFORE SET AUDIO");
1937
+ await this._stopAudio();
1938
+ sdkLogger.info("AFTER STOP BEFORE SET AUDIO");
1939
+ state = SetAudioLanguageState.SET;
1775
1940
  break;
1776
1941
  case SetAudioLanguageState.STOPPED:
1777
- await lifecycle.moveToForeground();
1778
1942
  state = SetAudioLanguageState.SET;
1779
1943
  break;
1780
1944
  case SetAudioLanguageState.SET:
1781
1945
  initialAudioLanguage = this._pendingAudioLanguage;
1782
1946
  previousPendingAudioLanguage = this._selectedAudioTrack;
1783
1947
  res = await this._selectAudioTrackV3(initialAudioLanguage, previousPendingAudioLanguage);
1948
+ sdkLogger.info("BEFORE PLAY AFTER SET AUDIO 1");
1784
1949
  state = SetAudioLanguageState.DONE;
1785
1950
  break;
1786
1951
  }
1787
1952
  } catch (error) {
1788
- sdkLogger.error(`Error during set audio process: ${error.message}`);
1953
+ sdkLogger.info(`Error during set audio process: ${error.message}`);
1789
1954
  state = SetAudioLanguageState.DONE;
1790
1955
  res = Promise.reject(error);
1791
- } finally {
1792
- if (!this._abortSetAudioLanguage) {
1793
- if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_UI) {
1794
- console.log("BEFORE PLAY AFTER SET AUDIO");
1795
- await this._play();
1796
- } else if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_ABR) {
1797
- console.log("BEFORE MOVE_TO_BACKGROUND AFTER SET AUDIO");
1798
- await lifecycle._moveToBackground();
1799
- }
1800
- }
1801
- this._isSetAudioByApplication = false;
1802
- sdkLogger.info("SetAudioLanguage: local video element set audio end");
1803
1956
  }
1804
1957
  }
1958
+
1959
+ if (!this._abortSetAudioLanguage) {
1960
+ sdkLogger.info("TARGET PLAYING STATE", this._targetSetAudioPlayingState);
1961
+ if (this._targetSetAudioPlayingState === TargetPlayingState.PLAYING_UI) {
1962
+ sdkLogger.info("BEFORE PLAY AFTER SET AUDIO 2");
1963
+ this._play();
1964
+ }
1965
+ }
1966
+
1967
+ this._isSetAudioByApplication = false;
1968
+ sdkLogger.info("SetAudioLanguage: local video element set audio end");
1805
1969
  return res
1806
1970
  }
1807
1971
  }
package/src/utils.js CHANGED
@@ -159,8 +159,7 @@ export const SetAudioLanguageState = Object.freeze({
159
159
  INIT: "init",
160
160
  STOPPED: "stopped",
161
161
  SET: "set",
162
- MULTI_SET: "multiSet",
163
- WAITING: "waiting",
162
+ PLAYING: "playing",
164
163
  DONE: "done"
165
164
  });
166
165
 
@@ -168,8 +167,7 @@ export const SetSubtitleLanguageState = Object.freeze({
168
167
  INIT: "init",
169
168
  STOPPED: "stopped",
170
169
  SET: "set",
171
- MULTI_SET: "multiSet",
172
- WAITING: "waiting",
170
+ PLAYING: "playing",
173
171
  DONE: "done"
174
172
  });
175
173