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.6KB

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