Как пользоваться сокетами в Vue typescript
разрабатываю клиентскую часть на Vue typescript. Поступила задача написать чат. На бэке используется фреймворк Symfony, где уже прописан "socket server logic". Но проблема в том, что я никогда не делал чат и не использовал сокеты. Либа vue-socket-io я так понимаю не подойдет. А в сети я почему то не могу найти что то нормальное, документацию какую то и тд. Может быть вы подскажете какие нибудь ресурсы или же что то в этом роде? Заранее спасибо. А вот и код на беке
class ChatService implements MessageComponentInterface
{
protected array $connections = [];
protected JWTTokenManagerInterface $JWTManager;
protected UserRepository $userRepository;
protected LoggerInterface $logger;
protected MessageBusInterface $bus;
public function __construct(
JWTTokenManagerInterface $JWTManager,
UserRepository $userRepository,
MessageBusInterface $bus,
LoggerInterface $logger
)
{
$this->JWTManager = $JWTManager;
$this->userRepository = $userRepository;
$this->bus = $bus;
$this->logger = $logger;
}
function onOpen(ConnectionInterface $conn)
{
$this->connections[] = $conn;
}
function onMessage(ConnectionInterface $from, $msg)
{
$messageData = json_decode($msg, true, 512, JSON_THROW_ON_ERROR);
if (!isset($messageData['chat_id'])) {
$from->close();
}
try {
//first message - auth
if (isset($messageData['token'])) {
$token = new JWTUserToken();
$token->setRawToken($messageData['token']);
$payload = $this->JWTManager->decode($token);
if (!$user = $this>userRepository>findOneBy(['username'=>$payload['username']]))
{
$from->close();
}
$connectionKey = $payload['username'] . ';' . $messageData['chat_id'];
$allConnections = $this->connections;
foreach ($allConnections as $key => $conn) {
if ($conn === $from) {
$this->connections[$connectionKey] = $from;
//$from->send('..:: Connected as ' . $connectionKey . ' ::..');
unset($this->connections[$key]);
break;
}
continue;
}
} elseif (isset($messageData['username'])) {
$currentKey = $messageData['username'] . ';' . $messageData['chat_id'];
if (array_key_exists($currentKey, $this->connections)) {
$isAnotherUserFound = false;
foreach ($this->connections as $key => $connection) {
$chatId = explode(';', $key);
if (isset($chatId[1]) && $chatId[1] === $messageData['chat_id'] && $key !== $currentKey) {
$isAnotherUserFound = true;
$connection->send($messageData['message']);
$this->bus->dispatch(new UserMessage($messageData['username'], $messageData['chat_id'], $messageData['message']));
break;
}
}
if ($isAnotherUserFound === false) {
$this->bus->dispatch(new UserMessage($messageData['username'], $messageData['chat_id'], $messageData['message']));
}
}
} else {
$from->close();
}
} catch (\Exception $e) {
$this->logger->error('Socket server error: ' . $e->getMessage());
}
}
function onClose(ConnectionInterface $conn)
{
foreach ($this->connections as $key => $conn_element) {
if ($conn === $conn_element) {
unset($this->connections[$key]);
break;
}
}
}
function onError(ConnectionInterface $conn, \Exception $e)
{
$this->logger->error('Socket server error: ' . $e->getMessage());
$conn->close();
}
}