| 193 | } |
| 194 | |
| 195 | void Remote::scheduleFunction(u32 timestamp, u32 receivedAt, const fl::json& jsonRpcRequest) { |
| 196 | // Make explicit copy for capture (avoid reference issues) |
| 197 | fl::json requestCopy = jsonRpcRequest; |
| 198 | fl::string funcName = requestCopy["method"].as_string().value_or("unknown"); |
| 199 | |
| 200 | // Wrap RPC execution in lambda and schedule it |
| 201 | mScheduler.schedule(timestamp, [this, requestCopy, timestamp, receivedAt, funcName]() { |
| 202 | u32 executedAt = fl::millis(); |
| 203 | |
| 204 | // Execute JSON-RPC request |
| 205 | fl::json response = mRpc.handle(requestCopy); |
| 206 | |
| 207 | // Record result with timing metadata |
| 208 | if (response.contains("result") && requestCopy.contains("method")) { |
| 209 | recordResult(funcName, response["result"], timestamp, receivedAt, executedAt, true); |
| 210 | } |
| 211 | }); |
| 212 | |
| 213 | FL_DBG("Scheduled RPC: " << funcName << " at " << timestamp); |
| 214 | } |
| 215 | |
| 216 | void Remote::recordResult(const fl::string& funcName, const fl::json& result, u32 scheduledAt, u32 receivedAt, u32 executedAt, bool wasScheduled) { |
| 217 | mResults.push_back({funcName, result, scheduledAt, receivedAt, executedAt, wasScheduled}); |