Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

middleware.ts 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { IStore } from '../app/types';
  2. import {
  3. CONFERENCE_JOINED,
  4. CONFERENCE_WILL_LEAVE
  5. } from '../base/conference/actionTypes';
  6. import { getCurrentConference } from '../base/conference/functions';
  7. import { JitsiConferenceEvents } from '../base/lib-jitsi-meet';
  8. import { getLocalParticipant, getParticipantCount } from '../base/participants/functions';
  9. import { IParticipant } from '../base/participants/types';
  10. import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
  11. import { TRACK_ADDED, TRACK_REMOVED, TRACK_UPDATED } from '../base/tracks/actionTypes';
  12. import FaceLandmarksDetector from './FaceLandmarksDetector';
  13. import { ADD_FACE_EXPRESSION, NEW_FACE_COORDINATES, UPDATE_FACE_COORDINATES } from './actionTypes';
  14. import {
  15. addToFaceExpressionsBuffer
  16. } from './actions';
  17. import { FACE_BOX_EVENT_TYPE } from './constants';
  18. import { sendFaceBoxToParticipants, sendFaceExpressionToParticipants, sendFaceExpressionToServer } from './functions';
  19. MiddlewareRegistry.register((store: IStore) => (next: Function) => (action: any) => {
  20. const { dispatch, getState } = store;
  21. const { faceLandmarks } = getState()['features/base/config'];
  22. const isEnabled = faceLandmarks?.enableFaceCentering || faceLandmarks?.enableFaceExpressionsDetection;
  23. if (action.type === CONFERENCE_JOINED) {
  24. if (isEnabled) {
  25. FaceLandmarksDetector.init(store);
  26. }
  27. // allow using remote face centering data when local face centering is not enabled
  28. action.conference.on(
  29. JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED,
  30. (participant: IParticipant | undefined, eventData: any) => {
  31. if (!participant || !eventData || !participant.getId) {
  32. return;
  33. }
  34. if (eventData.type === FACE_BOX_EVENT_TYPE) {
  35. dispatch({
  36. type: UPDATE_FACE_COORDINATES,
  37. faceBox: eventData.faceBox,
  38. id: participant.getId()
  39. });
  40. }
  41. });
  42. return next(action);
  43. }
  44. if (!isEnabled) {
  45. return next(action);
  46. }
  47. switch (action.type) {
  48. case CONFERENCE_WILL_LEAVE : {
  49. FaceLandmarksDetector.stopDetection(store);
  50. return next(action);
  51. }
  52. case TRACK_ADDED: {
  53. const { jitsiTrack: { isLocal, videoType }, muted } = action.track;
  54. if (videoType === 'camera' && isLocal() && !muted) {
  55. // need to pass this since the track is not yet added in the store
  56. FaceLandmarksDetector.startDetection(store, action.track);
  57. }
  58. return next(action);
  59. }
  60. case TRACK_UPDATED: {
  61. const { jitsiTrack: { isLocal, videoType } } = action.track;
  62. if (videoType !== 'camera' || !isLocal()) {
  63. return next(action);
  64. }
  65. const { muted } = action.track;
  66. if (muted !== undefined) {
  67. // addresses video mute state changes
  68. if (muted) {
  69. FaceLandmarksDetector.stopDetection(store);
  70. } else {
  71. FaceLandmarksDetector.startDetection(store);
  72. }
  73. }
  74. return next(action);
  75. }
  76. case TRACK_REMOVED: {
  77. const { jitsiTrack: { isLocal, videoType } } = action.track;
  78. if (videoType === 'camera' && isLocal()) {
  79. FaceLandmarksDetector.stopDetection(store);
  80. }
  81. return next(action);
  82. }
  83. case ADD_FACE_EXPRESSION: {
  84. const state = getState();
  85. const { faceExpression, duration, timestamp } = action;
  86. const conference = getCurrentConference(state);
  87. if (getParticipantCount(state) > 1) {
  88. sendFaceExpressionToParticipants(conference, faceExpression, duration);
  89. }
  90. sendFaceExpressionToServer(conference, faceExpression, duration);
  91. dispatch(addToFaceExpressionsBuffer({
  92. emotion: faceExpression,
  93. timestamp
  94. }));
  95. return next(action);
  96. }
  97. case NEW_FACE_COORDINATES: {
  98. const state = getState();
  99. const { faceBox } = action;
  100. const conference = getCurrentConference(state);
  101. const localParticipant = getLocalParticipant(state);
  102. if (getParticipantCount(state) > 1) {
  103. sendFaceBoxToParticipants(conference, faceBox);
  104. }
  105. dispatch({
  106. type: UPDATE_FACE_COORDINATES,
  107. faceBox,
  108. id: localParticipant?.id
  109. });
  110. }
  111. }
  112. return next(action);
  113. });