24 std::chrono::milliseconds queue_timeout = std::chrono::seconds(5)) {
25 auto request = std::make_shared<Request>();
26 request->json = std::move(json);
27 auto result = request->result.get_future();
29 std::lock_guard<std::mutex> lock(
mutex_);
31 return absl::ResourceExhaustedError(
"Editor command queue is full");
35 if (result.wait_for(queue_timeout) != std::future_status::ready) {
37 if (request->state.compare_exchange_strong(queued, 2)) {
38 return absl::DeadlineExceededError(
39 "Editor did not process the command; cancelled without execution");
47 const std::function<std::string(
const std::string&)>& action) {
48 std::shared_ptr<Request> request;
50 std::lock_guard<std::mutex> lock(
mutex_);
57 if (request->state.compare_exchange_strong(queued, 1)) {
59 request->result.set_value(action(request->json));
62 request->result.set_value(
63 R
"({"protocol":"yaze-editor-control/v1","status":"error","http_status":500,"error":"Editor command failed"})");