@elysiajs/server-timing
Version:
Plugin for Elysia for performance audit via server timing
110 lines (109 loc) • 3.17 kB
JavaScript
// src/index.ts
import {
Elysia
} from "elysia";
var getLabel = (event, listener, write) => {
listener(async ({ onStop, onEvent, total }) => {
let label = "";
if (total === 0) return;
onEvent(({ name, index, onStop: onStop2 }) => {
onStop2(({ elapsed }) => {
label += `${event}.${index}.${name || "anon"};dur=${elapsed},`;
});
});
onStop(({ elapsed }) => {
label += `${event};dur=${elapsed},`;
write(label);
});
});
};
var serverTiming = ({
allow,
enabled = process.env.NODE_ENV !== "production",
trace: {
request: traceRequest = true,
parse: traceParse = true,
transform: traceTransform = true,
beforeHandle: traceBeforeHandle = true,
handle: traceHandle = true,
afterHandle: traceAfterHandle = true,
error: traceError = true,
mapResponse: traceMapResponse = true,
total: traceTotal = true
} = {}
} = {}) => {
const app = new Elysia();
if (enabled) {
app.trace(
{ as: "global" },
async ({
onRequest,
onParse,
onTransform,
onBeforeHandle,
onHandle,
onAfterHandle,
onMapResponse,
onError,
set,
context,
context: {
request: { method }
}
}) => {
let label = "";
const write = (nextValue) => {
label += nextValue;
};
let start;
onRequest(({ begin }) => {
start = begin;
});
if (traceRequest) getLabel("request", onRequest, write);
if (traceParse) getLabel("parse", onParse, write);
if (traceTransform) getLabel("transform", onTransform, write);
if (traceBeforeHandle)
getLabel("beforeHandle", onBeforeHandle, write);
if (traceAfterHandle)
getLabel("afterHandle", onAfterHandle, write);
if (traceError) getLabel("error", onError, write);
if (traceMapResponse)
getLabel("mapResponse", onMapResponse, write);
if (traceHandle)
onHandle(({ name, onStop }) => {
onStop(({ elapsed }) => {
label += `handle.${name};dur=${elapsed},`;
});
});
onMapResponse(({ onStop }) => {
onStop(async ({ end }) => {
let allowed = allow;
if (allowed instanceof Promise) allowed = await allowed;
if (traceTotal) label += `total;dur=${end - start}`;
else label = label.slice(0, -1);
switch (typeof allowed) {
case "boolean":
if (allowed === false)
delete set.headers["Server-Timing"];
set.headers["Server-Timing"] = label;
break;
case "function":
if (await allowed(context) === false)
delete set.headers["Server-Timing"];
set.headers["Server-Timing"] = label;
break;
default:
set.headers["Server-Timing"] = label;
}
});
});
}
);
}
return app;
};
var index_default = serverTiming;
export {
index_default as default,
serverTiming
};