Skip to content

Commit 72585b1

Browse files
knareshNaresh Kumar Kolloju
andauthored
Publish kernel status into notebook's awareness (#47)
* Publish kernel status into notebooks awareness * Addresse previous pr feedback and do some cleanup --------- Co-authored-by: Naresh Kumar Kolloju <[email protected]>
1 parent e92faaf commit 72585b1

File tree

3 files changed

+31
-26
lines changed

3 files changed

+31
-26
lines changed

jupyter_rtc_core/kernels/kernel_client.py

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ class DocumentAwareKernelClient(AsyncKernelClient):
3535
# status messages.
3636
_yrooms: t.Set[YRoom] = Set(trait=Instance(YRoom), default_value=set())
3737

38-
3938
async def start_listening(self):
4039
"""Start listening to messages coming from the kernel.
4140
@@ -70,7 +69,7 @@ async def stop_listening(self):
7069
# Log any exceptions that were raised.
7170
except Exception as err:
7271
self.log.error(err)
73-
72+
7473
_listening_task: t.Optional[t.Awaitable] = Any(allow_none=True)
7574

7675
def handle_incoming_message(self, channel_name: str, msg: list[bytes]):
@@ -166,7 +165,7 @@ async def handle_outgoing_message(self, channel_name: str, msg: list[bytes]):
166165
return
167166

168167
# Update the last activity.
169-
#self.last_activity = self.session.msg_time
168+
# self.last_activity = self.session.msg_time
170169

171170
await self.send_message_to_listeners(channel_name, msg)
172171

@@ -183,7 +182,7 @@ async def handle_iopub_message(self, msg: list[bytes]) -> t.Optional[list[bytes]
183182
-------
184183
Returns the message if it should be forwarded to listeners. Otherwise,
185184
returns `None` and keeps (i.e. intercepts) the message from going
186-
to listenres.
185+
to listeners.
187186
"""
188187
# NOTE: Here's where we will inject the kernel state
189188
# into the awareness of a document.
@@ -192,37 +191,34 @@ async def handle_iopub_message(self, msg: list[bytes]) -> t.Optional[list[bytes]
192191
dmsg = self.session.deserialize(msg, content=False)
193192
except Exception as e:
194193
self.log.error(f"Error deserializing message: {e}")
195-
raise ValueError
196-
197-
if dmsg["msg_type"] == "status":
198-
# Forward to all yrooms.
199-
for yroom in self._yrooms:
200-
# NOTE: We need to create a real message here.
201-
awareness_update_message = b""
202-
self.log.debug(f"Update Awareness here: {dmsg}. YRoom: {yroom}")
203-
#self.log.debug(f"Getting YDoc: {await yroom.get_ydoc()}")
204-
#yroom.add_message(awareness_update_message)
205-
206-
# TODO: returning message temporarily to not break UI
207-
return msg
208-
194+
raise
209195

210196
# NOTE: Inject display data into ydoc.
211197
if dmsg["msg_type"] == "display_data":
212198
# Forward to all yrooms.
213199
for yroom in self._yrooms:
214200
update_document_message = b""
215-
self.log.debug(f"Update Document here: {dmsg}. Yroom: {yroom}")
216-
#self.log.debug(f"Getting YDoc: {await yroom.get_ydoc()}")
217-
#yroom.add_message(update_document_message)
218-
219-
# TODO: returning message temporarily to not break UI
220-
return msg
201+
# yroom.add_message(update_document_message)
221202

203+
# TODO: returning message temporarily to not break UI
222204
# If the message isn't handled above, return it and it will
223205
# be forwarded to all listeners
224206
return msg
225207

208+
def send_kernel_awareness(self, kernel_status: dict):
209+
"""
210+
Send kernel status awareness messages to all yrooms
211+
"""
212+
for yroom in self._yrooms:
213+
awareness = yroom.get_awareness()
214+
if awareness is None:
215+
self.log.error(f"awareness cannot be None. room_id: {yroom.room_id}")
216+
continue
217+
self.log.debug(f"current state: {awareness.get_local_state()} room_id: {yroom.room_id}. kernel status: {kernel_status}")
218+
awareness.set_local_state_field("kernel", kernel_status)
219+
self.log.debug(f"current state: {awareness.get_local_state()} room_id: {yroom.room_id}")
220+
221+
226222
async def add_yroom(self, yroom: YRoom):
227223
"""
228224
Register a YRoom with this kernel client. YRooms will

jupyter_rtc_core/kernels/kernel_manager.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ def set_state(
107107

108108
if broadcast:
109109
# Broadcast this state change to all listeners
110-
# Turn off state broadcasting temporarily to avoid
111110
self._state_observers = None
112111
self.broadcast_state()
113112

@@ -202,4 +201,14 @@ def execution_state_listener(self, channel_name: str, msg: list[bytes]):
202201
if parent_channel and parent_channel == "shell":
203202
# Don't broadcast, since this message is already going out.
204203
self.set_state(LifecycleStates.CONNECTED, ExecutionStates(execution_state), broadcast=False)
204+
205+
kernel_status = {
206+
"execution_state": self.execution_state,
207+
"lifecycle_state": self.lifecycle_state
208+
}
209+
self.log.debug(f"Sending kernel status awareness {kernel_status}")
210+
self.main_client.send_kernel_awareness(kernel_status)
211+
self.log.debug(f"Sent kernel status awareness {kernel_status}")
212+
213+
205214

jupyter_rtc_core/session_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
class YDocSessionManager(SessionManager):
12-
"""A Jupyter Server Session Manager that's connects YDocuments
12+
"""A Jupyter Server Session Manager that connects YDocuments
1313
to Kernel Clients.
1414
"""
1515

0 commit comments

Comments
 (0)