[{"data":1,"prerenderedAt":850},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Fwebsockets-durable-objects-tempo-real":129},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11],{"title":5,"path":6,"stem":7,"icon":10},"i-ph-squares-four-duotone",{"title":12,"path":13,"stem":14,"children":15,"icon":18},"Flow Videos","\u002Fdocs\u002Fflow-videos","docs\u002Fflow-videos\u002F0.index",[16,19,36,67,93],{"title":17,"path":13,"stem":14,"icon":18},"Serelius Flow Video","i-ph-video-camera-duotone",{"title":20,"icon":21,"path":22,"stem":23,"children":24,"page":35},"Getting Started","i-ph-rocket-launch-duotone","\u002Fdocs\u002Fflow-videos\u002Fgetting-started","docs\u002Fflow-videos\u002F1.getting-started",[25,30],{"title":26,"path":27,"stem":28,"icon":29},"Overview","\u002Fdocs\u002Fflow-videos\u002Fgetting-started\u002Foverview","docs\u002Fflow-videos\u002F1.getting-started\u002F0.overview","i-ph-play-circle-duotone",{"title":31,"path":32,"stem":33,"icon":34},"Global Features","\u002Fdocs\u002Fflow-videos\u002Fgetting-started\u002Fglobal-features","docs\u002Fflow-videos\u002F1.getting-started\u002F1.global-features","i-ph-gear-six-duotone",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Pipeline","i-ph-film-strip-duotone","\u002Fdocs\u002Fflow-videos\u002Fpipeline","docs\u002Fflow-videos\u002F2.pipeline",[42,47,52,57,62],{"title":43,"path":44,"stem":45,"icon":46},"Phase 1 — Script","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Fscript","docs\u002Fflow-videos\u002F2.pipeline\u002F1.script","i-ph-scroll-duotone",{"title":48,"path":49,"stem":50,"icon":51},"Phase 2 — Style & Identity","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Fstyle-and-identity","docs\u002Fflow-videos\u002F2.pipeline\u002F2.style-and-identity","i-ph-palette-duotone",{"title":53,"path":54,"stem":55,"icon":56},"Phase 3 — Storyboard","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Fstoryboard","docs\u002Fflow-videos\u002F2.pipeline\u002F3.storyboard","i-ph-image-duotone",{"title":58,"path":59,"stem":60,"icon":61},"Phase 4 — Videos","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Fvideos","docs\u002Fflow-videos\u002F2.pipeline\u002F4.videos","i-ph-video-duotone",{"title":63,"path":64,"stem":65,"icon":66},"Phase 5 — Final Assembly","\u002Fdocs\u002Fflow-videos\u002Fpipeline\u002Ffinal-assembly","docs\u002Fflow-videos\u002F2.pipeline\u002F5.final-assembly","i-ph-scissors-duotone",{"title":68,"icon":69,"path":70,"stem":71,"children":72,"page":35},"Settings & Models","i-ph-sliders-duotone","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models","docs\u002Fflow-videos\u002F3.settings-and-models",[73,78,83,88],{"title":74,"path":75,"stem":76,"icon":77},"Settings","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models\u002Fsettings","docs\u002Fflow-videos\u002F3.settings-and-models\u002F0.settings","i-ph-sliders-horizontal-duotone",{"title":79,"path":80,"stem":81,"icon":82},"AI Models & Limits","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models\u002Fmodels-and-limits","docs\u002Fflow-videos\u002F3.settings-and-models\u002F1.models-and-limits","i-ph-cpu-duotone",{"title":84,"path":85,"stem":86,"icon":87},"Option Catalogs","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models\u002Fcatalogs","docs\u002Fflow-videos\u002F3.settings-and-models\u002F2.catalogs","i-ph-list-bullets-duotone",{"title":89,"path":90,"stem":91,"icon":92},"Pipeline Calibration","\u002Fdocs\u002Fflow-videos\u002Fsettings-and-models\u002Fcalibration","docs\u002Fflow-videos\u002F3.settings-and-models\u002F3.calibration","i-ph-gauge-duotone",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":35},"Reference","i-ph-book-open-duotone","\u002Fdocs\u002Fflow-videos\u002Freference","docs\u002Fflow-videos\u002F4.reference",[99,104,109,114,119,124],{"title":100,"path":101,"stem":102,"icon":103},"Delivered Files","\u002Fdocs\u002Fflow-videos\u002Freference\u002Fdelivered-files","docs\u002Fflow-videos\u002F4.reference\u002F0.delivered-files","i-ph-folder-duotone",{"title":105,"path":106,"stem":107,"icon":108},"Supported Video Types","\u002Fdocs\u002Fflow-videos\u002Freference\u002Fvideo-types","docs\u002Fflow-videos\u002F4.reference\u002F1.video-types","i-ph-television-duotone",{"title":110,"path":111,"stem":112,"icon":113},"What the Tool Does NOT Do","\u002Fdocs\u002Fflow-videos\u002Freference\u002Flimitations","docs\u002Fflow-videos\u002F4.reference\u002F2.limitations","i-ph-prohibit-duotone",{"title":115,"path":116,"stem":117,"icon":118},"Business Models","\u002Fdocs\u002Fflow-videos\u002Freference\u002Fbusiness-models","docs\u002Fflow-videos\u002F4.reference\u002F3.business-models","i-ph-briefcase-duotone",{"title":120,"path":121,"stem":122,"icon":123},"FAQ & Glossary","\u002Fdocs\u002Fflow-videos\u002Freference\u002Ffaq-and-glossary","docs\u002Fflow-videos\u002F4.reference\u002F4.faq-and-glossary","i-ph-question-duotone",{"title":125,"path":126,"stem":127,"icon":128},"Technical and Architectural Audit","\u002Fdocs\u002Fflow-videos\u002Freference\u002Faudit","docs\u002Fflow-videos\u002F4.reference\u002F5.audit","i-ph-shield-check-duotone",{"id":130,"title":131,"author":132,"authorType":133,"body":134,"category":828,"date":829,"description":830,"extension":831,"image":832,"lang":833,"meta":834,"navigation":558,"ogImage":835,"path":836,"readTime":837,"seo":838,"stem":839,"tags":840,"translations":845,"updated":133,"__hash__":849},"blog\u002Fblog\u002Fwebsockets-durable-objects-tempo-real.md","WebSockets em Tempo Real sem Redis: Usando Cloudflare Durable Objects no Nuxt 4","Equipe Nuxfire",null,{"type":135,"value":136,"toc":822},"minimark",[137,141,144,157,169,172,177,184,191,202,204,208,211,225,475,477,481,484,795,797,801,804,809,818],[138,139,140],"p",{},"Construir funcionalidades em tempo real (como notificações instantâneas, cursores colaborativos ou dashboards ao vivo) sempre foi um dos maiores pesadelos em arquiteturas serverless.",[138,142,143],{},"Tradicionalmente, a receita para suportar WebSockets exigia:",[145,146,147,151,154],"ol",{},[148,149,150],"li",{},"Um cluster de servidores Node.js dedicados sempre ligados.",[148,152,153],{},"Um cluster Redis com Pub\u002FSub para sincronizar mensagens entre instâncias.",[148,155,156],{},"Um balanceador de carga configurado para conexões persistentes (Sticky Sessions).",[138,158,159,160,164,165,168],{},"O custo mensal dessa infraestrutura mínima raramente ficava abaixo de centenas de dólares. O ",[161,162,163],"strong",{},"Nuxfire"," resolve esse desafio utilizando ",[161,166,167],{},"Cloudflare Durable Objects",".",[170,171],"hr",{},[173,174,176],"h2",{"id":175},"o-que-são-cloudflare-durable-objects","O que são Cloudflare Durable Objects?",[138,178,179,180,183],{},"Durable Objects fornecem computação serverless com ",[161,181,182],{},"estado coordenado",". Cada objeto roda como uma instância única na rede global da Cloudflare, garantindo que todas as conexões para o mesmo \"canal\" ou \"sala\" cheguem ao mesmo processo de memória.",[138,185,186,187,190],{},"Além disso, cada Durable Object possui seu próprio banco ",[161,188,189],{},"SQLite embarcado",", permitindo persistir o histórico de mensagens com latência abaixo de 1 milissegundo.",[192,193,198],"pre",{"className":194,"code":196,"language":197},[195],"language-text","[Usuário A (Navegador)] ──WebSockets──> ┌────────────────────────────────┐\n                                       │ Cloudflare Durable Object      │\n[Usuário B (Navegador)] ──WebSockets──> │ - Estado de conexões em RAM    │\n                                       │ - Banco SQLite Embarcado       │\n[Webhook \u002F Worker Backend] ──Fetch────> └────────────────────────────────┘\n","text",[199,200,196],"code",{"__ignoreMap":201},"",[170,203],{},[173,205,207],{"id":206},"segurança-robusta-handshake-com-tickets-assinados-por-hmac","Segurança Robusta: Handshake com Tickets Assinados por HMAC",[138,209,210],{},"Conexões WebSockets não transmitem headers HTTP normais após o handshake inicial. Para garantir segurança máxima contra conexões forjadas, o Nuxfire utiliza tickets assinados criptograficamente:",[145,212,213,216,219,222],{},[148,214,215],{},"O cliente faz uma requisição HTTP autenticada solicitando um ticket de conexão.",[148,217,218],{},"O servidor gera um token com HMAC assinado usando a chave secreta da aplicação e com validade de 60 segundos.",[148,220,221],{},"O cliente abre a conexão WebSocket passando o ticket na query string.",[148,223,224],{},"O Durable Object valida a assinatura antes de aceitar o handshake.",[192,226,230],{"className":227,"code":228,"language":229,"meta":201,"style":201},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u002F\u002F Gerando o ticket assinado no endpoint de autenticação\nexport function generateWebSocketTicket(userId: string, workspaceId: string) {\n  const expiresAt = Date.now() + 60 * 1000;\n  const payload = `${userId}:${workspaceId}:${expiresAt}`;\n  const signature = createHmac(\"sha256\", env.WS_SECRET).update(payload).digest(\"hex\");\n  return `${payload}:${signature}`;\n}\n","typescript",[199,231,232,241,288,330,377,442,469],{"__ignoreMap":201},[233,234,237],"span",{"class":235,"line":236},"line",1,[233,238,240],{"class":239},"ss7Ak","\u002F\u002F Gerando o ticket assinado no endpoint de autenticação\n",[233,242,244,248,252,256,260,264,268,272,275,278,280,282,285],{"class":235,"line":243},2,[233,245,247],{"class":246},"sRxSC","export",[233,249,251],{"class":250},"srJo8"," function",[233,253,255],{"class":254},"sD0ED"," generateWebSocketTicket",[233,257,259],{"class":258},"swvn1","(",[233,261,263],{"class":262},"sQgqH","userId",[233,265,267],{"class":266},"sGXK2",":",[233,269,271],{"class":270},"s_MOj"," string",[233,273,274],{"class":258},",",[233,276,277],{"class":262}," workspaceId",[233,279,267],{"class":266},[233,281,271],{"class":270},[233,283,284],{"class":258},")",[233,286,287],{"class":258}," {\n",[233,289,291,294,298,301,305,307,310,314,317,321,324,327],{"class":235,"line":290},3,[233,292,293],{"class":250},"  const",[233,295,297],{"class":296},"s91G_"," expiresAt",[233,299,300],{"class":266}," =",[233,302,304],{"class":303},"ss--_"," Date",[233,306,168],{"class":258},[233,308,309],{"class":254},"now",[233,311,313],{"class":312},"squCx","() ",[233,315,316],{"class":266},"+",[233,318,320],{"class":319},"sYThS"," 60",[233,322,323],{"class":266}," *",[233,325,326],{"class":319}," 1000",[233,328,329],{"class":258},";\n",[233,331,333,335,338,340,344,348,350,353,356,358,361,363,365,367,370,372,375],{"class":235,"line":332},4,[233,334,293],{"class":250},[233,336,337],{"class":296}," payload",[233,339,300],{"class":266},[233,341,343],{"class":342},"siCPE"," `",[233,345,347],{"class":346},"slF1C","${",[233,349,263],{"class":303},[233,351,352],{"class":346},"}",[233,354,267],{"class":355},"sLACW",[233,357,347],{"class":346},[233,359,360],{"class":303},"workspaceId",[233,362,352],{"class":346},[233,364,267],{"class":355},[233,366,347],{"class":346},[233,368,369],{"class":303},"expiresAt",[233,371,352],{"class":346},[233,373,374],{"class":342},"`",[233,376,329],{"class":258},[233,378,380,382,385,387,390,392,395,398,400,402,405,407,410,412,414,417,419,422,424,426,429,431,433,436,438,440],{"class":235,"line":379},5,[233,381,293],{"class":250},[233,383,384],{"class":296}," signature",[233,386,300],{"class":266},[233,388,389],{"class":254}," createHmac",[233,391,259],{"class":312},[233,393,394],{"class":342},"\"",[233,396,397],{"class":355},"sha256",[233,399,394],{"class":342},[233,401,274],{"class":258},[233,403,404],{"class":303}," env",[233,406,168],{"class":258},[233,408,409],{"class":296},"WS_SECRET",[233,411,284],{"class":312},[233,413,168],{"class":258},[233,415,416],{"class":254},"update",[233,418,259],{"class":312},[233,420,421],{"class":303},"payload",[233,423,284],{"class":312},[233,425,168],{"class":258},[233,427,428],{"class":254},"digest",[233,430,259],{"class":312},[233,432,394],{"class":342},[233,434,435],{"class":355},"hex",[233,437,394],{"class":342},[233,439,284],{"class":312},[233,441,329],{"class":258},[233,443,445,448,450,452,454,456,458,460,463,465,467],{"class":235,"line":444},6,[233,446,447],{"class":246},"  return",[233,449,343],{"class":342},[233,451,347],{"class":346},[233,453,421],{"class":303},[233,455,352],{"class":346},[233,457,267],{"class":355},[233,459,347],{"class":346},[233,461,462],{"class":303},"signature",[233,464,352],{"class":346},[233,466,374],{"class":342},[233,468,329],{"class":258},[233,470,472],{"class":235,"line":471},7,[233,473,474],{"class":258},"}\n",[170,476],{},[173,478,480],{"id":479},"consumindo-no-frontend-com-nuxt-composables","Consumindo no Frontend com Nuxt Composables",[138,482,483],{},"No lado do cliente Nuxt 4, conectar-se ao canal da equipe é tão simples quanto usar um composable nativo:",[192,485,489],{"className":486,"code":487,"language":488,"meta":201,"style":201},"language-vue shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u003Cscript setup lang=\"ts\">\nconst { messages, status, send } = useTeamWebSockets();\n\nfunction handleNotify() {\n  send({ type: \"TEAM_PING\", content: \"Nova tarefa criada no quadro!\" });\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003CUBadge :color=\"status === 'OPEN' ? 'success' : 'neutral'\">\n      {{ status === 'OPEN' ? 'Tempo Real Ativo' : 'Reconectando...' }}\n    \u003C\u002FUBadge>\n    \u003Cdiv v-for=\"msg in messages\" :key=\"msg.id\">\n      {{ msg.content }}\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","vue",[199,490,491,520,554,560,572,615,619,628,633,643,654,712,718,728,761,767,776,786],{"__ignoreMap":201},[233,492,493,496,500,504,507,510,512,515,517],{"class":235,"line":236},[233,494,495],{"class":258},"\u003C",[233,497,499],{"class":498},"sHsBP","script",[233,501,503],{"class":502},"s_lYk"," setup",[233,505,506],{"class":502}," lang",[233,508,509],{"class":258},"=",[233,511,394],{"class":342},[233,513,514],{"class":355},"ts",[233,516,394],{"class":342},[233,518,519],{"class":258},">\n",[233,521,522,525,528,531,533,536,538,541,544,546,549,552],{"class":235,"line":243},[233,523,524],{"class":250},"const",[233,526,527],{"class":258}," {",[233,529,530],{"class":296}," messages",[233,532,274],{"class":258},[233,534,535],{"class":296}," status",[233,537,274],{"class":258},[233,539,540],{"class":296}," send",[233,542,543],{"class":258}," }",[233,545,300],{"class":266},[233,547,548],{"class":254}," useTeamWebSockets",[233,550,551],{"class":303},"()",[233,553,329],{"class":258},[233,555,556],{"class":235,"line":290},[233,557,559],{"emptyLinePlaceholder":558},true,"\n",[233,561,562,565,568,570],{"class":235,"line":332},[233,563,564],{"class":250},"function",[233,566,567],{"class":254}," handleNotify",[233,569,551],{"class":258},[233,571,287],{"class":258},[233,573,574,577,579,582,585,587,590,593,595,597,600,602,604,607,609,611,613],{"class":235,"line":379},[233,575,576],{"class":254},"  send",[233,578,259],{"class":312},[233,580,581],{"class":258},"{",[233,583,584],{"class":312}," type",[233,586,267],{"class":258},[233,588,589],{"class":342}," \"",[233,591,592],{"class":355},"TEAM_PING",[233,594,394],{"class":342},[233,596,274],{"class":258},[233,598,599],{"class":312}," content",[233,601,267],{"class":258},[233,603,589],{"class":342},[233,605,606],{"class":355},"Nova tarefa criada no quadro!",[233,608,394],{"class":342},[233,610,543],{"class":258},[233,612,284],{"class":312},[233,614,329],{"class":258},[233,616,617],{"class":235,"line":444},[233,618,474],{"class":258},[233,620,621,624,626],{"class":235,"line":471},[233,622,623],{"class":258},"\u003C\u002F",[233,625,499],{"class":498},[233,627,519],{"class":258},[233,629,631],{"class":235,"line":630},8,[233,632,559],{"emptyLinePlaceholder":558},[233,634,636,638,641],{"class":235,"line":635},9,[233,637,495],{"class":258},[233,639,640],{"class":498},"template",[233,642,519],{"class":258},[233,644,646,649,652],{"class":235,"line":645},10,[233,647,648],{"class":258},"  \u003C",[233,650,651],{"class":498},"div",[233,653,519],{"class":258},[233,655,657,660,663,666,669,671,674,677,680,683,686,689,692,694,697,699,701,703,706,708,710],{"class":235,"line":656},11,[233,658,659],{"class":258},"    \u003C",[233,661,662],{"class":498},"UBadge",[233,664,665],{"class":258}," :",[233,667,668],{"class":502},"color",[233,670,509],{"class":258},[233,672,394],{"class":673},"s00De",[233,675,676],{"class":303},"status",[233,678,679],{"class":266}," ===",[233,681,682],{"class":342}," '",[233,684,685],{"class":355},"OPEN",[233,687,688],{"class":342},"'",[233,690,691],{"class":266}," ?",[233,693,682],{"class":342},[233,695,696],{"class":355},"success",[233,698,688],{"class":342},[233,700,665],{"class":266},[233,702,682],{"class":342},[233,704,705],{"class":355},"neutral",[233,707,688],{"class":342},[233,709,394],{"class":673},[233,711,519],{"class":258},[233,713,715],{"class":235,"line":714},12,[233,716,717],{"class":303},"      {{ status === 'OPEN' ? 'Tempo Real Ativo' : 'Reconectando...' }}\n",[233,719,721,724,726],{"class":235,"line":720},13,[233,722,723],{"class":258},"    \u003C\u002F",[233,725,662],{"class":498},[233,727,519],{"class":258},[233,729,731,733,735,738,740,742,745,747,750,752,754,757,759],{"class":235,"line":730},14,[233,732,659],{"class":258},[233,734,651],{"class":498},[233,736,737],{"class":502}," v-for",[233,739,509],{"class":258},[233,741,394],{"class":342},[233,743,744],{"class":355},"msg in messages",[233,746,394],{"class":342},[233,748,749],{"class":502}," :key",[233,751,509],{"class":258},[233,753,394],{"class":342},[233,755,756],{"class":355},"msg.id",[233,758,394],{"class":342},[233,760,519],{"class":258},[233,762,764],{"class":235,"line":763},15,[233,765,766],{"class":303},"      {{ msg.content }}\n",[233,768,770,772,774],{"class":235,"line":769},16,[233,771,723],{"class":258},[233,773,651],{"class":498},[233,775,519],{"class":258},[233,777,779,782,784],{"class":235,"line":778},17,[233,780,781],{"class":258},"  \u003C\u002F",[233,783,651],{"class":498},[233,785,519],{"class":258},[233,787,789,791,793],{"class":235,"line":788},18,[233,790,623],{"class":258},[233,792,640],{"class":498},[233,794,519],{"class":258},[170,796],{},[173,798,800],{"id":799},"conclusão-tempo-real-de-nível-enterprise-ao-seu-alcance","Conclusão: Tempo Real de Nível Enterprise ao seu Alcance",[138,802,803],{},"Com os Durable Objects, você elimina completamente os custos de servidores Redis e Socket.io, aproveitando a rede global da Cloudflare para entregar uma experiência ultra-rápida aos seus usuários.",[138,805,806,807,168],{},"Todo esse fluxo — desde os workers de backend até os composables reativos do Nuxt — já vem 100% implementado e testado no ",[161,808,163],{},[138,810,811],{},[812,813,815],"a",{"href":814},"\u002Fpt-br#pricing",[161,816,817],{},"Garanta sua licença vitalícia e baixe o código agora mesmo →",[819,820,821],"style",{},"html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sQgqH, html code.shiki .sQgqH{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s_MOj, html code.shiki .s_MOj{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .s91G_, html code.shiki .s91G_{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .squCx, html code.shiki .squCx{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sYThS, html code.shiki .sYThS{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .slF1C, html code.shiki .slF1C{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#F92672}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}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 .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sHsBP, html code.shiki .sHsBP{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D;--shiki-sepia:#F92672}html pre.shiki code .s_lYk, html code.shiki .s_lYk{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s00De, html code.shiki .s00De{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#F8F8F2}",{"title":201,"searchDepth":243,"depth":243,"links":823},[824,825,826,827],{"id":175,"depth":243,"text":176},{"id":206,"depth":243,"text":207},{"id":479,"depth":243,"text":480},{"id":799,"depth":243,"text":800},"Tempo Real & WebSockets","2026-09-15","Descubra como criar notificações instantâneas e colaboração multiusuário sem servidores Socket.io dedicados nem instâncias caras de Redis, usando Durable Objects.","md","\u002Fimages\u002Fblog\u002Fwebsockets-durable-objects.svg","pt-br",{},"\u002Fimages\u002Fblog\u002Fwebsockets-durable-objects.png","\u002Fblog\u002Fwebsockets-durable-objects-tempo-real","6 min",{"title":131,"description":830},"blog\u002Fwebsockets-durable-objects-tempo-real",[841,842,843,844],"WebSockets","Durable Objects","Cloudflare","Tempo Real",{"en":846,"pt-br":847,"es":848},"realtime-websockets-durable-objects","websockets-durable-objects-tempo-real","websockets-durable-objects-tiempo-real","i7LafJa5zYzXcuoT8dhVznqlIj_7k6-TjGi1mq_fcuc",1794055340475]