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