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); }
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); }
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() ); } }); }