diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2021-11-23 21:09:51 +0100 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2021-11-23 21:09:51 +0100 |
commit | 6810c0e213226a62db1179a7c55bd351eb71ffe9 (patch) | |
tree | 6a7be6647f95ea1e7fa0f47987b2fdcaf6450d9c /src/main.cpp | |
parent | 39f11bb10f8b0f8797110a6d8ce70b8c975e112f (diff) |
Test sync service
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/src/main.cpp b/src/main.cpp index 0c786e2..a3805e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include <erebos/identity.h> #include <erebos/network.h> #include <erebos/storage.h> +#include <erebos/sync.h> #include <filesystem> #include <functional> @@ -92,7 +93,10 @@ void createIdentity(const vector<string> & args) if (identity) { auto nh = h->update([&identity] (const auto & loc) { - return st.store(loc->identity(*identity)); + auto ret = loc->identity(*identity); + if (identity->owner()) + ret = ret.template shared<optional<Identity>>(identity->finalOwner()); + return st.store(ret); }); if (nh) *h = *nh; @@ -130,6 +134,8 @@ void startServer(const vector<string> &) atts->onResponse(confirmAttach); services.push_back(move(atts)); + services.push_back(make_unique<SyncService>()); + server.emplace(*h, move(services)); server->peerList().onUpdate([](size_t idx, const Peer * peer) { @@ -165,6 +171,40 @@ void watchLocalIdentity(const vector<string> &) }); } +void watchSharedIdentity(const vector<string> &) +{ + auto bhv = h->behavior().lens<SharedState>().lens<optional<Identity>>(); + static auto watchedSharedIdentity = bhv.watch([] (const optional<Identity> & idt) { + if (idt) { + ostringstream ss; + ss << "shared-identity"; + for (optional<Identity> i = idt; i; i = i->owner()) + ss << " " << i->name().value(); + printLine(ss.str()); + } + }); +} + +void updateSharedIdentity(const vector<string> & params) +{ + if (params.size() != 1) { + throw invalid_argument("usage: update-shared-identity <name>"); + } + + auto nh = h->update([¶ms] (const Stored<LocalState> & loc) { + auto st = loc.ref().storage(); + auto mbid = loc->shared<optional<Identity>>(); + if (!mbid) + return loc; + + auto b = mbid->modify(); + b.name(params[0]); + return st.store(loc->shared<optional<Identity>>(optional(b.commit()))); + }); + if (nh) + *h = *nh; +} + void attach(const vector<string> & params) { server->svc<AttachService>().attachTo(getPeer(params.at(0))); @@ -181,6 +221,8 @@ vector<Command> commands = { { "start-server", startServer }, { "stop-server", stopServer }, { "watch-local-identity", watchLocalIdentity }, + { "watch-shared-identity", watchSharedIdentity }, + { "update-shared-identity", updateSharedIdentity }, { "attach", attach }, { "attach-accept", attachAccept }, }; |