[fix] send home initial data in streaming to avoid killing firefox

This commit is contained in:
Laurent Peuch 2019-06-22 06:41:07 +02:00
parent b2efcc03c5
commit 2523a1f140
2 changed files with 22 additions and 3 deletions

21
run.py
View file

@ -525,6 +525,12 @@ def clean_websocket(function):
return _wrap
def chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in range(0, len(l), n):
yield l[i:i + n]
@app.websocket('/index-ws')
@clean_websocket
async def ws_index(request, websocket):
@ -549,13 +555,22 @@ async def ws_index(request, websocket):
.join(subquery, on=(Job.id == subquery.c.min_id))\
.order_by(-Job.id)
# chunks initial data by batch of 30 to avoid killing firefox
data = chunks(list(itertools.chain(map(model_to_dict, next_scheduled_jobs),
map(model_to_dict, Job.select().where(Job.state == "running")),
map(model_to_dict, latest_done_jobs))), 30)
await websocket.send(ujson.dumps({
"action": "init_jobs",
"data": itertools.chain(map(model_to_dict, next_scheduled_jobs),
map(model_to_dict, Job.select().where(Job.state == "running")),
map(model_to_dict, latest_done_jobs)),
"data": next(data), # send first chunk
}))
for chunk in data:
await websocket.send(ujson.dumps({
"action": "init_jobs_stream",
"data": chunk,
}))
await websocket.wait_closed()

View file

@ -64,6 +64,10 @@
if (action == "init_jobs") {
app.jobs = data;
Vue.set(app, 'inited', true);
// when there is too much initial data, it's streamed to avoid a
// bug in firefox that make the whole browser crash
} else if (action == "init_jobs_stream") {
Vue.set(app, 'jobs', app.jobs.concat(data))
} else if (action == "update_job") {
for (var i = 0; i < app.jobs.length; ++i) {
if (app.jobs[i].id == data.id) {