@@ -29,7 +29,7 @@ internal sealed partial class PhysicalConnection : IDisposable
2929
3030 private const int DefaultRedisDatabaseCount = 16 ;
3131
32- private static readonly CommandBytes message = "message" , pmessage = "pmessage" ;
32+ private static readonly CommandBytes message = "message" , pmessage = "pmessage" , smessage = "smessage" ;
3333
3434 private static readonly Message [ ] ReusableChangeDatabaseCommands = Enumerable . Range ( 0 , DefaultRedisDatabaseCount ) . Select (
3535 i => Message . Create ( i , CommandFlags . FireAndForget , RedisCommand . SELECT ) ) . ToArray ( ) ;
@@ -276,7 +276,11 @@ private enum ReadMode : byte
276276 private RedisProtocol _protocol ; // note starts at **zero**, not RESP2
277277 public RedisProtocol ? Protocol => _protocol == 0 ? null : _protocol ;
278278
279- internal void SetProtocol ( RedisProtocol value ) => _protocol = value ;
279+ internal void SetProtocol ( RedisProtocol value )
280+ {
281+ _protocol = value ;
282+ BridgeCouldBeNull ? . SetProtocol ( value ) ;
283+ }
280284
281285 [ System . Diagnostics . CodeAnalysis . SuppressMessage ( "Microsoft.Usage" , "CA2202:Do not dispose objects multiple times" , Justification = "Trust me yo" ) ]
282286 internal void Shutdown ( )
@@ -384,7 +388,7 @@ public void RecordConnectionFailed(
384388 bool isInitialConnect = false ,
385389 IDuplexPipe ? connectingPipe = null )
386390 {
387- bool weAskedForThis = false ;
391+ bool weAskedForThis ;
388392 Exception ? outerException = innerException ;
389393 IdentifyFailureType ( innerException , ref failureType ) ;
390394 var bridge = BridgeCouldBeNull ;
@@ -1644,9 +1648,9 @@ private void MatchResult(in RawResult result)
16441648
16451649 // out of band message does not match to a queued message
16461650 var items = result . GetItems ( ) ;
1647- if ( items . Length >= 3 && items [ 0 ] . IsEqual ( message ) )
1651+ if ( items . Length >= 3 && ( items [ 0 ] . IsEqual ( message ) || items [ 0 ] . IsEqual ( smessage ) ) )
16481652 {
1649- _readStatus = ReadStatus . PubSubMessage ;
1653+ _readStatus = items [ 0 ] . IsEqual ( message ) ? ReadStatus . PubSubMessage : ReadStatus . PubSubSMessage ;
16501654
16511655 // special-case the configuration change broadcasts (we don't keep that in the usual pub/sub registry)
16521656 var configChanged = muxer . ConfigurationChangedChannel ;
@@ -1668,8 +1672,17 @@ private void MatchResult(in RawResult result)
16681672 }
16691673
16701674 // invoke the handlers
1671- var channel = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Literal ) ;
1672- Trace ( "MESSAGE: " + channel ) ;
1675+ RedisChannel channel ;
1676+ if ( items [ 0 ] . IsEqual ( message ) )
1677+ {
1678+ channel = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . RedisChannelOptions . None ) ;
1679+ Trace ( "MESSAGE: " + channel ) ;
1680+ }
1681+ else // see check on outer-if that restricts to message / smessage
1682+ {
1683+ channel = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . RedisChannelOptions . Sharded ) ;
1684+ Trace ( "SMESSAGE: " + channel ) ;
1685+ }
16731686 if ( ! channel . IsNull )
16741687 {
16751688 if ( TryGetPubSubPayload ( items [ 2 ] , out var payload ) )
@@ -1690,27 +1703,30 @@ private void MatchResult(in RawResult result)
16901703 {
16911704 _readStatus = ReadStatus . PubSubPMessage ;
16921705
1693- var channel = items [ 2 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Literal ) ;
1706+ var channel = items [ 2 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . RedisChannelOptions . Pattern ) ;
1707+
16941708 Trace ( "PMESSAGE: " + channel ) ;
16951709 if ( ! channel . IsNull )
16961710 {
16971711 if ( TryGetPubSubPayload ( items [ 3 ] , out var payload ) )
16981712 {
1699- var sub = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Pattern ) ;
1713+ var sub = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . RedisChannelOptions . Pattern ) ;
1714+
17001715 _readStatus = ReadStatus . InvokePubSub ;
17011716 muxer . OnMessage ( sub , channel , payload ) ;
17021717 }
17031718 else if ( TryGetMultiPubSubPayload ( items [ 3 ] , out var payloads ) )
17041719 {
1705- var sub = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Pattern ) ;
1720+ var sub = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . RedisChannelOptions . Pattern ) ;
1721+
17061722 _readStatus = ReadStatus . InvokePubSub ;
17071723 muxer . OnMessage ( sub , channel , payloads ) ;
17081724 }
17091725 }
17101726 return ; // AND STOP PROCESSING!
17111727 }
17121728
1713- // if it didn't look like "[p]message", then we still need to process the pending queue
1729+ // if it didn't look like "[p|s ]message", then we still need to process the pending queue
17141730 }
17151731 Trace ( "Matching result..." ) ;
17161732
@@ -2110,6 +2126,7 @@ internal enum ReadStatus
21102126 MatchResult ,
21112127 PubSubMessage ,
21122128 PubSubPMessage ,
2129+ PubSubSMessage ,
21132130 Reconfigure ,
21142131 InvokePubSub ,
21152132 ResponseSequenceCheck , // high-integrity mode only
0 commit comments