Пример #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 static void RegisterEventsAndCommands()
        {
            // register commands and event with serialization

            var commandTypes = typeof(CSharpProjectKernel).Assembly.ExportedTypes
                               .Where(t => !t.IsAbstract && !t.IsInterface)
                               .Where(t => typeof(KernelCommand).IsAssignableFrom(t))
                               .OrderBy(t => t.Name)
                               .ToList();
            var eventTypes = typeof(CSharpProjectKernel).Assembly.ExportedTypes
                             .Where(t => !t.IsAbstract && !t.IsInterface)
                             .Where(t => typeof(KernelEvent).IsAssignableFrom(t))
                             .OrderBy(t => t.Name)
                             .ToList();

            foreach (var commandType in commandTypes)
            {
                KernelCommandEnvelope.RegisterCommand(commandType);
            }

            foreach (var eventType in eventTypes)
            {
                KernelEventEnvelope.RegisterEvent(eventType);
            }
        }
Пример #3
0
    public async Task RouteAsync(RouteContext context)
    {
        if (context.HttpContext.Request.Method == HttpMethods.Post)
        {
            var segments =
                context.HttpContext
                .Request
                .Path
                .Value
                .Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
            if (segments.Length == 1 && segments[0] == "publishEvent")
            {
                using var reader = new StreamReader(context.HttpContext.Request.Body);
                var requestText = await reader.ReadToEndAsync();

                var requestObject     = JsonDocument.Parse(requestText).RootElement;
                var commandToken      = requestObject.GetPropertyFromPath("commandToken")?.GetString();
                var eventEnvelopeText = requestObject.GetPropertyFromPath("eventEnvelope")?.GetRawText();
                _frontendEnvironment.PublishEventFromCommand(commandToken, command =>
                {
                    context.Handler = async httpContext =>
                    {
                        httpContext.Response.StatusCode = 200;
                        await httpContext.Response.CompleteAsync();
                    };
                    var eventEnvelope = KernelEventEnvelope.DeserializeWithCommand(eventEnvelopeText, command);
                    return(eventEnvelope.Event);
                });
            }
        }
    }
Пример #4
0
        public async Task SendAsync(KernelEvent kernelEvent, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            _sender.WriteMessage(KernelEventEnvelope.Serialize(KernelEventEnvelope.Create(kernelEvent)));

            await _sender.FlushAsync(cancellationToken);
        }
Пример #5
0
 public static TKernel UseVSCodeCommands <TKernel>(this TKernel kernel) where TKernel : Kernel
 {
     kernel.RegisterCommandType <GetInput>();
     KernelCommandEnvelope.RegisterCommand <GetInput>();
     KernelEventEnvelope.RegisterEvent <InputProduced>();
     return(kernel);
 }
Пример #6
0
 public void Dispose()
 {
     KernelCommandEnvelope.ResetToDefaults();
     KernelEventEnvelope.ResetToDefaults();
     _host.Value.Dispose();
     _host = null;
 }
Пример #7
0
        public CommandLineParserTests(ITestOutputHelper output)
        {
            KernelCommandEnvelope.ResetToDefaults();
            KernelEventEnvelope.ResetToDefaults();

            _output            = output;
            _serviceCollection = new ServiceCollection();
            _parser            = CommandLineParser.Create(
                _serviceCollection,
                startServer: (options, invocationContext) =>
            {
                _startOptions = options;
            },
                jupyter: (startupOptions, console, startServer, context) =>
            {
                _startOptions = startupOptions;
                return(Task.FromResult(1));
            },
                startStdIO: (startupOptions, kernel, console) =>
            {
                _startOptions = startupOptions;
                return(Task.FromResult(1));
            },
                startHttp: (startupOptions, console, startServer, context) =>
            {
                _startOptions = startupOptions;
                return(Task.FromResult(1));
            },
                telemetry: new FakeTelemetry(),
                firstTimeUseNoticeSentinel: new NopFirstTimeUseNoticeSentinel());

            _connectionFile        = new FileInfo(Path.GetTempFileName());
            _kernelSpecInstallPath = new DirectoryInfo(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()));
        }
Пример #8
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}"))
                );
        }
Пример #9
0
        public async Task SendAsync(KernelEvent kernelEvent, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            await _writer.WriteAsync(KernelEventEnvelope.Serialize(KernelEventEnvelope.Create(kernelEvent)));

            await _writer.WriteAsync(Delimiter);

            await _writer.FlushAsync();
        }
Пример #10
0
        public static Task UseVSCodeHelpersAsync <TKernel>(this TKernel kernel, Kernel rootKernel) where TKernel : DotNetKernel
        {
            rootKernel.RegisterCommandType <GetInput>();
            KernelEventEnvelope.RegisterEvent <InputProduced>();

            var interactiveHost = new VSCodeInteractiveHost(rootKernel);

            return(kernel.SetVariableAsync("InteractiveHost", interactiveHost, typeof(IInteractiveHost)));
        }
