Clean up, add status, add html
This commit is contained in:
parent
7f843b4ecd
commit
f6fff37b98
|
|
@ -146,29 +146,29 @@ class SseStream():
|
|||
if not self.__queues.get( id ):
|
||||
self._queue = queue.Queue( self.__queue_size )
|
||||
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):
|
||||
""" Deregister client from queue - clean up """
|
||||
try:
|
||||
del self.__queues[ self._id ]
|
||||
print( f"Stream object {self._id} is deleted")
|
||||
except KeyError:
|
||||
print( f"Stream object {self._id} not found")
|
||||
pass
|
||||
|
||||
def __iter__(self):
|
||||
while True:
|
||||
msg = self._queue.get(block=True, timeout=None)
|
||||
print(msg)
|
||||
if isinstance( msg, Sse ):
|
||||
for data in msg:
|
||||
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():
|
||||
SseStream.setMaxConnections(5)
|
||||
|
|
@ -182,7 +182,7 @@ def main():
|
|||
import time
|
||||
while True:
|
||||
counter += 1
|
||||
time.sleep(5)
|
||||
time.sleep(0.75)
|
||||
SseStream.addMessage("Ping", str(time.time()), id = counter)
|
||||
|
||||
t = threading.Thread( target=filler )
|
||||
|
|
@ -192,9 +192,62 @@ def main():
|
|||
app = Flask(__name__)
|
||||
app.debug = True
|
||||
|
||||
import json
|
||||
@app.route('/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'))
|
||||
def index():
|
||||
if request.method == 'POST':
|
||||
|
|
|
|||
Loading…
Reference in New Issue