Better chunked-encoding implementation

This commit is contained in:
Zaid Abdulla committed 2018-12-27 01:21:18 -08:00
1 parent 16c8871102
commit 46c1781816
1 file changed
+9 -43
+9 -43
View File
@@ -1,6 +1,6 @@
"use strict"; "use strict";
const zlib = require("zlib"); const stream = require("stream");
const Router = require("koa-router"); const Router = require("koa-router");
const db = require("./db"); const db = require("./db");
const apiFunctions = require("./api-functions"); const apiFunctions = require("./api-functions");
@@ -109,32 +109,15 @@ for (const [resource, flags] of Object.entries(resources)) {
]); ]);
} }
let stream; ctx.body = new stream.PassThrough();
switch (ctx.acceptsEncodings("gzip", "deflate", "identity")) {
case "gzip":
stream = zlib.createGzip({ flush: zlib.constants.Z_SYNC_FLUSH });
stream.pipe(ctx.res);
ctx.set("Content-Encoding", "gzip");
break;
case "deflate":
stream = zlib.createDeflate({ flush: zlib.constants.Z_SYNC_FLUSH });
stream.pipe(ctx.res);
ctx.set("Content-Encoding", "deflate");
break;
default:
stream = ctx.res;
break;
}
ctx.body = ctx.res;
ctx.type = "application/json"; ctx.type = "application/json";
let c = 0; let c = 0;
stream.write("[\n"); ctx.body.write("[\n");
await db.query(resource, filter, options, obj => { await db.query(resource, filter, options, obj => {
stream.write((c++ ? "," : "") + JSON.stringify(obj) + "\n"); ctx.body.write((c++ ? "," : "") + JSON.stringify(obj) + "\n");
}); });
stream.end("]"); ctx.body.end("]");
logger.accessInfo(log); logger.accessInfo(log);
}); });
@@ -181,30 +164,13 @@ for (const [resource, flags] of Object.entries(resources)) {
]); ]);
} }
let stream; ctx.body = new stream.PassThrough();
switch (ctx.acceptsEncodings("gzip", "deflate", "identity")) {
case "gzip":
stream = zlib.createGzip({ flush: zlib.constants.Z_SYNC_FLUSH });
stream.pipe(ctx.res);
ctx.set("Content-Encoding", "gzip");
break;
case "deflate":
stream = zlib.createDeflate({ flush: zlib.constants.Z_SYNC_FLUSH });
stream.pipe(ctx.res);
ctx.set("Content-Encoding", "deflate");
break;
default:
stream = ctx.res;
break;
}
ctx.body = ctx.res;
ctx.type = "text/csv"; ctx.type = "text/csv";
ctx.attachment( ctx.attachment(
`${resource}-${new Date(now).toISOString().replace(/[:.]/g, "")}.csv` `${resource}-${new Date(now).toISOString().replace(/[:.]/g, "")}.csv`
); );
stream.write( ctx.body.write(
Object.keys(columns).map(k => `"${k.replace(/"/, '""')}"`) + "\n" Object.keys(columns).map(k => `"${k.replace(/"/, '""')}"`) + "\n"
); );
await db.query(resource, filter, options, obj => { await db.query(resource, filter, options, obj => {
@@ -236,9 +202,9 @@ for (const [resource, flags] of Object.entries(resources)) {
if (typeof v === "string") return `"${v.replace(/"/g, '""')}"`; if (typeof v === "string") return `"${v.replace(/"/g, '""')}"`;
return v; return v;
}); });
stream.write(arr.join(",") + "\n"); ctx.body.write(arr.join(",") + "\n");
}); });
stream.end(); ctx.body.end();
logger.accessInfo(log); logger.accessInfo(log);
}); });