broadcastMessage method
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(),
},
),
);
}
}