Better chunked-encoding implementation
This commit is contained in:
1 parent
16c8871102
commit
46c1781816
1 file changed
+9
-43
+9
-43
@@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in new issue
Block a user