From adaf801d6e3e2995d9decc63180bbb6f417164e8 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Mon, 29 Nov 2021 23:36:27 -0800 Subject: [PATCH] Stream query results as they become available --- lib/ui/api.ts | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/ui/api.ts b/lib/ui/api.ts index b6366be..7c2efaa 100644 --- a/lib/ui/api.ts +++ b/lib/ui/api.ts @@ -221,12 +221,16 @@ for (const [resource, flags] of Object.entries(resources)) { let c = 0; ctx.body.write("[\n"); - await db.query(resource, filter, options, (obj) => { + db.query(resource, filter, options, (obj) => { ctx.body.write((c++ ? "," : "") + JSON.stringify(obj) + "\n"); - }); - ctx.body.end("]"); - - logger.accessInfo(log); + }) + .then(() => { + ctx.body.end("]"); + logger.accessInfo(log); + }) + .catch((err) => { + ctx.body.emit("error", err); + }); }); // CSV download @@ -285,7 +289,7 @@ for (const [resource, flags] of Object.entries(resources)) { ctx.body.write( Object.keys(columns).map((k) => `"${k.replace(/"/, '""')}"`) + "\n" ); - await db.query(resource, filter, options, (obj) => { + db.query(resource, filter, options, (obj) => { const arr = Object.values(columns).map((exp) => { const v = evaluate(exp, obj, null, (e) => { if (Array.isArray(e)) { @@ -327,10 +331,14 @@ for (const [resource, flags] of Object.entries(resources)) { return v; }); ctx.body.write(arr.join(",") + "\n"); - }); - ctx.body.end(); - - logger.accessInfo(log); + }) + .then(() => { + ctx.body.end(); + logger.accessInfo(log); + }) + .catch((err) => { + ctx.body.emit("error", err); + }); }); router.head(`/${resource}/:id`, async (ctx) => {