Пример #11
0
        public void Create_creates_envelope_of_the_correct_type()
        {
            IKernelEvent @event = new DisplayedValueProduced(
                123,
                new SubmitCode("display(123)"));

            var envelope = KernelEventEnvelope.Create(@event);

            envelope.Should().BeOfType <KernelEventEnvelope <DisplayedValueProduced> >();
        }
Пример #12
0
        public void Create_creates_envelope_with_reference_to_original_event()
        {
            IKernelEvent @event = new DisplayedValueProduced(
                123,
                new SubmitCode("display(123)"));

            var envelope = KernelEventEnvelope.Create(@event);

            envelope.Event.Should().BeSameAs(@event);
        }
Пример #13
0
    static CSharpProjectKernel()
    {
        // register commands and event with serialization
        KernelCommandEnvelope.RegisterCommand <OpenProject>();
        KernelCommandEnvelope.RegisterCommand <OpenDocument>();
        KernelCommandEnvelope.RegisterCommand <CompileProject>();

        KernelEventEnvelope.RegisterEvent <DocumentOpened>();
        KernelEventEnvelope.RegisterEvent <AssemblyProduced>();
    }
Пример #14
0
        public async Task when_a_KernelEventEnvelope_is_received_it_publishes_the_event()
        {
            var kernelEvent = new CommandSucceeded(new SubmitCode("x=1"));
            var message     = KernelEventEnvelope.Serialize(KernelEventEnvelope.Create(kernelEvent));

            using var stringReader = new StringReader(message);
            var receiver = new KernelCommandAndEventTextReceiver(stringReader);

            var d = await receiver.CommandsAndEventsAsync(CancellationToken.None).FirstAsync();

            d.Event.Should().BeEquivalentTo(kernelEvent);
        }
Пример #15
0
        public void Event_contract_has_not_been_broken(KernelEvent @event)
        {
            var _configuration = new Configuration()
                                 .UsingExtension($"{@event.GetType().Name}.json")
                                 .SetInteractive(Debugger.IsAttached);

            @event.Command?.SetToken("the-token");

            var json = KernelEventEnvelope.Serialize(@event);

            this.Assent(json, _configuration);
        }
Пример #16
0
        public SerializationTests(ITestOutputHelper output)
        {
            _output = output;

            KernelCommandEnvelope.RegisterCommand <OpenProject>();
            KernelCommandEnvelope.RegisterCommand <OpenDocument>();
            KernelCommandEnvelope.RegisterCommand <CompileProject>();
            KernelEventEnvelope.RegisterEvent <DocumentOpened>();
            KernelEventEnvelope.RegisterEvent <AssemblyProduced>();

            KernelCommandEnvelope.RegisterCommand <GetInput>();
            KernelEventEnvelope.RegisterEvent <InputProduced>();
        }
Пример #17
0
        public async Task when_a_KernelEvent_is_sent_it_writes_a_KernelEventEnvelope()
        {
            var kernelEvent = new CommandSucceeded(new SubmitCode("x=1"));
            var buffer      = new StringBuilder();

            var sender = new KernelCommandAndEventTextStreamSender(new StringWriter(buffer));
            await sender.SendAsync(kernelEvent, CancellationToken.None);

            var envelopeMessage = buffer.ToString();

            envelopeMessage.Should()
            .BeEquivalentTo(KernelEventEnvelope.Serialize(KernelEventEnvelope.Create(kernelEvent)) + KernelCommandAndEventTextStreamSender.Delimiter);
        }
Пример #18
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);
        }
Пример #19
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)
            {
            }
        }
Пример #20
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);
        }
Пример #21
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));
            }
        }
Пример #22
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));
        }
Пример #23
0
 public async Task KernelEvent(string kernelEventEnvelope)
 {
     var envelope = KernelEventEnvelope.Deserialize(kernelEventEnvelope);
     await _connection.HandleKernelEventFromClientAsync(envelope);
 }
 public async Task SendAsync(KernelEvent kernelEvent, CancellationToken cancellationToken)
 {
     await _sender.SendAsync("kernelEventFromServer", KernelEventEnvelope.Serialize(KernelEventEnvelope.Create(kernelEvent)), cancellationToken : cancellationToken);
 }
        private async Task PublishEventToContext(IKernelEvent kernelEvent, IHubContext <KernelHub> hubContext)
        {
            var eventEnvelope = KernelEventEnvelope.Create(kernelEvent);

            await hubContext.Clients.All.SendAsync("kernelEvent", KernelEventEnvelope.Serialize(eventEnvelope));
        }
Пример #26
0
 public Task SendAsync(KernelEvent kernelEvent, CancellationToken cancellationToken)
 {
     _onSendAsync?.Invoke(new CommandOrEvent(KernelEventEnvelope.Deserialize(KernelEventEnvelope.Serialize(kernelEvent)).Event));
     return(Task.CompletedTask);
 }