コード例 #1
0
        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            Task.Run(async() =>
            {
                while (!stoppingToken.IsCancellationRequested)
                {
                    var output = await DotNetInteractiveProcess.StandardOutput.ReadLineAsync();

                    if (!string.IsNullOrEmpty(output))
                    {
                        logger.LogDebug(output);

                        var eventEnvelope = KernelEventEnvelope.Deserialize(output);

                        var token = eventEnvelope.Event.Command?.GetToken();

                        if (token != null && pendingRequests.TryGetValue(token, out var tracker))
                        {
                            tracker(eventEnvelope.Event);
                        }
                    }
                }
            }, stoppingToken);

            return(Task.CompletedTask);
        }
コード例 #2
0
        public void All_event_types_are_round_trip_serializable(KernelEvent @event)
        {
            var originalEnvelope = KernelEventEnvelope.Create(@event);

            var json = KernelEventEnvelope.Serialize(originalEnvelope);

            _output.WriteLine($"{Environment.NewLine}{@event.GetType().Name}: {Environment.NewLine}{json}");

            var deserializedEnvelope = KernelEventEnvelope.Deserialize(json);

            // ignore these specific properties because they're not serialized
            var ignoredProperties = new HashSet <string>
            {
                $"{nameof(CommandFailed)}.{nameof(CommandFailed.Exception)}",
                $"{nameof(DisplayEvent)}.{nameof(DisplayEvent.Value)}"
            };

            deserializedEnvelope
            .Should()
            .BeEquivalentToRespectingRuntimeTypes(
                originalEnvelope,
                o => o.Excluding(envelope => envelope.Event.Command.Properties)
                .Excluding(envelope => ignoredProperties.Contains($"{envelope.SelectedMemberInfo.DeclaringType.Name}.{envelope.SelectedMemberInfo.Name}"))
                );
        }
コード例 #3
0
        public void All_event_types_are_round_trip_serializable(IKernelEvent @event)
        {
            var originalEnvelope = KernelEventEnvelope.Create(@event);

            var json = KernelEventEnvelope.Serialize(originalEnvelope);

            _output.WriteLine($"{Environment.NewLine}{@event.GetType().Name}: {Environment.NewLine}{json}");

            var deserializedEnvelope = KernelEventEnvelope.Deserialize(json);

            deserializedEnvelope
            .Should()
            .BeEquivalentTo(originalEnvelope);
        }
コード例 #4
0
        private void HandleLine(string line)
        {
            try
            {
                var eventEnvelope = KernelEventEnvelope.Deserialize(line);
                if (eventEnvelope.Event is KernelReady)
                {
                    _ready.SetResult(true);
                }

                _events.OnNext(eventEnvelope.Event);
            }
            catch (JsonReaderException)
            {
            }
        }
コード例 #5
0
        private async Task PollEvents(string commandToken)
        {
            do
            {
                var message = await _clientStream.ReadMessageAsync();

                var kernelEvent = KernelEventEnvelope.Deserialize(message).Event;
                PublishEvent(kernelEvent);
                if (kernelEvent is CommandSucceeded || kernelEvent is CommandFailed)
                {
                    if (kernelEvent.Command.GetToken() == commandToken)
                    {
                        break;
                    }
                }
            } while (true);
        }
コード例 #6
0
        public async IAsyncEnumerable <CommandOrEvent> CommandsOrEventsAsync([EnumeratorCancellation] CancellationToken cancellationToken)
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                KernelCommand kernelCommand = null;
                KernelEvent   kernelEvent   = null;

                var message = await ReadMessageAsync(cancellationToken);

                if (string.IsNullOrWhiteSpace(message))
                {
                    continue;
                }

                var isParseError = false;
                try
                {
                    var jsonObject = JsonDocument.Parse(message).RootElement;
                    if (IsEventEnvelope(jsonObject))
                    {
                        var kernelEventEnvelope = KernelEventEnvelope.Deserialize(jsonObject);
                        kernelEvent = kernelEventEnvelope.Event;
                    }
                    else if (IsCommandEnvelope(jsonObject))
                    {
                        var kernelCommandEnvelope = KernelCommandEnvelope.Deserialize(jsonObject);
                        kernelCommand = kernelCommandEnvelope.Command;
                    }
                    else
                    {
                        kernelEvent = new DiagnosticLogEntryProduced(
                            $"Expected {nameof(KernelCommandEnvelope)} or {nameof(KernelEventEnvelope)} but received: \n{message}", KernelCommand.None);
                        isParseError = true;
                    }
                }
                catch (Exception ex)
                {
                    kernelEvent = new DiagnosticLogEntryProduced(
                        $"Error while parsing Envelope: {message} \n{ex.Message}", KernelCommand.None);
                    isParseError = true;
                }

                yield return(kernelCommand is null ? new CommandOrEvent(kernelEvent, isParseError) : new CommandOrEvent(kernelCommand));
            }
        }
コード例 #7
0
        protected override async Task <CommandOrEvent> ReadCommandOrEventAsync(CancellationToken cancellationToken)
        {
            KernelCommand kernelCommand = null;
            KernelEvent   kernelEvent   = null;

            var message = await ReadMessageAsync(cancellationToken);

            if (string.IsNullOrWhiteSpace(message))
            {
                return(null);
            }

            var isParseError = false;

            try
            {
                var jsonObject = JsonDocument.Parse(message).RootElement;
                if (IsEventEnvelope(jsonObject))
                {
                    var kernelEventEnvelope = KernelEventEnvelope.Deserialize(jsonObject);
                    kernelEvent = kernelEventEnvelope.Event;
                }
                else if (IsCommandEnvelope(jsonObject))
                {
                    var kernelCommandEnvelope = KernelCommandEnvelope.Deserialize(jsonObject);
                    kernelCommand = kernelCommandEnvelope.Command;
                }
                else
                {
                    kernelEvent = new DiagnosticLogEntryProduced(
                        $"Expected {nameof(KernelCommandEnvelope)} or {nameof(KernelEventEnvelope)} but received: \n{message}", KernelCommand.None);
                    isParseError = true;
                }
            }
            catch (Exception ex)
            {
                kernelEvent = new DiagnosticLogEntryProduced(
                    $"Error while parsing Envelope: {message} \n{ex.Message}", KernelCommand.None);
                isParseError = true;
            }

            return(kernelCommand is null ? new CommandOrEvent(kernelEvent, isParseError) : new CommandOrEvent(kernelCommand));
        }
コード例 #8
0
ファイル: KernelHub.cs プロジェクト: zhamppx97/interactive
 public async Task KernelEvent(string kernelEventEnvelope)
 {
     var envelope = KernelEventEnvelope.Deserialize(kernelEventEnvelope);
     await _connection.HandleKernelEventFromClientAsync(envelope);
 }
コード例 #9
0
 public Task SendAsync(KernelEvent kernelEvent, CancellationToken cancellationToken)
 {
     _onSendAsync?.Invoke(new CommandOrEvent(KernelEventEnvelope.Deserialize(KernelEventEnvelope.Serialize(kernelEvent)).Event));
     return(Task.CompletedTask);
 }