@@ -522,8 +522,7 @@ AsyncWebSocketMultiMessage::~AsyncWebSocketMultiMessage() {
522
522
const size_t AWSC_PING_PAYLOAD_LEN = 22 ;
523
523
524
524
AsyncWebSocketClient::AsyncWebSocketClient (AsyncWebServerRequest *request, AsyncWebSocket *server)
525
- : _controlQueue(LinkedList<AsyncWebSocketControl *>([](AsyncWebSocketControl *c){ delete c; }))
526
- , _messageQueue(LinkedList<AsyncWebSocketMessage *>([](AsyncWebSocketMessage *m){ delete m; }))
525
+ : _messageQueue(LinkedList<AsyncWebSocketMessage *>([](AsyncWebSocketMessage *m){ delete m; }))
527
526
, _tempObject(NULL )
528
527
{
529
528
_client = request->client ();
@@ -548,7 +547,7 @@ AsyncWebSocketClient::AsyncWebSocketClient(AsyncWebServerRequest *request, Async
548
547
AsyncWebSocketClient::~AsyncWebSocketClient (){
549
548
// Serial.printf("%u FREE Q\n", id());
550
549
_messageQueue.free ();
551
- _controlQueue.free ();
550
+ _controlQueue.clear ();
552
551
_server->_cleanBuffers ();
553
552
_server->_handleEvent (this , WS_EVT_DISCONNECT, NULL , NULL , 0 );
554
553
}
@@ -562,17 +561,17 @@ void AsyncWebSocketClient::_clearQueue(){
562
561
void AsyncWebSocketClient::_onAck (size_t len, uint32_t time){
563
562
// Serial.printf("%u onAck\n", id());
564
563
_lastMessageTime = millis ();
565
- if (!_controlQueue.isEmpty ()){
566
- auto head = _controlQueue.front ();
567
- if (head-> finished ()){
568
- len -= head-> len ();
569
- if (_status == WS_DISCONNECTING && head-> opcode () == WS_DISCONNECT){
570
- _controlQueue.remove (head );
564
+ if (!_controlQueue.empty ()){
565
+ auto & head = _controlQueue.front ();
566
+ if (head. finished ()){
567
+ len -= head. len ();
568
+ if (_status == WS_DISCONNECTING && head. opcode () == WS_DISCONNECT){
569
+ _controlQueue.pop_front ( );
571
570
_status = WS_DISCONNECTED;
572
571
_client->close (true );
573
572
return ;
574
573
}
575
- _controlQueue.remove (head );
574
+ _controlQueue.pop_front ( );
576
575
}
577
576
}
578
577
@@ -588,10 +587,9 @@ void AsyncWebSocketClient::_onAck(size_t len, uint32_t time){
588
587
}
589
588
590
589
void AsyncWebSocketClient::_onPoll (){
591
- if (_client->canSend () && (!_controlQueue.isEmpty () || !_messageQueue.isEmpty ())){
592
- // Serial.println("RUN 2");
590
+ if (_client->canSend () && (!_controlQueue.empty () || !_messageQueue.isEmpty ())){
593
591
_runQueue ();
594
- } else if (_keepAlivePeriod > 0 && _controlQueue.isEmpty () && _messageQueue.isEmpty () && (millis () - _lastMessageTime) >= _keepAlivePeriod){
592
+ } else if (_keepAlivePeriod > 0 && _controlQueue.empty () && _messageQueue.isEmpty () && (millis () - _lastMessageTime) >= _keepAlivePeriod){
595
593
ping ((uint8_t *)AWSC_PING_PAYLOAD, AWSC_PING_PAYLOAD_LEN);
596
594
}
597
595
}
@@ -602,9 +600,9 @@ void AsyncWebSocketClient::_runQueue(){
602
600
// size_t m0 = _messageQueue.isEmpty()? 0 : _messageQueue.length();
603
601
// size_t m1 = _messageQueue.isEmpty()? 0 : _messageQueue.front()->betweenFrames();
604
602
// Serial.printf("%u R C = %u %u\n", _clientId, m0, m1);
605
- if (!_controlQueue.isEmpty () && (_messageQueue.isEmpty () || _messageQueue.front ()->betweenFrames ()) && webSocketSendFrameWindow (_client) > (size_t )(_controlQueue.front ()-> len () - 1 )){
603
+ if (!_controlQueue.empty () && (_messageQueue.isEmpty () || _messageQueue.front ()->betweenFrames ()) && webSocketSendFrameWindow (_client) > (size_t )(_controlQueue.front (). len () - 1 )){
606
604
// Serial.printf("%u R S C\n", _clientId);
607
- _controlQueue.front ()-> send (_client);
605
+ _controlQueue.front (). send (_client);
608
606
} else if (!_messageQueue.isEmpty () && _messageQueue.front ()->betweenFrames () && webSocketSendFrameWindow (_client)){
609
607
// Serial.printf("%u R S M = ", _clientId);
610
608
_messageQueue.front ()->send (_client);
@@ -617,6 +615,10 @@ bool AsyncWebSocketClient::queueIsFull() const {
617
615
return (_messageQueue.length () >= WS_MAX_QUEUED_MESSAGES) || (_status != WS_CONNECTED);
618
616
}
619
617
618
+ size_t AsyncWebSocketClient::queueLen () const {
619
+ return _messageQueue.length () + _controlQueue.size ();
620
+ }
621
+
620
622
void AsyncWebSocketClient::_queueMessage (AsyncWebSocketMessage *dataMessage){
621
623
if (dataMessage == NULL ){
622
624
// Serial.printf("%u Q1\n", _clientId);
@@ -642,11 +644,9 @@ void AsyncWebSocketClient::_queueMessage(AsyncWebSocketMessage *dataMessage){
642
644
}
643
645
}
644
646
645
- void AsyncWebSocketClient::_queueControl (AsyncWebSocketControl *controlMessage){
646
- if (controlMessage == NULL )
647
- return ;
648
- _controlQueue.add (controlMessage);
649
- if (_client->canSend ()) {
647
+ void AsyncWebSocketClient::_queueControl (uint8_t opcode, uint8_t *data, size_t len, bool mask){
648
+ _controlQueue.emplace_back (opcode, data, len, mask);
649
+ if (_client->canSend ()) {
650
650
// Serial.println("RUN 4");
651
651
_runQueue ();
652
652
}
@@ -669,17 +669,17 @@ void AsyncWebSocketClient::close(uint16_t code, const char * message){
669
669
if (message != NULL ){
670
670
memcpy (buf+2 , message, packetLen -2 );
671
671
}
672
- _queueControl (new AsyncWebSocketControl ( WS_DISCONNECT,(uint8_t *)buf,packetLen) );
672
+ _queueControl (WS_DISCONNECT, (uint8_t *)buf, packetLen);
673
673
free (buf);
674
674
return ;
675
675
}
676
676
}
677
- _queueControl (new AsyncWebSocketControl ( WS_DISCONNECT) );
677
+ _queueControl (WS_DISCONNECT);
678
678
}
679
679
680
680
void AsyncWebSocketClient::ping (uint8_t *data, size_t len){
681
681
if (_status == WS_CONNECTED)
682
- _queueControl (new AsyncWebSocketControl ( WS_PING, data, len) );
682
+ _queueControl (WS_PING, data, len);
683
683
}
684
684
685
685
void AsyncWebSocketClient::_onError (int8_t ){
@@ -765,10 +765,10 @@ void AsyncWebSocketClient::_onData(void *pbuf, size_t plen){
765
765
} else {
766
766
_status = WS_DISCONNECTING;
767
767
_client->ackLater ();
768
- _queueControl (new AsyncWebSocketControl ( WS_DISCONNECT, data, datalen) );
768
+ _queueControl (WS_DISCONNECT, data, datalen);
769
769
}
770
770
} else if (_pinfo.opcode == WS_PING){
771
- _queueControl (new AsyncWebSocketControl ( WS_PONG, data, datalen) );
771
+ _queueControl (WS_PONG, data, datalen);
772
772
} else if (_pinfo.opcode == WS_PONG){
773
773
if (datalen != AWSC_PING_PAYLOAD_LEN || memcmp (AWSC_PING_PAYLOAD, data, AWSC_PING_PAYLOAD_LEN) != 0 )
774
774
_server->_handleEvent (this , WS_EVT_PONG, NULL , data, datalen);
0 commit comments