in src/Microsoft.Azure.SignalR.Common/ServiceConnections/MultiEndpointServiceConnectionContainer.cs [183:257]
internal IEnumerable<ServiceEndpoint> GetRoutedEndpoints(ServiceMessage message)
{
if (!_routerEndpoints.needRouter)
{
return _routerEndpoints.endpoints;
}
var endpoints = _routerEndpoints.endpoints;
switch (message)
{
case BroadcastDataMessage bdm:
return _router.GetEndpointsForBroadcast(endpoints);
case GroupBroadcastDataMessage gbdm:
return _router.GetEndpointsForGroup(gbdm.GroupName, endpoints);
case JoinGroupWithAckMessage jgm:
return _router.GetEndpointsForGroup(jgm.GroupName, endpoints);
case LeaveGroupWithAckMessage lgm:
return _router.GetEndpointsForGroup(lgm.GroupName, endpoints);
case MultiGroupBroadcastDataMessage mgbdm:
return mgbdm.GroupList.SelectMany(g => _router.GetEndpointsForGroup(g, endpoints)).Distinct();
case ConnectionDataMessage cdm:
return _router.GetEndpointsForConnection(cdm.ConnectionId, endpoints);
case MultiConnectionDataMessage mcd:
return mcd.ConnectionList.SelectMany(c => _router.GetEndpointsForConnection(c, endpoints)).Distinct();
case UserDataMessage udm:
return _router.GetEndpointsForUser(udm.UserId, endpoints);
case MultiUserDataMessage mudm:
return mudm.UserList.SelectMany(g => _router.GetEndpointsForUser(g, endpoints)).Distinct();
case UserJoinGroupMessage ujgm:
return _router.GetEndpointsForGroup(ujgm.GroupName, endpoints).Intersect(_router.GetEndpointsForUser(ujgm.UserId, endpoints));
case UserJoinGroupWithAckMessage ujgm:
return _router.GetEndpointsForGroup(ujgm.GroupName, endpoints).Intersect(_router.GetEndpointsForUser(ujgm.UserId, endpoints));
case UserLeaveGroupMessage ulgm:
return _router.GetEndpointsForGroup(ulgm.GroupName, endpoints).Intersect(_router.GetEndpointsForUser(ulgm.UserId, endpoints));
case UserLeaveGroupWithAckMessage ulgm:
return _router.GetEndpointsForGroup(ulgm.GroupName, endpoints).Intersect(_router.GetEndpointsForUser(ulgm.UserId, endpoints));
case CheckConnectionExistenceWithAckMessage checkConnectionMessage:
return _router.GetEndpointsForConnection(checkConnectionMessage.ConnectionId, endpoints);
case CheckUserExistenceWithAckMessage checkUserMessage:
return _router.GetEndpointsForUser(checkUserMessage.UserId, endpoints);
case CheckGroupExistenceWithAckMessage checkGroupMessage:
return _router.GetEndpointsForGroup(checkGroupMessage.GroupName, endpoints);
case CheckUserInGroupWithAckMessage checkUserInGroupMessage:
return _router.GetEndpointsForGroup(checkUserInGroupMessage.GroupName, endpoints).Intersect(_router.GetEndpointsForUser(checkUserInGroupMessage.UserId, endpoints));
case CloseConnectionMessage closeConnectionMessage:
return _router.GetEndpointsForConnection(closeConnectionMessage.ConnectionId, endpoints);
case ClientInvocationMessage clientInvocationMessage:
return _router.GetEndpointsForConnection(clientInvocationMessage.ConnectionId, endpoints);
case ServiceCompletionMessage serviceCompletionMessage:
return _router.GetEndpointsForConnection(serviceCompletionMessage.ConnectionId, endpoints);
// ServiceMappingMessage should never be sent to the service
default:
throw new NotSupportedException(message.GetType().Name);
}
}