burger-online

Форк
0
/
socket-middleware.ts 
85 строк · 2.3 Кб
1
import {Middleware, MiddlewareAPI} from 'redux'
2
import {
3
  feedOrdersConnect,
4
  feedOrdersDisconnect,
5
  feedOrdersWsClose,
6
  feedOrdersWsConnecting,
7
  feedOrdersWsError,
8
  feedOrdersWsMessage,
9
  feedOrdersWsOpen,
10
} from '../feed-orders/actions'
11
import {
12
  profileOrderConnect,
13
  profileOrderDisconnect,
14
  profileOrderWsClose,
15
  profileOrderWsConnecting,
16
  profileOrderWsError,
17
  profileOrderWsMessage,
18
  profileOrderWsOpen,
19
} from '../profile-orders/actions'
20
import {AppDispatch, RootState} from '../store'
21
import {fetchCheckUser} from '../user/actions'
22

23
type TWsActions = {
24
  wsConnect: typeof feedOrdersConnect | typeof profileOrderConnect
25
  wsDisconnect: typeof feedOrdersDisconnect | typeof profileOrderDisconnect
26
  wsConnecting: typeof feedOrdersWsConnecting | typeof profileOrderWsConnecting
27
  onOpen: typeof feedOrdersWsOpen | typeof profileOrderWsOpen
28
  onMessage: typeof feedOrdersWsMessage | typeof profileOrderWsMessage
29
  onClose: typeof feedOrdersWsClose | typeof profileOrderWsClose
30
  onError: typeof feedOrdersWsError | typeof profileOrderWsError
31
}
32

33
export const socketMiddleware = (wsActions: TWsActions): Middleware => {
34
  return (store: MiddlewareAPI<AppDispatch, RootState>) => {
35
    let socket: WebSocket | null = null
36
    let isCLosed = false
37

38
    return next => action => {
39
      const {dispatch} = store
40
      const {wsConnect, wsDisconnect, wsConnecting, onOpen, onMessage, onClose, onError} = wsActions
41

42
      if (wsConnect.match(action)) {
43
        if (action.payload) {
44
          socket = new WebSocket(action.payload)
45
          dispatch(wsConnecting())
46
        }
47
      }
48

49
      if (socket) {
50
        socket.onopen = event => {
51
          dispatch(onOpen())
52
        }
53

54
        socket.onmessage = event => {
55
          const {data} = event
56
          if (data.message === 'Invalid or missing token') {
57
            dispatch(fetchCheckUser())
58
          } else {
59
            dispatch(onMessage(JSON.parse(data)))
60
          }
61
        }
62

63
        socket.onerror = event => {
64
          dispatch(onError())
65
        }
66

67
        socket.onclose = event => {
68
          if (!isCLosed) {
69
            dispatch(onClose())
70
          } else {
71
            dispatch(wsConnect())
72
          }
73
        }
74

75
        if (wsDisconnect.match(action)) {
76
          socket.close()
77
          socket = null
78
          isCLosed = true
79
        }
80
      }
81

82
      next(action)
83
    }
84
  }
85
}
86

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.