WebSocket

فینچ از WebSocket از طریق یک طراحی سه‌کلاسه پشتیبانی می‌کند: SocketManager برای ثبت، SocketEvent برای تعریف رویدادها، و SocketController برای پردازش پیام‌ها.

راه‌اندازی

۱. یک SocketController بسازید

import 'package:finch/finch_route.dart';

class ChatController extends SocketController {
  @override
  void onConnect(SocketClient client) {
    print('کاربر وصل شد: \${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;
    }
  }
}

۲. Route WebSocket را ثبت کنید

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

متدهای SocketController

متد توضیح
sendTo(client, event) ارسال به یک کاربر مشخص
sendToAll(event) ارسال به همه کاربران متصل
sendToAllExcept(client, event) ارسال به همه به جز یک کاربر
broadcast(room, event) ارسال به یک room
joinRoom(client, room) اضافه کردن کاربر به room
leaveRoom(client, room) خارج کردن کاربر از room

کلاینت JavaScript

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

socket.onopen = () => {
  console.log('متصل شد');
};

socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('رویداد دریافت شد:', data.name, data.data);
};

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

socket.onclose = () => {
  console.log('اتصال قطع شد');
};

اتاق‌ها (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}));
  }
}