diff options
-rw-r--r-- | src/main.cpp | 40 | ||||
-rw-r--r-- | test/sync.test | 5 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp index dad307c..387fe4a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -306,6 +306,44 @@ void stopServer(const vector<string> &) server.reset(); } +void sharedStateGet(const vector<string> &) +{ + ostringstream ss; + ss << "shared-state-get"; + for (const auto & r : h->behavior().lens<vector<Ref>>().get()) + ss << " " << string(r.digest()); + printLine(ss.str()); +} + +void sharedStateWait(const vector<string> & args) +{ + static optional<Watched<vector<Ref>>> watched; + watched = h->behavior().lens<vector<Ref>>().watch([args, watched = watched] (const vector<Ref> & refs) mutable { + vector<Stored<Object>> objs; + objs.reserve(refs.size()); + for (const auto & r : refs) + objs.push_back(Stored<Object>::load(r)); + + auto objs2 = objs; + for (const auto & a : args) + if (auto ref = st.ref(Digest(a))) + objs2.push_back(Stored<Object>::load(*ref)); + else + return; + + filterAncestors(objs2); + if (objs2 == objs) { + ostringstream ss; + ss << "shared-state-wait"; + for (const auto & a : args) + ss << " " << a; + printLine(ss.str()); + + watched = std::nullopt; + } + }); +} + void watchLocalIdentity(const vector<string> &) { auto bhv = h->behavior().lens<optional<Identity>>(); @@ -395,6 +433,8 @@ vector<Command> commands = { { "create-identity", createIdentity }, { "start-server", startServer }, { "stop-server", stopServer }, + { "shared-state-get", sharedStateGet }, + { "shared-state-wait", sharedStateWait }, { "watch-local-identity", watchLocalIdentity }, { "watch-shared-identity", watchSharedIdentity }, { "update-local-identity", updateLocalIdentity }, diff --git a/test/sync.test b/test/sync.test index 06d1a92..b9f3354 100644 --- a/test/sync.test +++ b/test/sync.test @@ -43,3 +43,8 @@ test: send "update-shared-identity NewOwner3" to p1 expect /shared-identity NewOwner3/ from p1 expect /shared-identity NewOwner3/ from p2 + + send "shared-state-get" to p1 + expect /shared-state-get (.*)/ from p1 capture p1state + send "shared-state-wait $p1state" to p2 + expect /shared-state-wait $p1state/ from p2 |