Прослушивание событий вебсокетов
Подскажите, пжлста, имеются вебсокеты и не могу понять где накосячил, на клиенте один экзмепляр сокета, слушателей на каждое событие по одному, но при получении с сервера событие updateMessage происходит два раза у одного клиента(хотелось бы один), а getNewMessage у всех один- 1
//серверная часть
socket.on('message:createNewMessage', async (data) => {
const parsedData = JSON.parse(data)
const message = await MessageService.addMessage(parsedData)
socket.broadcast.emit('message:getNewMessage', JSON.stringify(message))
io.to(socket.id).emit('message:updateMessage', JSON.stringify(message))
})
//клиентская часть
export const socketMiddleware = (
wsActions: TSocketChatMiddlewareActions
): Middleware<{}, RootState> => {
return (store) => {
let socket: Socket | null = null
return (next) => (action) => {
const { dispatch } = store
const user = store.getState().rootReducer.user.data.name
const {
wsConnect,
wsDisconnect,
wsSendMessage,
wsConnecting,
wsOnOpen,
wsOnClose,
wsOnError,
wsOnMessage,
wsSetUsers,
wsUserJoined,
wsUserLeft,
wsRecieveAllMessage,
} = wsActions
if (wsConnect.match(action)) {
socket = io('http://localhost:5000', {
path: '/api/messages',
transports: ['websocket'],
reconnectionDelay: 5000,
query: {
user,
},
})
dispatch(wsConnecting())
}
if (socket) {
socket.removeAllListeners()
socket.on('connect', () => {
dispatch(wsOnOpen())
})
socket.on('connect_error', (error) => {
dispatch(wsOnError(`Error === ${error.message}`))
})
socket.on('disconnect', (reason: any) => {
dispatch(wsOnClose())
})
//USER
socket.on('login', (data: TConnectDataToOwner) => {
dispatch(socketChatAction.setUsers(data))
socket!.emit('message:getHistoryMessage')
})
socket.on('user left', (data) => {
dispatch(socketChatAction.addLeftUserEvent(data))
})
socket.on('user joined', (data) => {
dispatch(socketChatAction.addJoinUserEvent(data))
})
socket.on('message:recieveHistoryMessage', (data) => {
const messages = JSON.parse(data)
dispatch(socketChatAction.setHistoryMessages(messages))
})
if (wsSendMessage.match(action)) {
const messageData = action.payload
switch (messageData.processing) {
case TMessageProcessing.ADD:
const modifiedData = {
...messageData.data,
_id: uniqid(),
timestamp: new Date().toISOString(),
}
dispatch(socketChatAction.addMessage(modifiedData))
socket.emit(
'message:createNewMessage',
JSON.stringify(modifiedData)
)
break
case TMessageProcessing.EDIT:
socket.emit(
'message:editMessage',
JSON.stringify({
...messageData.data,
timestamp: new Date().toISOString(),
})
)
break
case TMessageProcessing.EDIT:
socket.emit(
'message:editMessage',
JSON.stringify({
...messageData.data,
timestamp: new Date().toISOString(),
})
)
break
}
}
socket.on('message:updateMessage', (data) => {
const message = JSON.parse(data)
dispatch(socketChatAction.updateMessage(message))
})
socket.on('message:getNewMessage', (data) => {
const message = JSON.parse(data)
dispatch(socketChatAction.addMessage(message))
})
if (wsDisconnect.match(action)) {
socket.disconnect()
socket = null
dispatch(wsOnClose())
}
}
next(action)
}
}
}
useEffect(() => {
dispatch(connect())
return () => {
dispatch(disconnect())
}
}, [])
"react": "^18.2.0",