[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-branding":3,"content-de-websocket":8,"public-ads-config":1488},{"siteName":4,"primaryColor":5,"accentColor":6,"faviconUrl":7,"logoUrl":7},"KiroCloud","#ffffff","#888888","",{"id":9,"title":10,"author":11,"body":12,"category":1478,"description":1479,"extension":1480,"lastUpdated":11,"meta":1481,"navigation":385,"order":1483,"path":1484,"readTime":11,"seo":1485,"stem":1486,"__hash__":1487},"docs\u002Fdocs\u002Fde\u002Fwebsocket.md","Websocket Events",null,{"type":13,"value":14,"toc":1468},"minimark",[15,20,29,41,44,49,52,60,65,72,100,104,1249,1251,1253,1257,1263,1269,1273,1422,1424,1428,1431,1465],[16,17,19],"h1",{"id":18},"websocket-events-telemetrie","WebSocket Events & Telemetrie",[21,22,23,24,28],"p",{},"Neben den klassischen Webhooks für serverseitige Benachrichtigungen bietet KiroCloud native ",[25,26,27],"strong",{},"WebSocket","-Verbindungen an. Diese sind ideal, um auf einer Website oder in einem Dashboard Live-Updates (wie CPU-Auslastung oder Konsolenausgaben eines Bots) in Echtzeit darzustellen.",[21,30,31,32,36,37,40],{},"Die WebSocket-API ist direkt unter ",[33,34,35],"code",{},"\u002Fws\u002F"," verfügbar. Im Gegensatz zur HTTP-API wird zur Authentifizierung der JWT-Token im Query-String ",[33,38,39],{},"?token=..."," oder per Cookie übergeben.",[42,43],"hr",{},[45,46,48],"h2",{"id":47},"_1-dashboard-websocket-bot-telemetrie","1. Dashboard WebSocket (Bot-Telemetrie)",[21,50,51],{},"Dieser Endpunkt liefert Live-Daten für einen spezifischen Bot. Das ist nützlich, wenn du ein eigenes Web-Interface für deine Discord Bots bauen möchtest, in dem die User die Live-Konsole ihres Bots sehen können.",[21,53,54,57],{},[25,55,56],{},"Endpunkt:",[33,58,59],{},"wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=DEINE_BOT_ID&token=DEIN_API_TOKEN",[61,62,64],"h3",{"id":63},"unterstützte-events","Unterstützte Events",[21,66,67,68,71],{},"Wenn du dich verbindest, erhältst du sofort ein ",[33,69,70],{},"subscribed"," Event sowie die Log-Historie (falls vorhanden). Danach pusht der Server bei Änderungen folgende Events:",[73,74,75,82,88,94],"ul",{},[76,77,78,81],"li",{},[33,79,80],{},"bot:status"," - Wird gesendet, wenn der Bot online, offline oder abgestürzt ist.",[76,83,84,87],{},[33,85,86],{},"bot:log"," - Jede neue Konsolenausgabe (stdout\u002Fstderr) des Bots.",[76,89,90,93],{},[33,91,92],{},"bot:stats"," - Echtzeit CPU- und RAM-Auslastung des Bots (wird i.d.R. im Sekundentakt gepusht).",[76,95,96,99],{},[33,97,98],{},"bot:log_history"," - Ein Array der letzten Log-Einträge, direkt nach der Verbindung gesendet.",[61,101,103],{"id":102},"beispiel-implementierung-im-frontend-javascript","Beispiel: Implementierung im Frontend (JavaScript)",[105,106,110],"pre",{"className":107,"code":108,"language":109,"meta":7,"style":7},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!DOCTYPE html>\n\u003Chtml lang=\"de\">\n\u003Chead>\n  \u003Cmeta charset=\"UTF-8\">\n  \u003Ctitle>KiroBot Live Konsole\u003C\u002Ftitle>\n  \u003Cstyle>\n    body { background: #111; color: #0f0; font-family: monospace; padding: 20px; }\n    #console { white-space: pre-wrap; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n  \u003Ch2>Live Konsole\u003C\u002Fh2>\n  \u003Cdiv id=\"console\">\u003C\u002Fdiv>\n\n  \u003Cscript>\n    const BOT_ID = '1234567890';\n    \u002F\u002F HINWEIS: Niemals den API-Key dauerhaft im Frontend hardcoden!\n    \u002F\u002F Nutze Cookies oder einen Backend-Proxy in Produktion.\n    const TOKEN = 'DEIN_API_KEY'; \n\n    const ws = new WebSocket(`wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=${BOT_ID}&token=${TOKEN}`);\n\n    const consoleDiv = document.getElementById('console');\n\n    ws.onmessage = (event) => {\n      try {\n        const payload = JSON.parse(event.data);\n        \n        switch (payload.event) {\n          case 'subscribed':\n            console.log('Erfolgreich mit dem Websocket verbunden!');\n            break;\n\n          case 'bot:log_history':\n            \u002F\u002F Initialer Log-Dump\n            payload.data.forEach(logLine => {\n              consoleDiv.textContent += logLine + '\\n';\n            });\n            break;\n\n          case 'bot:log':\n            \u002F\u002F Neue, einzelne Log-Zeile\n            consoleDiv.textContent += payload.data + '\\n';\n            window.scrollTo(0, document.body.scrollHeight);\n            break;\n\n          case 'bot:status':\n            consoleDiv.textContent += `[SYSTEM] Bot Status geändert zu: ${payload.data.status}\\n`;\n            break;\n\n          case 'bot:stats':\n            \u002F\u002F payload.data enthält z.B. { cpu: 2.5, memory: 120 }\n            document.title = `RAM: ${payload.data.memory}MB`;\n            break;\n        }\n      } catch (err) {\n        \u002F\u002F Fallback falls die Daten mal kein JSON sind\n        consoleDiv.textContent += event.data + '\\n';\n      }\n    };\n\n    ws.onerror = (error) => {\n      console.error('WebSocket Error:', error);\n      consoleDiv.textContent += `[WS ERROR] Verbindung fehlgeschlagen.\\n`;\n    };\n\n    ws.onclose = () => {\n      consoleDiv.textContent += `[WS CLOSED] Verbindung getrennt.\\n`;\n    };\n  \u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html",[33,111,112,132,157,167,190,212,222,284,307,317,326,336,354,380,387,397,420,427,433,455,460,511,516,547,552,581,590,622,628,649,664,688,696,701,714,720,744,773,783,790,795,808,814,842,876,883,888,901,939,946,951,964,970,1009,1016,1022,1040,1046,1075,1081,1087,1092,1115,1143,1166,1171,1176,1195,1217,1222,1231,1240],{"__ignoreMap":7},[113,114,117,121,125,129],"span",{"class":115,"line":116},"line",1,[113,118,120],{"class":119},"sMK4o","\u003C!",[113,122,124],{"class":123},"swJcz","DOCTYPE",[113,126,128],{"class":127},"spNyl"," html",[113,130,131],{"class":119},">\n",[113,133,135,138,140,143,146,149,153,155],{"class":115,"line":134},2,[113,136,137],{"class":119},"\u003C",[113,139,109],{"class":123},[113,141,142],{"class":127}," lang",[113,144,145],{"class":119},"=",[113,147,148],{"class":119},"\"",[113,150,152],{"class":151},"sfazB","de",[113,154,148],{"class":119},[113,156,131],{"class":119},[113,158,160,162,165],{"class":115,"line":159},3,[113,161,137],{"class":119},[113,163,164],{"class":123},"head",[113,166,131],{"class":119},[113,168,170,173,176,179,181,183,186,188],{"class":115,"line":169},4,[113,171,172],{"class":119},"  \u003C",[113,174,175],{"class":123},"meta",[113,177,178],{"class":127}," charset",[113,180,145],{"class":119},[113,182,148],{"class":119},[113,184,185],{"class":151},"UTF-8",[113,187,148],{"class":119},[113,189,131],{"class":119},[113,191,193,195,198,201,205,208,210],{"class":115,"line":192},5,[113,194,172],{"class":119},[113,196,197],{"class":123},"title",[113,199,200],{"class":119},">",[113,202,204],{"class":203},"sTEyZ","KiroBot Live Konsole",[113,206,207],{"class":119},"\u003C\u002F",[113,209,197],{"class":123},[113,211,131],{"class":119},[113,213,215,217,220],{"class":115,"line":214},6,[113,216,172],{"class":119},[113,218,219],{"class":123},"style",[113,221,131],{"class":119},[113,223,225,229,232,236,239,242,245,248,251,253,255,258,260,263,265,268,270,273,275,279,281],{"class":115,"line":224},7,[113,226,228],{"class":227},"sBMFI","    body",[113,230,231],{"class":119}," {",[113,233,235],{"class":234},"sqsOY"," background",[113,237,238],{"class":119},":",[113,240,241],{"class":119}," #",[113,243,244],{"class":203},"111",[113,246,247],{"class":119},";",[113,249,250],{"class":234}," color",[113,252,238],{"class":119},[113,254,241],{"class":119},[113,256,257],{"class":203},"0f0",[113,259,247],{"class":119},[113,261,262],{"class":234}," font-family",[113,264,238],{"class":119},[113,266,267],{"class":203}," monospace",[113,269,247],{"class":119},[113,271,272],{"class":234}," padding",[113,274,238],{"class":119},[113,276,278],{"class":277},"sbssI"," 20px",[113,280,247],{"class":119},[113,282,283],{"class":119}," }\n",[113,285,287,290,293,295,298,300,303,305],{"class":115,"line":286},8,[113,288,289],{"class":119},"    #",[113,291,292],{"class":277},"console",[113,294,231],{"class":119},[113,296,297],{"class":234}," white-space",[113,299,238],{"class":119},[113,301,302],{"class":203}," pre-wrap",[113,304,247],{"class":119},[113,306,283],{"class":119},[113,308,310,313,315],{"class":115,"line":309},9,[113,311,312],{"class":119},"  \u003C\u002F",[113,314,219],{"class":123},[113,316,131],{"class":119},[113,318,320,322,324],{"class":115,"line":319},10,[113,321,207],{"class":119},[113,323,164],{"class":123},[113,325,131],{"class":119},[113,327,329,331,334],{"class":115,"line":328},11,[113,330,137],{"class":119},[113,332,333],{"class":123},"body",[113,335,131],{"class":119},[113,337,339,341,343,345,348,350,352],{"class":115,"line":338},12,[113,340,172],{"class":119},[113,342,45],{"class":123},[113,344,200],{"class":119},[113,346,347],{"class":203},"Live Konsole",[113,349,207],{"class":119},[113,351,45],{"class":123},[113,353,131],{"class":119},[113,355,357,359,362,365,367,369,371,373,376,378],{"class":115,"line":356},13,[113,358,172],{"class":119},[113,360,361],{"class":123},"div",[113,363,364],{"class":127}," id",[113,366,145],{"class":119},[113,368,148],{"class":119},[113,370,292],{"class":151},[113,372,148],{"class":119},[113,374,375],{"class":119},">\u003C\u002F",[113,377,361],{"class":123},[113,379,131],{"class":119},[113,381,383],{"class":115,"line":382},14,[113,384,386],{"emptyLinePlaceholder":385},true,"\n",[113,388,390,392,395],{"class":115,"line":389},15,[113,391,172],{"class":119},[113,393,394],{"class":123},"script",[113,396,131],{"class":119},[113,398,400,403,406,408,411,414,417],{"class":115,"line":399},16,[113,401,402],{"class":127},"    const",[113,404,405],{"class":203}," BOT_ID ",[113,407,145],{"class":119},[113,409,410],{"class":119}," '",[113,412,413],{"class":151},"1234567890",[113,415,416],{"class":119},"'",[113,418,419],{"class":119},";\n",[113,421,423],{"class":115,"line":422},17,[113,424,426],{"class":425},"sHwdD","    \u002F\u002F HINWEIS: Niemals den API-Key dauerhaft im Frontend hardcoden!\n",[113,428,430],{"class":115,"line":429},18,[113,431,432],{"class":425},"    \u002F\u002F Nutze Cookies oder einen Backend-Proxy in Produktion.\n",[113,434,436,438,441,443,445,448,450,452],{"class":115,"line":435},19,[113,437,402],{"class":127},[113,439,440],{"class":203}," TOKEN ",[113,442,145],{"class":119},[113,444,410],{"class":119},[113,446,447],{"class":151},"DEIN_API_KEY",[113,449,416],{"class":119},[113,451,247],{"class":119},[113,453,454],{"class":203}," \n",[113,456,458],{"class":115,"line":457},20,[113,459,386],{"emptyLinePlaceholder":385},[113,461,463,465,468,470,473,477,480,483,486,489,492,495,498,500,503,506,509],{"class":115,"line":462},21,[113,464,402],{"class":127},[113,466,467],{"class":203}," ws ",[113,469,145],{"class":119},[113,471,472],{"class":119}," new",[113,474,476],{"class":475},"s2Zo4"," WebSocket",[113,478,479],{"class":203},"(",[113,481,482],{"class":119},"`",[113,484,485],{"class":151},"wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=",[113,487,488],{"class":119},"${",[113,490,491],{"class":203},"BOT_ID",[113,493,494],{"class":119},"}",[113,496,497],{"class":151},"&token=",[113,499,488],{"class":119},[113,501,502],{"class":203},"TOKEN",[113,504,505],{"class":119},"}`",[113,507,508],{"class":203},")",[113,510,419],{"class":119},[113,512,514],{"class":115,"line":513},22,[113,515,386],{"emptyLinePlaceholder":385},[113,517,519,521,524,526,529,532,535,537,539,541,543,545],{"class":115,"line":518},23,[113,520,402],{"class":127},[113,522,523],{"class":203}," consoleDiv ",[113,525,145],{"class":119},[113,527,528],{"class":203}," document",[113,530,531],{"class":119},".",[113,533,534],{"class":475},"getElementById",[113,536,479],{"class":203},[113,538,416],{"class":119},[113,540,292],{"class":151},[113,542,416],{"class":119},[113,544,508],{"class":203},[113,546,419],{"class":119},[113,548,550],{"class":115,"line":549},24,[113,551,386],{"emptyLinePlaceholder":385},[113,553,555,558,560,563,566,569,573,575,578],{"class":115,"line":554},25,[113,556,557],{"class":203},"    ws",[113,559,531],{"class":119},[113,561,562],{"class":475},"onmessage",[113,564,565],{"class":119}," =",[113,567,568],{"class":119}," (",[113,570,572],{"class":571},"sHdIc","event",[113,574,508],{"class":119},[113,576,577],{"class":127}," =>",[113,579,580],{"class":119}," {\n",[113,582,584,588],{"class":115,"line":583},26,[113,585,587],{"class":586},"s7zQu","      try",[113,589,580],{"class":119},[113,591,593,596,599,601,604,606,609,611,613,615,618,620],{"class":115,"line":592},27,[113,594,595],{"class":127},"        const",[113,597,598],{"class":203}," payload",[113,600,565],{"class":119},[113,602,603],{"class":203}," JSON",[113,605,531],{"class":119},[113,607,608],{"class":475},"parse",[113,610,479],{"class":123},[113,612,572],{"class":203},[113,614,531],{"class":119},[113,616,617],{"class":203},"data",[113,619,508],{"class":123},[113,621,419],{"class":119},[113,623,625],{"class":115,"line":624},28,[113,626,627],{"class":123},"        \n",[113,629,631,634,636,639,641,643,646],{"class":115,"line":630},29,[113,632,633],{"class":586},"        switch",[113,635,568],{"class":123},[113,637,638],{"class":203},"payload",[113,640,531],{"class":119},[113,642,572],{"class":203},[113,644,645],{"class":123},") ",[113,647,648],{"class":119},"{\n",[113,650,652,655,657,659,661],{"class":115,"line":651},30,[113,653,654],{"class":586},"          case",[113,656,410],{"class":119},[113,658,70],{"class":151},[113,660,416],{"class":119},[113,662,663],{"class":119},":\n",[113,665,667,670,672,675,677,679,682,684,686],{"class":115,"line":666},31,[113,668,669],{"class":203},"            console",[113,671,531],{"class":119},[113,673,674],{"class":475},"log",[113,676,479],{"class":123},[113,678,416],{"class":119},[113,680,681],{"class":151},"Erfolgreich mit dem Websocket verbunden!",[113,683,416],{"class":119},[113,685,508],{"class":123},[113,687,419],{"class":119},[113,689,691,694],{"class":115,"line":690},32,[113,692,693],{"class":586},"            break",[113,695,419],{"class":119},[113,697,699],{"class":115,"line":698},33,[113,700,386],{"emptyLinePlaceholder":385},[113,702,704,706,708,710,712],{"class":115,"line":703},34,[113,705,654],{"class":586},[113,707,410],{"class":119},[113,709,98],{"class":151},[113,711,416],{"class":119},[113,713,663],{"class":119},[113,715,717],{"class":115,"line":716},35,[113,718,719],{"class":425},"            \u002F\u002F Initialer Log-Dump\n",[113,721,723,726,728,730,732,735,737,740,742],{"class":115,"line":722},36,[113,724,725],{"class":203},"            payload",[113,727,531],{"class":119},[113,729,617],{"class":203},[113,731,531],{"class":119},[113,733,734],{"class":475},"forEach",[113,736,479],{"class":123},[113,738,739],{"class":571},"logLine",[113,741,577],{"class":127},[113,743,580],{"class":119},[113,745,747,750,752,755,758,761,764,766,769,771],{"class":115,"line":746},37,[113,748,749],{"class":203},"              consoleDiv",[113,751,531],{"class":119},[113,753,754],{"class":203},"textContent",[113,756,757],{"class":119}," +=",[113,759,760],{"class":203}," logLine",[113,762,763],{"class":119}," +",[113,765,410],{"class":119},[113,767,768],{"class":203},"\\n",[113,770,416],{"class":119},[113,772,419],{"class":119},[113,774,776,779,781],{"class":115,"line":775},38,[113,777,778],{"class":119},"            }",[113,780,508],{"class":123},[113,782,419],{"class":119},[113,784,786,788],{"class":115,"line":785},39,[113,787,693],{"class":586},[113,789,419],{"class":119},[113,791,793],{"class":115,"line":792},40,[113,794,386],{"emptyLinePlaceholder":385},[113,796,798,800,802,804,806],{"class":115,"line":797},41,[113,799,654],{"class":586},[113,801,410],{"class":119},[113,803,86],{"class":151},[113,805,416],{"class":119},[113,807,663],{"class":119},[113,809,811],{"class":115,"line":810},42,[113,812,813],{"class":425},"            \u002F\u002F Neue, einzelne Log-Zeile\n",[113,815,817,820,822,824,826,828,830,832,834,836,838,840],{"class":115,"line":816},43,[113,818,819],{"class":203},"            consoleDiv",[113,821,531],{"class":119},[113,823,754],{"class":203},[113,825,757],{"class":119},[113,827,598],{"class":203},[113,829,531],{"class":119},[113,831,617],{"class":203},[113,833,763],{"class":119},[113,835,410],{"class":119},[113,837,768],{"class":203},[113,839,416],{"class":119},[113,841,419],{"class":119},[113,843,845,848,850,853,855,858,861,863,865,867,869,872,874],{"class":115,"line":844},44,[113,846,847],{"class":203},"            window",[113,849,531],{"class":119},[113,851,852],{"class":475},"scrollTo",[113,854,479],{"class":123},[113,856,857],{"class":277},"0",[113,859,860],{"class":119},",",[113,862,528],{"class":203},[113,864,531],{"class":119},[113,866,333],{"class":203},[113,868,531],{"class":119},[113,870,871],{"class":203},"scrollHeight",[113,873,508],{"class":123},[113,875,419],{"class":119},[113,877,879,881],{"class":115,"line":878},45,[113,880,693],{"class":586},[113,882,419],{"class":119},[113,884,886],{"class":115,"line":885},46,[113,887,386],{"emptyLinePlaceholder":385},[113,889,891,893,895,897,899],{"class":115,"line":890},47,[113,892,654],{"class":586},[113,894,410],{"class":119},[113,896,80],{"class":151},[113,898,416],{"class":119},[113,900,663],{"class":119},[113,902,904,906,908,910,912,915,918,920,922,924,926,928,931,933,935,937],{"class":115,"line":903},48,[113,905,819],{"class":203},[113,907,531],{"class":119},[113,909,754],{"class":203},[113,911,757],{"class":119},[113,913,914],{"class":119}," `",[113,916,917],{"class":151},"[SYSTEM] Bot Status geändert zu: ",[113,919,488],{"class":119},[113,921,638],{"class":203},[113,923,531],{"class":119},[113,925,617],{"class":203},[113,927,531],{"class":119},[113,929,930],{"class":203},"status",[113,932,494],{"class":119},[113,934,768],{"class":203},[113,936,482],{"class":119},[113,938,419],{"class":119},[113,940,942,944],{"class":115,"line":941},49,[113,943,693],{"class":586},[113,945,419],{"class":119},[113,947,949],{"class":115,"line":948},50,[113,950,386],{"emptyLinePlaceholder":385},[113,952,954,956,958,960,962],{"class":115,"line":953},51,[113,955,654],{"class":586},[113,957,410],{"class":119},[113,959,92],{"class":151},[113,961,416],{"class":119},[113,963,663],{"class":119},[113,965,967],{"class":115,"line":966},52,[113,968,969],{"class":425},"            \u002F\u002F payload.data enthält z.B. { cpu: 2.5, memory: 120 }\n",[113,971,973,976,978,980,982,984,987,989,991,993,995,997,1000,1002,1005,1007],{"class":115,"line":972},53,[113,974,975],{"class":203},"            document",[113,977,531],{"class":119},[113,979,197],{"class":203},[113,981,565],{"class":119},[113,983,914],{"class":119},[113,985,986],{"class":151},"RAM: ",[113,988,488],{"class":119},[113,990,638],{"class":203},[113,992,531],{"class":119},[113,994,617],{"class":203},[113,996,531],{"class":119},[113,998,999],{"class":203},"memory",[113,1001,494],{"class":119},[113,1003,1004],{"class":151},"MB",[113,1006,482],{"class":119},[113,1008,419],{"class":119},[113,1010,1012,1014],{"class":115,"line":1011},54,[113,1013,693],{"class":586},[113,1015,419],{"class":119},[113,1017,1019],{"class":115,"line":1018},55,[113,1020,1021],{"class":119},"        }\n",[113,1023,1025,1028,1031,1033,1036,1038],{"class":115,"line":1024},56,[113,1026,1027],{"class":119},"      }",[113,1029,1030],{"class":586}," catch",[113,1032,568],{"class":123},[113,1034,1035],{"class":203},"err",[113,1037,645],{"class":123},[113,1039,648],{"class":119},[113,1041,1043],{"class":115,"line":1042},57,[113,1044,1045],{"class":425},"        \u002F\u002F Fallback falls die Daten mal kein JSON sind\n",[113,1047,1049,1052,1054,1056,1058,1061,1063,1065,1067,1069,1071,1073],{"class":115,"line":1048},58,[113,1050,1051],{"class":203},"        consoleDiv",[113,1053,531],{"class":119},[113,1055,754],{"class":203},[113,1057,757],{"class":119},[113,1059,1060],{"class":203}," event",[113,1062,531],{"class":119},[113,1064,617],{"class":203},[113,1066,763],{"class":119},[113,1068,410],{"class":119},[113,1070,768],{"class":203},[113,1072,416],{"class":119},[113,1074,419],{"class":119},[113,1076,1078],{"class":115,"line":1077},59,[113,1079,1080],{"class":119},"      }\n",[113,1082,1084],{"class":115,"line":1083},60,[113,1085,1086],{"class":119},"    };\n",[113,1088,1090],{"class":115,"line":1089},61,[113,1091,386],{"emptyLinePlaceholder":385},[113,1093,1095,1097,1099,1102,1104,1106,1109,1111,1113],{"class":115,"line":1094},62,[113,1096,557],{"class":203},[113,1098,531],{"class":119},[113,1100,1101],{"class":475},"onerror",[113,1103,565],{"class":119},[113,1105,568],{"class":119},[113,1107,1108],{"class":571},"error",[113,1110,508],{"class":119},[113,1112,577],{"class":127},[113,1114,580],{"class":119},[113,1116,1118,1121,1123,1125,1127,1129,1132,1134,1136,1139,1141],{"class":115,"line":1117},63,[113,1119,1120],{"class":203},"      console",[113,1122,531],{"class":119},[113,1124,1108],{"class":475},[113,1126,479],{"class":123},[113,1128,416],{"class":119},[113,1130,1131],{"class":151},"WebSocket Error:",[113,1133,416],{"class":119},[113,1135,860],{"class":119},[113,1137,1138],{"class":203}," error",[113,1140,508],{"class":123},[113,1142,419],{"class":119},[113,1144,1146,1149,1151,1153,1155,1157,1160,1162,1164],{"class":115,"line":1145},64,[113,1147,1148],{"class":203},"      consoleDiv",[113,1150,531],{"class":119},[113,1152,754],{"class":203},[113,1154,757],{"class":119},[113,1156,914],{"class":119},[113,1158,1159],{"class":151},"[WS ERROR] Verbindung fehlgeschlagen.",[113,1161,768],{"class":203},[113,1163,482],{"class":119},[113,1165,419],{"class":119},[113,1167,1169],{"class":115,"line":1168},65,[113,1170,1086],{"class":119},[113,1172,1174],{"class":115,"line":1173},66,[113,1175,386],{"emptyLinePlaceholder":385},[113,1177,1179,1181,1183,1186,1188,1191,1193],{"class":115,"line":1178},67,[113,1180,557],{"class":203},[113,1182,531],{"class":119},[113,1184,1185],{"class":475},"onclose",[113,1187,565],{"class":119},[113,1189,1190],{"class":119}," ()",[113,1192,577],{"class":127},[113,1194,580],{"class":119},[113,1196,1198,1200,1202,1204,1206,1208,1211,1213,1215],{"class":115,"line":1197},68,[113,1199,1148],{"class":203},[113,1201,531],{"class":119},[113,1203,754],{"class":203},[113,1205,757],{"class":119},[113,1207,914],{"class":119},[113,1209,1210],{"class":151},"[WS CLOSED] Verbindung getrennt.",[113,1212,768],{"class":203},[113,1214,482],{"class":119},[113,1216,419],{"class":119},[113,1218,1220],{"class":115,"line":1219},69,[113,1221,1086],{"class":119},[113,1223,1225,1227,1229],{"class":115,"line":1224},70,[113,1226,312],{"class":119},[113,1228,394],{"class":123},[113,1230,131],{"class":119},[113,1232,1234,1236,1238],{"class":115,"line":1233},71,[113,1235,207],{"class":119},[113,1237,333],{"class":123},[113,1239,131],{"class":119},[113,1241,1243,1245,1247],{"class":115,"line":1242},72,[113,1244,207],{"class":119},[113,1246,109],{"class":123},[113,1248,131],{"class":119},[42,1250],{},[42,1252],{},[45,1254,1256],{"id":1255},"_2-bot-telemetrie-performance-stream-nodejs-client","2. Bot Telemetrie & Performance Stream (Node.js Client)",[21,1258,1259,1260,531],{},"Für Backend-Dienste, Überwachungstools oder Daemon-Skripte kannst du den WebSocket auch direkt in Node.js konsumieren. Hierfür eignet sich die Standard-Bibliothek ",[33,1261,1262],{},"ws",[21,1264,1265,1267],{},[25,1266,56],{},[33,1268,59],{},[61,1270,1272],{"id":1271},"implementierung-im-backend-nodejs","Implementierung im Backend (Node.js)",[105,1274,1278],{"className":1275,"code":1276,"language":1277,"meta":7,"style":7},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F npm install ws\nimport WebSocket from 'ws';\n\nconst BOT_ID = '00000000-0000-0000-0000-000000000000';\nconst API_TOKEN = 'kiro_sec_DEIN_API_SCHLUESSEL';\nconst ws = new WebSocket(`wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=${BOT_ID}&token=${API_TOKEN}`);\n\nws.on('open', () => {\n  console.log('Mit KiroCloud Telemetrie-Stream verbunden!');\n});\n\nws.on('message', (data) => {\n  const payload = JSON.parse(data.toString());\n  \n  if (payload.event === 'subscribed') {\n    console.log('Abonnement für Bot-Telemetrie aktiv.');\n  } else if (payload.event === 'bot:stats') {\n    console.log(`[BOT STATS] CPU: ${payload.data.cpu}% | RAM: ${payload.data.memory}MB`);\n  } else if (payload.event === 'bot:status') {\n    console.log(`[BOT STATUS] Neuer Status: ${payload.data.status}`);\n  }\n});\n\nws.on('close', (code, reason) => {\n  console.log(`Verbindung geschlossen (${code}):`, reason.toString());\n});\n\nws.on('error', (err) => {\n  console.error('WebSocket Fehler:', err.message);\n});\n","javascript",[33,1279,1280,1285,1290,1294,1299,1304,1309,1313,1318,1323,1328,1332,1337,1342,1347,1352,1357,1362,1367,1372,1377,1382,1386,1390,1395,1400,1404,1408,1413,1418],{"__ignoreMap":7},[113,1281,1282],{"class":115,"line":116},[113,1283,1284],{},"\u002F\u002F npm install ws\n",[113,1286,1287],{"class":115,"line":134},[113,1288,1289],{},"import WebSocket from 'ws';\n",[113,1291,1292],{"class":115,"line":159},[113,1293,386],{"emptyLinePlaceholder":385},[113,1295,1296],{"class":115,"line":169},[113,1297,1298],{},"const BOT_ID = '00000000-0000-0000-0000-000000000000';\n",[113,1300,1301],{"class":115,"line":192},[113,1302,1303],{},"const API_TOKEN = 'kiro_sec_DEIN_API_SCHLUESSEL';\n",[113,1305,1306],{"class":115,"line":214},[113,1307,1308],{},"const ws = new WebSocket(`wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=${BOT_ID}&token=${API_TOKEN}`);\n",[113,1310,1311],{"class":115,"line":224},[113,1312,386],{"emptyLinePlaceholder":385},[113,1314,1315],{"class":115,"line":286},[113,1316,1317],{},"ws.on('open', () => {\n",[113,1319,1320],{"class":115,"line":309},[113,1321,1322],{},"  console.log('Mit KiroCloud Telemetrie-Stream verbunden!');\n",[113,1324,1325],{"class":115,"line":319},[113,1326,1327],{},"});\n",[113,1329,1330],{"class":115,"line":328},[113,1331,386],{"emptyLinePlaceholder":385},[113,1333,1334],{"class":115,"line":338},[113,1335,1336],{},"ws.on('message', (data) => {\n",[113,1338,1339],{"class":115,"line":356},[113,1340,1341],{},"  const payload = JSON.parse(data.toString());\n",[113,1343,1344],{"class":115,"line":382},[113,1345,1346],{},"  \n",[113,1348,1349],{"class":115,"line":389},[113,1350,1351],{},"  if (payload.event === 'subscribed') {\n",[113,1353,1354],{"class":115,"line":399},[113,1355,1356],{},"    console.log('Abonnement für Bot-Telemetrie aktiv.');\n",[113,1358,1359],{"class":115,"line":422},[113,1360,1361],{},"  } else if (payload.event === 'bot:stats') {\n",[113,1363,1364],{"class":115,"line":429},[113,1365,1366],{},"    console.log(`[BOT STATS] CPU: ${payload.data.cpu}% | RAM: ${payload.data.memory}MB`);\n",[113,1368,1369],{"class":115,"line":435},[113,1370,1371],{},"  } else if (payload.event === 'bot:status') {\n",[113,1373,1374],{"class":115,"line":457},[113,1375,1376],{},"    console.log(`[BOT STATUS] Neuer Status: ${payload.data.status}`);\n",[113,1378,1379],{"class":115,"line":462},[113,1380,1381],{},"  }\n",[113,1383,1384],{"class":115,"line":513},[113,1385,1327],{},[113,1387,1388],{"class":115,"line":518},[113,1389,386],{"emptyLinePlaceholder":385},[113,1391,1392],{"class":115,"line":549},[113,1393,1394],{},"ws.on('close', (code, reason) => {\n",[113,1396,1397],{"class":115,"line":554},[113,1398,1399],{},"  console.log(`Verbindung geschlossen (${code}):`, reason.toString());\n",[113,1401,1402],{"class":115,"line":583},[113,1403,1327],{},[113,1405,1406],{"class":115,"line":592},[113,1407,386],{"emptyLinePlaceholder":385},[113,1409,1410],{"class":115,"line":624},[113,1411,1412],{},"ws.on('error', (err) => {\n",[113,1414,1415],{"class":115,"line":630},[113,1416,1417],{},"  console.error('WebSocket Fehler:', err.message);\n",[113,1419,1420],{"class":115,"line":651},[113,1421,1327],{},[42,1423],{},[45,1425,1427],{"id":1426},"_3-fehlerbehebung-statuscodes","3. Fehlerbehebung & Statuscodes",[21,1429,1430],{},"Sollte die WebSocket-Verbindung sofort nach dem Öffnen wieder getrennt werden, liefert der WebSocket Close Code die Ursache:",[73,1432,1433,1443,1459],{},[76,1434,1435,1438,1439,1442],{},[33,1436,1437],{},"1008 Policy Violation"," mit ",[33,1440,1441],{},"invalid token",": Der übergebene API-Schlüssel ist ungültig, abgelaufen oder hat keinen Zugriff auf die angeforderte Bot-Instanz.",[76,1444,1445,1438,1447,1450,1451,1454,1455,1458],{},[33,1446,1437],{},[33,1448,1449],{},"token+botId required",": Der Pflichtparameter ",[33,1452,1453],{},"botId"," oder ",[33,1456,1457],{},"token"," fehlt in der Verbindungs-URL.",[76,1460,1461,1464],{},[33,1462,1463],{},"1001 Going Away",": Die Bot-Instanz wurde neu gestartet; der Client sollte nach 2 Sekunden eine automatische Wiederverbindung versuchen.",[219,1466,1467],{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":7,"searchDepth":134,"depth":134,"links":1469},[1470,1474,1477],{"id":47,"depth":134,"text":48,"children":1471},[1472,1473],{"id":63,"depth":159,"text":64},{"id":102,"depth":159,"text":103},{"id":1255,"depth":134,"text":1256,"children":1475},[1476],{"id":1271,"depth":159,"text":1272},{"id":1426,"depth":134,"text":1427},"api","Verbinde dich mit den KiroCloud WebSockets für Echtzeit-Telemetrie und Live-Logs.","md",{"icon":1482},"i-lucide-radio",0,"\u002Fdocs\u002Fde\u002Fwebsocket",{"title":10,"description":1479},"docs\u002Fde\u002Fwebsocket","NgWPgRygjzTPay-3tP1LRZCPOBmOaPatYnut4JBJkVY",{"enabled":385,"clientPubId":1489,"docsSlotId":7,"newsSlotId":7,"guidesSlotId":7,"dashboardSlotId":7,"docsEnabled":385,"newsEnabled":385,"guidesEnabled":385,"dashboardEnabled":385},"ca-pub-9454065621077312"]