public SyncManager(IServiceProvider serviceProvider, ILogger <SyncManager> logger)
        {
            sapphireSyncModule = (ISapphireSyncModule)serviceProvider.GetService(typeof(ISapphireSyncModule));

            if (sapphireSyncModule != null)
            {
                sapphireSyncModule.SyncRequestRequestReceived += request =>
                {
                    if (request.OriginId == uId)
                    {
                        return;
                    }

                    if (request.Propagate)
                    {
                        Publish(request);
                    }

                    if (request is SendChangesRequest sendChangesRequest)
                    {
                        Type dbType = Assembly.GetEntryAssembly()?.DefinedTypes
                                      .FirstOrDefault(t => t.FullName == sendChangesRequest.DbType);

                        if (dbType != null)
                        {
                            SapphireChangeNotifier changeNotifier = (SapphireChangeNotifier)serviceProvider.GetService(typeof(SapphireChangeNotifier));
                            logger.LogInformation("Handling changes from other server");
                            changeNotifier.HandleChanges(sendChangesRequest.Changes, dbType);
                        }
                    }
                    else if (request is SendMessageRequest sendMessageRequest)
                    {
                        SapphireMessageSender sender = (SapphireMessageSender)serviceProvider.GetService(typeof(SapphireMessageSender));
                        logger.LogInformation("Handling message from other server");
                        sender.Send(sendMessageRequest.Message, sendMessageRequest.Filter, sendMessageRequest.FilterParameters, false);
                    }
                    else if (request is SendPublishRequest sendPublishRequest)
                    {
                        SapphireMessageSender sender = (SapphireMessageSender)serviceProvider.GetService(typeof(SapphireMessageSender));
                        logger.LogInformation("Handling publish from other server");
                        sender.Publish(sendPublishRequest.Topic, sendPublishRequest.Message, sendPublishRequest.Retain, false);
                    }
                };
            }
        }
示例#2
0
        public SyncManager(IServiceProvider serviceProvider, ILogger <SyncManager> logger, DbContextTypeContainer contextTypeContainer, SyncContext syncContext)
        {
            this.logger = logger;
            this.contextTypeContainer = contextTypeContainer;
            this.syncContext          = syncContext;
            sapphireSyncModule        = (ISapphireSyncModule)serviceProvider.GetService(typeof(ISapphireSyncModule));

            if (sapphireSyncModule != null)
            {
                sapphireSyncModule.SyncRequestRequestReceived += request =>
                {
                    if (request.OriginId == syncContext.SessionId)
                    {
                        return;
                    }

                    if (request.Propagate)
                    {
                        Publish(request);
                    }

                    if (request is SendChangesRequest sendChangesRequest)
                    {
                        Type dbType = contextTypeContainer.GetContext(sendChangesRequest.DbName);

                        if (dbType != null)
                        {
                            SapphireChangeNotifier changeNotifier =
                                (SapphireChangeNotifier)serviceProvider.GetService(typeof(SapphireChangeNotifier));
                            logger.LogInformation("Handling changes from other server");
                            logger.LogDebug(
                                "Handling {changeCount} changes of '{dbType}' from server with OriginId '{originId}'. Propagate: {propagate}",
                                sendChangesRequest.Changes.Count, dbType.Name,
                                sendChangesRequest.OriginId, sendChangesRequest.Propagate);

                            changeNotifier.HandleChanges(sendChangesRequest.Changes, dbType);
                        }
                    }
                    else if (request is SendMessageRequest sendMessageRequest)
                    {
                        SapphireMessageSender sender =
                            (SapphireMessageSender)serviceProvider.GetService(typeof(SapphireMessageSender));
                        logger.LogInformation("Handling message from other server");
                        logger.LogDebug(
                            "Handling message for filter '{filter}' from server with OriginId '{originId}'. Propagate: {propagate}",
                            sendMessageRequest.Filter, sendMessageRequest.OriginId, sendMessageRequest.Propagate);

                        sender.Send(sendMessageRequest.Message, sendMessageRequest.Filter,
                                    sendMessageRequest.FilterParameters, false);
                    }
                    else if (request is SendPublishRequest sendPublishRequest)
                    {
                        SapphireMessageSender sender =
                            (SapphireMessageSender)serviceProvider.GetService(typeof(SapphireMessageSender));
                        logger.LogInformation("Handling publish from other server");
                        logger.LogDebug(
                            "Handling publish to topic '{topic}' from server with OriginId '{originId}'. Retain: {retain}, Propagate: {propagate}",
                            sendPublishRequest.Topic, sendPublishRequest.OriginId, sendPublishRequest.Retain, sendPublishRequest.Propagate);

                        sender.Publish(sendPublishRequest.Topic, sendPublishRequest.Message, sendPublishRequest.Retain,
                                       false);
                    }
                };
            }
        }
 public MessageCommandHandler(DbContextAccesor dbContextAccessor, SapphireMessageSender messageSender, SapphireDatabaseOptions options)
     : base(dbContextAccessor)
 {
     this.messageSender = messageSender;
     this.options       = options;
 }
 public PublishCommandHandler(DbContextAccesor dbContextAccessor, SapphireMessageSender messageSender)
     : base(dbContextAccessor)
 {
     this.messageSender = messageSender;
 }
