broadcastMessage method

  1. @override
Future<void> broadcastMessage(
  1. Message message, {
  2. List<String>? excludeClientIds,
})
override

Broadcast a message to all subscribed clients

Implementation

@override
Future<void> broadcastMessage(
  Message message, {
  List<String>? excludeClientIds,
}) async {
  final documentId = message.documentId;
  final sessions = List.of(_sessions.values);

  final sessionsReached = <String>[];

  for (final session in sessions) {
    final isExcluded = excludeClientIds?.contains(session.id) ?? false;
    final isSubscribed = session.isSubscribedTo(documentId);

    if (isExcluded || !isSubscribed) {
      continue;
    }

    try {
      await session.sendMessage(message);
      sessionsReached.add(session.id);
    } catch (e) {
      // A failing client must not prevent the broadcast from reaching the
      // remaining healthy clients. `sendMessage` already closed the failing
      // session; just record the error and continue.
      _addServerEvent(
        ServerEvent(
          type: ServerEventType.error,
          message: 'Failed to broadcast to session ${session.id}: $e',
          data: {
            'clientId': session.id,
            'documentId': documentId,
          },
        ),
      );
    }
  }

  if (sessionsReached.isNotEmpty) {
    _addServerEvent(
      ServerEvent(
        type: ServerEventType.messageBroadcasted,
        message: 'Message broadcasted to ${sessionsReached.length} clients',
        data: {
          'documentId': documentId,
          'sessionsReached': sessionsReached,
          'message': message.toJson(),
        },
      ),
    );
  }
}