[{"data":1,"prerenderedAt":859},["ShallowReactive",2],{"navigation":3,"-guide-handler":61,"-guide-handler-surround":854},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Getting Started","/guide","1.guide/01.index",[9,11,16,21,26,31,36,41,46,51,56],{"title":5,"path":6,"stem":7,"icon":10},"ph:book-open-duotone",{"title":12,"path":13,"stem":14,"icon":15},"Fetch Handler","/guide/handler","1.guide/02.handler","i-fluent:target-24-regular",{"title":17,"path":18,"stem":19,"icon":20},"Server Instance","/guide/server","1.guide/03.server","radix-icons:component-instance",{"title":22,"path":23,"stem":24,"icon":25},"Middleware","/guide/middleware","1.guide/04.middleware","clarity:plugin-line",{"title":27,"path":28,"stem":29,"icon":30},"Server Options","/guide/options","1.guide/05.options","ri:settings-3-line",{"title":32,"path":33,"stem":34,"icon":35},"TLS","/guide/tls","1.guide/06.tls","ri:lock-2-line",{"title":37,"path":38,"stem":39,"icon":40},"Bundler Usage","/guide/bundler","1.guide/07.bundler","clarity:bundle-line",{"title":42,"path":43,"stem":44,"icon":45},"Node.js Support","/guide/node","1.guide/08.node","akar-icons:node-fill",{"title":47,"path":48,"stem":49,"icon":50},"Using CLI","/guide/cli","1.guide/10.cli","garden:terminal-cli-stroke-12",{"title":52,"path":53,"stem":54,"icon":55},"Body Size Limiting","/guide/body-limit","1.guide/11.body-limit","ri:scales-3-line",{"title":57,"path":58,"stem":59,"icon":60},"AWS Lambda","/guide/aws-lambda","1.guide/9.aws-lambda","clarity:cloud-traffic-line",{"id":62,"title":12,"body":63,"description":848,"extension":849,"meta":850,"navigation":851,"path":13,"seo":852,"stem":14,"__hash__":853},"content/1.guide/02.handler.md",{"type":64,"value":65,"toc":836,"icon":15},"minimark",[66,94,100,267,276,291,298,305,373,379,397,401,407,410,590,596,613,619,625,631,637,643,649,676,697,808,829,832],[67,68,69,70,74,75,81,82,87,88,93],"p",{},"Request handler is defined via ",[71,72,73],"code",{},"fetch"," key since it is similar to ",[76,77,73],"a",{"href":78,"rel":79},"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API",[80],"nofollow"," API. The input is a ",[76,83,86],{"href":84,"rel":85},"https://developer.mozilla.org/en-US/docs/Web/API/Request",[80],"Request"," object and handler should return a ",[76,89,92],{"href":90,"rel":91},"https://developer.mozilla.org/en-US/docs/Web/API/Response",[80],"Response"," or a promise if the server handler is async.",[67,95,96],{},[97,98,99],"strong",{},"Example:",[101,102,107],"pre",{"className":103,"code":104,"language":105,"meta":106,"style":106},"language-js shiki shiki-themes github-light github-dark github-dark","import { serve } from \"srvx\";\n\nserve({\n  async fetch(request) {\n    return new Response(\n      `\n        \u003Ch1>👋 Hello there\u003C/h1>\n        \u003Cp>You are visiting ${request.url} from ${request.ip}\u003C/p>\n      `,\n      { headers: { \"Content-Type\": \"text/html\" } },\n    );\n  },\n});\n","js","",[71,108,109,132,139,149,168,183,189,195,222,231,249,255,261],{"__ignoreMap":106},[110,111,114,118,122,125,129],"span",{"class":112,"line":113},"line",1,[110,115,117],{"class":116},"so5gQ","import",[110,119,121],{"class":120},"slsVL"," { serve } ",[110,123,124],{"class":116},"from",[110,126,128],{"class":127},"sfrk1"," \"srvx\"",[110,130,131],{"class":120},";\n",[110,133,135],{"class":112,"line":134},2,[110,136,138],{"emptyLinePlaceholder":137},true,"\n",[110,140,142,146],{"class":112,"line":141},3,[110,143,145],{"class":144},"shcOC","serve",[110,147,148],{"class":120},"({\n",[110,150,152,155,158,161,165],{"class":112,"line":151},4,[110,153,154],{"class":116},"  async",[110,156,157],{"class":144}," fetch",[110,159,160],{"class":120},"(",[110,162,164],{"class":163},"sQHwn","request",[110,166,167],{"class":120},") {\n",[110,169,171,174,177,180],{"class":112,"line":170},5,[110,172,173],{"class":116},"    return",[110,175,176],{"class":116}," new",[110,178,179],{"class":144}," Response",[110,181,182],{"class":120},"(\n",[110,184,186],{"class":112,"line":185},6,[110,187,188],{"class":127},"      `\n",[110,190,192],{"class":112,"line":191},7,[110,193,194],{"class":127},"        \u003Ch1>👋 Hello there\u003C/h1>\n",[110,196,198,201,203,206,209,212,214,216,219],{"class":112,"line":197},8,[110,199,200],{"class":127},"        \u003Cp>You are visiting ${",[110,202,164],{"class":120},[110,204,205],{"class":127},".",[110,207,208],{"class":120},"url",[110,210,211],{"class":127},"} from ${",[110,213,164],{"class":120},[110,215,205],{"class":127},[110,217,218],{"class":120},"ip",[110,220,221],{"class":127},"}\u003C/p>\n",[110,223,225,228],{"class":112,"line":224},9,[110,226,227],{"class":127},"      `",[110,229,230],{"class":120},",\n",[110,232,234,237,240,243,246],{"class":112,"line":233},10,[110,235,236],{"class":120},"      { headers: { ",[110,238,239],{"class":127},"\"Content-Type\"",[110,241,242],{"class":120},": ",[110,244,245],{"class":127},"\"text/html\"",[110,247,248],{"class":120}," } },\n",[110,250,252],{"class":112,"line":251},11,[110,253,254],{"class":120},"    );\n",[110,256,258],{"class":112,"line":257},12,[110,259,260],{"class":120},"  },\n",[110,262,264],{"class":112,"line":263},13,[110,265,266],{"class":120},"});\n",[268,269,271,272,275],"h2",{"id":270},"extended-request-serverrequest","Extended Request (",[71,273,274],{},"ServerRequest",")",[277,278,279],"tip",{},[67,280,281,282,284,285,288,289,205],{},"\nYou can use ",[71,283,274],{}," type export from ",[71,286,287],{},"srvx"," as type of ",[71,290,164],{},[292,293,295],"h3",{"id":294},"requestip",[71,296,297],{},"request.ip?",[67,299,300,301,304],{},"Using ",[71,302,303],{},"request.ip"," allows to access connected client's IP address.",[101,306,308],{"className":103,"code":307,"language":105,"meta":106,"style":106},"import { serve } from \"srvx\";\n\nserve({\n  fetch: (request) => new Response(`Your ip address is \"${request.ip}\"`),\n});\n",[71,309,310,322,326,332,369],{"__ignoreMap":106},[110,311,312,314,316,318,320],{"class":112,"line":113},[110,313,117],{"class":116},[110,315,121],{"class":120},[110,317,124],{"class":116},[110,319,128],{"class":127},[110,321,131],{"class":120},[110,323,324],{"class":112,"line":134},[110,325,138],{"emptyLinePlaceholder":137},[110,327,328,330],{"class":112,"line":141},[110,329,145],{"class":144},[110,331,148],{"class":120},[110,333,334,337,340,342,345,348,350,352,354,357,359,361,363,366],{"class":112,"line":151},[110,335,336],{"class":144},"  fetch",[110,338,339],{"class":120},": (",[110,341,164],{"class":163},[110,343,344],{"class":120},") ",[110,346,347],{"class":116},"=>",[110,349,176],{"class":116},[110,351,179],{"class":144},[110,353,160],{"class":120},[110,355,356],{"class":127},"`Your ip address is \"${",[110,358,164],{"class":120},[110,360,205],{"class":127},[110,362,218],{"class":120},[110,364,365],{"class":127},"}\"`",[110,367,368],{"class":120},"),\n",[110,370,371],{"class":112,"line":170},[110,372,266],{"class":120},[292,374,376],{"id":375},"requesttls",[71,377,378],{},"request.tls?",[67,380,381,382,388,389,392,393,396],{},"TLS connection state, including the client (peer) certificate, negotiated protocol and cipher. Added by the opt-in ",[76,383,385],{"href":384},"/guide/tls#mutual-tls-mtls",[71,386,387],{},"mtlsPlugin()"," (",[71,390,391],{},"srvx/mtls","); ",[71,394,395],{},"undefined"," for plain HTTP requests or when the plugin is not enabled.",[398,399],"read-more",{"title":400,"to":33},"TLS & mutual TLS",[292,402,404],{"id":403},"requestwaituntil",[71,405,406],{},"request.waitUntil?",[67,408,409],{},"Tell the runtime about an ongoing operation that shouldn't close until the promise resolves.",[101,411,413],{"className":103,"code":412,"language":105,"meta":106,"style":106},"import { serve } from \"srvx\";\n\nasync function logRequest(request) {\n  await fetch(\"https://telemetry.example.com\", {\n    method: \"POST\",\n    body: JSON.stringify({\n      method: request.method,\n      url: request.url,\n      ip: request.ip,\n    }),\n  });\n}\n\nserve({\n  fetch: (request) => {\n    request.waitUntil(logRequest(request));\n    return new Response(\"OK\");\n  },\n});\n",[71,414,415,427,431,448,463,473,489,494,499,504,509,514,519,523,530,546,563,580,585],{"__ignoreMap":106},[110,416,417,419,421,423,425],{"class":112,"line":113},[110,418,117],{"class":116},[110,420,121],{"class":120},[110,422,124],{"class":116},[110,424,128],{"class":127},[110,426,131],{"class":120},[110,428,429],{"class":112,"line":134},[110,430,138],{"emptyLinePlaceholder":137},[110,432,433,436,439,442,444,446],{"class":112,"line":141},[110,434,435],{"class":116},"async",[110,437,438],{"class":116}," function",[110,440,441],{"class":144}," logRequest",[110,443,160],{"class":120},[110,445,164],{"class":163},[110,447,167],{"class":120},[110,449,450,453,455,457,460],{"class":112,"line":151},[110,451,452],{"class":116},"  await",[110,454,157],{"class":144},[110,456,160],{"class":120},[110,458,459],{"class":127},"\"https://telemetry.example.com\"",[110,461,462],{"class":120},", {\n",[110,464,465,468,471],{"class":112,"line":170},[110,466,467],{"class":120},"    method: ",[110,469,470],{"class":127},"\"POST\"",[110,472,230],{"class":120},[110,474,475,478,482,484,487],{"class":112,"line":185},[110,476,477],{"class":120},"    body: ",[110,479,481],{"class":480},"suiK_","JSON",[110,483,205],{"class":120},[110,485,486],{"class":144},"stringify",[110,488,148],{"class":120},[110,490,491],{"class":112,"line":191},[110,492,493],{"class":120},"      method: request.method,\n",[110,495,496],{"class":112,"line":197},[110,497,498],{"class":120},"      url: request.url,\n",[110,500,501],{"class":112,"line":224},[110,502,503],{"class":120},"      ip: request.ip,\n",[110,505,506],{"class":112,"line":233},[110,507,508],{"class":120},"    }),\n",[110,510,511],{"class":112,"line":251},[110,512,513],{"class":120},"  });\n",[110,515,516],{"class":112,"line":257},[110,517,518],{"class":120},"}\n",[110,520,521],{"class":112,"line":263},[110,522,138],{"emptyLinePlaceholder":137},[110,524,526,528],{"class":112,"line":525},14,[110,527,145],{"class":144},[110,529,148],{"class":120},[110,531,533,535,537,539,541,543],{"class":112,"line":532},15,[110,534,336],{"class":144},[110,536,339],{"class":120},[110,538,164],{"class":163},[110,540,344],{"class":120},[110,542,347],{"class":116},[110,544,545],{"class":120}," {\n",[110,547,549,552,555,557,560],{"class":112,"line":548},16,[110,550,551],{"class":120},"    request.",[110,553,554],{"class":144},"waitUntil",[110,556,160],{"class":120},[110,558,559],{"class":144},"logRequest",[110,561,562],{"class":120},"(request));\n",[110,564,566,568,570,572,574,577],{"class":112,"line":565},17,[110,567,173],{"class":116},[110,569,176],{"class":116},[110,571,179],{"class":144},[110,573,160],{"class":120},[110,575,576],{"class":127},"\"OK\"",[110,578,579],{"class":120},");\n",[110,581,583],{"class":112,"line":582},18,[110,584,260],{"class":120},[110,586,588],{"class":112,"line":587},19,[110,589,266],{"class":120},[292,591,593],{"id":592},"requestruntimename",[71,594,595],{},"request.runtime?.name?",[67,597,598,599,602,603,602,606,602,609,612],{},"Runtime name. Can be ",[71,600,601],{},"\"bun\"",", ",[71,604,605],{},"\"deno\"",[71,607,608],{},"\"node\"",[71,610,611],{},"\"cloudflare\""," or any other string.",[292,614,616],{"id":615},"requestruntimebun",[71,617,618],{},"request.runtime?.bun?",[67,620,300,621,624],{},[71,622,623],{},"request.runtime.bun?.server"," you can access to the underlying Bun server.",[292,626,628],{"id":627},"requestruntimedeno",[71,629,630],{},"request.runtime?.deno?",[67,632,300,633,636],{},[71,634,635],{},"request.runtime.deno?.server"," you can access to the underlying Deno server.",[67,638,300,639,642],{},[71,640,641],{},"request.deno?.info"," you can access to the extra request information provided by Deno.",[292,644,646],{"id":645},"requestruntimenode",[71,647,648],{},"request.runtime?.node?",[67,650,651,656,657,662,663,666,667,672,673,205],{},[76,652,655],{"href":653,"rel":654},"https://nodejs.org/",[80],"Node.js"," is supported through a proxy that wraps ",[76,658,661],{"href":659,"rel":660},"https://nodejs.org/api/http.html#http_class_http_incomingmessage",[80],"node:IncomingMessage"," as ",[76,664,86],{"href":84,"rel":665},[80]," and converting final state of ",[76,668,671],{"href":669,"rel":670},"https://nodejs.org/api/http.html#http_class_http_serverresponse",[80],"node:ServerResponse"," to ",[76,674,92],{"href":90,"rel":675},[80],[67,677,678,679,682,683,388,686,689,690,388,693,696],{},"If access to the underlying ",[76,680,655],{"href":653,"rel":681},[80]," request and response objects is required (only in Node.js runtime), you can access them via ",[71,684,685],{},"request.runtime?.node?.req",[76,687,661],{"href":659,"rel":688},[80],") and ",[71,691,692],{},"request.runtime?.node?.res",[76,694,671],{"href":669,"rel":695},[80],").",[101,698,700],{"className":103,"code":699,"language":105,"meta":106,"style":106},"import { serve } from \"srvx\";\n\nserve({\n  fetch: (request) => {\n    if (request.runtime.node) {\n      console.log(\"Node.js req url:\", request.runtime.node?.req.url);\n      request.runtime.node.res.statusCode = 418; // I'm a teapot!\n    }\n    return new Response(\"ok\");\n  },\n});\n",[71,701,702,714,718,724,738,746,762,780,785,800,804],{"__ignoreMap":106},[110,703,704,706,708,710,712],{"class":112,"line":113},[110,705,117],{"class":116},[110,707,121],{"class":120},[110,709,124],{"class":116},[110,711,128],{"class":127},[110,713,131],{"class":120},[110,715,716],{"class":112,"line":134},[110,717,138],{"emptyLinePlaceholder":137},[110,719,720,722],{"class":112,"line":141},[110,721,145],{"class":144},[110,723,148],{"class":120},[110,725,726,728,730,732,734,736],{"class":112,"line":151},[110,727,336],{"class":144},[110,729,339],{"class":120},[110,731,164],{"class":163},[110,733,344],{"class":120},[110,735,347],{"class":116},[110,737,545],{"class":120},[110,739,740,743],{"class":112,"line":170},[110,741,742],{"class":116},"    if",[110,744,745],{"class":120}," (request.runtime.node) {\n",[110,747,748,751,754,756,759],{"class":112,"line":185},[110,749,750],{"class":120},"      console.",[110,752,753],{"class":144},"log",[110,755,160],{"class":120},[110,757,758],{"class":127},"\"Node.js req url:\"",[110,760,761],{"class":120},", request.runtime.node?.req.url);\n",[110,763,764,767,770,773,776],{"class":112,"line":191},[110,765,766],{"class":120},"      request.runtime.node.res.statusCode ",[110,768,769],{"class":116},"=",[110,771,772],{"class":480}," 418",[110,774,775],{"class":120},"; ",[110,777,779],{"class":778},"sCsY4","// I'm a teapot!\n",[110,781,782],{"class":112,"line":197},[110,783,784],{"class":120},"    }\n",[110,786,787,789,791,793,795,798],{"class":112,"line":224},[110,788,173],{"class":116},[110,790,176],{"class":116},[110,792,179],{"class":144},[110,794,160],{"class":120},[110,796,797],{"class":127},"\"ok\"",[110,799,579],{"class":120},[110,801,802],{"class":112,"line":233},[110,803,260],{"class":120},[110,805,806],{"class":112,"line":251},[110,807,266],{"class":120},[277,809,810],{},[67,811,812,813,816,817,820,821,824,825,828],{},"\nsrvx implementation of ",[76,814,86],{"href":84,"rel":815},[80]," proxy directly uses the underlying ",[76,818,661],{"href":659,"rel":819},[80]," as source of trust. Any changes to ",[76,822,86],{"href":84,"rel":823},[80]," will be reflected to the underlying ",[76,826,661],{"href":659,"rel":827},[80]," and vise-versa.",[398,830],{"title":831,"to":43},"Node.js support",[833,834,835],"style",{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":106,"searchDepth":134,"depth":134,"links":837},[838],{"id":270,"depth":134,"text":839,"children":840},"Extended Request (ServerRequest)",[841,842,843,844,845,846,847],{"id":294,"depth":141,"text":297},{"id":375,"depth":141,"text":378},{"id":403,"depth":141,"text":406},{"id":592,"depth":141,"text":595},{"id":615,"depth":141,"text":618},{"id":627,"depth":141,"text":630},{"id":645,"depth":141,"text":648},"Get familiar with srvx fetch server handler and ServerRequest.","md",{"icon":15},{"icon":15},{"title":12,"description":848},"RfYj3GS36-4RNXeJ4il4MciKg9SgB2W-QDnS2qeamXE",[855,857],{"title":5,"path":6,"stem":7,"description":856,"icon":10,"children":-1},"Build HTTP servers with web standard APIs like fetch, Request, and Response.",{"title":17,"path":18,"stem":19,"description":858,"icon":20,"children":-1},"Control srvx server lifecycle.",1785329752783]