@@ -1683,71 +1683,75 @@ private enum PushKind
16831683 private PushKind GetPushKind ( in Sequence < RawResult > result , out RedisChannel channel )
16841684 {
16851685 var len = result . Length ;
1686- if ( len >= 2 ) // always have at least the kind and the subscription channel
1687- {
1688- const int MAX_LEN = 16 ;
1689- Debug . Assert ( MAX_LEN >= Enumerable . Max (
1690- [
1691- PushMessage . Length , PushPMessage . Length , PushSMessage . Length ,
1692- PushSubscribe . Length , PushPSubscribe . Length , PushSSubscribe . Length ,
1693- PushUnsubscribe . Length , PushPUnsubscribe . Length , PushSUnsubscribe . Length ,
1694- ] ) ) ;
1695- ref readonly RawResult pushKind = ref result [ 0 ] ;
1696- var multiSegmentPayload = pushKind . Payload ;
1697- if ( multiSegmentPayload . Length <= MAX_LEN )
1698- {
1699- var span = multiSegmentPayload . IsSingleSegment
1700- ? multiSegmentPayload . First . Span
1701- : CopyTo ( stackalloc byte [ MAX_LEN ] , multiSegmentPayload ) ;
1702-
1703- var hash = FastHash . Hash64 ( span ) ;
1704- RedisChannel . RedisChannelOptions channelOptions = RedisChannel . RedisChannelOptions . None ;
1705- PushKind kind ;
1706- switch ( hash )
1707- {
1708- case PushMessage . Hash when PushMessage . Is ( hash , span ) & len >= 3 :
1709- kind = PushKind . Message ;
1710- break ;
1711- case PushPMessage . Hash when PushPMessage . Is ( hash , span ) & len >= 4 :
1712- channelOptions = RedisChannel . RedisChannelOptions . Pattern ;
1713- kind = PushKind . PMessage ;
1714- break ;
1715- case PushSMessage . Hash when PushSMessage . Is ( hash , span ) & len >= 3 :
1716- channelOptions = RedisChannel . RedisChannelOptions . Sharded ;
1717- kind = PushKind . SMessage ;
1718- break ;
1719- case PushSubscribe . Hash when PushSubscribe . Is ( hash , span ) :
1720- kind = PushKind . Subscribe ;
1721- break ;
1722- case PushPSubscribe . Hash when PushPSubscribe . Is ( hash , span ) :
1723- channelOptions = RedisChannel . RedisChannelOptions . Pattern ;
1724- kind = PushKind . PSubscribe ;
1725- break ;
1726- case PushSSubscribe . Hash when PushSSubscribe . Is ( hash , span ) :
1727- channelOptions = RedisChannel . RedisChannelOptions . Sharded ;
1728- kind = PushKind . SSubscribe ;
1729- break ;
1730- case PushUnsubscribe . Hash when PushUnsubscribe . Is ( hash , span ) :
1731- kind = PushKind . Unsubscribe ;
1732- break ;
1733- case PushPUnsubscribe . Hash when PushPUnsubscribe . Is ( hash , span ) :
1734- channelOptions = RedisChannel . RedisChannelOptions . Pattern ;
1735- kind = PushKind . PUnsubscribe ;
1736- break ;
1737- case PushSUnsubscribe . Hash when PushSUnsubscribe . Is ( hash , span ) :
1738- channelOptions = RedisChannel . RedisChannelOptions . Sharded ;
1739- kind = PushKind . SUnsubscribe ;
1740- break ;
1741- default :
1742- kind = PushKind . None ;
1743- break ;
1744- }
1745- if ( kind != PushKind . None )
1746- {
1747- // the channel is always the second element
1748- channel = result [ 1 ] . AsRedisChannel ( ChannelPrefix , channelOptions ) ;
1749- return kind ;
1750- }
1686+ if ( len < 2 )
1687+ {
1688+ // for supported cases, we demand at least the kind and the subscription channel
1689+ channel = default ;
1690+ return PushKind . None ;
1691+ }
1692+
1693+ const int MAX_LEN = 16 ;
1694+ Debug . Assert ( MAX_LEN >= Enumerable . Max (
1695+ [
1696+ PushMessage . Length , PushPMessage . Length , PushSMessage . Length ,
1697+ PushSubscribe . Length , PushPSubscribe . Length , PushSSubscribe . Length ,
1698+ PushUnsubscribe . Length , PushPUnsubscribe . Length , PushSUnsubscribe . Length ,
1699+ ] ) ) ;
1700+ ref readonly RawResult pushKind = ref result [ 0 ] ;
1701+ var multiSegmentPayload = pushKind . Payload ;
1702+ if ( multiSegmentPayload . Length <= MAX_LEN )
1703+ {
1704+ var span = multiSegmentPayload . IsSingleSegment
1705+ ? multiSegmentPayload . First . Span
1706+ : CopyTo ( stackalloc byte [ MAX_LEN ] , multiSegmentPayload ) ;
1707+
1708+ var hash = FastHash . Hash64 ( span ) ;
1709+ RedisChannel . RedisChannelOptions channelOptions = RedisChannel . RedisChannelOptions . None ;
1710+ PushKind kind ;
1711+ switch ( hash )
1712+ {
1713+ case PushMessage . Hash when PushMessage . Is ( hash , span ) & len >= 3 :
1714+ kind = PushKind . Message ;
1715+ break ;
1716+ case PushPMessage . Hash when PushPMessage . Is ( hash , span ) & len >= 4 :
1717+ channelOptions = RedisChannel . RedisChannelOptions . Pattern ;
1718+ kind = PushKind . PMessage ;
1719+ break ;
1720+ case PushSMessage . Hash when PushSMessage . Is ( hash , span ) & len >= 3 :
1721+ channelOptions = RedisChannel . RedisChannelOptions . Sharded ;
1722+ kind = PushKind . SMessage ;
1723+ break ;
1724+ case PushSubscribe . Hash when PushSubscribe . Is ( hash , span ) :
1725+ kind = PushKind . Subscribe ;
1726+ break ;
1727+ case PushPSubscribe . Hash when PushPSubscribe . Is ( hash , span ) :
1728+ channelOptions = RedisChannel . RedisChannelOptions . Pattern ;
1729+ kind = PushKind . PSubscribe ;
1730+ break ;
1731+ case PushSSubscribe . Hash when PushSSubscribe . Is ( hash , span ) :
1732+ channelOptions = RedisChannel . RedisChannelOptions . Sharded ;
1733+ kind = PushKind . SSubscribe ;
1734+ break ;
1735+ case PushUnsubscribe . Hash when PushUnsubscribe . Is ( hash , span ) :
1736+ kind = PushKind . Unsubscribe ;
1737+ break ;
1738+ case PushPUnsubscribe . Hash when PushPUnsubscribe . Is ( hash , span ) :
1739+ channelOptions = RedisChannel . RedisChannelOptions . Pattern ;
1740+ kind = PushKind . PUnsubscribe ;
1741+ break ;
1742+ case PushSUnsubscribe . Hash when PushSUnsubscribe . Is ( hash , span ) :
1743+ channelOptions = RedisChannel . RedisChannelOptions . Sharded ;
1744+ kind = PushKind . SUnsubscribe ;
1745+ break ;
1746+ default :
1747+ kind = PushKind . None ;
1748+ break ;
1749+ }
1750+ if ( kind != PushKind . None )
1751+ {
1752+ // the channel is always the second element
1753+ channel = result [ 1 ] . AsRedisChannel ( ChannelPrefix , channelOptions ) ;
1754+ return kind ;
17511755 }
17521756 }
17531757 channel = default ;
0 commit comments