Przejdź do głównej treści

WebSocket

Ready_™ Developer TeamMniej niż 1 minuta

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);
            }
        }
    );