[{"data":1,"prerenderedAt":956},["ShallowReactive",2],{"navigation":3,"-utils-response":184,"-utils-response-surround":951},[4,91,133,161,168],{"title":5,"path":6,"stem":7,"children":8,"icon":90},"Guide","/guide","1.guide/0.index",[9,12,53,69],{"title":10,"path":6,"stem":7,"icon":11},"Getting Started","pixel:play",{"title":5,"icon":13,"path":14,"stem":15,"children":16,"page":52},"ph:book-open-duotone","/guide/basics","1.guide/1.basics",[17,22,27,32,37,42,47],{"title":18,"path":19,"stem":20,"icon":21},"Request Lifecycle","/guide/basics/lifecycle","1.guide/1.basics/1.lifecycle","icon-park-outline:handle-round",{"title":23,"path":24,"stem":25,"icon":26},"Routing","/guide/basics/routing","1.guide/1.basics/2.routing","solar:routing-bold",{"title":28,"path":29,"stem":30,"icon":31},"Middleware","/guide/basics/middleware","1.guide/1.basics/3.middleware","mdi:middleware-outline",{"title":33,"path":34,"stem":35,"icon":36},"Event Handlers","/guide/basics/handler","1.guide/1.basics/4.handler","mdi:function",{"title":38,"path":39,"stem":40,"icon":41},"Sending Response","/guide/basics/response","1.guide/1.basics/5.response","tabler:json",{"title":43,"path":44,"stem":45,"icon":46},"Error Handling","/guide/basics/error","1.guide/1.basics/6.error","tabler:error-404",{"title":48,"path":49,"stem":50,"icon":51},"Nested Apps","/guide/basics/nested-apps","1.guide/1.basics/7.nested-apps","material-symbols-light:layers-outline",false,{"title":54,"icon":55,"path":56,"stem":57,"children":58,"page":52},"API","material-symbols-light:api-rounded","/guide/api","1.guide/900.api",[59,64],{"title":60,"path":61,"stem":62,"icon":63},"H3","/guide/api/h3","1.guide/900.api/1.h3","material-symbols:bolt-rounded",{"title":65,"path":66,"stem":67,"icon":68},"H3Event","/guide/api/h3event","1.guide/900.api/2.h3event","material-symbols:data-object-rounded",{"title":70,"icon":71,"path":72,"stem":73,"children":74,"page":52},"Advanced","hugeicons:more-01","/guide/advanced","1.guide/901.advanced",[75,80,85],{"title":76,"path":77,"stem":78,"icon":79},"Plugins","/guide/advanced/plugins","1.guide/901.advanced/1.plugins","clarity:plugin-line",{"title":81,"path":82,"stem":83,"icon":84},"WebSockets","/guide/advanced/websocket","1.guide/901.advanced/2.websocket","hugeicons:live-streaming-02",{"title":86,"path":87,"stem":88,"icon":89},"Nightly Builds","/guide/advanced/nightly","1.guide/901.advanced/9.nightly","game-icons:barn-owl","i-ph:book-open-duotone",{"title":92,"path":93,"stem":94,"children":95,"icon":97},"Utils","/utils","2.utils/0.index",[96,98,103,108,113,118,123,128],{"title":92,"path":93,"stem":94,"icon":97},"ph:function-bold",{"title":99,"path":100,"stem":101,"icon":102},"Request","/utils/request","2.utils/1.request","material-symbols-light:input",{"title":104,"path":105,"stem":106,"icon":107},"Response","/utils/response","2.utils/2.response","material-symbols-light:output",{"title":109,"path":110,"stem":111,"icon":112},"Cookie","/utils/cookie","2.utils/3.cookie","material-symbols:cookie-outline",{"title":114,"path":115,"stem":116,"icon":117},"Security","/utils/security","2.utils/4.security","wpf:key-security",{"title":119,"path":120,"stem":121,"icon":122},"Proxy","/utils/proxy","2.utils/5.proxy","arcticons:super-proxy",{"title":124,"path":125,"stem":126,"icon":127},"More utils","/utils/more","2.utils/9.more","mingcute:plus-line",{"title":129,"path":130,"stem":131,"icon":132},"Community","/utils/community","2.utils/99.community","lets-icons:external",{"title":134,"path":135,"stem":136,"children":137,"icon":139},"Examples","/examples","4.examples/0.index",[138,140,145,149,153,157],{"title":134,"path":135,"stem":136,"icon":139},"ph:code",{"title":141,"path":142,"stem":143,"icon":144},"Cookies","/examples/handle-cookie","4.examples/handle-cookie","ph:arrow-right",{"title":146,"path":147,"stem":148,"icon":144},"Sessions","/examples/handle-session","4.examples/handle-session",{"title":150,"path":151,"stem":152,"icon":144},"Static Assets","/examples/serve-static-assets","4.examples/serve-static-assets",{"title":154,"path":155,"stem":156,"icon":144},"Stream Response","/examples/stream-response","4.examples/stream-response",{"title":158,"path":159,"stem":160,"icon":144},"Validate Data","/examples/validate-data","4.examples/validate-data",{"title":162,"path":163,"stem":164,"children":165,"icon":167},"Migration","/migration","5.migration/0.index",[166],{"title":162,"path":163,"stem":164,"icon":167},"icons8:up-round",{"title":169,"path":170,"stem":171,"children":172},"Blog","/blog","99.blog",[173,176,180],{"title":169,"path":170,"stem":174,"icon":175},"99.blog/index","i-lucide-file-text",{"title":177,"path":178,"stem":179,"icon":175},"H3 1.8 - Towards the Edge of the Web","/blog/v1.8","99.blog/1.v1.8",{"title":181,"path":182,"stem":183,"icon":175},"H3 v2 beta","/blog/v2-beta","99.blog/2.v2-beta",{"id":185,"title":104,"body":186,"description":945,"extension":946,"meta":947,"navigation":948,"path":105,"seo":949,"stem":106,"__hash__":950},"content/2.utils/2.response.md",{"type":187,"value":188,"toc":926,"icon":107},"minimark",[189,194,202,213,219,475,479,485,488,494,497,504,508,514,517,521,527,533,536,539,542,546,753,759,765,769,796,802,805,812,815,819,858,862,909,915,922],[190,191,193],"h2",{"id":192},"event-stream","Event Stream",[195,196,198],"h3",{"id":197},"createeventstreamevent-opts",[199,200,201],"code",{},"createEventStream(event, opts?)",[203,204,205,206],"p",{},"Initialize an EventStream instance for creating ",[207,208,212],"a",{"href":209,"rel":210},"https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events",[211],"nofollow","server sent events",[203,214,215],{},[216,217,218],"strong",{},"Example:",[220,221,226],"pre",{"className":222,"code":223,"language":224,"meta":225,"style":225},"language-ts shiki shiki-themes github-light github-dark github-dark","import { createEventStream, sendEventStream } from \"h3\";\n\napp.get(\"/sse\", (event) => {\n  const eventStream = createEventStream(event);\n\n  // Send a message every second\n  const interval = setInterval(async () => {\n    await eventStream.push(\"Hello world\");\n  }, 1000);\n\n  // cleanup the interval and close the stream when the connection is terminated\n  eventStream.onClosed(async () => {\n    console.log(\"closing SSE...\");\n    clearInterval(interval);\n    await eventStream.close();\n  });\n\n  return eventStream.send();\n});\n","ts","",[199,227,228,251,258,290,309,314,321,346,366,377,382,388,407,423,432,445,451,456,469],{"__ignoreMap":225},[229,230,233,237,241,244,248],"span",{"class":231,"line":232},"line",1,[229,234,236],{"class":235},"so5gQ","import",[229,238,240],{"class":239},"slsVL"," { createEventStream, sendEventStream } ",[229,242,243],{"class":235},"from",[229,245,247],{"class":246},"sfrk1"," \"h3\"",[229,249,250],{"class":239},";\n",[229,252,254],{"class":231,"line":253},2,[229,255,257],{"emptyLinePlaceholder":256},true,"\n",[229,259,261,264,268,271,274,277,281,284,287],{"class":231,"line":260},3,[229,262,263],{"class":239},"app.",[229,265,267],{"class":266},"shcOC","get",[229,269,270],{"class":239},"(",[229,272,273],{"class":246},"\"/sse\"",[229,275,276],{"class":239},", (",[229,278,280],{"class":279},"sQHwn","event",[229,282,283],{"class":239},") ",[229,285,286],{"class":235},"=>",[229,288,289],{"class":239}," {\n",[229,291,293,296,300,303,306],{"class":231,"line":292},4,[229,294,295],{"class":235},"  const",[229,297,299],{"class":298},"suiK_"," eventStream",[229,301,302],{"class":235}," =",[229,304,305],{"class":266}," createEventStream",[229,307,308],{"class":239},"(event);\n",[229,310,312],{"class":231,"line":311},5,[229,313,257],{"emptyLinePlaceholder":256},[229,315,317],{"class":231,"line":316},6,[229,318,320],{"class":319},"sCsY4","  // Send a message every second\n",[229,322,324,326,329,331,334,336,339,342,344],{"class":231,"line":323},7,[229,325,295],{"class":235},[229,327,328],{"class":298}," interval",[229,330,302],{"class":235},[229,332,333],{"class":266}," setInterval",[229,335,270],{"class":239},[229,337,338],{"class":235},"async",[229,340,341],{"class":239}," () ",[229,343,286],{"class":235},[229,345,289],{"class":239},[229,347,349,352,355,358,360,363],{"class":231,"line":348},8,[229,350,351],{"class":235},"    await",[229,353,354],{"class":239}," eventStream.",[229,356,357],{"class":266},"push",[229,359,270],{"class":239},[229,361,362],{"class":246},"\"Hello world\"",[229,364,365],{"class":239},");\n",[229,367,369,372,375],{"class":231,"line":368},9,[229,370,371],{"class":239},"  }, ",[229,373,374],{"class":298},"1000",[229,376,365],{"class":239},[229,378,380],{"class":231,"line":379},10,[229,381,257],{"emptyLinePlaceholder":256},[229,383,385],{"class":231,"line":384},11,[229,386,387],{"class":319},"  // cleanup the interval and close the stream when the connection is terminated\n",[229,389,391,394,397,399,401,403,405],{"class":231,"line":390},12,[229,392,393],{"class":239},"  eventStream.",[229,395,396],{"class":266},"onClosed",[229,398,270],{"class":239},[229,400,338],{"class":235},[229,402,341],{"class":239},[229,404,286],{"class":235},[229,406,289],{"class":239},[229,408,410,413,416,418,421],{"class":231,"line":409},13,[229,411,412],{"class":239},"    console.",[229,414,415],{"class":266},"log",[229,417,270],{"class":239},[229,419,420],{"class":246},"\"closing SSE...\"",[229,422,365],{"class":239},[229,424,426,429],{"class":231,"line":425},14,[229,427,428],{"class":266},"    clearInterval",[229,430,431],{"class":239},"(interval);\n",[229,433,435,437,439,442],{"class":231,"line":434},15,[229,436,351],{"class":235},[229,438,354],{"class":239},[229,440,441],{"class":266},"close",[229,443,444],{"class":239},"();\n",[229,446,448],{"class":231,"line":447},16,[229,449,450],{"class":239},"  });\n",[229,452,454],{"class":231,"line":453},17,[229,455,257],{"emptyLinePlaceholder":256},[229,457,459,462,464,467],{"class":231,"line":458},18,[229,460,461],{"class":235},"  return",[229,463,354],{"class":239},[229,465,466],{"class":266},"send",[229,468,444],{"class":239},[229,470,472],{"class":231,"line":471},19,[229,473,474],{"class":239},"});\n",[190,476,478],{"id":477},"sanitize","Sanitize",[195,480,482],{"id":481},"sanitizestatuscodestatuscode-defaultstatuscode",[199,483,484],{},"sanitizeStatusCode(statusCode?, defaultStatusCode)",[203,486,487],{},"Make sure the status code is a valid HTTP status code.",[195,489,491],{"id":490},"sanitizestatusmessagestatusmessage",[199,492,493],{},"sanitizeStatusMessage(statusMessage)",[203,495,496],{},"Make sure the status message is safe to use in a response.",[203,498,499,500],{},"Allowed characters: horizontal tabs, spaces or visible ascii characters: ",[207,501,502],{"href":502,"rel":503},"https://www.rfc-editor.org/rfc/rfc7230#section-3.1.2",[211],[190,505,507],{"id":506},"serve-static","Serve Static",[195,509,511],{"id":510},"servestaticevent-options",[199,512,513],{},"serveStatic(event, options)",[203,515,516],{},"Dynamically serve static assets based on the request path.",[190,518,520],{"id":519},"more-response-utils","More Response Utils",[195,522,524],{"id":523},"htmlfirst",[199,525,526],{},"html(first)",[195,528,530],{"id":529},"iterableiterable",[199,531,532],{},"iterable(iterable)",[203,534,535],{},"Iterate a source of chunks and send back each chunk in order. Supports mixing async work together with emitting chunks.",[203,537,538],{},"Each chunk must be a string or a buffer.",[203,540,541],{},"For generator (yielding) functions, the returned value is treated the same as yielded values.",[203,543,544],{},[216,545,218],{},[220,547,549],{"className":222,"code":548,"language":224,"meta":225,"style":225},"return iterable(async function* work() {\n  // Open document body\n  yield \"\u003C!DOCTYPE html>\\n\u003Chtml>\u003Cbody>\u003Ch1>Executing...\u003C/h1>\u003Col>\\n\";\n  // Do work ...\n  for (let i = 0; i \u003C 1000) {\n    await delay(1000);\n    // Report progress\n    yield `\u003Cli>Completed job #`;\n    yield i;\n    yield `\u003C/li>\\n`;\n  }\n  // Close out the report\n  return `\u003C/ol>\u003C/body>\u003C/html>`;\n})\nasync function delay(ms) {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n",[199,550,551,572,577,598,603,635,648,653,663,670,684,689,694,703,708,724,748],{"__ignoreMap":225},[229,552,553,556,559,561,563,566,569],{"class":231,"line":232},[229,554,555],{"class":235},"return",[229,557,558],{"class":266}," iterable",[229,560,270],{"class":239},[229,562,338],{"class":235},[229,564,565],{"class":235}," function*",[229,567,568],{"class":266}," work",[229,570,571],{"class":239},"() {\n",[229,573,574],{"class":231,"line":253},[229,575,576],{"class":319},"  // Open document body\n",[229,578,579,582,585,588,591,593,596],{"class":231,"line":260},[229,580,581],{"class":235},"  yield",[229,583,584],{"class":246}," \"\u003C!DOCTYPE html>",[229,586,587],{"class":298},"\\n",[229,589,590],{"class":246},"\u003Chtml>\u003Cbody>\u003Ch1>Executing...\u003C/h1>\u003Col>",[229,592,587],{"class":298},[229,594,595],{"class":246},"\"",[229,597,250],{"class":239},[229,599,600],{"class":231,"line":292},[229,601,602],{"class":319},"  // Do work ...\n",[229,604,605,608,611,614,617,620,623,626,629,632],{"class":231,"line":311},[229,606,607],{"class":235},"  for",[229,609,610],{"class":239}," (",[229,612,613],{"class":235},"let",[229,615,616],{"class":239}," i ",[229,618,619],{"class":235},"=",[229,621,622],{"class":298}," 0",[229,624,625],{"class":239},"; i ",[229,627,628],{"class":235},"\u003C",[229,630,631],{"class":298}," 1000",[229,633,634],{"class":239},") {\n",[229,636,637,639,642,644,646],{"class":231,"line":316},[229,638,351],{"class":235},[229,640,641],{"class":266}," delay",[229,643,270],{"class":239},[229,645,374],{"class":298},[229,647,365],{"class":239},[229,649,650],{"class":231,"line":323},[229,651,652],{"class":319},"    // Report progress\n",[229,654,655,658,661],{"class":231,"line":348},[229,656,657],{"class":235},"    yield",[229,659,660],{"class":246}," `\u003Cli>Completed job #`",[229,662,250],{"class":239},[229,664,665,667],{"class":231,"line":368},[229,666,657],{"class":235},[229,668,669],{"class":239}," i;\n",[229,671,672,674,677,679,682],{"class":231,"line":379},[229,673,657],{"class":235},[229,675,676],{"class":246}," `\u003C/li>",[229,678,587],{"class":298},[229,680,681],{"class":246},"`",[229,683,250],{"class":239},[229,685,686],{"class":231,"line":384},[229,687,688],{"class":239},"  }\n",[229,690,691],{"class":231,"line":390},[229,692,693],{"class":319},"  // Close out the report\n",[229,695,696,698,701],{"class":231,"line":409},[229,697,461],{"class":235},[229,699,700],{"class":246}," `\u003C/ol>\u003C/body>\u003C/html>`",[229,702,250],{"class":239},[229,704,705],{"class":231,"line":425},[229,706,707],{"class":239},"})\n",[229,709,710,712,715,717,719,722],{"class":231,"line":434},[229,711,338],{"class":235},[229,713,714],{"class":235}," function",[229,716,641],{"class":266},[229,718,270],{"class":239},[229,720,721],{"class":279},"ms",[229,723,634],{"class":239},[229,725,726,728,731,734,736,739,742,745],{"class":231,"line":447},[229,727,461],{"class":235},[229,729,730],{"class":235}," new",[229,732,733],{"class":298}," Promise",[229,735,270],{"class":239},[229,737,738],{"class":279},"resolve",[229,740,741],{"class":235}," =>",[229,743,744],{"class":266}," setTimeout",[229,746,747],{"class":239},"(resolve, ms));\n",[229,749,750],{"class":231,"line":453},[229,751,752],{"class":239},"}\n",[195,754,756],{"id":755},"nocontentstatus",[199,757,758],{},"noContent(status)",[203,760,761,762],{},"Respond with an empty payload.",[763,764],"br",{},[203,766,767],{},[216,768,218],{},[220,770,772],{"className":222,"code":771,"language":224,"meta":225,"style":225},"app.get(\"/\", () => noContent());\n",[199,773,774],{"__ignoreMap":225},[229,775,776,778,780,782,785,788,790,793],{"class":231,"line":232},[229,777,263],{"class":239},[229,779,267],{"class":266},[229,781,270],{"class":239},[229,783,784],{"class":246},"\"/\"",[229,786,787],{"class":239},", () ",[229,789,286],{"class":235},[229,791,792],{"class":266}," noContent",[229,794,795],{"class":239},"());\n",[195,797,799],{"id":798},"redirectlocation-status-statustext",[199,800,801],{},"redirect(location, status, statusText?)",[203,803,804],{},"Send a redirect response to the client.",[203,806,807,808,811],{},"It adds the ",[199,809,810],{},"location"," header to the response and sets the status code to 302 by default.",[203,813,814],{},"In the body, it sends a simple HTML page with a meta refresh tag to redirect the client in case the headers are ignored.",[203,816,817],{},[216,818,218],{},[220,820,822],{"className":222,"code":821,"language":224,"meta":225,"style":225},"app.get(\"/\", () => {\n  return redirect(\"https://example.com\");\n});\n",[199,823,824,840,854],{"__ignoreMap":225},[229,825,826,828,830,832,834,836,838],{"class":231,"line":232},[229,827,263],{"class":239},[229,829,267],{"class":266},[229,831,270],{"class":239},[229,833,784],{"class":246},[229,835,787],{"class":239},[229,837,286],{"class":235},[229,839,289],{"class":239},[229,841,842,844,847,849,852],{"class":231,"line":253},[229,843,461],{"class":235},[229,845,846],{"class":266}," redirect",[229,848,270],{"class":239},[229,850,851],{"class":246},"\"https://example.com\"",[229,853,365],{"class":239},[229,855,856],{"class":231,"line":260},[229,857,474],{"class":239},[203,859,860],{},[216,861,218],{},[220,863,865],{"className":222,"code":864,"language":224,"meta":225,"style":225},"app.get(\"/\", () => {\n  return redirect(\"https://example.com\", 301); // Permanent redirect\n});\n",[199,866,867,883,905],{"__ignoreMap":225},[229,868,869,871,873,875,877,879,881],{"class":231,"line":232},[229,870,263],{"class":239},[229,872,267],{"class":266},[229,874,270],{"class":239},[229,876,784],{"class":246},[229,878,787],{"class":239},[229,880,286],{"class":235},[229,882,289],{"class":239},[229,884,885,887,889,891,893,896,899,902],{"class":231,"line":253},[229,886,461],{"class":235},[229,888,846],{"class":266},[229,890,270],{"class":239},[229,892,851],{"class":246},[229,894,895],{"class":239},", ",[229,897,898],{"class":298},"301",[229,900,901],{"class":239},"); ",[229,903,904],{"class":319},"// Permanent redirect\n",[229,906,907],{"class":231,"line":260},[229,908,474],{"class":239},[195,910,912],{"id":911},"writeearlyhintsevent-hints",[199,913,914],{},"writeEarlyHints(event, hints)",[203,916,917,918,921],{},"Write ",[199,919,920],{},"HTTP/1.1 103 Early Hints"," to the client.",[923,924,925],"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 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}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);}",{"title":225,"searchDepth":253,"depth":253,"links":927},[928,931,935,938],{"id":192,"depth":253,"text":193,"children":929},[930],{"id":197,"depth":260,"text":201},{"id":477,"depth":253,"text":478,"children":932},[933,934],{"id":481,"depth":260,"text":484},{"id":490,"depth":260,"text":493},{"id":506,"depth":253,"text":507,"children":936},[937],{"id":510,"depth":260,"text":513},{"id":519,"depth":253,"text":520,"children":939},[940,941,942,943,944],{"id":523,"depth":260,"text":526},{"id":529,"depth":260,"text":532},{"id":755,"depth":260,"text":758},{"id":798,"depth":260,"text":801},{"id":911,"depth":260,"text":914},"H3 response utilities.","md",{"automd":256,"icon":107},{"icon":107},{"title":104,"description":945},"BbVpKbWFRJ9i8_OoZWVmsUPwHHUy3wYCDHIgZm-ZBac",[952,954],{"title":99,"path":100,"stem":101,"description":953,"icon":102,"children":-1},"H3 request utilities.",{"title":109,"path":110,"stem":111,"description":955,"icon":112,"children":-1},"H3 cookie utilities.",1768646388649]