Documentation
¶
Overview ¶
Package comms implement the back-end (kernel) protocol over "Custom Messages" used to communicate with the front-end.
This is the counter-part to the `websocket` package, which implements (in javascript) the front-end side.
See documentation in `gonb/docs/FrontEndCommunication.md` with a diagram and description of what is going on.
Index ¶
- Constants
- type State
- func (s *State) Close(msg kernel.Message) error
- func (s *State) HandleMsg(msg kernel.Message) (err error)
- func (s *State) HandleOpen(msg kernel.Message) (err error)
- func (s *State) InstallWebSocket(msg kernel.Message) error
- func (s *State) ProgramFinished()
- func (s *State) ProgramReadValueRequest(address string)
- func (s *State) ProgramSendValueRequest(address string, value any)
- func (s *State) ProgramStart(exec *jpyexec.Executor)
- func (s *State) ProgramSubscribeRequest(address string)
- func (s *State) ProgramUnsubscribeRequest(address string)
- func (s *State) Send(msg kernel.Message, address string, value any) error
- func (s *State) SendHeartbeatAndWait(msg kernel.Message, timeout time.Duration) (heartbeat bool, err error)
Constants ¶
const ( // CommOpenAckAddress is messaged in acknowledgement to a "comm_open" message. CommOpenAckAddress = "#comm_open_ack" // HeartbeatPingAddress is a protocol private message address used as heartbeat request. HeartbeatPingAddress = "#heartbeat/ping" // HeartbeatPongAddress is a protocol private message address used as heartbeat reply. HeartbeatPongAddress = "#heartbeat/pong" )
const ( HeartbeatTimeout = 500 * time.Millisecond HeartbeatRequestThreshold = 1 * time.Second WaitForConnectionTimeout = 3 * time.Second )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type State ¶
type State struct { // IsWebSocketInstalled indicates if the Javascript that runs a WebSocket that connects to JupyterServer // (and through that to GoNB) is installed in the front-end. // This is required for widgets to work: that's how they exchange update information. // Notice that having it installed doesn't mean yet the connection was established back -- that's what happens // usually, but it may take some cycles (or fail for any reason). IsWebSocketInstalled bool // TransientDisplayId is where javascript code was installed as a transient "display data". // It is randomly created when the websocket is installed. // The "transient" cell itself can be cleared after connection is established, to make sure the javascript // code is not saved. TransientDisplayId string // Opened indicates whether "comm_open" message has already been received. Opened bool // CommId created when the channel is opened from the front-end. CommId string // LastMsgTime is used to condition the need of a heartbeat, to access if the connection is still alive. LastMsgTime time.Time // HeartbeatPongLatch is triggered when we receive a heartbeat reply ("pong"), or when it times out. // A true value means it got the heartbeat, false means it didn't. // It is recreated everytime a HeartbeatPing is sent. HeartbeatPongLatch *common.LatchWithValue[bool] // AddressSubscriptions by the program being executed. Needs to be reset at every program // execution. AddressSubscriptions common.Set[string] // ProgramExecutor is a reference to the executor of the user's program (current cell). // It is used to dispatch comms coming from the front-end to the program. // This is set at the start of every cell execution, and reset to nil when the execution finishes. ProgramExecutor *jpyexec.Executor // ProgramExecMsg is the kernel.Message used to start the program. // This is set at the start of every cell execution, and reset to nil when the execution finishes. ProgramExecMsg kernel.Message // LogWebsocket controls whether to turn verbose logging (on the Javascript console) of the // WebSocket Javascript library, when it is installed. LogWebSocket bool // contains filtered or unexported fields }
State for comms protocol. There is a singleton for the kernel, owned by goexec.State.
func (*State) Close ¶
Close connection with front-end. If `msg != nil`, It sends a "comm_close" message.
func (*State) HandleMsg ¶
HandleMsg is called by the dispatcher whenever a new `comm_msg` arrives from the front-end. It filters out messages with the wrong `comm_id`, handles protocol messages (heartbeat) and routes other messages.
func (*State) HandleOpen ¶
HandleOpen message, with `msg_type` set to "comm_open".
If message is incomplete, or apparently not addressed to us, it returns nil (no error) but also doesn't set communications as opened.
func (*State) InstallWebSocket ¶
InstallWebSocket in the front-end, if not already installed. In the browser this is materialized as a global `gonb_comm` object, that handles communication.
If it is supposedly installed, but there has been no communication > `HeartbeatRequestThreshold` (~ 1 second), it probes with a heartbeat "ping" to check.
To install it sends a javascript is output as a transient output, so it's not saved.
If it has already been installed, this does nothing.
func (*State) ProgramFinished ¶
func (s *State) ProgramFinished()
ProgramFinished is called when the program (cell execution) finishes.
func (*State) ProgramReadValueRequest ¶
ProgramReadValueRequest handler, it implements jpyexec.CommsHandler. It sends a message with a request to read the value from the address to the front-end.
This only works if there is a `SyncedVariable` or something similar listening to the address on the front-end.
It also tries to install the WebSocket, if not yet installed.
func (*State) ProgramSendValueRequest ¶
ProgramSendValueRequest handler, it implements jpyexec.CommsHandler. It sends a value to the front-end.
It also tries to install the WebSocket, if not yet installed.
func (*State) ProgramStart ¶
ProgramStart is called each time a program is being executed (the contents of a cell), which is configured to use named pipes (for front-end communication/widgets).
func (*State) ProgramSubscribeRequest ¶
ProgramSubscribeRequest handler, it implements jpyexec.CommsHandler. It subscribes the program to receive updates on the given address.
It also tries to install the WebSocket, if not yet installed.
func (*State) ProgramUnsubscribeRequest ¶
ProgramUnsubscribeRequest handler, it implements jpyexec.CommsHandler. It unsubscribes the program to receive updates on the given address.
It also tries to install the WebSocket, if not yet installed.
func (*State) Send ¶
Send value to the given address in the front-end. This, along with subscribe, is the basic communication operation with the front-end. The value will be converted to JSON before being sent.
func (*State) SendHeartbeatAndWait ¶
func (s *State) SendHeartbeatAndWait(msg kernel.Message, timeout time.Duration) (heartbeat bool, err error)
SendHeartbeatAndWait sends a heartbeat request (ping) and waits for a reply within the given timeout. Returns true if a heartbeat was replied (pong) back, or false if it timed out. It returns an error if it failed to sendData the heartbeat message.