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