[{"data":1,"prerenderedAt":1308},["ShallowReactive",2],{"navigation":3,"-guide-advanced-websocket":189,"-guide-advanced-websocket-surround":1304},[4,91,138,166,173],{"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,133],{"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},"MCP","/utils/mcp","2.utils/6.mcp","material-symbols:swap-calls",{"title":129,"path":130,"stem":131,"icon":132},"More utils","/utils/more","2.utils/9.more","mingcute:plus-line",{"title":134,"path":135,"stem":136,"icon":137},"Community","/utils/community","2.utils/99.community","lets-icons:external",{"title":139,"path":140,"stem":141,"children":142,"icon":144},"Examples","/examples","4.examples/0.index",[143,145,150,154,158,162],{"title":139,"path":140,"stem":141,"icon":144},"ph:code",{"title":146,"path":147,"stem":148,"icon":149},"Cookies","/examples/handle-cookie","4.examples/handle-cookie","ph:arrow-right",{"title":151,"path":152,"stem":153,"icon":149},"Sessions","/examples/handle-session","4.examples/handle-session",{"title":155,"path":156,"stem":157,"icon":149},"Static Assets","/examples/serve-static-assets","4.examples/serve-static-assets",{"title":159,"path":160,"stem":161,"icon":149},"Stream Response","/examples/stream-response","4.examples/stream-response",{"title":163,"path":164,"stem":165,"icon":149},"Validate Data","/examples/validate-data","4.examples/validate-data",{"title":167,"path":168,"stem":169,"children":170,"icon":172},"Migration","/migration","5.migration/0.index",[171],{"title":167,"path":168,"stem":169,"icon":172},"icons8:up-round",{"title":174,"path":175,"stem":176,"children":177},"Blog","/blog","99.blog",[178,181,185],{"title":174,"path":175,"stem":179,"icon":180},"99.blog/index","i-lucide-file-text",{"title":182,"path":183,"stem":184,"icon":180},"H3 1.8 - Towards the Edge of the Web","/blog/v1.8","99.blog/1.v1.8",{"title":186,"path":187,"stem":188,"icon":180},"H3 v2 beta","/blog/v2-beta","99.blog/2.v2-beta",{"id":190,"title":81,"body":191,"description":1298,"extension":1299,"meta":1300,"navigation":1301,"path":82,"seo":1302,"stem":83,"__hash__":1303},"content/1.guide/901.advanced/2.websocket.md",{"type":192,"value":193,"toc":1292,"icon":84},"minimark",[194,206,212,217,225,236,419,425,1041,1045,1053,1060,1065,1288],[195,196,197,198,205],"p",{},"You can add cross platform WebSocket support to H3 servers using ",[199,200,204],"a",{"href":201,"rel":202},"https://crossws.h3.dev/",[203],"nofollow","🔌 CrossWS",".",[207,208,209],"important",{},[195,210,211],{},"\nBuilt-in support of WebSockets in h3 version is WIP.",[213,214,216],"h2",{"id":215},"usage","Usage",[195,218,219,220,224],{},"WebSocket handlers can be defined using the ",[221,222,223],"code",{},"defineWebSocketHandler()"," utility and registered to any route like event handlers.",[195,226,227,228,231,232,235],{},"You need to register CrossWS as a server plugin in the ",[221,229,230],{},"serve"," function and provide a ",[221,233,234],{},"resolve"," function to resolve the correct hooks from the route.",[237,238,243],"pre",{"className":239,"code":240,"language":241,"meta":242,"style":242},"language-js shiki shiki-themes github-light github-dark github-dark","import { H3, serve, defineWebSocketHandler } from \"h3\";\n\nimport { plugin as ws } from \"crossws/server\";\n\nconst app = new H3();\n\napp.get(\"/_ws\", defineWebSocketHandler({ message: console.log }));\n\nserve(app, {\n  plugins: [ws({ resolve: async (req) => (await app.fetch(req)).crossws })],\n});\n","js","",[221,244,245,268,275,296,301,324,329,353,358,366,413],{"__ignoreMap":242},[246,247,250,254,258,261,265],"span",{"class":248,"line":249},"line",1,[246,251,253],{"class":252},"so5gQ","import",[246,255,257],{"class":256},"slsVL"," { H3, serve, defineWebSocketHandler } ",[246,259,260],{"class":252},"from",[246,262,264],{"class":263},"sfrk1"," \"h3\"",[246,266,267],{"class":256},";\n",[246,269,271],{"class":248,"line":270},2,[246,272,274],{"emptyLinePlaceholder":273},true,"\n",[246,276,278,280,283,286,289,291,294],{"class":248,"line":277},3,[246,279,253],{"class":252},[246,281,282],{"class":256}," { plugin ",[246,284,285],{"class":252},"as",[246,287,288],{"class":256}," ws } ",[246,290,260],{"class":252},[246,292,293],{"class":263}," \"crossws/server\"",[246,295,267],{"class":256},[246,297,299],{"class":248,"line":298},4,[246,300,274],{"emptyLinePlaceholder":273},[246,302,304,307,311,314,317,321],{"class":248,"line":303},5,[246,305,306],{"class":252},"const",[246,308,310],{"class":309},"suiK_"," app",[246,312,313],{"class":252}," =",[246,315,316],{"class":252}," new",[246,318,320],{"class":319},"shcOC"," H3",[246,322,323],{"class":256},"();\n",[246,325,327],{"class":248,"line":326},6,[246,328,274],{"emptyLinePlaceholder":273},[246,330,332,335,338,341,344,347,350],{"class":248,"line":331},7,[246,333,334],{"class":256},"app.",[246,336,337],{"class":319},"get",[246,339,340],{"class":256},"(",[246,342,343],{"class":263},"\"/_ws\"",[246,345,346],{"class":256},", ",[246,348,349],{"class":319},"defineWebSocketHandler",[246,351,352],{"class":256},"({ message: console.log }));\n",[246,354,356],{"class":248,"line":355},8,[246,357,274],{"emptyLinePlaceholder":273},[246,359,361,363],{"class":248,"line":360},9,[246,362,230],{"class":319},[246,364,365],{"class":256},"(app, {\n",[246,367,369,372,375,378,380,383,386,389,393,396,399,401,404,407,410],{"class":248,"line":368},10,[246,370,371],{"class":256},"  plugins: [",[246,373,374],{"class":319},"ws",[246,376,377],{"class":256},"({ ",[246,379,234],{"class":319},[246,381,382],{"class":256},": ",[246,384,385],{"class":252},"async",[246,387,388],{"class":256}," (",[246,390,392],{"class":391},"sQHwn","req",[246,394,395],{"class":256},") ",[246,397,398],{"class":252},"=>",[246,400,388],{"class":256},[246,402,403],{"class":252},"await",[246,405,406],{"class":256}," app.",[246,408,409],{"class":319},"fetch",[246,411,412],{"class":256},"(req)).crossws })],\n",[246,414,416],{"class":248,"line":415},11,[246,417,418],{"class":256},"});\n",[195,420,421],{},[422,423,424],"strong",{},"Full example:",[237,426,429],{"className":239,"code":427,"filename":428,"language":241,"meta":242,"style":242},"import { H3, serve, defineWebSocketHandler } from \"h3\";\nimport { plugin as ws } from \"crossws/server\";\n\nexport const app = new H3();\n\nconst demoURL =\n  \"https://raw.githubusercontent.com/h3js/crossws/refs/heads/main/playground/public/index.html\";\n\napp.get(\"/\", () =>\n  fetch(demoURL).then(\n    (res) => new Response(res.body, { headers: { \"Content-Type\": \"text/html\" } }),\n  ),\n);\n\napp.get(\n  \"/_ws\",\n  defineWebSocketHandler({\n    // upgrade(req) {},\n    open(peer) {\n      console.log(\"[open]\", peer);\n\n      // Send welcome to the new client\n      peer.send(\"Welcome to the server!\");\n\n      // Join new client to the \"chat\" channel\n      peer.subscribe(\"chat\");\n\n      // Notify every other connected client\n      peer.publish(\"chat\", `[system] ${peer} joined!`);\n    },\n\n    message(peer, message) {\n      console.log(\"[message]\", peer);\n\n      if (message.text() === \"ping\") {\n        // Reply to the client with a ping response\n        peer.send(\"pong\");\n        return;\n      }\n\n      // The server re-broadcasts incoming messages to everyone\n      peer.publish(\"chat\", `[${peer}] ${message}`);\n\n      // Echo the message back to the sender\n      peer.send(message);\n    },\n\n    close(peer) {\n      console.log(\"[close]\", peer);\n      peer.publish(\"chat\", `[system] ${peer} has left the chat!`);\n      peer.unsubscribe(\"chat\");\n    },\n  }),\n);\n\nserve(app, {\n  plugins: [ws({ resolve: async (req) => (await app.fetch(req)).crossws })],\n});\n","websocket.mjs",[221,430,431,443,459,463,481,485,495,502,506,523,537,568,574,580,585,594,603,612,619,633,650,655,661,677,682,688,703,708,714,738,744,749,766,780,785,808,814,829,837,843,848,854,882,887,893,903,908,913,925,939,961,975,980,986,991,996,1003,1036],{"__ignoreMap":242},[246,432,433,435,437,439,441],{"class":248,"line":249},[246,434,253],{"class":252},[246,436,257],{"class":256},[246,438,260],{"class":252},[246,440,264],{"class":263},[246,442,267],{"class":256},[246,444,445,447,449,451,453,455,457],{"class":248,"line":270},[246,446,253],{"class":252},[246,448,282],{"class":256},[246,450,285],{"class":252},[246,452,288],{"class":256},[246,454,260],{"class":252},[246,456,293],{"class":263},[246,458,267],{"class":256},[246,460,461],{"class":248,"line":277},[246,462,274],{"emptyLinePlaceholder":273},[246,464,465,468,471,473,475,477,479],{"class":248,"line":298},[246,466,467],{"class":252},"export",[246,469,470],{"class":252}," const",[246,472,310],{"class":309},[246,474,313],{"class":252},[246,476,316],{"class":252},[246,478,320],{"class":319},[246,480,323],{"class":256},[246,482,483],{"class":248,"line":303},[246,484,274],{"emptyLinePlaceholder":273},[246,486,487,489,492],{"class":248,"line":326},[246,488,306],{"class":252},[246,490,491],{"class":309}," demoURL",[246,493,494],{"class":252}," =\n",[246,496,497,500],{"class":248,"line":331},[246,498,499],{"class":263},"  \"https://raw.githubusercontent.com/h3js/crossws/refs/heads/main/playground/public/index.html\"",[246,501,267],{"class":256},[246,503,504],{"class":248,"line":355},[246,505,274],{"emptyLinePlaceholder":273},[246,507,508,510,512,514,517,520],{"class":248,"line":360},[246,509,334],{"class":256},[246,511,337],{"class":319},[246,513,340],{"class":256},[246,515,516],{"class":263},"\"/\"",[246,518,519],{"class":256},", () ",[246,521,522],{"class":252},"=>\n",[246,524,525,528,531,534],{"class":248,"line":368},[246,526,527],{"class":319},"  fetch",[246,529,530],{"class":256},"(demoURL).",[246,532,533],{"class":319},"then",[246,535,536],{"class":256},"(\n",[246,538,539,542,545,547,549,551,554,557,560,562,565],{"class":248,"line":415},[246,540,541],{"class":256},"    (",[246,543,544],{"class":391},"res",[246,546,395],{"class":256},[246,548,398],{"class":252},[246,550,316],{"class":252},[246,552,553],{"class":319}," Response",[246,555,556],{"class":256},"(res.body, { headers: { ",[246,558,559],{"class":263},"\"Content-Type\"",[246,561,382],{"class":256},[246,563,564],{"class":263},"\"text/html\"",[246,566,567],{"class":256}," } }),\n",[246,569,571],{"class":248,"line":570},12,[246,572,573],{"class":256},"  ),\n",[246,575,577],{"class":248,"line":576},13,[246,578,579],{"class":256},");\n",[246,581,583],{"class":248,"line":582},14,[246,584,274],{"emptyLinePlaceholder":273},[246,586,588,590,592],{"class":248,"line":587},15,[246,589,334],{"class":256},[246,591,337],{"class":319},[246,593,536],{"class":256},[246,595,597,600],{"class":248,"line":596},16,[246,598,599],{"class":263},"  \"/_ws\"",[246,601,602],{"class":256},",\n",[246,604,606,609],{"class":248,"line":605},17,[246,607,608],{"class":319},"  defineWebSocketHandler",[246,610,611],{"class":256},"({\n",[246,613,615],{"class":248,"line":614},18,[246,616,618],{"class":617},"sCsY4","    // upgrade(req) {},\n",[246,620,622,625,627,630],{"class":248,"line":621},19,[246,623,624],{"class":319},"    open",[246,626,340],{"class":256},[246,628,629],{"class":391},"peer",[246,631,632],{"class":256},") {\n",[246,634,636,639,642,644,647],{"class":248,"line":635},20,[246,637,638],{"class":256},"      console.",[246,640,641],{"class":319},"log",[246,643,340],{"class":256},[246,645,646],{"class":263},"\"[open]\"",[246,648,649],{"class":256},", peer);\n",[246,651,653],{"class":248,"line":652},21,[246,654,274],{"emptyLinePlaceholder":273},[246,656,658],{"class":248,"line":657},22,[246,659,660],{"class":617},"      // Send welcome to the new client\n",[246,662,664,667,670,672,675],{"class":248,"line":663},23,[246,665,666],{"class":256},"      peer.",[246,668,669],{"class":319},"send",[246,671,340],{"class":256},[246,673,674],{"class":263},"\"Welcome to the server!\"",[246,676,579],{"class":256},[246,678,680],{"class":248,"line":679},24,[246,681,274],{"emptyLinePlaceholder":273},[246,683,685],{"class":248,"line":684},25,[246,686,687],{"class":617},"      // Join new client to the \"chat\" channel\n",[246,689,691,693,696,698,701],{"class":248,"line":690},26,[246,692,666],{"class":256},[246,694,695],{"class":319},"subscribe",[246,697,340],{"class":256},[246,699,700],{"class":263},"\"chat\"",[246,702,579],{"class":256},[246,704,706],{"class":248,"line":705},27,[246,707,274],{"emptyLinePlaceholder":273},[246,709,711],{"class":248,"line":710},28,[246,712,713],{"class":617},"      // Notify every other connected client\n",[246,715,717,719,722,724,726,728,731,733,736],{"class":248,"line":716},29,[246,718,666],{"class":256},[246,720,721],{"class":319},"publish",[246,723,340],{"class":256},[246,725,700],{"class":263},[246,727,346],{"class":256},[246,729,730],{"class":263},"`[system] ${",[246,732,629],{"class":256},[246,734,735],{"class":263},"} joined!`",[246,737,579],{"class":256},[246,739,741],{"class":248,"line":740},30,[246,742,743],{"class":256},"    },\n",[246,745,747],{"class":248,"line":746},31,[246,748,274],{"emptyLinePlaceholder":273},[246,750,752,755,757,759,761,764],{"class":248,"line":751},32,[246,753,754],{"class":319},"    message",[246,756,340],{"class":256},[246,758,629],{"class":391},[246,760,346],{"class":256},[246,762,763],{"class":391},"message",[246,765,632],{"class":256},[246,767,769,771,773,775,778],{"class":248,"line":768},33,[246,770,638],{"class":256},[246,772,641],{"class":319},[246,774,340],{"class":256},[246,776,777],{"class":263},"\"[message]\"",[246,779,649],{"class":256},[246,781,783],{"class":248,"line":782},34,[246,784,274],{"emptyLinePlaceholder":273},[246,786,788,791,794,797,800,803,806],{"class":248,"line":787},35,[246,789,790],{"class":252},"      if",[246,792,793],{"class":256}," (message.",[246,795,796],{"class":319},"text",[246,798,799],{"class":256},"() ",[246,801,802],{"class":252},"===",[246,804,805],{"class":263}," \"ping\"",[246,807,632],{"class":256},[246,809,811],{"class":248,"line":810},36,[246,812,813],{"class":617},"        // Reply to the client with a ping response\n",[246,815,817,820,822,824,827],{"class":248,"line":816},37,[246,818,819],{"class":256},"        peer.",[246,821,669],{"class":319},[246,823,340],{"class":256},[246,825,826],{"class":263},"\"pong\"",[246,828,579],{"class":256},[246,830,832,835],{"class":248,"line":831},38,[246,833,834],{"class":252},"        return",[246,836,267],{"class":256},[246,838,840],{"class":248,"line":839},39,[246,841,842],{"class":256},"      }\n",[246,844,846],{"class":248,"line":845},40,[246,847,274],{"emptyLinePlaceholder":273},[246,849,851],{"class":248,"line":850},41,[246,852,853],{"class":617},"      // The server re-broadcasts incoming messages to everyone\n",[246,855,857,859,861,863,865,867,870,872,875,877,880],{"class":248,"line":856},42,[246,858,666],{"class":256},[246,860,721],{"class":319},[246,862,340],{"class":256},[246,864,700],{"class":263},[246,866,346],{"class":256},[246,868,869],{"class":263},"`[${",[246,871,629],{"class":256},[246,873,874],{"class":263},"}] ${",[246,876,763],{"class":256},[246,878,879],{"class":263},"}`",[246,881,579],{"class":256},[246,883,885],{"class":248,"line":884},43,[246,886,274],{"emptyLinePlaceholder":273},[246,888,890],{"class":248,"line":889},44,[246,891,892],{"class":617},"      // Echo the message back to the sender\n",[246,894,896,898,900],{"class":248,"line":895},45,[246,897,666],{"class":256},[246,899,669],{"class":319},[246,901,902],{"class":256},"(message);\n",[246,904,906],{"class":248,"line":905},46,[246,907,743],{"class":256},[246,909,911],{"class":248,"line":910},47,[246,912,274],{"emptyLinePlaceholder":273},[246,914,916,919,921,923],{"class":248,"line":915},48,[246,917,918],{"class":319},"    close",[246,920,340],{"class":256},[246,922,629],{"class":391},[246,924,632],{"class":256},[246,926,928,930,932,934,937],{"class":248,"line":927},49,[246,929,638],{"class":256},[246,931,641],{"class":319},[246,933,340],{"class":256},[246,935,936],{"class":263},"\"[close]\"",[246,938,649],{"class":256},[246,940,942,944,946,948,950,952,954,956,959],{"class":248,"line":941},50,[246,943,666],{"class":256},[246,945,721],{"class":319},[246,947,340],{"class":256},[246,949,700],{"class":263},[246,951,346],{"class":256},[246,953,730],{"class":263},[246,955,629],{"class":256},[246,957,958],{"class":263},"} has left the chat!`",[246,960,579],{"class":256},[246,962,964,966,969,971,973],{"class":248,"line":963},51,[246,965,666],{"class":256},[246,967,968],{"class":319},"unsubscribe",[246,970,340],{"class":256},[246,972,700],{"class":263},[246,974,579],{"class":256},[246,976,978],{"class":248,"line":977},52,[246,979,743],{"class":256},[246,981,983],{"class":248,"line":982},53,[246,984,985],{"class":256},"  }),\n",[246,987,989],{"class":248,"line":988},54,[246,990,579],{"class":256},[246,992,994],{"class":248,"line":993},55,[246,995,274],{"emptyLinePlaceholder":273},[246,997,999,1001],{"class":248,"line":998},56,[246,1000,230],{"class":319},[246,1002,365],{"class":256},[246,1004,1006,1008,1010,1012,1014,1016,1018,1020,1022,1024,1026,1028,1030,1032,1034],{"class":248,"line":1005},57,[246,1007,371],{"class":256},[246,1009,374],{"class":319},[246,1011,377],{"class":256},[246,1013,234],{"class":319},[246,1015,382],{"class":256},[246,1017,385],{"class":252},[246,1019,388],{"class":256},[246,1021,392],{"class":391},[246,1023,395],{"class":256},[246,1025,398],{"class":252},[246,1027,388],{"class":256},[246,1029,403],{"class":252},[246,1031,406],{"class":256},[246,1033,409],{"class":319},[246,1035,412],{"class":256},[246,1037,1039],{"class":248,"line":1038},58,[246,1040,418],{"class":256},[213,1042,1044],{"id":1043},"server-sent-events-sse","Server-Sent Events (SSE)",[195,1046,1047,1048,205],{},"As an alternative to WebSockets, you can use ",[199,1049,1052],{"href":1050,"rel":1051},"https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events",[203],"Server-sent events",[195,1054,1055,1056,1059],{},"H3 has a built-in API to create server-sent events using ",[221,1057,1058],{},"createEventStream(event)"," utility.",[1061,1062,1064],"h3",{"id":1063},"example","Example",[237,1066,1069],{"className":239,"code":1067,"filename":1068,"language":241,"meta":242,"style":242},"import { H3, serve, createEventStream } from \"h3\";\n\nexport const app = new H3();\n\napp.get(\"/\", (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 when the connection is terminated or the writer is closed\n  eventStream.onClosed(() => {\n    console.log(\"Connection closed\");\n    clearInterval(interval);\n  });\n\n  return eventStream.send();\n});\n\nserve(app);\n","server-sent-events.mjs",[221,1070,1071,1084,1088,1104,1108,1131,1147,1151,1156,1179,1197,1207,1211,1216,1231,1245,1253,1258,1262,1273,1277,1281],{"__ignoreMap":242},[246,1072,1073,1075,1078,1080,1082],{"class":248,"line":249},[246,1074,253],{"class":252},[246,1076,1077],{"class":256}," { H3, serve, createEventStream } ",[246,1079,260],{"class":252},[246,1081,264],{"class":263},[246,1083,267],{"class":256},[246,1085,1086],{"class":248,"line":270},[246,1087,274],{"emptyLinePlaceholder":273},[246,1089,1090,1092,1094,1096,1098,1100,1102],{"class":248,"line":277},[246,1091,467],{"class":252},[246,1093,470],{"class":252},[246,1095,310],{"class":309},[246,1097,313],{"class":252},[246,1099,316],{"class":252},[246,1101,320],{"class":319},[246,1103,323],{"class":256},[246,1105,1106],{"class":248,"line":298},[246,1107,274],{"emptyLinePlaceholder":273},[246,1109,1110,1112,1114,1116,1118,1121,1124,1126,1128],{"class":248,"line":303},[246,1111,334],{"class":256},[246,1113,337],{"class":319},[246,1115,340],{"class":256},[246,1117,516],{"class":263},[246,1119,1120],{"class":256},", (",[246,1122,1123],{"class":391},"event",[246,1125,395],{"class":256},[246,1127,398],{"class":252},[246,1129,1130],{"class":256}," {\n",[246,1132,1133,1136,1139,1141,1144],{"class":248,"line":326},[246,1134,1135],{"class":252},"  const",[246,1137,1138],{"class":309}," eventStream",[246,1140,313],{"class":252},[246,1142,1143],{"class":319}," createEventStream",[246,1145,1146],{"class":256},"(event);\n",[246,1148,1149],{"class":248,"line":331},[246,1150,274],{"emptyLinePlaceholder":273},[246,1152,1153],{"class":248,"line":355},[246,1154,1155],{"class":617},"  // Send a message every second\n",[246,1157,1158,1160,1163,1165,1168,1170,1172,1175,1177],{"class":248,"line":360},[246,1159,1135],{"class":252},[246,1161,1162],{"class":309}," interval",[246,1164,313],{"class":252},[246,1166,1167],{"class":319}," setInterval",[246,1169,340],{"class":256},[246,1171,385],{"class":252},[246,1173,1174],{"class":256}," () ",[246,1176,398],{"class":252},[246,1178,1130],{"class":256},[246,1180,1181,1184,1187,1190,1192,1195],{"class":248,"line":368},[246,1182,1183],{"class":252},"    await",[246,1185,1186],{"class":256}," eventStream.",[246,1188,1189],{"class":319},"push",[246,1191,340],{"class":256},[246,1193,1194],{"class":263},"\"Hello world\"",[246,1196,579],{"class":256},[246,1198,1199,1202,1205],{"class":248,"line":415},[246,1200,1201],{"class":256},"  }, ",[246,1203,1204],{"class":309},"1000",[246,1206,579],{"class":256},[246,1208,1209],{"class":248,"line":570},[246,1210,274],{"emptyLinePlaceholder":273},[246,1212,1213],{"class":248,"line":576},[246,1214,1215],{"class":617},"  // cleanup the interval when the connection is terminated or the writer is closed\n",[246,1217,1218,1221,1224,1227,1229],{"class":248,"line":582},[246,1219,1220],{"class":256},"  eventStream.",[246,1222,1223],{"class":319},"onClosed",[246,1225,1226],{"class":256},"(() ",[246,1228,398],{"class":252},[246,1230,1130],{"class":256},[246,1232,1233,1236,1238,1240,1243],{"class":248,"line":587},[246,1234,1235],{"class":256},"    console.",[246,1237,641],{"class":319},[246,1239,340],{"class":256},[246,1241,1242],{"class":263},"\"Connection closed\"",[246,1244,579],{"class":256},[246,1246,1247,1250],{"class":248,"line":596},[246,1248,1249],{"class":319},"    clearInterval",[246,1251,1252],{"class":256},"(interval);\n",[246,1254,1255],{"class":248,"line":605},[246,1256,1257],{"class":256},"  });\n",[246,1259,1260],{"class":248,"line":614},[246,1261,274],{"emptyLinePlaceholder":273},[246,1263,1264,1267,1269,1271],{"class":248,"line":621},[246,1265,1266],{"class":252},"  return",[246,1268,1186],{"class":256},[246,1270,669],{"class":319},[246,1272,323],{"class":256},[246,1274,1275],{"class":248,"line":635},[246,1276,418],{"class":256},[246,1278,1279],{"class":248,"line":652},[246,1280,274],{"emptyLinePlaceholder":273},[246,1282,1283,1285],{"class":248,"line":657},[246,1284,230],{"class":319},[246,1286,1287],{"class":256},"(app);\n",[1289,1290,1291],"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 .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}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 .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":242,"searchDepth":270,"depth":270,"links":1293},[1294,1295],{"id":215,"depth":270,"text":216},{"id":1043,"depth":270,"text":1044,"children":1296},[1297],{"id":1063,"depth":277,"text":1064},"H3 has built-in utilities for cross platform WebSocket and Server-Sent Events.","md",{"automd":273,"icon":84},{"icon":84},{"title":81,"description":1298},"p0K7K9qPFRAcTvOnunvvOa0AefdAGfYIKC959RApr1k",[1305,1307],{"title":76,"path":77,"stem":78,"description":1306,"icon":79,"children":-1},"H3 plugins allow you to extend an H3 app instance with reusable logic.",{"title":86,"path":87,"stem":88,"description":242,"icon":89,"children":-1},1773004785173]