Websocket Directus

Hello,

Un petit sujet autour de la mise en place des websocket Directus !

La doc officielle : Getting Started With WebSockets | Directus Docs

personnellement, j’ai besoin de cette fonctionnalité dans mon app Flutter, j’ai donc converti le code en dart :

void listenWebSocket() {
    WebSocketChannel channel = channelSocket!;
    const url = 'ws://127.0.0.1:8055/websocket';
    final accessToken = _apiManager.currentAuthToken;
    const collection = 'player';

    channel = WebSocketChannel.connect(Uri.parse(url));

    subscribe() {
      channel.sink.add(jsonEncode({
        'type': 'subscribe',
        'collection': collection,
        'query': {
          'fields': ['*']
        },
      }));
    }

    channel.stream.listen(
      (message) {
        print("message = $message");
        final data = jsonDecode(message);
        if (data['type'] == 'auth' && data['status'] == 'ok') {
          subscribe();
        }
        print({'event': 'onmessage', 'data': data});
      },
      onError: (error) {
        print({'event': 'onerror', 'error': error});
      },
      onDone: () {
        print({'event': 'onclose'});
      },
    );

    channel.sink.add(jsonEncode({
      'type': 'auth',
      'access_token': accessToken,
    }));
  }

Pour mettre en place le système il faut modifier le .env :

WEBSOCKETS_ENABLED=true

A l’initialisation la connexion est opérationnel et, jusqu’au ping suivant, je peux communiquer avec la database.

flutter: message = {"type":"auth","status":"ok"}

Mais au ping suivant, s’il n’y a aucune action, le système tombe tout seul et le onDone est reçu, coupant la connexion…

Alors s’il y a quelqu’un travaillant sur le sujet je suis preneur !

Comme d’habitude, poster c’est trouver :

channel.stream.listen(
      (message) {
        print("message = $message");
        final data = jsonDecode(message);
        if (data['type'] == 'auth' && data['status'] == 'ok') {
          subscribe();
        }
        if (data['type'] == 'ping') {
          channel.sink.add(jsonEncode({'type': 'pong'}));
          print({'event': 'onmessage', 'data': data});
        }
      },
      onError: (error) {
        print({'event': 'onerror', 'error': error});
      },
      onDone: () {
        print({'event': 'onclose'});
      },
    );
2 « J'aime »