WebSocket
W tym artykule omówimy czym jest Websocket i do czego służy.
Czym jest WebSocket
WebSocket jest protokołem komunikacyjnym, który umożliwia dwu kierunkową wymianę danych, między serwerem a przeglądarką lub applikacją.
Możemy użyć websocket poprzez event.
Do komunikacji jest używany ZeroMQ lub Readis
Jak używać
WebSocket jest oparty o eventy:
- Prywatne dla konkretnego użytkownika i tanantu na którym dany userzytkownik pracuje.
- Publiczny który jest tylko dla konkretnego tanantu.
i te eventy używają odpowiednio kanały o którym mowa poniżej.
Kanały
1. Kanał prywatny
Do ustawienia kanału prywatnego jest używany id tanantu oraz id użytkownika, które to id możemy przesłać jako parametr albo zostanie automatycznie dodane id zalogowanego aktualnie użytkownika.
Nazwa kanału prywatnego
events.channel.private
2. Kanał publiczny
Do ustawienia kanału publicznego jest używany tylko id tanantu.
Nazwa kanału publicznego
events.channel.public
Budowa eventu
Naszą klasę event dla WebSocketu musimy rozszeżyć o klase:
- PublicEvent
- PrivateEvent
które znajdują się w przestrzeni nazw:
Ready\Component\WS\Message
Przykład kodu eventu
Dla przykładu, wykorzystujemu w nim prywatyny event (możemy także użyć PublicEvent),
class Notification extends PrivateEvent {
protected string $event = 'notification.message.new';
/**
* Notification constructor.
* @param mixed[] $data
*/
public function __construct(array $data) {
parent::__construct($data);
}
/**
* @return mixed[]
*/
public function jsonSerialize(): array {
if (!isset($this->data['tou_id'])) {
return [];
}
return [
Config::TOPIC_KEY => Config::getUserEventsChannel($this->data['tou_id']),
Config::EVENT_KEY => $this->event,
'data' => $this->data,
];
}
}
Użycie utworzonego eventu
Utworzony wcześniej event, powinliśmy emitować w JS Więcej informacji znajdziemy w rozdziale poświęconym Event w JS
Przykład emitowania eventu w JS-ie
ROS.EventEmitter.on(
'notification.message.new',
function(evt, data) {
try {
if (data && data.msg_to) {
App.timeToCheckNM.resetSpeed();
$A1(App.comHWND, null, 1, null, 'newMessageDB(text);', null, false);
}
} catch (e) {
console.error(e);
}
}
);