UNPKG

@elysiajs/server-timing

Version:

Plugin for Elysia for performance audit via server timing

133 lines (131 loc) 4.21 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { default: () => index_default, serverTiming: () => serverTiming }); module.exports = __toCommonJS(index_exports); var import_elysia = require("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 import_elysia.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; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { serverTiming });