import { BaseRequest, ITraceable, ServerTrace } from '@emprespresso/pengueno'; const greetings = ['hewwo :D', 'hiya cutie', 'boop!', 'sending virtual hugs!', 'stay pawsitive']; const penguenoGreeting = () => greetings[Math.floor(Math.random() * greetings.length)]; export class PenguenoRequest { private constructor( public readonly req: BaseRequest, private readonly id: string, private readonly at: Date, ) {} public elapsedTimeMs(after = () => Date.now()): number { return after() - this.at.getTime(); } public getResponseHeaders(): Record { const RequestId = this.id; const RequestReceivedUnix = this.at.getTime(); const RequestHandleUnix = Date.now(); const DeltaUnix = this.elapsedTimeMs(() => RequestHandleUnix); const Hai = penguenoGreeting(); return Object.entries({ RequestId, RequestReceivedUnix, RequestHandleUnix, DeltaUnix, Hai, }).reduce((acc, [key, val]) => ({ ...acc, [key]: val!.toString() }), {}); } public static from(request: ITraceable): ITraceable { const id = crypto.randomUUID(); return request.bimap((tRequest) => { const request = tRequest.get(); const url = new URL(request.url); const { pathname } = url; const trace = `RequestId = ${id}, Method = ${request.method}, Path = ${pathname}`; return { item: new PenguenoRequest(request, id, new Date()), trace }; }); } }