Using WebSockets in Dallinger Experiments

Dallinger provides some helpers to facilitate realtime communication between participants and the experiment using the WebSocket protocol.

The integration consists of a web API route GET /chat?channel=<channel> (see The Web API) to open a WebSocket connection with a “subscription” to messages on a specific “channel”.

Additionally, Experiment classes can implement a channel attribute which will subscribe the experiment class to a the named channel. Such experiments should implement a receive_message() method to receive and process any messages on the specified channel as well as the control channel named “dallinger_control”. This function will be called asynchronously by a worker when the message contains JSON data that includes a sender or participant_id property containing the sender’s Participant id or a node_id containing a Node id.

Experiments may also send messages to clients subscribed to a channel using the publish_to_subscribers() method.

If you would like your experiment class to receive messages published on additional WebSocket channels, you will need to subscribe to them in your Experiment class’s on_launch() method. For example

def on_launch(self):
    from dallinger.experiment_server.sockets import chat_backend
    chat_backend.subscribe(self, 'my_secondary_channel')