code: def _handle_message(self, change):
      from vegafusion.runtime import runtime
  
      change_new = change["new"]
      if change_new is not None:
          msg_bytes = change["new"]
          start = time.time()
          self._log("Received request")
  
          # Build response
          response_bytes = runtime.process_request_bytes(msg_bytes)
  
          message_len = len(response_bytes)
          self._response_msg = response_bytes
  
          duration = (time.time() - start) * 1000
          self._log(
              f"Sent response in {duration:.1f}ms ({message_len} bytes)"
          )
  
          # Clean up temporary tables
          if runtime._connection is not None:
              runtime._connection.unregister_temporary_tables()
  
file_path: vegafusion/python/vegafusion-jupyter/vegafusion_jupyter/widget.py
imports: from ipywidgets import DOMWidget
  from traitlets import Unicode, Bool, Float, CBytes, observe
  import time
  import logging
  from ._frontend import module_name, module_version
  import altair
  import json
label_desc: Use image node_id 3 for calling the VegaFusionWidget obj's underlying member method code with example usage: obj._handle_message(change) without return types