<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Hi everyone,<br>
<br>
I want to start a discussion on
<a class="moz-txt-link-freetext" href="https://github.com/kimchi-project/wok/issues/16">https://github.com/kimchi-project/wok/issues/16</a>,<br>
"<span class="js-issue-title" style="box-sizing: border-box;">Asynchronous
event notification".<br>
<br>
As most of you are aware, WoK does not have any sort of push
notification. WoK<br>
UI works based on a polling strategy using the Notifications API
to fetch for any<br>
backend notifications. This polling is on a 3 second interval to
not overload the server<br>
with these requests. The problems with this approach are obvious:
the cost of<br>
the polling process for both UI and backend, the interval for a
backend event to be<br>
delivered to the UI and so forth.<br>
<br>
- The idea<br>
<br>
This work aims to implement an asynchronous strategy to deliver
server to client<br>
messages. The idea is to use websockets* to establish a socket
connection between<br>
the UI and the backend. The backend can send any message using
this socket and<br>
the UI, after receiving it, can act upon immediately.<br>
<br>
<br>
- Push server implementation<br>
<br>
This socket in the backend side would act as a 'push server' that
will receive the<br>
connections and push the same messages to all of them. Only server
to client<br>
messages will be sent. <br>
<br>
This push server can be implemented in two ways:<br>
<br>
* from scratch<br>
<br>
* using an external library<br>
<br>
One library that seems to do this asynchronous socket
implementation is tornado<br>
( <a class="moz-txt-link-freetext" href="https://github.com/tornadoweb/tornado">https://github.com/tornadoweb/tornado</a> ). It is present in all
distros we support<br>
and it has Apache 2.0 licensing. I'll experiment with it and see
if it helps. I am<br>
opened to any other suggestion of libraries that can be used in
the push server<br>
implementation. If no library is good enough for us, I'll have to
implement it from<br>
scratch.<br>
<br>
<br>
- WoK backend design<br>
<br>
In WoK backend, my idea is to reuse the 'add_notification' method
from the<br>
existing Notifications API. When adding a notification, fire a
message to the<br>
push server and notify all the listeners too.<br>
<br>
This approach has the following advantages:<br>
<br>
- it will work out of the box for all backend messages in all
plug-ins that<br>
uses the 'add_notification' method;<br>
<br>
- we can re-use the same JSON message format of the Notifications
API,<br>
reducing the amount of UI work we'll have to adapt the existing
UIs;<br>
<br>
- it will be harmless to implement. Given that the push server
will send<br>
messages to all connected UI endpoints, if no endpoint is connect<br>
no message will be sent.<br>
<br>
<br>
- WoK frontend design<br>
<br>
For any tab that wants to receive the push notifications, just
connect<br>
to the push server via websocket and react to the messages sent -
just<br>
like it is done today with the notifications API but without the
need of<br>
sending the GET /notifications messages.<br>
<br>
We will need to be careful to not open unnecessary websockets when<br>
tab switching. We will need to pay attention to closing up the
connections<br>
we don't need anymore.<br>
<br>
I am planning to do a proof of concept of an UI working with this
new<br>
push server notifications in the 'User Log' tab, together with
this backend<br>
work. When a new log entry is created, a push notification is sent
and the<br>
UI would refresh automatically. This implementation would be used
as a base<br>
for the other tabs/plug-ins.<br>
<br>
<br>
Let me know what you think!<br>
<br>
<br>
Daniel<br>
<br>
<br>
PS: for the record, before deciding to use websockets I've
considered using SSE<br>
(Server-side Events), a HTML5 standard, but gave up due to lack of
SSE support<br>
from Microsoft browsers.<br>
</span>
</body>
</html>