Skip to content

Commit ed239fb

Browse files
committed
Remove socket.io dependency and use http server sent events instead
Signed-off-by: Thomas Schmid <tom@binary-kitchen.de>
1 parent f1c267d commit ed239fb

File tree

4 files changed

+59
-45
lines changed

4 files changed

+59
-45
lines changed

arch/PKGBUILD

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ depends=('python3'
1616
'mosquitto'
1717
'mpg123'
1818
'python-flask-wtf'
19-
'python-flask-socketio'
2019
'python-paho-mqtt'
2120
'chromium'
2221
'xf86-video-fbdev'

pydoorlock/WebApp.py

+50-24
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
Doorlockd -- Binary Kitchen's smart door opener
33
4-
Copyright (c) Binary Kitchen e.V., 2018
4+
Copyright (c) Binary Kitchen e.V., 2020
55
66
Author:
77
Ralf Ramsauer <ralf@binary-kitchen.de>
@@ -16,9 +16,10 @@
1616
"""
1717

1818
import logging
19+
import json
20+
import threading
1921

20-
from flask import abort, Flask, jsonify, render_template, request
21-
from flask_socketio import SocketIO
22+
from flask import abort, Flask, jsonify, render_template, request, Response
2223
from flask_wtf import FlaskForm
2324
from wtforms import PasswordField, StringField, SubmitField
2425
from wtforms.validators import DataRequired, Length
@@ -28,19 +29,41 @@
2829
from .Authenticator import AuthMethod
2930

3031
log = logging.getLogger()
31-
3232
webapp = Flask(__name__)
33-
socketio = SocketIO(webapp, async_mode='threading')
33+
evt = threading.Event()
34+
json_push_state = ""
3435

3536

3637
def emit_doorstate(response=None):
37-
state = logic.state
38+
global json_push_state
39+
3840
if response:
3941
message = str(response)
4042
else:
41-
message = str(state)
42-
socketio.emit('status', {'led': state.to_img(), 'message': message})
43-
43+
message = str(logic.state)
44+
45+
json_push_state = json.dumps({
46+
'message' : message,
47+
'img' : logic.state.to_img()})
48+
49+
#Notify push clients
50+
evt.set()
51+
evt.clear()
52+
53+
def event_str():
54+
return "data: {}\n\n".format(json_push_state)
55+
56+
def push_state():
57+
def event_str():
58+
return "data: {}\n\n".format(json_push_state)
59+
60+
try:
61+
yield event_str()
62+
while True:
63+
evt.wait()
64+
yield event_str()
65+
except GeneratorExit:
66+
return
4467

4568
class AuthenticationForm(FlaskForm):
4669
username = StringField('Username', [Length(min=3, max=25)])
@@ -64,33 +87,34 @@ def validate(self):
6487

6588
return True
6689

67-
68-
@socketio.on('request_status')
69-
@socketio.on('connect')
70-
def on_connect():
71-
emit_doorstate()
72-
73-
7490
@webapp.route('/display')
7591
def display():
7692
return render_template('display.html',
7793
room=room,
7894
title=title,
7995
welcome=welcome)
8096

97+
@webapp.route('/push')
98+
def push():
99+
emit_doorstate()
100+
resp = Response(push_state(),mimetype="text/event-stream")
101+
resp.headers['X-Accel-Buffering'] = 'no'
102+
resp.headers['Cache-Control'] = 'no-cache'
103+
return resp
104+
81105

82106
@webapp.route('/api', methods=['POST'])
83107
def api():
84108
def json_response(response, msg=None):
85-
json = dict()
86-
json['err'] = response.value
87-
json['msg'] = str(response) if msg is None else msg
109+
json_dict = dict()
110+
json_dict['err'] = response.value
111+
json_dict['msg'] = str(response) if msg is None else msg
88112
if response == DoorlockResponse.Success or \
89113
response == DoorlockResponse.AlreadyActive:
90114
# TBD: Remove 'open'. No more users. Still used in App Version 2.1.1!
91-
json['open'] = logic.state.is_open()
92-
json['status'] = logic.state.value
93-
return jsonify(json)
115+
json_dict['open'] = logic.state.is_open()
116+
json_dict['status'] = logic.state.value
117+
return jsonify(json_dict)
94118

95119
user = request.form.get('user')
96120
password = request.form.get('pass')
@@ -137,6 +161,7 @@ def home():
137161
desired_state = authentication_form.desired_state
138162
log.info(' desired state: %s' % desired_state)
139163
log.info(' current state: %s' % logic.state)
164+
140165
response = logic.request(desired_state, credentials)
141166
log.info(' response: %s' % response)
142167

@@ -154,7 +179,7 @@ def home():
154179
def webapp_run(cfg, my_logic, status, version, template_folder, static_folder):
155180
global logic
156181
logic = my_logic
157-
182+
158183
debug = cfg.boolean('DEBUG')
159184

160185
host = 'localhost'
@@ -176,4 +201,5 @@ def webapp_run(cfg, my_logic, status, version, template_folder, static_folder):
176201
webapp.config['SECRET_KEY'] = cfg.str('SECRET_KEY')
177202
webapp.template_folder = template_folder
178203
webapp.static_folder = static_folder
179-
socketio.run(webapp, host=host, port=8080, use_reloader=False, debug=debug)
204+
webapp.debug = debug
205+
webapp.run(host = host, port = 8080)

share/doorlockd/static/socket.io.slim.js

-3
This file was deleted.

share/doorlockd/templates/display.html

+9-17
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,18 @@
1010
{{ super() }}
1111
<script src="/static/js/jquery.min.js"></script>
1212
<script src="/static/js/bootstrap.min.js"></script>
13-
<script type="text/javascript" src="static/socket.io.slim.js"></script>
1413
<script type="text/javascript" charset="utf-8">
1514
$(document).ready(function() {
16-
function request_status() {
17-
socket.emit('request_status');
18-
}
19-
20-
var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port);
21-
var timer = setInterval(request_status, 120000);
22-
23-
socket.on('connect', function() {
24-
socket.emit('connected');
25-
});
26-
socket.on('status', function(status) {
27-
$('#led').attr('src', status.led);
28-
$('#message').html(status.message);
29-
clearInterval(timer);
30-
timer = setInterval(request_status, 120000);
15+
var source = new EventSource('{{ url_for('push')}}');
16+
source.onmessage = function(event){
17+
console.log("event:" + event.data);
18+
try{
19+
var data = JSON.parse(event.data);
20+
$('#message').html(data.message);
21+
led = $('#led');
22+
led.attr('src', data.img);
23+
} catch(e){console.log(e);}}
3124
});
32-
});
3325
</script>
3426
{% endblock %}
3527

0 commit comments

Comments
 (0)