Пример #1
0
        public async Task Invoke(HttpContext context, SapphireChangeNotifier changeNotifier, SapphireMessageSender sender)
        {
            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.Nlb.Secret ||
                options.Nlb.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.Nlb.EncryptionKey);

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

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

                Type dbType = Assembly.GetEntryAssembly()?.DefinedTypes.FirstOrDefault(t => t.FullName == changesRequest.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);
                logger.LogInformation("Handling publish from other server");
                sender.Publish(publishRequest.Topic, publishRequest.Message, true);
                break;

            case "message":
                SendMessageRequest messageRequest = JsonConvert.DeserializeObject <SendMessageRequest>(requestBody);
                logger.LogInformation("Handling message from other server");
                sender.Send(messageRequest.Message, true);
                break;
            }
        }
Пример #2
0
        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);
                    }
                };
            }
        }
Пример #3
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 SapphireDatabaseNotifier(SapphireChangeNotifier notifier, SyncManager syncManager)
 {
     this.notifier    = notifier;
     this.syncManager = syncManager;
 }
Пример #5
0
 public SapphireDatabaseNotifier(SapphireChangeNotifier notifier, NlbManager nlbManager)
 {
     this.notifier   = notifier;
     this.nlbManager = nlbManager;
 }
Пример #6
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);
                    }
                };
            }
        }