WebSocket

Finch ondersteunt WebSocket via een drieklasdontwerp: SocketManager voor registratie, SocketEvent voor gebeurtenisdefinitie en SocketController voor berichtverwerking.

Installatie

1. Maak een SocketController aan

import 'package:finch/finch_route.dart';

class ChatController extends SocketController {
  @override
  void onConnect(SocketClient client) {
    print('Gebruiker verbonden: \${client.id}');
    sendToAll(SocketEvent('user_joined', {'id': client.id}));
  }

  @override
  void onDisconnect(SocketClient client) {
    sendToAll(SocketEvent('user_left', {'id': client.id}));
  }

  @override
  void onMessage(SocketClient client, SocketEvent event) {
    switch (event.name) {
      case 'chat_message':
        var message = event.data['message'] as String;
        sendToAllExcept(
          client,
          SocketEvent('chat_message', {
            'from': client.id,
            'message': message,
          }),
        );
        break;
    }
  }
}

2. WebSocket-route registreren

router.ws('/chat', ChatController());

SocketController-methoden

Methode Beschrijving
sendTo(client, event) Verzenden naar een specifieke client
sendToAll(event) Verzenden naar alle verbonden clients
sendToAllExcept(client, event) Verzenden naar iedereen behalve één client
broadcast(room, event) Verzenden naar een ruimte
joinRoom(client, room) Client aan een ruimte toevoegen
leaveRoom(client, room) Client uit een ruimte verwijderen

JavaScript-client

const socket = new WebSocket('ws://localhost:8080/chat');

socket.onopen = () => {
  console.log('Verbonden');
};

socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Ontvangen gebeurtenis:', data.name, data.data);
};

function sendMessage(message) {
  socket.send(JSON.stringify({
    name: 'chat_message',
    data: { message }
  }));
}

socket.onclose = () => {
  console.log('Verbinding verbroken');
};

Ruimten (Rooms)

@override
void onMessage(SocketClient client, SocketEvent event) {
  if (event.name == 'join_room') {
    var room = event.data['room'] as String;
    joinRoom(client, room);
    broadcast(room, SocketEvent('room_joined', {'user': client.id}));
  }
}