private static RedisPubSubMessage ToPubSubMessage(RedisPubSubResponse response) { if (response.Type == RedisPubSubResponseType.PMessage) { return(new RedisPubSubMessage(RedisPubSubMessageType.PMessage, response.Channel, response.Pattern, response.Data as byte[])); } if (response.Type == RedisPubSubResponseType.Message) { return(new RedisPubSubMessage(RedisPubSubMessageType.Message, response.Channel, response.Pattern, response.Data as byte[])); } return(RedisPubSubMessage.Empty); }
private void ResponseReceived(IRedisRawResponse response) { m_LastMessageSeenTime = DateTime.UtcNow; var pubSubResp = RedisPubSubResponse.ToPubSubResponse(response); if (!pubSubResp.IsEmpty) { switch (pubSubResp.Type) { case RedisPubSubResponseType.Message: { var subscriptions = m_Subscriptions; if (subscriptions != null && subscriptions.HasCallbacks(pubSubResp.Channel)) { subscriptions.Invoke(ToPubSubMessage(pubSubResp)); } } break; case RedisPubSubResponseType.PMessage: { var subscriptions = m_PSubscriptions; if (subscriptions != null && subscriptions.HasCallbacks(pubSubResp.Pattern)) { subscriptions.Invoke(ToPubSubMessage(pubSubResp)); } } break; case RedisPubSubResponseType.Subscribe: { lock (m_SubscriptionLock) { var bag = m_PendingSubscriptions.Drop(pubSubResp.Channel); m_Subscriptions.Register(pubSubResp.Channel, bag); } } break; case RedisPubSubResponseType.PSubscribe: { lock (m_PSubscriptionLock) { var bag = m_PendingPSubscriptions.Drop(pubSubResp.Pattern); m_PSubscriptions.Register(pubSubResp.Pattern, bag); } } break; case RedisPubSubResponseType.Unsubscribe: { lock (m_SubscriptionLock) { if (pubSubResp.Channel.IsEmpty()) { m_PendingSubscriptions.UnregisterAll(); m_Subscriptions.UnregisterAll(); } else { if (!m_Subscriptions.Unregister(pubSubResp.Channel)) { m_PendingSubscriptions.Unregister(pubSubResp.Channel); } } } } break; case RedisPubSubResponseType.PUnsubscribe: { lock (m_PSubscriptionLock) { if (pubSubResp.Pattern.IsEmpty()) { m_PendingPSubscriptions.UnregisterAll(); m_PSubscriptions.UnregisterAll(); } else { if (!m_PSubscriptions.Unregister(pubSubResp.Pattern)) { m_PendingPSubscriptions.Unregister(pubSubResp.Pattern); } } } } break; default: break; } } }