You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

middleware.web.ts 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import {
  2. setPrejoinPageVisibility,
  3. setSkipPrejoinOnReload
  4. } from '../../prejoin/actions.web';
  5. import { JitsiConferenceErrors } from '../lib-jitsi-meet';
  6. import MiddlewareRegistry from '../redux/MiddlewareRegistry';
  7. import {
  8. CONFERENCE_FAILED,
  9. CONFERENCE_JOINED,
  10. CONFERENCE_JOIN_IN_PROGRESS,
  11. CONFERENCE_LEFT,
  12. KICKED_OUT
  13. } from './actionTypes';
  14. import logger from './logger';
  15. import './middleware.any';
  16. let screenLock: WakeLockSentinel | undefined;
  17. /**
  18. * Releases the screen lock.
  19. *
  20. * @returns {Promise}
  21. */
  22. async function releaseScreenLock() {
  23. if (screenLock) {
  24. if (!screenLock.released) {
  25. logger.debug('Releasing wake lock.');
  26. try {
  27. await screenLock.release();
  28. } catch (e) {
  29. logger.error(`Error while releasing the screen wake lock: ${e}.`);
  30. }
  31. }
  32. screenLock.removeEventListener('release', onWakeLockReleased);
  33. screenLock = undefined;
  34. document.removeEventListener('visibilitychange', handleVisibilityChange);
  35. }
  36. }
  37. /**
  38. * Requests a new screen wake lock.
  39. *
  40. * @returns {void}
  41. */
  42. function requestWakeLock() {
  43. if (navigator.wakeLock?.request) {
  44. navigator.wakeLock.request('screen')
  45. .then(lock => {
  46. screenLock = lock;
  47. screenLock.addEventListener('release', onWakeLockReleased);
  48. document.addEventListener('visibilitychange', handleVisibilityChange);
  49. logger.debug('Wake lock created.');
  50. })
  51. .catch(e => {
  52. logger.error(`Error while requesting wake lock for screen: ${e}`);
  53. });
  54. }
  55. }
  56. /**
  57. * Page visibility change handler that re-requests the wake lock if it has been released by the OS.
  58. *
  59. * @returns {void}
  60. */
  61. async function handleVisibilityChange() {
  62. if (screenLock?.released && document.visibilityState === 'visible') {
  63. // The screen lock have been released by the OS because of document visibility change. Lets try to request the
  64. // wake lock again.
  65. await releaseScreenLock();
  66. requestWakeLock();
  67. }
  68. }
  69. /**
  70. * Wake lock released handler.
  71. *
  72. * @returns {void}
  73. */
  74. function onWakeLockReleased() {
  75. logger.debug('Wake lock released');
  76. }
  77. MiddlewareRegistry.register(store => next => action => {
  78. const { dispatch, getState } = store;
  79. const { enableForcedReload } = getState()['features/base/config'];
  80. switch (action.type) {
  81. case CONFERENCE_JOIN_IN_PROGRESS: {
  82. dispatch(setPrejoinPageVisibility(false));
  83. break;
  84. }
  85. case CONFERENCE_JOINED: {
  86. if (enableForcedReload) {
  87. dispatch(setSkipPrejoinOnReload(false));
  88. }
  89. requestWakeLock();
  90. break;
  91. }
  92. case CONFERENCE_FAILED: {
  93. const errorName = action.error?.name;
  94. if (enableForcedReload && errorName === JitsiConferenceErrors.CONFERENCE_RESTARTED) {
  95. dispatch(setSkipPrejoinOnReload(true));
  96. }
  97. releaseScreenLock();
  98. break;
  99. }
  100. case CONFERENCE_LEFT:
  101. case KICKED_OUT:
  102. releaseScreenLock();
  103. break;
  104. }
  105. return next(action);
  106. });