jellyfish-web/src/components/syncPlay/ui/playbackPermissionManager.js

53 lines
1.4 KiB
JavaScript
Raw Normal View History

import { appHost } from '../../apphost';
2020-04-15 18:09:34 +02:00
/**
* Creates an audio element that plays a silent sound.
* @returns {HTMLMediaElement} The audio element.
*/
function createTestMediaElement () {
const elem = document.createElement('audio');
elem.classList.add('testMediaPlayerAudio');
elem.classList.add('hide');
document.body.appendChild(elem);
elem.volume = 1; // Volume should not be zero to trigger proper permissions
2020-05-05 12:01:43 +02:00
elem.src = 'assets/audio/silence.mp3'; // Silent sound
2020-04-15 18:09:34 +02:00
return elem;
}
/**
* Destroys a media element.
* @param {HTMLMediaElement} elem The element to destroy.
*/
function destroyTestMediaElement (elem) {
elem.pause();
elem.remove();
}
/**
* Class that manages the playback permission.
*/
class PlaybackPermissionManager {
/**
2020-05-05 12:01:43 +02:00
* Tests playback permission. Grabs the permission when called inside a click event (or any other valid user interaction).
2020-04-15 18:09:34 +02:00
* @returns {Promise} Promise that resolves succesfully if playback permission is allowed.
*/
2021-06-24 17:50:39 -04:00
check () {
2021-04-10 22:01:37 -04:00
if (appHost.supports('htmlaudioautoplay')) {
2021-06-24 17:50:39 -04:00
return Promise.resolve(true);
}
2022-02-26 13:56:50 +03:00
const media = createTestMediaElement();
return media.play()
.finally(() => {
2020-04-15 18:09:34 +02:00
destroyTestMediaElement(media);
});
}
}
/** PlaybackPermissionManager singleton. */
export default new PlaybackPermissionManager();