コード例 #1
0
        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);
            };
        }
コード例 #2
0
 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);
     }
 }
コード例 #3
0
        public override VectorClockSyncResult <T> Acknowledge(VectorClockNode <T> vectorClock)
        {
            var result = base.Acknowledge(vectorClock);

            if (AppState <T> .Current.VectorClockNode != this)
            {
                NotifyRemoteNode();
            }
            return(result);
        }
コード例 #4
0
 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(),
     });
 }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
            };
        }
コード例 #7
0
        public override VectorClockSyncResult <T> Acknowledge(VectorClockNode <T> vectorClock)
        {
            var result = base.Acknowledge(vectorClock);

            return(result);
        }
コード例 #8
0
 public VectorClockConflict(VectorClockNode <T> nodeA, VectorClockNode <T> nodeB)
 {
     NodeA = nodeA;
     NodeB = nodeB;
 }
コード例 #9
0
 public override void QueueEvent(VectorClockNode <T> eventSource)
 {
     AppState <T> .Current.VectorClockSyncServer.QueueEvent(eventSource);
 }