#include "observation_store.hpp"
#include <utility>
namespace nethack_mcp
{
ObservationStore::ObservationStore()
: snapshot_({
{"schema_version", 1},
{"game_id", nullptr},
{"revision", 0},
{"lifecycle", "idle"},
{"operation", nullptr},
{"map", {
{"width", 79},
{"height", 21},
{"origin", {{"x", 1}, {"y", 0}}},
{"rows", Json::array()},
{"cursor", nullptr},
}},
{"status", Json::object()},
{"messages", Json::array()},
{"messages_truncated", false},
{"inventory", {
{"known", false},
{"stale", true},
{"entries", Json::array()},
}},
{"pending", nullptr},
})
{}
Json ObservationStore::snapshot() const
{
std::lock_guard lock(mutex_);
return snapshot_;
}
std::uint64_t ObservationStore::publish(Json snapshot)
{
std::lock_guard lock(mutex_);
++revision_;
snapshot["revision"] = revision_;
snapshot_ = std::move(snapshot);
condition_.notify_all();
return revision_;
}
Json ObservationStore::waitForRevision(
std::uint64_t revision,
std::chrono::milliseconds timeout) const
{
std::unique_lock lock(mutex_);
condition_.wait_for(lock, timeout, [&] {
return revision_ > revision;
});
return snapshot_;
}
} // namespace nethack_mcp