state machine

This commit is contained in:
J. Nick Koston
2025-12-18 16:50:41 -10:00
parent 38afc5149a
commit a7f82f5201

View File

@@ -214,32 +214,35 @@ void APIConnection::loop() {
this->process_batch_();
}
if (this->active_iterator_ == ActiveIterator::LIST_ENTITIES) {
if (!this->iterator_storage_.list_entities.completed()) {
this->process_iterator_batch_(this->iterator_storage_.list_entities);
} else {
// List entities completed, check if we need to start initial state
this->destroy_active_iterator_();
if (this->flags_.state_subscription) {
this->begin_iterator_(ActiveIterator::INITIAL_STATE);
switch (this->active_iterator_) {
case ActiveIterator::LIST_ENTITIES:
if (this->iterator_storage_.list_entities.completed()) {
this->destroy_active_iterator_();
if (this->flags_.state_subscription) {
this->begin_iterator_(ActiveIterator::INITIAL_STATE);
}
} else {
this->process_iterator_batch_(this->iterator_storage_.list_entities);
}
}
} else if (this->active_iterator_ == ActiveIterator::INITIAL_STATE) {
if (!this->iterator_storage_.initial_state.completed()) {
this->process_iterator_batch_(this->iterator_storage_.initial_state);
} else {
// Initial state completed
this->destroy_active_iterator_();
// Process any remaining batched messages immediately
if (!this->deferred_batch_.empty()) {
this->process_batch_();
break;
case ActiveIterator::INITIAL_STATE:
if (this->iterator_storage_.initial_state.completed()) {
this->destroy_active_iterator_();
// Process any remaining batched messages immediately
if (!this->deferred_batch_.empty()) {
this->process_batch_();
}
// Now that everything is sent, enable immediate sending for future state changes
this->flags_.should_try_send_immediately = true;
// Release excess memory from buffers that grew during initial sync
this->deferred_batch_.release_buffer();
this->helper_->release_buffers();
} else {
this->process_iterator_batch_(this->iterator_storage_.initial_state);
}
// Now that everything is sent, enable immediate sending for future state changes
this->flags_.should_try_send_immediately = true;
// Release excess memory from buffers that grew during initial sync
this->deferred_batch_.release_buffer();
this->helper_->release_buffers();
}
break;
case ActiveIterator::NONE:
break;
}
if (this->flags_.sent_ping) {