Skill: WebSocket Flow & API Endpoints
When to Use
Use this skill when adding new real-time WebSocket commands or HTTP API endpoints to Visdom.
Adding a New WebSocket Command
Socket handler (
py/visdom/server/handlers/socket_handlers.py):- Add
elif cmd == "my_command":inAnySocketHandlerOrWrapper.on_message() - Use
broadcast()to push updates to subscribers - Use
send_to_sources()to push events to Python clients
- Add
Frontend (
js/api/ApiProvider.js):- Add a
sendMyCommandfunction that callssendSocketMessage({cmd: 'my_command', ...}) - Export it via the
ApiContext.Providervalue
- Add a
Message handling (
js/api/ApiProvider.js):- Add a
case 'my_response':inhandleMessage()switch statement
- Add a
Adding a New API Endpoint
Handler (
py/visdom/server/handlers/web_handlers.py):- Create a new handler class extending
BaseHandler - Implement
initialize(self, app)copying required app attributes - Implement
post()with@check_authdecorator
- Create a new handler class extending
Route (
py/visdom/server/app.py):- Add the route in
Application.__init__()(lines 97-116) - Pattern:
(r"%s/my_endpoint" % self.base_url, MyHandler, {"app": self}) - Place before the catch-all
IndexHandlerroute
- Add the route in
Client (
py/visdom/__init__.py):- Add a method calling
self._send(msg, endpoint="my_endpoint")
- Add a method calling
Guardrails
- Every socket feature must work in both WebSocket and polling modes
- All handlers must use
@check_authdecorator - Copy required app attributes in
initialize()— do not useself.app - Test both
functional-testandfunctional-test-pollingCI jobs
Documentation
- Skill reference
py/visdom/server/app.pypy/visdom/server/handlers/socket_handlers.pypy/visdom/server/handlers/web_handlers.pyjs/api/ApiProvider.jsAGENTS.mdCONTRIBUTING.md
Assets
- See
assets/README.mdand store templates/resources inassets/.
Tests
- Follow the default flow in
references/TESTS.md.