@whatwg-node/server
Advanced tools
Comparing version 0.10.0-alpha-20250205113213-1ddf37bf9cb93e796a62ac800ea0b4100bb2eaa4 to 0.10.0-alpha-20250218152320-bb3f75a75f6ca8fcae41c014c88eee498bd6489c
@@ -29,2 +29,3 @@ "use strict"; | ||
const onResponseHooks = []; | ||
let tracer; | ||
const waitUntilPromises = new Set(); | ||
@@ -65,2 +66,8 @@ let _disposableStack; | ||
for (const plugin of options.plugins) { | ||
if (plugin.tracer) { | ||
if (tracer) { | ||
throw new Error('Multiple tracers have been declared. Only one plugin with a tracer is allowed.'); | ||
} | ||
tracer = plugin.tracer; | ||
} | ||
if (plugin.onRequest) { | ||
@@ -85,3 +92,3 @@ onRequestHooks.push(plugin.onRequest); | ||
} | ||
const handleRequest = onRequestHooks.length > 0 || onResponseHooks.length > 0 | ||
let handleRequest = onRequestHooks.length > 0 || onResponseHooks.length > 0 | ||
? function handleRequest(request, serverContext) { | ||
@@ -123,3 +130,3 @@ let requestHandler = givenHandleRequest; | ||
} | ||
const onResponseHookPayload = { | ||
const onResponseHooksIteration$ = (0, utils_js_1.iterateAsyncVoid)(onResponseHooks, onResponseHook => onResponseHook({ | ||
request, | ||
@@ -132,4 +139,3 @@ response, | ||
fetchAPI, | ||
}; | ||
const onResponseHooksIteration$ = (0, utils_js_1.iterateAsyncVoid)(onResponseHooks, onResponseHook => onResponseHook(onResponseHookPayload)); | ||
})); | ||
if ((0, utils_js_1.isPromise)(onResponseHooksIteration$)) { | ||
@@ -156,2 +162,13 @@ return onResponseHooksIteration$.then(() => response); | ||
: givenHandleRequest; | ||
if (tracer?.request) { | ||
const originalRequestHandler = handleRequest; | ||
handleRequest = (request, initialContext) => { | ||
let response; | ||
const tracerPromise = tracer.request({ request }, () => { | ||
response = originalRequestHandler(request, initialContext); | ||
return (0, utils_js_1.isPromise)(response) ? response.then(() => undefined) : undefined; | ||
}); | ||
return (0, utils_js_1.isPromise)(tracerPromise) ? tracerPromise.then(() => response) : response; | ||
}; | ||
} | ||
// TODO: Remove this on the next major version | ||
@@ -158,0 +175,0 @@ function handleNodeRequest(nodeRequest, ...ctx) { |
@@ -25,2 +25,3 @@ import { AsyncDisposableStack, DisposableSymbols } from '@whatwg-node/disposablestack'; | ||
const onResponseHooks = []; | ||
let tracer; | ||
const waitUntilPromises = new Set(); | ||
@@ -61,2 +62,8 @@ let _disposableStack; | ||
for (const plugin of options.plugins) { | ||
if (plugin.tracer) { | ||
if (tracer) { | ||
throw new Error('Multiple tracers have been declared. Only one plugin with a tracer is allowed.'); | ||
} | ||
tracer = plugin.tracer; | ||
} | ||
if (plugin.onRequest) { | ||
@@ -81,3 +88,3 @@ onRequestHooks.push(plugin.onRequest); | ||
} | ||
const handleRequest = onRequestHooks.length > 0 || onResponseHooks.length > 0 | ||
let handleRequest = onRequestHooks.length > 0 || onResponseHooks.length > 0 | ||
? function handleRequest(request, serverContext) { | ||
@@ -119,3 +126,3 @@ let requestHandler = givenHandleRequest; | ||
} | ||
const onResponseHookPayload = { | ||
const onResponseHooksIteration$ = iterateAsyncVoid(onResponseHooks, onResponseHook => onResponseHook({ | ||
request, | ||
@@ -128,4 +135,3 @@ response, | ||
fetchAPI, | ||
}; | ||
const onResponseHooksIteration$ = iterateAsyncVoid(onResponseHooks, onResponseHook => onResponseHook(onResponseHookPayload)); | ||
})); | ||
if (isPromise(onResponseHooksIteration$)) { | ||
@@ -152,2 +158,13 @@ return onResponseHooksIteration$.then(() => response); | ||
: givenHandleRequest; | ||
if (tracer?.request) { | ||
const originalRequestHandler = handleRequest; | ||
handleRequest = (request, initialContext) => { | ||
let response; | ||
const tracerPromise = tracer.request({ request }, () => { | ||
response = originalRequestHandler(request, initialContext); | ||
return isPromise(response) ? response.then(() => undefined) : undefined; | ||
}); | ||
return isPromise(tracerPromise) ? tracerPromise.then(() => response) : response; | ||
}; | ||
} | ||
// TODO: Remove this on the next major version | ||
@@ -154,0 +171,0 @@ function handleNodeRequest(nodeRequest, ...ctx) { |
{ | ||
"name": "@whatwg-node/server", | ||
"version": "0.10.0-alpha-20250205113213-1ddf37bf9cb93e796a62ac800ea0b4100bb2eaa4", | ||
"version": "0.10.0-alpha-20250218152320-bb3f75a75f6ca8fcae41c014c88eee498bd6489c", | ||
"description": "Fetch API compliant HTTP Server adapter", | ||
@@ -5,0 +5,0 @@ "sideEffects": false, |
import { FetchAPI, ServerAdapterRequestHandler, type ServerAdapterInitialContext } from '../types.js'; | ||
export interface ServerAdapterPlugin<TServerContext = {}> { | ||
/** | ||
* A tracer insance. It can be used to wrap the entire request handling pipeline (including the | ||
* plugin hooks). It is mostly used for observability (monitoring, tracing, etc...). | ||
*/ | ||
tracer?: Tracer; | ||
/** | ||
* This hook is invoked for ANY incoming HTTP request. Here you can manipulate the request, | ||
@@ -41,2 +46,7 @@ * create a short circuit before the request handler takes it over. | ||
} | ||
export type Tracer = { | ||
request: (payload: { | ||
request: Request; | ||
}, wrapped: () => Promise<void> | void) => Promise<void> | void; | ||
}; | ||
export type OnRequestHook<TServerContext> = (payload: OnRequestEventPayload<TServerContext>) => Promise<void> | void; | ||
@@ -43,0 +53,0 @@ export interface OnRequestEventPayload<TServerContext> { |
Sorry, the diff of this file is not supported yet
171359
3337