Exemple #1
0
        public static string Serialize(IKernelEventEnvelope eventEnvelope)
        {
            KernelCommandEnvelope.SerializationModel commandSerializationModel = null;

            if (eventEnvelope.Event.Command is not null && eventEnvelope.Event.Command is not NoCommand)
            {
                var commandEnvelope = KernelCommandEnvelope.Create(eventEnvelope.Event.Command);

                commandSerializationModel = new KernelCommandEnvelope.SerializationModel
                {
                    command     = commandEnvelope.Command,
                    commandType = commandEnvelope.CommandType,
                    token       = eventEnvelope.Event.Command.GetToken()
                };
            }

            var serializationModel = new SerializationModel
            {
                @event    = eventEnvelope.Event,
                eventType = eventEnvelope.EventType,
                command   = commandSerializationModel
            };

            return(JsonSerializer.Serialize(
                       serializationModel,
                       Serializer.JsonSerializerOptions));
        }
        public async Task SendAsync(KernelCommand command, string token = null)
        {
            if (!string.IsNullOrWhiteSpace(token))
            {
                command.SetToken(token);
            }

            var completionSource = new TaskCompletionSource <bool>();

            token = command.GetToken();
            var sub = _kernelEvents
                      .Where(e => e.Command.GetToken() == token)
                      .Subscribe(kernelEvent =>
            {
                switch (kernelEvent)
                {
                case CommandFailed _:
                case CommandSucceeded _:
                    completionSource.SetResult(true);
                    break;
                }
            });

            var envelope = KernelCommandEnvelope.Create(command);

            var serialized = KernelCommandEnvelope.Serialize(envelope);

            _output.Write(serialized);

            await completionSource.Task;

            sub.Dispose();
        }