Webserver

This is an extensible webserver implemented using Flask and websockets that allows agents to serve frontend HTML pages, along with bi-directional messaging using websockets, including custom message types specific to each application.

Server API

class WebServer(web_host='0.0.0.0', web_port=8050, ws_port=49000, ssl_cert=None, ssl_key=None, root=None, index='index.html', mounts={'/tmp/uploads': '/uploads'}, msg_callback=None, web_trace=False, **kwargs)[source]

Bases: object

MESSAGE_JSON = 0

JSON websocket message (dict)

MESSAGE_TEXT = 1

Text websocket message (str)

MESSAGE_BINARY = 2

Binary websocket message (bytes)

MESSAGE_FILE = 3

File upload from client (bytes)

MESSAGE_AUDIO = 4

Audio samples (bytes, int16)

MESSAGE_IMAGE = 5

Image message (PIL.Image)

__init__(web_host='0.0.0.0', web_port=8050, ws_port=49000, ssl_cert=None, ssl_key=None, root=None, index='index.html', mounts={'/tmp/uploads': '/uploads'}, msg_callback=None, web_trace=False, **kwargs)[source]

Create HTTP/HTTPS Flask webserver with websocket messaging.

Use this by either creating an instance and providing msg_callback, or inherit from it and implement on_message() in a subclass. You can also add Flask routes to Webserver.app before start() is called.

Parameters:
  • web_host (str) – network interface to bind to (0.0.0.0 for all)

  • web_port (int) – port to serve HTTP/HTTPS webpages on

  • ws_port (int) – port to use for websocket communication

  • ssl_cert (str) – path to PEM-encoded SSL/TLS cert file for enabling HTTPS

  • ssl_key (str) – path to PEM-encoded SSL/TLS cert key for enabling HTTPS

  • root (str) – the root directory for serving site files (should have static/ and template/)

  • index (str) – the name of the site’s index page (should be under web/templates)

  • upload_dir (str) – the path to save files uploaded from client (or None to disable uploads)

  • msg_callback (callable) – websocket message handler (see WebServer.on_message() for signature)

  • web_trace (bool) – if true, additional debug messages will be printed when –log-level=debug

The kwargs are passed as variables to the Jinja render_template() used in the index file.

start()[source]

Call this to start the webserver listening for new connections. It will start new worker threads and then return control to the user.

add_message_handler(callback)[source]

Register a message handler that will be called when new websocket messages are recieved.

on_message(payload, payload_size=None, msg_type=0, msg_id=None, metadata=None, timestamp=None, path=None, **kwargs)[source]

Handler for recieved websocket messages. Implement this in a subclass to process messages, otherwise msg_callback needs to be provided during initialization.

Parameters:
  • payload (dict|str|bytes) – If this is a JSON message, will be a dict. If this is a text message, will be a string. If this is a binary message, will be a bytes array.

  • payload_size (int) – size of the payload (in bytes)

  • msg_type (int) – MESSAGE_JSON (0), MESSAGE_TEXT (1), MESSAGE_BINARY (2)

  • msg_id (int) – the monotonically-increasing message ID number

  • metadata (str) – message-specific string or other data

  • timestamp (int) – time that the message was sent

  • path (str) – if this is a file or image upload, the file path on the server

send_message(payload, type=None, timestamp=None)[source]

Send a websocket message to client.