Clean up, add status, add html

This commit is contained in:
Markus Bauer 2023-03-28 11:39:53 +02:00
parent 7f843b4ecd
commit f6fff37b98
1 changed files with 63 additions and 10 deletions

View File

@ -146,29 +146,29 @@ class SseStream():
if not self.__queues.get( id ): if not self.__queues.get( id ):
self._queue = queue.Queue( self.__queue_size ) self._queue = queue.Queue( self.__queue_size )
self.__queues[ id ] = self._queue self.__queues[ id ] = self._queue
print( self.__queues )
print(f"Queue size: {self.__queue_size}; Connections: { len( self.__queues ) }/{self.__maxConnections}; ID: {id}")
print()
print()
def __del__(self): def __del__(self):
""" Deregister client from queue - clean up """ """ Deregister client from queue - clean up """
try: try:
del self.__queues[ self._id ] del self.__queues[ self._id ]
print( f"Stream object {self._id} is deleted")
except KeyError: except KeyError:
print( f"Stream object {self._id} not found")
pass pass
def __iter__(self): def __iter__(self):
while True: while True:
msg = self._queue.get(block=True, timeout=None) msg = self._queue.get(block=True, timeout=None)
print(msg)
if isinstance( msg, Sse ): if isinstance( msg, Sse ):
for data in msg: for data in msg:
yield data.encode('utf-8') yield data.encode('utf-8')
def getStatus(self):
status = {}
status['currentConnections'] = len( self.__queues )
status['maxConnections'] = self.__maxConnections
status['id'] = str(self._id)
return status
def main(): def main():
SseStream.setMaxConnections(5) SseStream.setMaxConnections(5)
@ -182,7 +182,7 @@ def main():
import time import time
while True: while True:
counter += 1 counter += 1
time.sleep(5) time.sleep(0.75)
SseStream.addMessage("Ping", str(time.time()), id = counter) SseStream.addMessage("Ping", str(time.time()), id = counter)
t = threading.Thread( target=filler ) t = threading.Thread( target=filler )
@ -192,9 +192,62 @@ def main():
app = Flask(__name__) app = Flask(__name__)
app.debug = True app.debug = True
import json
@app.route('/stream') @app.route('/stream')
def stream(): def stream():
return current_app.response_class( SseStream(uuid.uuid4()), mimetype='text/event-stream' ) if request.accept_mimetypes['text/event-stream'] == 1:
stream = SseStream(uuid.uuid4())
SseStream.addMessage("Status", json.dumps( stream.getStatus() ) )
return current_app.response_class( stream, mimetype='text/event-stream' )
else:
return '''
<script>
function timeout(){
const btn = document.getElementById('online');
btn.style.backgroundColor = 'Red';
btn.textContent = 'Offline';
}
const eventSource = new EventSource('/stream');
var wd = window.setTimeout(timeout,1000);
eventSource.addEventListener("Message", (event) => {
const newElement = document.createElement("li");
const eventList = document.getElementById("list");
console.log( event )
newElement.textContent = `message: ${event.data}`;
eventList.appendChild(newElement);
});
eventSource.addEventListener("Status", (event) => {
console.log(event.data)
const data = JSON.parse( event.data )
console.log( data )
const clients = document.getElementById("clients");
clients.textContent = `${data.currentConnections}/${data.maxConnections}`
const id = document.getElementById("id");
id.textContent = `${data.id}`
});
eventSource.addEventListener("Ping", (event) => {
const btn = document.getElementById('online')
btn.style.backgroundColor = 'Green';
btn.textContent = 'Online';
clearTimeout(wd);
wd = window.setTimeout(timeout,1000);
});
</script>
<html>
<h1>Messages</h1>
<div>
<h3>Status</h3>
<div>Connection <button id="online"></div>
<div>Clients: <span id="clients"></div>
<div>ID: <span id='id'></div>
</div>
<div><p>Below a list of messages </p></div>
<div><ul id="list"></ul></div>
</html>
'''
@app.route('/', methods=('GET', 'POST')) @app.route('/', methods=('GET', 'POST'))
def index(): def index():
if request.method == 'POST': if request.method == 'POST':