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 ):
|
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':
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue