Skip to content

Commit df20d40

Browse files
committed
refactor(server): rewrite in typescript
1 parent 81c1dc4 commit df20d40

24 files changed

+329
-233
lines changed

server/app.js renamed to server/app.ts

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
import Fastify from "fastify";
1+
import Fastify, { FastifyServerOptions } from "fastify";
22
import frameworksRouter from "./src/frameworks/frameworksRouter.js";
33
import cspRouter from "./src/csp/cspRouter.js";
44
import staticRouter from "./src/static/staticRouter.js";
55
import ejs from "ejs";
66
import fastifyView from "@fastify/view";
77
import minifier from "html-minifier";
8-
import { Stream } from "node:stream";
9-
import toArray from "stream-to-array";
8+
import { Readable } from "node:stream";
109
import zlib from "node:zlib";
1110
import { responseSizeRouter } from "./src/responseSize/responseSizeRouter.js";
1211
import { createResponseSizeDecorator } from "./src/responseSize/responseSizeDecorator.js";
1312

1413
/**
1514
* Builds the server but does not start it. Need it for testing API
16-
* @param {import("fastify").FastifyServerOptions} options
17-
* @returns {import("fastify").FastifyInstance}
1815
*/
19-
function buildServer(options = {}) {
16+
function buildServer(options: FastifyServerOptions = {}) {
2017
const fastify = Fastify(options);
2118

2219
fastify.register(fastifyView, {
@@ -29,11 +26,10 @@ function buildServer(options = {}) {
2926
});
3027

3128
fastify.decorate("responseSize", createResponseSizeDecorator());
32-
fastify.register(responseSizeRouter);
3329

34-
fastify.addHook("onSend", async (request, reply, payload) => {
30+
fastify.addHook("onSend", async function (request, reply, payload) {
3531
// const MISSING_HEADERS_AND_HTTP = 99;
36-
let getSizeInfo = (original, compressed) => {
32+
function getSizeInfo(original: Buffer | string, compressed?: Buffer | string) {
3733
if (compressed) {
3834
reply.header("Content-Length", compressed.length);
3935
reply.header("Content-Encoding", "br");
@@ -46,57 +42,62 @@ function buildServer(options = {}) {
4642
compressed: compressed.length, // + headers.length + MISSING_HEADERS_AND_HTTP,
4743
uncompressed: original.length, // + headers.length + MISSING_HEADERS_AND_HTTP
4844
};
49-
};
45+
}
5046

51-
if (request.url.startsWith("/css") || reply.statusCode != 200 || !fastify.responseSize.use_compression) {
47+
if (request.url.startsWith("/css") || reply.statusCode !== 200 || !fastify.responseSize.use_compression) {
5248
return payload;
5349
}
5450

55-
if (typeof payload == "string") {
56-
let { uncompressed, compressed } = getSizeInfo(payload);
51+
if (typeof payload === "string") {
52+
const { uncompressed, compressed } = getSizeInfo(payload);
5753
fastify.responseSize.add(uncompressed, compressed);
5854
console.log(
5955
`onSend: ${request.url} as string with uncompressed size ${uncompressed} sum uncompressed ${fastify.responseSize.size_uncompressed}, compressed ${fastify.responseSize.size_compressed}`
6056
);
61-
} else if (payload instanceof Stream) {
62-
return toArray(payload)
63-
.then((chunks) => {
64-
const buffer = Buffer.concat(chunks);
65-
if (buffer.length >= 1024) {
66-
let out = zlib.brotliCompressSync(buffer);
67-
let { uncompressed, compressed } = getSizeInfo(buffer, out);
68-
fastify.responseSize.add(uncompressed, compressed);
69-
console.log(
70-
`onSend: ${request.url} as stream with uncompressed size ${uncompressed} compressed ${compressed} sum uncompressed ${fastify.responseSize.size_uncompressed}, compressed ${fastify.responseSize.size_compressed}`
71-
);
72-
return out;
73-
} else {
74-
let { uncompressed, compressed } = getSizeInfo(buffer);
75-
fastify.responseSize.add(uncompressed, compressed);
76-
console.log(
77-
`onSend: ${request.url} as stream with uncompressed size ${uncompressed} (not compressed since below threshold) sum uncompressed ${fastify.responseSize.size_uncompressed}, compressed ${fastify.responseSize.size_compressed}`
78-
);
79-
return buffer;
80-
}
81-
})
82-
.catch((error) => {
83-
console.log("onSend: Error", error);
84-
});
85-
} else {
86-
console.log("onSend: Unknown payload type", typeof payload, payload);
57+
return payload;
8758
}
59+
60+
if (payload instanceof Readable) {
61+
try {
62+
const chunks = await payload.toArray();
63+
const buffer = Buffer.concat(chunks);
64+
65+
if (buffer.length >= 1024) {
66+
const compressedBuffer = zlib.brotliCompressSync(buffer);
67+
const { uncompressed, compressed } = getSizeInfo(buffer, compressedBuffer);
68+
fastify.responseSize.add(uncompressed, compressed);
69+
console.log(
70+
`onSend: ${request.url} as stream with uncompressed size ${uncompressed} compressed ${compressed} sum uncompressed ${fastify.responseSize.size_uncompressed}, compressed ${fastify.responseSize.size_compressed}`
71+
);
72+
return compressedBuffer;
73+
} else {
74+
const { uncompressed, compressed } = getSizeInfo(buffer);
75+
fastify.responseSize.add(uncompressed, compressed);
76+
console.log(
77+
`onSend: ${request.url} as stream with uncompressed size ${uncompressed} (not compressed since below threshold) sum uncompressed ${fastify.responseSize.size_uncompressed}, compressed ${fastify.responseSize.size_compressed}`
78+
);
79+
return buffer;
80+
}
81+
} catch (error) {
82+
console.log("onSend: Error", error);
83+
return payload;
84+
}
85+
}
86+
87+
console.log("onSend: Unknown payload type", typeof payload, payload);
8888
return payload;
8989
});
9090

91-
fastify.addHook("onRequest", (request, reply, done) => {
91+
fastify.addHook("onRequest", function (request, reply, done) {
9292
if (request.url.endsWith("index.html")) {
93-
fastify.responseSize.reset();
93+
this.responseSize.reset();
9494
reply.header("Cross-Origin-Embedder-Policy", "require-corp");
9595
reply.header("Cross-Origin-Opener-Policy", "same-origin");
9696
}
9797
done();
9898
});
9999

100+
fastify.register(responseSizeRouter);
100101
fastify.register(staticRouter);
101102
fastify.register(frameworksRouter);
102103
fastify.register(cspRouter, { prefix: "/csp" });
File renamed without changes.

server/package-lock.json

Lines changed: 156 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)