@@ -109,17 +109,17 @@ public function loop(): ?float
109109 };
110110 $ this ->pendingState = null ;
111111 }
112- if ($ this ->queue ->isEmpty ()) {
113- $ this ->API ->logger ("No messages, pausing in $ this ... " , Logger::ULTRA_VERBOSE );
114- return self ::LONG_POLL_TIMEOUT ;
115- }
116112 $ this ->connection ->writing (true );
117113 try {
118114 if ($ this ->queue === $ this ->connection ->unencryptedPendingOutgoing ) {
119115 $ this ->unencryptedWriteLoop ();
120116 } else {
121117 $ this ->encryptedWriteLoop ();
122118 }
119+ if ($ this ->pendingState === null ) {
120+ $ this ->API ->logger ("No messages, pausing in $ this ... " , Logger::ULTRA_VERBOSE );
121+ return self ::LONG_POLL_TIMEOUT ;
122+ }
123123 } catch (StreamException $ e ) {
124124 if ($ this ->connection ->shouldReconnect ()) {
125125 $ this ->API ->logger ("Stopping $ this because we have to reconnect " );
@@ -171,7 +171,13 @@ public function unencryptedWriteLoop(): void
171171 }
172172 public function encryptedWriteLoop (): void
173173 {
174- while ($ this ->pendingState === null && !$ this ->queue ->isEmpty ()) {
174+ while ($ this ->pendingState === null &&
175+ (
176+ !$ this ->queue ->isEmpty ()
177+ || $ this ->connection ->ack_queue
178+ || $ this ->connection ->check_queue ->count ()
179+ )
180+ ) {
175181 if (0 !== ($ check = $ this ->connection ->check_queue )->count ()) {
176182 $ this ->connection ->check_queue = new WeakMap ;
177183 $ deferred = new DeferredFuture ();
@@ -207,6 +213,7 @@ public function encryptedWriteLoop(): void
207213 $ message = $ arr [$ key ];
208214 if ($ message ->hasReply ()) {
209215 $ this ->API ->logger ("Already got response for and forgot about message $ message " );
216+ $ this ->connection ->ack_queue [] = $ message ->getMsgId ();
210217 continue ;
211218 }
212219 $ chr = \ord ($ chr );
@@ -261,6 +268,7 @@ public function encryptedWriteLoop(): void
261268
262269 $ has_state = false ;
263270 $ has_resend = false ;
271+ $ has_content_related = false ;
264272
265273 $ message = $ this ->queue ;
266274 while (($ message = $ message ->prev ) instanceof MTProtoOutgoingMessage) {
@@ -310,6 +318,8 @@ public function encryptedWriteLoop(): void
310318 $ MTmessages [] = $ MTmessage ;
311319 $ messages [] = $ message ;
312320
321+ $ has_content_related = $ has_content_related || $ message ->hasPromise ();
322+
313323 $ message ->setSeqNo ($ MTmessage ['seqno ' ])
314324 ->setMsgId ($ MTmessage ['msg_id ' ]);
315325 }
@@ -347,11 +357,14 @@ public function encryptedWriteLoop(): void
347357 if ($ count > 1 || $ has_seq ) {
348358 $ message_id = $ this ->connection ->msgIdHandler ->generateMessageId ();
349359 $ this ->API ->logger ("Wrapping in msg_container ( {$ count } messages of total size {$ total_length }, id $ message_id) as encrypted message for DC {$ this ->datacenter }" , Logger::ULTRA_VERBOSE );
350- $ messages []= $ ct = new Container (
360+ $ ct = new Container (
351361 $ this ->connection ,
352362 $ messages ,
353363 $ acks ,
354364 );
365+ if ($ has_content_related ) {
366+ $ messages []= $ ct ;
367+ }
355368 $ this ->connection ->outgoingCtr ?->inc();
356369 $ message_data = $ this ->API ->getTL ()->serializeObject (['type ' => '' ], ['_ ' => 'msg_container ' , 'messages ' => $ MTmessages ], 'container ' );
357370 $ message_data_length = \strlen ($ message_data );
0 commit comments