Beispiel #1
0
 internal void RemoveSession(CommSession session)
 {
     Debug.Assert(
         openSessions.ContainsKey(session.Id),
         "Attempted to remove a session that was not still open. " +
         "This is an internal error that should never happen."
         );
     openSessions.Remove(session.Id);
 }
Beispiel #2
0
        public async Task <ICommSession> OpenSession(string targetName, object?data = null)
        {
            var id          = Guid.NewGuid().ToString();
            var commSession = new CommSession(this, id);

            openSessions.Add(id, commSession);

            await SendMessage(new Message
            {
                Content = new CommOpenContent
                {
                    RawData    = data == null ? null : JToken.FromObject(data),
                    Id         = id,
                    TargetName = targetName
                },
                Header = new MessageHeader
                {
                    MessageType = "comm_open"
                }
            });

            return(commSession);
        }
Beispiel #3
0
        public CommsRouter(IShellServer server, IShellRouter router, ILogger <CommsRouter>?logger = null)
        {
            this.Server = server;
            this.Router = router;
            this.logger = logger;

            router.RegisterHandler("comm_open", async(message) =>
            {
                if (message.Content is CommOpenContent openContent)
                {
                    if (sessionHandlers.TryGetValue(openContent.TargetName, out var handler))
                    {
                        var session = new CommSession(this, openContent.Id);
                        openSessions.Add(session.Id, session);
                        await handler.Handle(session, openContent.RawData);
                    }
                    else
                    {
                        // According to the Jupyter messaging protocol, we are
                        // supposed to ignore comm_open messages entirely if
                        // we don't recognizer the target_name property.
                        logger.LogWarning(
                            "Got a comm_open message for target name {TargetName}, but no handler for that target name has been registered.",
                            openContent.TargetName
                            );
                    }
                }
                else
                {
                    logger.LogError(
                        "Expected message content for a comm_open message, but got content of type {Type} instead.",
                        message.Content.GetType()
                        );
                }
            });

            router.RegisterHandler("comm_msg", async(message) =>
            {
                if (message.Content is CommMessageContent msgContent)
                {
                    if (!openSessions.TryGetValue(msgContent.Id, out var session))
                    {
                        logger.LogError(
                            "Got comms message for session {Id}, but no such session is currently open.",
                            session.Id
                            );
                    }
                    await session.HandleMessage(msgContent);
                }
                else
                {
                    logger.LogError(
                        "Expected message content for a comm_msg message, but got content of type {Type} instead.",
                        message.Content.GetType()
                        );
                }
            });

            router.RegisterHandler("comm_close", async(message) =>
            {
                if (message.Content is CommCloseContent closeContent)
                {
                    if (!openSessions.TryGetValue(closeContent.Id, out var session))
                    {
                        logger.LogError(
                            "Asked by client to close comms session with {Id}, but no such session is currently open.",
                            session.Id
                            );
                    }
                    openSessions.Remove(session.Id);
                    await session.HandleClose(CommSessionClosedBy.Client);
                }
                else
                {
                    logger.LogError(
                        "Expected message content for a comm_close message, but got content of type {Type} instead.",
                        message.Content.GetType()
                        );
                }
            });
        }