@whatwg-node/server
Advanced tools
Comparing version 0.10.0-alpha-20250227104850-9627f0bf88c955353a57c7af1cd0849684d82a53 to 0.10.0-alpha-20250227111609-07826f71d06c96c52d7b7339816bfd94c7aa6e7c
@@ -5,2 +5,3 @@ "use strict"; | ||
const tslib_1 = require("tslib"); | ||
const instruments_1 = require("@envelop/instruments"); | ||
const disposablestack_1 = require("@whatwg-node/disposablestack"); | ||
@@ -26,3 +27,3 @@ const DefaultFetchAPI = tslib_1.__importStar(require("@whatwg-node/fetch")); | ||
}; | ||
const givenHandleRequest = typeof serverAdapterBaseObject === 'function' | ||
const givenHandleRequest = typeof serverAdapterBaseObject === "function" | ||
? serverAdapterBaseObject | ||
@@ -32,3 +33,3 @@ : serverAdapterBaseObject.handle; | ||
const onResponseHooks = []; | ||
let tracer; | ||
let instruments; | ||
const waitUntilPromises = new Set(); | ||
@@ -61,3 +62,3 @@ let _disposableStack; | ||
waitUntilPromises.delete(promiseLike); | ||
}, err => { | ||
}, (err) => { | ||
console.error(`Unexpected error while waiting: ${err.message || err}`); | ||
@@ -70,7 +71,6 @@ waitUntilPromises.delete(promiseLike); | ||
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.instruments) { | ||
instruments = instruments | ||
? (0, instruments_1.chain)(instruments, plugin.instruments) | ||
: plugin.instruments; | ||
} | ||
@@ -103,6 +103,6 @@ if (plugin.onRequest) { | ||
} | ||
let url = request['parsedUrl'] || | ||
let url = request["parsedUrl"] || | ||
new Proxy(EMPTY_OBJECT, { | ||
get(_target, prop, _receiver) { | ||
url = new fetchAPI.URL(request.url, 'http://localhost'); | ||
url = new fetchAPI.URL(request.url, "http://localhost"); | ||
return Reflect.get(url, prop, url); | ||
@@ -115,3 +115,3 @@ }, | ||
} | ||
return (0, promise_helpers_1.handleMaybePromise)(() => (0, utils_js_1.iterateAsyncVoid)(onResponseHooks, onResponseHook => onResponseHook({ | ||
return (0, promise_helpers_1.handleMaybePromise)(() => (0, utils_js_1.iterateAsyncVoid)(onResponseHooks, (onResponseHook) => onResponseHook({ | ||
request, | ||
@@ -153,11 +153,6 @@ response, | ||
: givenHandleRequest; | ||
if (tracer?.request) { | ||
if (instruments?.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; | ||
return (0, instruments_1.getInstrumented)({ request }).asyncFn(instruments.request, originalRequestHandler)(request, initialContext); | ||
}; | ||
@@ -186,3 +181,3 @@ } | ||
}; | ||
return (0, promise_helpers_1.handleMaybePromise)(() => (0, promise_helpers_1.handleMaybePromise)(() => handleNodeRequestAndResponse(nodeRequest, nodeResponse, defaultServerContext, ...ctx), response => response, err => (0, utils_js_1.handleErrorFromRequestHandler)(err, fetchAPI.Response)), response => (0, promise_helpers_1.handleMaybePromise)(() => (0, utils_js_1.sendNodeResponse)(response, nodeResponse, nodeRequest), r => r, err => console.error(`Unexpected error while handling request: ${err.message || err}`))); | ||
return (0, promise_helpers_1.handleMaybePromise)(() => (0, promise_helpers_1.handleMaybePromise)(() => handleNodeRequestAndResponse(nodeRequest, nodeResponse, defaultServerContext, ...ctx), (response) => response, (err) => (0, utils_js_1.handleErrorFromRequestHandler)(err, fetchAPI.Response)), (response) => (0, promise_helpers_1.handleMaybePromise)(() => (0, utils_js_1.sendNodeResponse)(response, nodeResponse, nodeRequest), (r) => r, (err) => console.error(`Unexpected error while handling request: ${err.message || err}`))); | ||
} | ||
@@ -195,3 +190,3 @@ function handleUWS(res, req, ...ctx) { | ||
}; | ||
const filteredCtxParts = ctx.filter(partCtx => partCtx != null); | ||
const filteredCtxParts = ctx.filter((partCtx) => partCtx != null); | ||
const serverContext = filteredCtxParts.length > 0 | ||
@@ -212,3 +207,3 @@ ? (0, utils_js_1.completeAssign)(defaultServerContext, ...ctx) | ||
res.onAborted = function (cb) { | ||
controller.signal.addEventListener('abort', cb, { once: true }); | ||
controller.signal.addEventListener("abort", cb, { once: true }); | ||
}; | ||
@@ -221,5 +216,5 @@ const request = (0, uwebsockets_js_1.getRequestFromUWSRequest)({ | ||
}); | ||
return (0, promise_helpers_1.handleMaybePromise)(() => (0, promise_helpers_1.handleMaybePromise)(() => handleRequest(request, serverContext), response => response, err => (0, utils_js_1.handleErrorFromRequestHandler)(err, fetchAPI.Response)), response => { | ||
return (0, promise_helpers_1.handleMaybePromise)(() => (0, promise_helpers_1.handleMaybePromise)(() => handleRequest(request, serverContext), (response) => response, (err) => (0, utils_js_1.handleErrorFromRequestHandler)(err, fetchAPI.Response)), (response) => { | ||
if (!controller.signal.aborted && !resEnded) { | ||
return (0, promise_helpers_1.handleMaybePromise)(() => (0, uwebsockets_js_1.sendResponseToUwsOpts)(res, response, controller, fetchAPI), r => r, err => { | ||
return (0, promise_helpers_1.handleMaybePromise)(() => (0, uwebsockets_js_1.sendResponseToUwsOpts)(res, response, controller, fetchAPI), (r) => r, (err) => { | ||
console.error(`Unexpected error while handling request: ${err.message || err}`); | ||
@@ -234,3 +229,3 @@ }); | ||
} | ||
const filteredCtxParts = ctx.filter(partCtx => partCtx != null); | ||
const filteredCtxParts = ctx.filter((partCtx) => partCtx != null); | ||
const serverContext = filteredCtxParts.length > 0 | ||
@@ -243,3 +238,3 @@ ? (0, utils_js_1.completeAssign)({}, event, ...filteredCtxParts) | ||
function handleRequestWithWaitUntil(request, ...ctx) { | ||
const filteredCtxParts = ctx.filter(partCtx => partCtx != null); | ||
const filteredCtxParts = ctx.filter((partCtx) => partCtx != null); | ||
const serverContext = filteredCtxParts.length > 1 | ||
@@ -253,3 +248,3 @@ ? (0, utils_js_1.completeAssign)({}, ...filteredCtxParts) | ||
const fetchFn = (input, ...maybeCtx) => { | ||
if (typeof input === 'string' || 'href' in input) { | ||
if (typeof input === "string" || "href" in input) { | ||
const [initOrCtx, ...restOfCtx] = maybeCtx; | ||
@@ -284,3 +279,3 @@ if ((0, utils_js_1.isRequestInit)(initOrCtx)) { | ||
if ((0, utils_js_1.isServerResponse)(initOrCtxOrRes)) { | ||
throw new TypeError('Got Node response without Node request'); | ||
throw new TypeError("Got Node response without Node request"); | ||
} | ||
@@ -287,0 +282,0 @@ // Is input a container object over Request? |
@@ -1,6 +0,7 @@ | ||
import { AsyncDisposableStack, DisposableSymbols } from '@whatwg-node/disposablestack'; | ||
import * as DefaultFetchAPI from '@whatwg-node/fetch'; | ||
import { handleMaybePromise } from '@whatwg-node/promise-helpers'; | ||
import { completeAssign, ensureDisposableStackRegisteredForTerminateEvents, handleAbortSignalAndPromiseResponse, handleErrorFromRequestHandler, isFetchEvent, isNodeRequest, isolateObject, isPromise, isRequestInit, isServerResponse, iterateAsyncVoid, nodeRequestResponseMap, normalizeNodeRequest, sendNodeResponse, } from './utils.js'; | ||
import { fakePromise, getRequestFromUWSRequest, isUWSResponse, sendResponseToUwsOpts, } from './uwebsockets.js'; | ||
import { chain, getInstrumented } from "@envelop/instruments"; | ||
import { AsyncDisposableStack, DisposableSymbols, } from "@whatwg-node/disposablestack"; | ||
import * as DefaultFetchAPI from "@whatwg-node/fetch"; | ||
import { handleMaybePromise } from "@whatwg-node/promise-helpers"; | ||
import { completeAssign, ensureDisposableStackRegisteredForTerminateEvents, handleAbortSignalAndPromiseResponse, handleErrorFromRequestHandler, isFetchEvent, isNodeRequest, isolateObject, isPromise, isRequestInit, isServerResponse, iterateAsyncVoid, nodeRequestResponseMap, normalizeNodeRequest, sendNodeResponse, } from "./utils.js"; | ||
import { fakePromise, getRequestFromUWSRequest, isUWSResponse, sendResponseToUwsOpts, } from "./uwebsockets.js"; | ||
// Required for envs like nextjs edge runtime | ||
@@ -21,3 +22,3 @@ function isRequestAccessible(serverContext) { | ||
}; | ||
const givenHandleRequest = typeof serverAdapterBaseObject === 'function' | ||
const givenHandleRequest = typeof serverAdapterBaseObject === "function" | ||
? serverAdapterBaseObject | ||
@@ -27,3 +28,3 @@ : serverAdapterBaseObject.handle; | ||
const onResponseHooks = []; | ||
let tracer; | ||
let instruments; | ||
const waitUntilPromises = new Set(); | ||
@@ -56,3 +57,3 @@ let _disposableStack; | ||
waitUntilPromises.delete(promiseLike); | ||
}, err => { | ||
}, (err) => { | ||
console.error(`Unexpected error while waiting: ${err.message || err}`); | ||
@@ -65,7 +66,6 @@ waitUntilPromises.delete(promiseLike); | ||
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.instruments) { | ||
instruments = instruments | ||
? chain(instruments, plugin.instruments) | ||
: plugin.instruments; | ||
} | ||
@@ -98,6 +98,6 @@ if (plugin.onRequest) { | ||
} | ||
let url = request['parsedUrl'] || | ||
let url = request["parsedUrl"] || | ||
new Proxy(EMPTY_OBJECT, { | ||
get(_target, prop, _receiver) { | ||
url = new fetchAPI.URL(request.url, 'http://localhost'); | ||
url = new fetchAPI.URL(request.url, "http://localhost"); | ||
return Reflect.get(url, prop, url); | ||
@@ -110,3 +110,3 @@ }, | ||
} | ||
return handleMaybePromise(() => iterateAsyncVoid(onResponseHooks, onResponseHook => onResponseHook({ | ||
return handleMaybePromise(() => iterateAsyncVoid(onResponseHooks, (onResponseHook) => onResponseHook({ | ||
request, | ||
@@ -148,11 +148,6 @@ response, | ||
: givenHandleRequest; | ||
if (tracer?.request) { | ||
if (instruments?.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; | ||
return getInstrumented({ request }).asyncFn(instruments.request, originalRequestHandler)(request, initialContext); | ||
}; | ||
@@ -181,3 +176,3 @@ } | ||
}; | ||
return handleMaybePromise(() => handleMaybePromise(() => handleNodeRequestAndResponse(nodeRequest, nodeResponse, defaultServerContext, ...ctx), response => response, err => handleErrorFromRequestHandler(err, fetchAPI.Response)), response => handleMaybePromise(() => sendNodeResponse(response, nodeResponse, nodeRequest), r => r, err => console.error(`Unexpected error while handling request: ${err.message || err}`))); | ||
return handleMaybePromise(() => handleMaybePromise(() => handleNodeRequestAndResponse(nodeRequest, nodeResponse, defaultServerContext, ...ctx), (response) => response, (err) => handleErrorFromRequestHandler(err, fetchAPI.Response)), (response) => handleMaybePromise(() => sendNodeResponse(response, nodeResponse, nodeRequest), (r) => r, (err) => console.error(`Unexpected error while handling request: ${err.message || err}`))); | ||
} | ||
@@ -190,3 +185,3 @@ function handleUWS(res, req, ...ctx) { | ||
}; | ||
const filteredCtxParts = ctx.filter(partCtx => partCtx != null); | ||
const filteredCtxParts = ctx.filter((partCtx) => partCtx != null); | ||
const serverContext = filteredCtxParts.length > 0 | ||
@@ -207,3 +202,3 @@ ? completeAssign(defaultServerContext, ...ctx) | ||
res.onAborted = function (cb) { | ||
controller.signal.addEventListener('abort', cb, { once: true }); | ||
controller.signal.addEventListener("abort", cb, { once: true }); | ||
}; | ||
@@ -216,5 +211,5 @@ const request = getRequestFromUWSRequest({ | ||
}); | ||
return handleMaybePromise(() => handleMaybePromise(() => handleRequest(request, serverContext), response => response, err => handleErrorFromRequestHandler(err, fetchAPI.Response)), response => { | ||
return handleMaybePromise(() => handleMaybePromise(() => handleRequest(request, serverContext), (response) => response, (err) => handleErrorFromRequestHandler(err, fetchAPI.Response)), (response) => { | ||
if (!controller.signal.aborted && !resEnded) { | ||
return handleMaybePromise(() => sendResponseToUwsOpts(res, response, controller, fetchAPI), r => r, err => { | ||
return handleMaybePromise(() => sendResponseToUwsOpts(res, response, controller, fetchAPI), (r) => r, (err) => { | ||
console.error(`Unexpected error while handling request: ${err.message || err}`); | ||
@@ -229,3 +224,3 @@ }); | ||
} | ||
const filteredCtxParts = ctx.filter(partCtx => partCtx != null); | ||
const filteredCtxParts = ctx.filter((partCtx) => partCtx != null); | ||
const serverContext = filteredCtxParts.length > 0 | ||
@@ -238,3 +233,3 @@ ? completeAssign({}, event, ...filteredCtxParts) | ||
function handleRequestWithWaitUntil(request, ...ctx) { | ||
const filteredCtxParts = ctx.filter(partCtx => partCtx != null); | ||
const filteredCtxParts = ctx.filter((partCtx) => partCtx != null); | ||
const serverContext = filteredCtxParts.length > 1 | ||
@@ -248,3 +243,3 @@ ? completeAssign({}, ...filteredCtxParts) | ||
const fetchFn = (input, ...maybeCtx) => { | ||
if (typeof input === 'string' || 'href' in input) { | ||
if (typeof input === "string" || "href" in input) { | ||
const [initOrCtx, ...restOfCtx] = maybeCtx; | ||
@@ -279,3 +274,3 @@ if (isRequestInit(initOrCtx)) { | ||
if (isServerResponse(initOrCtxOrRes)) { | ||
throw new TypeError('Got Node response without Node request'); | ||
throw new TypeError("Got Node response without Node request"); | ||
} | ||
@@ -282,0 +277,0 @@ // Is input a container object over Request? |
{ | ||
"name": "@whatwg-node/server", | ||
"version": "0.10.0-alpha-20250227104850-9627f0bf88c955353a57c7af1cd0849684d82a53", | ||
"version": "0.10.0-alpha-20250227111609-07826f71d06c96c52d7b7339816bfd94c7aa6e7c", | ||
"description": "Fetch API compliant HTTP Server adapter", | ||
"sideEffects": false, | ||
"dependencies": { | ||
"@envelop/instruments": "^5.0.3", | ||
"@whatwg-node/disposablestack": "^0.0.6", | ||
@@ -8,0 +9,0 @@ "@whatwg-node/fetch": "^0.10.5", |
@@ -1,3 +0,3 @@ | ||
import { ServerAdapterPlugin } from './plugins/types.js'; | ||
import { FetchAPI, ServerAdapter, ServerAdapterBaseObject, ServerAdapterRequestHandler } from './types.js'; | ||
import { ServerAdapterPlugin } from "./plugins/types.js"; | ||
import { FetchAPI, ServerAdapter, ServerAdapterBaseObject, ServerAdapterRequestHandler } from "./types.js"; | ||
export interface ServerAdapterOptions<TServerContext> { | ||
@@ -4,0 +4,0 @@ plugins?: ServerAdapterPlugin<TServerContext>[]; |
@@ -1,2 +0,2 @@ | ||
import { FetchAPI, ServerAdapterRequestHandler, type ServerAdapterInitialContext } from '../types.js'; | ||
import { FetchAPI, ServerAdapterRequestHandler, type ServerAdapterInitialContext } from "../types.js"; | ||
export interface ServerAdapterPlugin<TServerContext = {}> { | ||
@@ -7,3 +7,3 @@ /** | ||
*/ | ||
tracer?: Tracer; | ||
instruments?: Instruments; | ||
/** | ||
@@ -47,3 +47,3 @@ * This hook is invoked for ANY incoming HTTP request. Here you can manipulate the request, | ||
} | ||
export type Tracer = { | ||
export type Instruments = { | ||
request?: (payload: { | ||
@@ -50,0 +50,0 @@ request: Request; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
164272
5
3056
+ Added@envelop/instruments@^5.0.3