2525using static MLAPI . Messaging . CustomMessagingManager ;
2626using MLAPI . Exceptions ;
2727using MLAPI . Transports . Tasks ;
28+ using MLAPI . Messaging . Buffering ;
2829
2930namespace MLAPI
3031{
@@ -695,6 +696,11 @@ private void Update()
695696 NetworkedObject . NetworkedBehaviourUpdate ( ) ;
696697 }
697698
699+ if ( ! IsServer && NetworkConfig . EnableMessageBuffering )
700+ {
701+ BufferManager . CleanBuffer ( ) ;
702+ }
703+
698704 if ( IsServer )
699705 {
700706 lastEventTickTime = NetworkTime ;
@@ -881,7 +887,7 @@ private void HandleRawTransportPoll(NetEventType eventType, ulong clientId, stri
881887 case NetEventType . Data :
882888 if ( LogHelper . CurrentLogLevel <= LogLevel . Developer ) LogHelper . LogInfo ( $ "Incoming Data From { clientId } : { payload . Count } bytes") ;
883889
884- HandleIncomingData ( clientId , channelName , payload , receiveTime ) ;
890+ HandleIncomingData ( clientId , channelName , payload , receiveTime , true ) ;
885891 break ;
886892 case NetEventType . Disconnect :
887893 NetworkProfiler . StartEvent ( TickType . Receive , 0 , "NONE" , "TRANSPORT_DISCONNECT" ) ;
@@ -905,7 +911,7 @@ private void HandleRawTransportPoll(NetEventType eventType, ulong clientId, stri
905911
906912 private readonly BitStream inputStreamWrapper = new BitStream ( new byte [ 0 ] ) ;
907913
908- private void HandleIncomingData ( ulong clientId , string channelName , ArraySegment < byte > data , float receiveTime )
914+ internal void HandleIncomingData ( ulong clientId , string channelName , ArraySegment < byte > data , float receiveTime , bool allowBuffer )
909915 {
910916 if ( LogHelper . CurrentLogLevel <= LogLevel . Developer ) LogHelper . LogInfo ( "Unwrapping Data Header" ) ;
911917
@@ -939,7 +945,31 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
939945 return ;
940946 }
941947
948+
949+ void bufferCallback ( ulong networkId )
950+ {
951+ if ( ! allowBuffer )
952+ {
953+ // This is to prevent recursive buffering
954+ if ( LogHelper . CurrentLogLevel <= LogLevel . Error ) LogHelper . LogError ( "A message of type " + MLAPIConstants . MESSAGE_NAMES [ messageType ] + " was recursivley buffered. It has been dropped." ) ;
955+ return ;
956+ }
957+
958+ if ( ! NetworkConfig . EnableMessageBuffering )
959+ {
960+ throw new InvalidOperationException ( "Cannot buffer with buffering disabled." ) ;
961+ }
962+
963+ if ( IsServer )
964+ {
965+ throw new InvalidOperationException ( "Cannot buffer on server." ) ;
966+ }
967+
968+ BufferManager . BufferMessageForNetworkId ( networkId , clientId , channelName , receiveTime , data ) ;
969+ }
970+
942971 #region INTERNAL MESSAGE
972+
943973 switch ( messageType )
944974 {
945975 case MLAPIConstants . MLAPI_CONNECTION_REQUEST :
@@ -955,7 +985,7 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
955985 if ( IsClient ) InternalMessageHandler . HandleDestroyObject ( clientId , messageStream ) ;
956986 break ;
957987 case MLAPIConstants . MLAPI_SWITCH_SCENE :
958- if ( IsClient && NetworkConfig . EnableSceneManagement ) InternalMessageHandler . HandleSwitchScene ( clientId , messageStream ) ;
988+ if ( IsClient ) InternalMessageHandler . HandleSwitchScene ( clientId , messageStream ) ;
959989 break ;
960990 case MLAPIConstants . MLAPI_CHANGE_OWNER :
961991 if ( IsClient ) InternalMessageHandler . HandleChangeOwner ( clientId , messageStream ) ;
@@ -970,10 +1000,10 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
9701000 if ( IsClient ) InternalMessageHandler . HandleTimeSync ( clientId , messageStream , receiveTime ) ;
9711001 break ;
9721002 case MLAPIConstants . MLAPI_NETWORKED_VAR_DELTA :
973- InternalMessageHandler . HandleNetworkedVarDelta ( clientId , messageStream ) ;
1003+ InternalMessageHandler . HandleNetworkedVarDelta ( clientId , messageStream , bufferCallback ) ;
9741004 break ;
9751005 case MLAPIConstants . MLAPI_NETWORKED_VAR_UPDATE :
976- InternalMessageHandler . HandleNetworkedVarUpdate ( clientId , messageStream ) ;
1006+ InternalMessageHandler . HandleNetworkedVarUpdate ( clientId , messageStream , bufferCallback ) ;
9771007 break ;
9781008 case MLAPIConstants . MLAPI_SERVER_RPC :
9791009 if ( IsServer ) InternalMessageHandler . HandleServerRPC ( clientId , messageStream ) ;
@@ -985,10 +1015,10 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
9851015 if ( IsClient ) InternalMessageHandler . HandleServerRPCResponse ( clientId , messageStream ) ;
9861016 break ;
9871017 case MLAPIConstants . MLAPI_CLIENT_RPC :
988- if ( IsClient ) InternalMessageHandler . HandleClientRPC ( clientId , messageStream ) ;
1018+ if ( IsClient ) InternalMessageHandler . HandleClientRPC ( clientId , messageStream , bufferCallback ) ;
9891019 break ;
9901020 case MLAPIConstants . MLAPI_CLIENT_RPC_REQUEST :
991- if ( IsClient ) InternalMessageHandler . HandleClientRPCRequest ( clientId , messageStream , channelName , security ) ;
1021+ if ( IsClient ) InternalMessageHandler . HandleClientRPCRequest ( clientId , messageStream , channelName , security , bufferCallback ) ;
9921022 break ;
9931023 case MLAPIConstants . MLAPI_CLIENT_RPC_RESPONSE :
9941024 if ( IsServer ) InternalMessageHandler . HandleClientRPCResponse ( clientId , messageStream ) ;
0 commit comments