Fetch handler
Request handler is defined via fetch
key since it is similar to fetch API. The input is a Request object and handler should return a Response or a promise if the server handler is async.
Example:
import { serve } from "srvx";
serve({
async fetch(request) {
return new Response(
`
<h1>👋 Hello there</h1>
<p>You are visiting ${request.url} from ${request.remoteAddress}</p>
`,
{ headers: { "Content-Type": "text/html" } },
);
},
});
Additional properties
srvx never patches, overrides or extends globals such as Request and Response. Only few lazy getters prefixed with
x
will optionally be added to therequest
object instance to allow server adoption of Request.
ServerRequest
type for TypeScript usage.request.remoteAddress?
Using request.remoteAddress
allows to access connected client's ipv4/ipv6 address or hostname.
import { serve } from "srvx";
serve({
fetch: (request) =>
new Response(`Your ip address is "${request.remoteAddress}"`),
});
request.bun?
Using request.bun?.server
you can access to the underlying Bun server.
request.deno?
Using request.deno?.server
you can access to the underlying Deno server.
Using request.deno?.info
you can access to the extra request information provided by Deno.
request.node?
Node.js is supported through a proxy that wraps node:IncomingMessage as Request and converting final state of node:ServerResponse to Response.
If access to the underlying Node.js request and response objects is required (only in Node.js runtime), you can access them via request.node?.req
(node:IncomingMessage) and request.node?.res
(node:ServerResponse).
import { serve } from "srvx";
serve({
fetch: (request) => {
if (request.node) {
console.log("Node.js req path:", request.node?.req.path);
req.node.res.statusCode = 418; // I'm a teapot!
}
return new Response("ok");
},
});