示例#5
0
        public async Task Invoke(HttpContext context, SapphireChangeNotifier changeNotifier,
                                 SapphireMessageSender sender, SyncManager syncManager)
        {
            if (context.Request.Method != "POST")
            {
                await next(context);

                return;
            }

            logger.LogInformation("Started handling nlb message");

            string originId = context.Request.Headers["OriginId"].ToString();

            if (context.Request.Headers["Secret"].ToString().ComputeHash() != options.Sync.Secret ||
                options.Sync.Entries.All(e => e.Id != originId))
            {
                logger.LogError("Prevented unauthorized access to nlb sync methods");
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                await context.Response.WriteAsync("You are not allowed to access this endpoint");

                return;
            }

            StreamReader sr          = new StreamReader(context.Request.Body);
            string       requestBody = await sr.ReadToEndAsync();

            requestBody = requestBody.Decrypt(options.Sync.EncryptionKey);

            string requestPath = context.Request.Path.Value.Split('/').LastOrDefault();

            bool propagate = false;

            if (context.Request.Query.TryGetValue("propagate", out StringValues propagateValue))
            {
                propagate = propagateValue.Equals("true");
            }

            switch (requestPath)
            {
            case "changes":
                SendChangesRequest changesRequest = JsonConvert.DeserializeObject <SendChangesRequest>(requestBody);

                Type dbType = Assembly.GetEntryAssembly()?.DefinedTypes
                              .FirstOrDefault(t => t.FullName == changesRequest.DbType);

                if (propagate)
                {
                    syncManager.SendChanges(changesRequest.Changes, dbType);
                }

                if (dbType != null)
                {
                    logger.LogInformation("Handling changes from other server");
                    changeNotifier.HandleChanges(changesRequest.Changes, dbType);
                }

                break;

            case "publish":
                SendPublishRequest publishRequest = JsonConvert.DeserializeObject <SendPublishRequest>(requestBody);

                if (propagate)
                {
                    syncManager.SendPublish(publishRequest.Topic, publishRequest.Message);
                }

                logger.LogInformation("Handling publish from other server");
                sender.Publish(publishRequest.Topic, publishRequest.Message, true);
                break;

            case "message":
                SendMessageRequest messageRequest = JsonConvert.DeserializeObject <SendMessageRequest>(requestBody);

                if (propagate)
                {
                    syncManager.SendMessage(messageRequest.Message);
                }

                logger.LogInformation("Handling message from other server");
                sender.Send(messageRequest.Message, true);
                break;
            }
        }
 public MessageActions(SapphireMessageSender messageSender)
 {
     MessageSender = messageSender;
 }
示例#7
0
        public SyncManager(IServiceProvider serviceProvider, ILogger <SyncManager> logger, DbContextTypeContainer contextTypeContainer, SyncContext syncContext)
        {
            this.logger = logger;
            this.contextTypeContainer = contextTypeContainer;
            this.syncContext          = syncContext;
            sapphireSyncModule        = (ISapphireSyncModule)serviceProvider.GetService(typeof(ISapphireSyncModule));

            if (sapphireSyncModule != null)
            {
                sapphireSyncModule.SyncRequestRequestReceived += request =>
                {
                    if (request.OriginId == syncContext.SessionId)
                    {
                        return;
                    }

                    if (request.Propagate)
                    {
                        Publish(request);
                    }

                    if (request is SendChangesRequest sendChangesRequest)
                    {
                        Type dbType = contextTypeContainer.GetContext(sendChangesRequest.DbName);

                        if (dbType != null)
                        {
                            SapphireChangeNotifier changeNotifier =
                                (SapphireChangeNotifier)serviceProvider.GetService(typeof(SapphireChangeNotifier));
                            logger.LogInformation("Handling changes from other server");
                            logger.LogDebug(
                                "Handling {ChangeCount} changes of {DbType} from server with OriginId {OriginId}. Propagate: {Propagate}",
                                sendChangesRequest.Changes.Count, dbType.Name,
                                sendChangesRequest.OriginId, sendChangesRequest.Propagate);

                            sendChangesRequest.Changes.ForEach(change =>
                            {
                                KeyValuePair <Type, string> property = dbType.GetDbSetType(change.CollectionName);

                                JObject rawValue = change.Value as JObject;
                                change.Value     = rawValue?.ToObject(property.Key);

                                if (change.State == ChangeResponse.ChangeState.Modified && change.OriginalValue != null)
                                {
                                    JObject rawOriginalValue = change.OriginalValue as JObject;
                                    change.OriginalValue     = rawOriginalValue?.ToObject(property.Key);
                                }
                            });

                            changeNotifier.HandleChanges(sendChangesRequest.Changes, dbType);
                        }
                    }
                    else if (request is SendMessageRequest sendMessageRequest)
                    {
                        SapphireMessageSender sender =
                            (SapphireMessageSender)serviceProvider.GetService(typeof(SapphireMessageSender));
                        logger.LogInformation("Handling message from other server");
                        logger.LogDebug(
                            "Handling message for filter {Filter} from server with OriginId {OriginId}. Propagate: {Propagate}",
                            sendMessageRequest.Filter, sendMessageRequest.OriginId, sendMessageRequest.Propagate);

                        sender.Send(sendMessageRequest.Message, sendMessageRequest.Filter,
                                    sendMessageRequest.FilterParameters, false);
                    }
                    else if (request is SendPublishRequest sendPublishRequest)
                    {
                        SapphireMessageSender sender =
                            (SapphireMessageSender)serviceProvider.GetService(typeof(SapphireMessageSender));
                        logger.LogInformation("Handling publish from other server");
                        logger.LogDebug(
                            "Handling publish to topic {Topic} from server with OriginId {OriginId}. Retain: {Retain}, Propagate: {Propagate}",
                            sendPublishRequest.Topic, sendPublishRequest.OriginId, sendPublishRequest.Retain, sendPublishRequest.Propagate);

                        sender.Publish(sendPublishRequest.Topic, sendPublishRequest.Message, sendPublishRequest.Retain,
                                       false);
                    }
                };
            }
        }