import logging import json from flask import request, Blueprint, abort, Response from flask_login import current_user from app import userevents from auth.decorators import require_session_login from data.userevent import CannotReadUserEventsException logger = logging.getLogger(__name__) realtime = Blueprint('realtime', __name__) @realtime.route("/user/") @require_session_login def index(): debug_template = """ <html> <head> </head> <body> <h1>Server sent events</h1> <div id="event"></div> <script type="text/javascript"> var eventOutputContainer = document.getElementById("event"); var evtSrc = new EventSource("/realtime/user/subscribe?events=docker-cli"); evtSrc.onmessage = function(e) { console.log(e.data); eventOutputContainer.innerHTML = e.data; }; </script> </body> </html> """ return(debug_template) @realtime.route("/user/test") @require_session_login def user_test(): evt = userevents.get_event(current_user.db_user().username) evt.publish_event_data('test', {'foo': 2}) return 'OK' @realtime.route("/user/subscribe") @require_session_login def user_subscribe(): def wrapper(listener): yield 'data: %s\n\n' % json.dumps({}) for event_id, data in listener.event_stream(): message = {'event': event_id, 'data': data} json_string = json.dumps(message) yield 'data: %s\n\n' % json_string events = request.args.get('events', '').split(',') if not events: abort(404) try: listener = userevents.get_listener(current_user.db_user().username, events) except CannotReadUserEventsException: abort(504) return Response(wrapper(listener), mimetype="text/event-stream")