public SyncServerModule() : base("/sync") { Get["/ping"] = _ => Response.AsText($"Alive @ {DateTime.Now}"); Get["/"] = _ => View["Index.html", AppState <string> .Current]; Post["/register"] = x => { AppState <string> .Current.VectorClockSyncServer = AppState <string> .Current.VectorClockSyncServer ?? new VectorClockSyncServer <string>(new DelegateToClientConflictResolver <string>()); AppState <string> .Current.VectorClockSyncServer.Start(); VectorClockNode <string> sender = this.Bind <VectorClockNodeDto <string> >().ToModel(); ServerSideVectorClockNode <string> node = new ServerSideVectorClockNode <string>(sender.NodeID, Request.Url.SiteBase, sender.Payload, sender.Revision); bool isSuccess = AppState <string> .Current.VectorClockSyncServer.TryRegisterNode(node); return(isSuccess ? HttpStatusCode.OK : HttpStatusCode.BadRequest); }; Put["/"] = x => { AppState <string> .Current.VectorClockSyncServer = AppState <string> .Current.VectorClockSyncServer ?? new VectorClockSyncServer <string>(new DelegateToClientConflictResolver <string>()); VectorClockNode <string> sender = this.Bind <VectorClockNodeDto <string> >().ToModel(); AppState <string> .Current.VectorClockSyncServer.QueueEvent(sender); return(HttpStatusCode.Accepted); }; }
public override bool TryRegisterNode(VectorClockNode <T> node) { using (var http = new HttpClient()) { StringContent json = new StringContent(JsonConvert.SerializeObject(VectorClockNodeDto <T> .FromModel(node)), Encoding.Default, "application/json"); var response = http.PostAsync($"{Url}sync/register", json).Result; return(response.IsSuccessStatusCode); } }
public override VectorClockSyncResult <T> Acknowledge(VectorClockNode <T> vectorClock) { var result = base.Acknowledge(vectorClock); if (AppState <T> .Current.VectorClockNode != this) { NotifyRemoteNode(); } return(result); }
public static VectorClockNodeDto <T> FromModel(VectorClockNode <T> model) { return(new VectorClockNodeDto <T> { Payload = model.Payload, NodeID = model.NodeID, Version = model.Version, Revision = model.Revision.Select(VectorClockNodeVersionDto.FromModel).ToArray(), }); }
public override VectorClockSyncResult <string> Acknowledge(VectorClockNode <string> vectorClock) { Console.WriteLine($"{this} tries to aknowledge {vectorClock} @ {DateTime.Now}"); var result = base.Acknowledge(vectorClock); Console.WriteLine($"{result} @ {DateTime.Now}"); return(result); }
public NodeModule() : base("/") { Get["/"] = _ => View["Index.html", AppState <string> .Current]; Get["/ping"] = _ => Response.AsText($"Alive @ {DateTime.Now}"); Get["/status"] = _ => Response.AsJson(AppState <string> .Current.LatestSync); Put["/ack"] = x => { AppState <string> .Current.VectorClockNode = AppState <string> .Current.VectorClockNode ?? new ServerSideVectorClockNode <string>(Request.Url.SiteBase, "http://localhost:60000"); VectorClockNode <string> sender = this.Bind <VectorClockNodeDto <string> >().ToModel(); AppState <string> .Current.LatestSync = AppState <string> .Current.VectorClockNode.Acknowledge(sender); return(HttpStatusCode.Accepted); }; Post["/say"] = x => { AppState <string> .Current.VectorClockNode = AppState <string> .Current.VectorClockNode ?? new ServerSideVectorClockNode <string>(Request.Url.SiteBase, "http://localhost:60000"); Telegram telegram = this.Bind <Telegram>(); AppState <string> .Current.VectorClockNode.Say(telegram.Message); return(HttpStatusCode.OK); }; Post["/resolveConflict"] = x => { Telegram telegram = this.Bind <Telegram>(); AppState <string> .Current.LatestSync.ResolveConflict(telegram.Message); AppState <string> .Current.LatestSync = AppState <string> .Current.VectorClockNode.Acknowledge(AppState <string> .Current.LatestSync.Solution); (AppState <string> .Current.VectorClockNode as ServerSideVectorClockNode <string>).NotifySyncServer(); return(HttpStatusCode.OK); }; }
public override VectorClockSyncResult <T> Acknowledge(VectorClockNode <T> vectorClock) { var result = base.Acknowledge(vectorClock); return(result); }
public VectorClockConflict(VectorClockNode <T> nodeA, VectorClockNode <T> nodeB) { NodeA = nodeA; NodeB = nodeB; }
public override void QueueEvent(VectorClockNode <T> eventSource) { AppState <T> .Current.VectorClockSyncServer.QueueEvent(eventSource); }