UNPKG

@elysiajs/server-timing

Version:

Plugin for Elysia for performance audit via server timing

110 lines (109 loc) 3.17 kB
// 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 };