@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
};