| 127 | } |
| 128 | |
| 129 | bool HttpStreamTransport::resolveRpc(const fl::json& msg, const fl::string& idKey) { |
| 130 | auto it = mPendingCalls.find(idKey); |
| 131 | if (it == mPendingCalls.end()) { |
| 132 | return false; |
| 133 | } |
| 134 | PendingCall* pending = &it->second; |
| 135 | |
| 136 | // Check for error |
| 137 | if (msg.contains("error")) { |
| 138 | fl::task::Error err(msg["error"]["message"].as_string().value()); |
| 139 | pending->promise.complete_with_error(err); |
| 140 | mPendingCalls.erase(idKey); |
| 141 | return true; |
| 142 | } |
| 143 | |
| 144 | // Check for ACK (ASYNC mode sends acknowledged first) |
| 145 | if (msg.contains("result") && msg["result"].contains("acknowledged")) { |
| 146 | if (msg["result"]["acknowledged"].as_bool() == true) { |
| 147 | pending->ackReceived = true; |
| 148 | return true; // Stay pending, wait for final result |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | // Final result |
| 153 | pending->promise.complete_with_value(msg); |
| 154 | mPendingCalls.erase(idKey); |
| 155 | return true; |
| 156 | } |
| 157 | |
| 158 | bool HttpStreamTransport::resolveRpcStream(const fl::json& msg, const fl::string& idKey) { |
| 159 | auto it = mPendingStreams.find(idKey); |
nothing calls this directly
no test coverage detected