Some cleanup and add server timing

This commit is contained in:
Dominic Ferrando
2026-06-26 13:06:40 -04:00
parent df29d3f2f1
commit a689417aed
5 changed files with 22 additions and 17 deletions
+2
View File
@@ -17,8 +17,10 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
# dotenv environment variable files # dotenv environment variable files
.env .env
.env.development
.env.development.local .env.development.local
.env.test.local .env.test.local
.env.production
.env.production.local .env.production.local
.env.local .env.local
+1
View File
@@ -17,6 +17,7 @@
"@blade-and-brawn/calculator": "workspace:*", "@blade-and-brawn/calculator": "workspace:*",
"@blade-and-brawn/commerce": "workspace:*", "@blade-and-brawn/commerce": "workspace:*",
"@blade-and-brawn/domain": "workspace:*", "@blade-and-brawn/domain": "workspace:*",
"@elysia/server-timing": "^1.4.1",
"@elysiajs/cors": "^1.4.2", "@elysiajs/cors": "^1.4.2",
"elysia": "^1.4.29", "elysia": "^1.4.29",
"ml-levenberg-marquardt": "^5.0.1", "ml-levenberg-marquardt": "^5.0.1",
+4 -4
View File
@@ -4,7 +4,7 @@ function requireEnv(key: string): string {
return val; return val;
} }
function optionEnv(key: string, fallback: string): string { function optionEnv(key: string, fallback: string = ""): string {
const val = Bun.env[key]; const val = Bun.env[key];
if (!val) return fallback; if (!val) return fallback;
return val; return val;
@@ -16,7 +16,7 @@ export const env = {
WEBFLOW_SITE_ID: requireEnv("WEBFLOW_SITE_ID"), WEBFLOW_SITE_ID: requireEnv("WEBFLOW_SITE_ID"),
WEBFLOW_COLLECTION_ID: requireEnv("WEBFLOW_COLLECTION_ID"), WEBFLOW_COLLECTION_ID: requireEnv("WEBFLOW_COLLECTION_ID"),
WEBFLOW_AUTH: requireEnv("WEBFLOW_AUTH"), WEBFLOW_AUTH: requireEnv("WEBFLOW_AUTH"),
WEBFLOW_WEBHOOK_SECRET: requireEnv("WEBFLOW_WEBHOOK_SECRET"), WEBFLOW_WEBHOOK_SECRET: optionEnv("WEBFLOW_WEBHOOK_SECRET"),
LOG_LEVEL: optionEnv("LOG_LEVEL", "info"), NODE_ENV: optionEnv("NODE_ENV", "development"),
NODE_ENV: optionEnv("NODE_ENV", "development") LOG_LEVEL: optionEnv("LOG_LEVEL", "info")
}; };
+12 -13
View File
@@ -23,10 +23,11 @@ import zipcodesUs from "zipcodes-us";
import z from "zod"; import z from "zod";
import pino from "pino"; import pino from "pino";
import { env } from "./env"; import { env } from "./env";
import serverTiming from "@elysia/server-timing";
const log = pino({ const log = pino({
level: env.LOG_LEVEL, level: env.LOG_LEVEL,
transport: env.NODE_ENV === "development" transport: env.NODE_ENV != "production"
? { target: "pino-pretty" } ? { target: "pino-pretty" }
: undefined, : undefined,
}); });
@@ -54,10 +55,7 @@ const productSyncer = new ProductSyncer(printful, webflow, log);
// ELYSIA // ELYSIA
// ----------- // -----------
export const app = new Elysia() export const app = new Elysia()
.derive(() => ({ .use(serverTiming())
startTime: Date.now(),
requestId: crypto.randomUUID(),
}))
.use( .use(
cors({ cors({
origin: [ origin: [
@@ -83,28 +81,29 @@ export const app = new Elysia()
WebflowError, WebflowError,
}) })
.onError(({ code, error, startTime, requestId }) => { .onError(({ code, error }) => {
const duration = Date.now() - (startTime ?? Date.now());
switch (code) { switch (code) {
case "PrintfulError": case "PrintfulError":
case "WebflowError": case "WebflowError":
log.error( log.error(
{ requestId, duration, upstreamStatus: error.status, payload: error.payload }, { upstreamStatus: error.status, payload: error.payload },
error.message, error.message,
); );
return status(502, { error: error.message }); return status(502, { error: error.message });
case "NOT_FOUND":
return status(404, { error: "Not found" });
case "VALIDATION":
return status(400, { error: error.message });
default: default:
log.error({ requestId, duration, err: error }, "unhandled error"); log.error({ err: error }, "unhandled error");
} }
}) })
.onAfterHandle(({ request, set, startTime, requestId }) => { .onAfterHandle(({ request, set }) => {
log.info({ log.info({
requestId,
method: request.method, method: request.method,
path: new URL(request.url).pathname, path: new URL(request.url).pathname,
status: set.status ?? 200, status: set.status ?? 200
duration: Date.now() - startTime,
}, "request"); }, "request");
}) })
+3
View File
@@ -15,6 +15,7 @@
"@blade-and-brawn/calculator": "workspace:*", "@blade-and-brawn/calculator": "workspace:*",
"@blade-and-brawn/commerce": "workspace:*", "@blade-and-brawn/commerce": "workspace:*",
"@blade-and-brawn/domain": "workspace:*", "@blade-and-brawn/domain": "workspace:*",
"@elysia/server-timing": "^1.4.1",
"@elysiajs/cors": "^1.4.2", "@elysiajs/cors": "^1.4.2",
"elysia": "^1.4.29", "elysia": "^1.4.29",
"ml-levenberg-marquardt": "^5.0.1", "ml-levenberg-marquardt": "^5.0.1",
@@ -88,6 +89,8 @@
"@elysia/eden": ["@elysia/eden@1.4.10", "", { "peerDependencies": { "elysia": ">=1.4.19" } }, "sha512-vcZXQcW6wZj6rhTxaiTkuCbVuS/yAJQ9jqCM6b83a5hu99F5Aj3HOyWXL17iod2Rz+pJpYsQGX0XaeoCsMpw2g=="], "@elysia/eden": ["@elysia/eden@1.4.10", "", { "peerDependencies": { "elysia": ">=1.4.19" } }, "sha512-vcZXQcW6wZj6rhTxaiTkuCbVuS/yAJQ9jqCM6b83a5hu99F5Aj3HOyWXL17iod2Rz+pJpYsQGX0XaeoCsMpw2g=="],
"@elysia/server-timing": ["@elysia/server-timing@1.4.1", "", { "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-+NDGhslxN0HZuyT8o4dt+hgib9bzsMuvxTE5bPrDhFFRl1duCNosseW3wE76pmwle8+m9+1aOeZ28mZAv51ggQ=="],
"@elysiajs/cors": ["@elysiajs/cors@1.4.2", "", { "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-FTCcbH35brTLigF1W7BYySRZomgI/dBEMK9BgK9RP9Nez7zmpGh4koL/Yr1BFv8nYz7CfhRvcM8d/c+XnwMaVQ=="], "@elysiajs/cors": ["@elysiajs/cors@1.4.2", "", { "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-FTCcbH35brTLigF1W7BYySRZomgI/dBEMK9BgK9RP9Nez7zmpGh4koL/Yr1BFv8nYz7CfhRvcM8d/c+XnwMaVQ=="],
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="],