senza-sdk 4.2.51-185e62d.0 → 4.2.51-1d6f604.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/dist/bundle.js +1 -1
- package/package.json +1 -1
- package/src/remotePlayer.js +197 -37
package/package.json
CHANGED
package/src/remotePlayer.js
CHANGED
|
@@ -1701,64 +1701,224 @@ class RemotePlayer extends EventTarget {
|
|
|
1701
1701
|
sdkLogger.info("Seeking: local video element seeking end");
|
|
1702
1702
|
}
|
|
1703
1703
|
|
|
1704
|
+
async _stopAudio() {
|
|
1705
|
+
if (window.cefQuery) {
|
|
1706
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1707
|
+
return new Promise((resolve, reject) => {
|
|
1708
|
+
const FCID = getFCID();
|
|
1709
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1710
|
+
logger.log(`remotePlayer _stopAudio: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
|
|
1711
|
+
const message = {
|
|
1712
|
+
type: "remotePlayer.stop",
|
|
1713
|
+
class: "remotePlayer",
|
|
1714
|
+
action: "stop",
|
|
1715
|
+
streamType: StreamType.AUDIO,
|
|
1716
|
+
fcid: FCID
|
|
1717
|
+
};
|
|
1718
|
+
let timerId = 0;
|
|
1719
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1720
|
+
const queryId = window.cefQuery({
|
|
1721
|
+
request: JSON.stringify({ target: "TC", waitForResponse: true, internalAction: "uiActive", message: JSON.stringify(message) }),
|
|
1722
|
+
persistent: false,
|
|
1723
|
+
onSuccess: () => {
|
|
1724
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1725
|
+
logger.withFields({ duration }).log(`stop audio completed successfully after ${duration} ms`);
|
|
1726
|
+
this._inTransition = false;
|
|
1727
|
+
timerId = clearTimer(timerId);
|
|
1728
|
+
resolve(true);
|
|
1729
|
+
},
|
|
1730
|
+
onFailure: (code, msg) => {
|
|
1731
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1732
|
+
logger.withFields({ duration }).log(`stop audio failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1733
|
+
this._inTransition = false;
|
|
1734
|
+
timerId = clearTimer(timerId);
|
|
1735
|
+
reject(new SenzaError(code, msg));
|
|
1736
|
+
}
|
|
1737
|
+
});
|
|
1738
|
+
logger.log(`window.cefQuery for stop audio returned query id ${queryId}`);
|
|
1739
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1740
|
+
timerId = setTimeout(() => {
|
|
1741
|
+
logger.log(`stop audio reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1742
|
+
this._inTransition = false;
|
|
1743
|
+
window.cefQueryCancel(queryId);
|
|
1744
|
+
reject(new SenzaError(6000, `stop audio reached timeout of ${timeout} ms`));
|
|
1745
|
+
}, timeout, queryId);
|
|
1746
|
+
});
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
}
|
|
1751
|
+
|
|
1752
|
+
async _stopSubtitle() {
|
|
1753
|
+
if (window.cefQuery) {
|
|
1754
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1755
|
+
return new Promise((resolve, reject) => {
|
|
1756
|
+
const FCID = getFCID();
|
|
1757
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1758
|
+
logger.log(`remotePlayer _stopSubtitle: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
|
|
1759
|
+
const message = {
|
|
1760
|
+
type: "remotePlayer.stop",
|
|
1761
|
+
class: "remotePlayer",
|
|
1762
|
+
action: "stop",
|
|
1763
|
+
streamType: StreamType.SUBTITLE,
|
|
1764
|
+
fcid: FCID
|
|
1765
|
+
};
|
|
1766
|
+
let timerId = 0;
|
|
1767
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1768
|
+
const queryId = window.cefQuery({
|
|
1769
|
+
request: JSON.stringify({ target: "TC", waitForResponse: true, internalAction: "uiActive", message: JSON.stringify(message) }),
|
|
1770
|
+
persistent: false,
|
|
1771
|
+
onSuccess: () => {
|
|
1772
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1773
|
+
logger.withFields({ duration }).log(`stop subtitle completed successfully after ${duration} ms`);
|
|
1774
|
+
this._inTransition = false;
|
|
1775
|
+
timerId = clearTimer(timerId);
|
|
1776
|
+
resolve(true);
|
|
1777
|
+
},
|
|
1778
|
+
onFailure: (code, msg) => {
|
|
1779
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1780
|
+
logger.withFields({ duration }).log(`stop subtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1781
|
+
this._inTransition = false;
|
|
1782
|
+
timerId = clearTimer(timerId);
|
|
1783
|
+
reject(new SenzaError(code, msg));
|
|
1784
|
+
}
|
|
1785
|
+
});
|
|
1786
|
+
logger.log(`window.cefQuery for stop returned query id ${queryId}`);
|
|
1787
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1788
|
+
timerId = setTimeout(() => {
|
|
1789
|
+
logger.log(`stop reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1790
|
+
window.cefQueryCancel(queryId);
|
|
1791
|
+
reject(new SenzaError(6000, `stop reached timeout of ${timeout} ms`));
|
|
1792
|
+
}, timeout, queryId);
|
|
1793
|
+
});
|
|
1794
|
+
}
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
async _playSubtitle() {
|
|
1800
|
+
if (window.cefQuery) {
|
|
1801
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1802
|
+
return new Promise((resolve, reject) => {
|
|
1803
|
+
const FCID = getFCID();
|
|
1804
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1805
|
+
logger.log("remotePlayer play subtitle: sending play action");
|
|
1806
|
+
const configuration = remotePlayer.getConfiguration();
|
|
1807
|
+
const subtitlesLanguage = remotePlayer.textTrackVisibility && (remotePlayer._selectedSubtitlesTrack || configuration.preferredSubtitlesLanguage) || "";
|
|
1808
|
+
let request;
|
|
1809
|
+
const message = {
|
|
1810
|
+
action: "play",
|
|
1811
|
+
fcid: FCID,
|
|
1812
|
+
subtitlesLanguage
|
|
1813
|
+
};
|
|
1814
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1815
|
+
message.type = "remotePlayer.play";
|
|
1816
|
+
message.class = "remotePlayer";
|
|
1817
|
+
message.streamType = StreamType.SUBTITLE;
|
|
1818
|
+
request = {
|
|
1819
|
+
target: "TC",
|
|
1820
|
+
waitForResponse: true,
|
|
1821
|
+
internalAction: "uiExit",
|
|
1822
|
+
message: JSON.stringify(message)
|
|
1823
|
+
};
|
|
1824
|
+
} else {
|
|
1825
|
+
request = message;
|
|
1826
|
+
}
|
|
1827
|
+
let timerId = 0;
|
|
1828
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1829
|
+
const queryId = window.cefQuery({
|
|
1830
|
+
request: JSON.stringify(request),
|
|
1831
|
+
persistent: false,
|
|
1832
|
+
onSuccess: () => {
|
|
1833
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1834
|
+
logger.withFields({ duration }).log(`play subtitle completed successfully after ${duration} ms`);
|
|
1835
|
+
this._inTransition = false;
|
|
1836
|
+
timerId = clearTimer(timerId);
|
|
1837
|
+
resolve();
|
|
1838
|
+
},
|
|
1839
|
+
onFailure: (code, msg) => {
|
|
1840
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1841
|
+
logger.withFields({ duration }).log(`play subtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1842
|
+
this._inTransition = false;
|
|
1843
|
+
timerId = clearTimer(timerId);
|
|
1844
|
+
reject(new SenzaError(code, msg));
|
|
1845
|
+
}
|
|
1846
|
+
});
|
|
1847
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1848
|
+
logger.log(`window.cefQuery for play subtitle returned query id ${queryId}`);
|
|
1849
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1850
|
+
timerId = setTimeout(() => {
|
|
1851
|
+
logger.log(`play subtitle reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1852
|
+
this._inTransition = false;
|
|
1853
|
+
window.cefQueryCancel(queryId);
|
|
1854
|
+
reject(new SenzaError(6000, `play subtitle reached timeout of ${timeout} ms`));
|
|
1855
|
+
}, timeout, queryId);
|
|
1856
|
+
}
|
|
1857
|
+
});
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
}
|
|
1861
|
+
sdkLogger.error("remotePlayer play subtitle: window.cefQuery is undefined");
|
|
1862
|
+
return Promise.resolve(undefined);
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1704
1865
|
async _atomicSetSubtitleLanguage() {
|
|
1705
1866
|
sdkLogger.info("SetSubtitleLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1706
1867
|
|
|
1707
|
-
this.
|
|
1868
|
+
this._targetSetSubtitlePlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1708
1869
|
this._abortSetSubtitleLanguage = false;
|
|
1709
1870
|
this._isSetSubtitleByApplication = true;
|
|
1710
1871
|
|
|
1711
1872
|
let state = SetSubtitleLanguageState.INIT;
|
|
1712
1873
|
|
|
1713
1874
|
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
1882
|
state = this._isPlaying ? SetSubtitleLanguageState.STOPPED : SetSubtitleLanguageState.SET;
|
|
1723
1883
|
break;
|
|
1724
1884
|
case SetSubtitleLanguageState.STOPPED:
|
|
1725
|
-
|
|
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
1892
|
previousPendingSubtitleLanguage = this._selectedSubtitleTrack;
|
|
1731
1893
|
res = await this._selectTextTrackV3(initialSubtitleLanguage, previousPendingSubtitleLanguage);
|
|
1732
|
-
sdkLogger.
|
|
1894
|
+
sdkLogger.info("BEFORE PLAY AFTER SET SUBTITLE 1");
|
|
1733
1895
|
state = SetSubtitleLanguageState.DONE;
|
|
1734
1896
|
break;
|
|
1735
1897
|
}
|
|
1736
1898
|
} catch (error) {
|
|
1737
|
-
sdkLogger.
|
|
1899
|
+
sdkLogger.info(`Error during set subtitle process: ${error.message}`);
|
|
1738
1900
|
state = SetSubtitleLanguageState.DONE;
|
|
1739
1901
|
res = Promise.reject(error);
|
|
1740
|
-
} finally {
|
|
1741
|
-
if (!this._abortSetSubtitleLanguage) {
|
|
1742
|
-
sdkLogger.error("TARGET PLAYING STATE", this._targetSeekPlayingState);
|
|
1743
|
-
if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1744
|
-
sdkLogger.error("BEFORE PLAY AFTER SET SUBTITLE 2");
|
|
1745
|
-
await this._play();
|
|
1746
|
-
} else if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_ABR) {
|
|
1747
|
-
sdkLogger.error("BEFORE MOVE_TO_BACKGROUND AFTER SET SUBTITLE");
|
|
1748
|
-
await lifecycle._moveToBackground();
|
|
1749
|
-
}
|
|
1750
|
-
}
|
|
1751
|
-
this._isSetSubtitleByApplication = false;
|
|
1752
|
-
sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
|
|
1753
1902
|
}
|
|
1754
1903
|
}
|
|
1904
|
+
|
|
1905
|
+
if (!this._abortSetSubtitleLanguage) {
|
|
1906
|
+
sdkLogger.info("TARGET PLAYING STATE", this._targetSetSubtitlePlayingState);
|
|
1907
|
+
sdkLogger.info("TEXT TRACK VISIBILITY", this._textTrackVisibility);
|
|
1908
|
+
if (this._targetSetSubtitlePlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1909
|
+
sdkLogger.info("BEFORE PLAY AFTER SET SUBTITLE 2");
|
|
1910
|
+
this._playSubtitle();
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
this._isSetSubtitleByApplication = false;
|
|
1914
|
+
sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
|
|
1755
1915
|
return res
|
|
1756
1916
|
}
|
|
1757
1917
|
|
|
1758
1918
|
async _atomicSetAudioLanguage() {
|
|
1759
1919
|
sdkLogger.info("SetAudioLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1760
1920
|
|
|
1761
|
-
this.
|
|
1921
|
+
this._targetSetAudioPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1762
1922
|
this._abortSetAudioLanguage = false;
|
|
1763
1923
|
this._isSetAudioByApplication = true;
|
|
1764
1924
|
|
|
@@ -1770,42 +1930,42 @@ class RemotePlayer extends EventTarget {
|
|
|
1770
1930
|
|
|
1771
1931
|
while (!this._abortSetAudioLanguage && state !== SetAudioLanguageState.DONE) {
|
|
1772
1932
|
try {
|
|
1773
|
-
|
|
1933
|
+
|
|
1774
1934
|
switch(state) {
|
|
1775
1935
|
case SetAudioLanguageState.INIT:
|
|
1776
1936
|
state = this._isPlaying ? SetAudioLanguageState.STOPPED : SetAudioLanguageState.SET;
|
|
1777
1937
|
break;
|
|
1778
1938
|
case SetAudioLanguageState.STOPPED:
|
|
1779
|
-
|
|
1939
|
+
sdkLogger.info("BEFORE STOP BEFORE SET AUDIO");
|
|
1940
|
+
await this._stopAudio();
|
|
1941
|
+
sdkLogger.info("AFTER STOP BEFORE SET AUDIO");
|
|
1780
1942
|
state = SetAudioLanguageState.SET;
|
|
1781
1943
|
break;
|
|
1782
1944
|
case SetAudioLanguageState.SET:
|
|
1783
1945
|
initialAudioLanguage = this._pendingAudioLanguage;
|
|
1784
1946
|
previousPendingAudioLanguage = this._selectedAudioTrack;
|
|
1785
1947
|
res = await this._selectAudioTrackV3(initialAudioLanguage, previousPendingAudioLanguage);
|
|
1786
|
-
sdkLogger.
|
|
1948
|
+
sdkLogger.info("BEFORE PLAY AFTER SET AUDIO 1");
|
|
1787
1949
|
state = SetAudioLanguageState.DONE;
|
|
1788
1950
|
break;
|
|
1789
1951
|
}
|
|
1790
1952
|
} catch (error) {
|
|
1791
|
-
sdkLogger.
|
|
1953
|
+
sdkLogger.info(`Error during set audio process: ${error.message}`);
|
|
1792
1954
|
state = SetAudioLanguageState.DONE;
|
|
1793
1955
|
res = Promise.reject(error);
|
|
1794
|
-
} finally {
|
|
1795
|
-
if (!this._abortSetAudioLanguage) {
|
|
1796
|
-
sdkLogger.error("TARGET PLAYING STATE", this._targetSeekPlayingState);
|
|
1797
|
-
if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1798
|
-
sdkLogger.error("BEFORE PLAY AFTER SET AUDIO 2");
|
|
1799
|
-
this._play();
|
|
1800
|
-
} else if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_ABR) {
|
|
1801
|
-
sdkLogger.error("BEFORE MOVE_TO_BACKGROUND AFTER SET AUDIO");
|
|
1802
|
-
lifecycle._moveToBackground();
|
|
1803
|
-
}
|
|
1804
|
-
}
|
|
1805
|
-
this._isSetAudioByApplication = false;
|
|
1806
|
-
sdkLogger.info("SetAudioLanguage: local video element set audio end");
|
|
1807
1956
|
}
|
|
1808
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");
|
|
1809
1969
|
return res
|
|
1810
1970
|
}
|
|
1811
1971
|
}
|