@elysiajs/server-timing
Version:
Plugin for Elysia for performance audit via server timing
133 lines (131 loc) • 4.21 kB
JavaScript
;
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
});