async def add_shared_ctx(request, **rv): # add ctx vars needed to support fancy Vue.js stuff on logged-in pages ses = await get_session(request) rv.update(dict( ws_url = '/websocket/' + ses.get('ws_token'), STATUS=STATUS.as_dict(), )) rv['CUR_PAGE'] = '/' + request.path.split('/')[-1] return rv
async def push_status_updates_handler(ws): # block for a bit, and then send display updates (and all other system status changes) # - there is no need for immediate update because when we rendered the HTML on page # load, we put in current values. await asyncio.sleep(0.250) last = None while 1: # get latest state now = STATUS.as_dict() if last != now: # it has changed, so send it. await ws.send_str(json_dumps(dict(vue_app_cb=dict(update_status=now)))) last = now # wait until next update, or X seconds max (for keep alive/just in case) try: await asyncio.wait_for(STATUS._update_event.wait(), 120) except asyncio.TimeoutError: # force an update last = None