This repository has been archived on 2020-03-24. You can view files and clone it, but cannot push or open issues or pull requests.
quay/endpoints/realtime.py

84 lines
2.0 KiB
Python

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):
logger.debug('Beginning streaming of user events')
try:
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
finally:
logger.debug('Closing listener due to exception')
listener.stop()
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)
def on_close():
logger.debug('Closing listener due to response close')
listener.stop()
r = Response(wrapper(listener), mimetype="text/event-stream")
r.call_on_close(on_close)
return r