How to return event$data in rstudio/websocket

171 Views Asked by At

I am trying to extend websocket::Websocket with a method that sends some data and returns the message, so that I can assign it to an object. My question is pretty much identical to https://community.rstudio.com/t/capture-streaming-json-over-websocket/16986. Unfortunately, the user there never revealed how they solved it themselves. My idea was to have the onMessage method return the event$data, i.e. something like:

my_websocket <- R6::R6Class("My websocket",
                             inherit = websocket::WebSocket,
                             public = list(
                               foo = function(x) {
                                 msg <- super$send(paste("x"))
                                 return(msg)
                               }                         )
)
load_websocket <- function(){
  ws <- my_websocket$new("ws://foo.local")
  ws$onMessage(function(event) {
    return(event$data)
  })
  return(ws)
}

my_ws <- load_websocket()
my_ws$foo("hello") # returns NULL

but after spending a good hour on the Websocket source code, I am still completely in the dark as to where exactly the callback happens, "R environment wise".

1

There are 1 best solutions below

0
On

You need to use super assignment operator <<-. <<- is most useful in conjunction with closures to maintain state. Unlike the usual single arrow assignment (<-) that always works on the current level, the double arrow operator can modify variables in parent levels.

my_websocket <- R6::R6Class("My websocket",
                             inherit = websocket::WebSocket,
                             public = list(
                               foo = function(x) {
                                 msg <<- super$send(paste("x"))
                                 return(msg)
                               }                         )
)
load_websocket <- function(){
  ws <- my_websocket$new("ws://foo.local")
  ws$onMessage(function(event) {
    return(event$data)
  })
  return(ws)
}

my_ws <- load_websocket()
my_ws$foo("hello")