[{"data":1,"prerenderedAt":1294},["ShallowReactive",2],{"navigation":3,"\u002Fextensions\u002Fwebsocket":65,"\u002Fextensions\u002Fwebsocket-surround":1289},[4,25,50],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Building FrankenPHP","\u002Fgetting-started\u002Fbuilding-frankenphp","1.getting-started\u002F3.building-frankenphp","i-lucide-hammer",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Extensions","\u002Fextensions","2.extensions",[30,35,40,45],{"title":31,"path":32,"stem":33,"icon":34},"Queue","\u002Fextensions\u002Fqueue","2.extensions\u002F1.queue","i-lucide-list-checks",{"title":36,"path":37,"stem":38,"icon":39},"Scheduler","\u002Fextensions\u002Fscheduler","2.extensions\u002F2.scheduler","i-lucide-calendar-clock",{"title":41,"path":42,"stem":43,"icon":44},"Pogo","\u002Fextensions\u002Fpogo","2.extensions\u002F3.pogo","i-lucide-split",{"title":46,"path":47,"stem":48,"icon":49},"WebSocket","\u002Fextensions\u002Fwebsocket","2.extensions\u002F4.websocket","i-lucide-radio",{"title":51,"icon":6,"path":52,"stem":53,"children":54,"page":6},"Reference","\u002Freference","3.reference",[55,60],{"title":56,"path":57,"stem":58,"icon":59},"Caddy Reference","\u002Freference\u002Fcaddy","3.reference\u002F1.caddy","i-lucide-settings-2",{"title":61,"path":62,"stem":63,"icon":64},"PHP API","\u002Freference\u002Fphp-api","3.reference\u002F2.php-api","i-lucide-file-code-2",{"id":66,"title":46,"body":67,"description":1282,"extension":1283,"links":1284,"meta":1285,"navigation":1286,"path":47,"seo":1287,"stem":48,"__hash__":1288},"docs\u002F2.extensions\u002F4.websocket.md",{"type":68,"value":69,"toc":1272},"minimark",[70,75,79,82,101,105,108,111,122,125,133,137,140,196,199,226,230,547,561,565,568,620,623,655,658,1031,1034,1049,1052,1172,1178,1182,1212,1216,1268],[71,72,74],"h2",{"id":73},"overview","Overview",[76,77,78],"p",{},"Pogo WebSocket embeds a Pusher-compatible WebSocket server into FrankenPHP.",[76,80,81],{},"It provides:",[83,84,85,89,92,95,98],"ul",{},[86,87,88],"li",{},"a Caddy HTTP handler for WebSocket connections,",[86,90,91],{},"PHP native publish functions,",[86,93,94],{},"a Laravel broadcasting driver,",[86,96,97],{},"private and presence channel auth through a dedicated FrankenPHP auth worker,",[86,99,100],{},"optional Redis Pub\u002FSub for multi-node fanout.",[71,102,104],{"id":103},"status-and-fit","Status and fit",[76,106,107],{},"Pogo WebSocket is experimental. It is suitable for demos, local testing, and controlled evaluation of a FrankenPHP-native realtime runtime.",[76,109,110],{},"Use it when:",[83,112,113,116,119],{},[86,114,115],{},"You want to evaluate Pusher-style broadcasting without a separate Node.js or hosted realtime service.",[86,117,118],{},"Your client can use Laravel Echo or the Pusher protocol subset.",[86,120,121],{},"At-most-once realtime delivery is acceptable.",[76,123,124],{},"Avoid presenting it as a drop-in production replacement for Laravel Reverb, Pusher, or hosted realtime systems until you validate behavior, benchmarks, and failure modes for your topology.",[76,126,127,128,132],{},"Supported protocol behavior includes connection establishment, ping\u002Fpong, public\u002Fprivate\u002Fpresence subscriptions, client events on private and presence channels, and ",[129,130,131],"code",{},"pusher:signin",".",[71,134,136],{"id":135},"build","Build",[76,138,139],{},"Compile the module into FrankenPHP:",[141,142,148],"pre",{"className":143,"code":144,"filename":145,"language":146,"meta":147,"style":147},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","xcaddy build \\\n  --with github.com\u002Fdunglas\u002Ffrankenphp@v1.12.3 \\\n  --with github.com\u002Fdunglas\u002Ffrankenphp\u002Fcaddy@v1.12.3 \\\n  --with github.com\u002Fy-l-g\u002Fwebsocket\u002Fmodule@main\n","Terminal","bash","",[129,149,150,167,178,188],{"__ignoreMap":147},[151,152,155,159,163],"span",{"class":153,"line":154},"line",1,[151,156,158],{"class":157},"sBMFI","xcaddy",[151,160,162],{"class":161},"sfazB"," build",[151,164,166],{"class":165},"sTEyZ"," \\\n",[151,168,170,173,176],{"class":153,"line":169},2,[151,171,172],{"class":161},"  --with",[151,174,175],{"class":161}," github.com\u002Fdunglas\u002Ffrankenphp@v1.12.3",[151,177,166],{"class":165},[151,179,181,183,186],{"class":153,"line":180},3,[151,182,172],{"class":161},[151,184,185],{"class":161}," github.com\u002Fdunglas\u002Ffrankenphp\u002Fcaddy@v1.12.3",[151,187,166],{"class":165},[151,189,191,193],{"class":153,"line":190},4,[151,192,172],{"class":161},[151,194,195],{"class":161}," github.com\u002Fy-l-g\u002Fwebsocket\u002Fmodule@main\n",[76,197,198],{},"Install the Laravel driver:",[141,200,202],{"className":143,"code":201,"filename":145,"language":146,"meta":147,"style":147},"composer require pogo\u002Fwebsocket\nphp artisan pogo:ws-install\n",[129,203,204,215],{"__ignoreMap":147},[151,205,206,209,212],{"class":153,"line":154},[151,207,208],{"class":157},"composer",[151,210,211],{"class":161}," require",[151,213,214],{"class":161}," pogo\u002Fwebsocket\n",[151,216,217,220,223],{"class":153,"line":169},[151,218,219],{"class":157},"php",[151,221,222],{"class":161}," artisan",[151,224,225],{"class":161}," pogo:ws-install\n",[71,227,229],{"id":228},"caddy-configuration","Caddy configuration",[141,231,236],{"className":232,"code":233,"filename":234,"language":235,"meta":147,"style":147},"language-caddyfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  frankenphp {\n    worker {\n      file public\u002Ffrankenphp-worker.php\n    }\n  }\n\n  order pogo_websocket before php_server\n}\n\n:8080 {\n  route \u002Fapp\u002F* {\n    pogo_websocket {\n      app_id pogo-app\n      app_secret {$WS_APP_SECRET}\n      auth_path \u002Fpogo\u002Fauth\n      auth_script public\u002Fwebsocket-worker.php\n      webhook_secret {$POGO_WEBHOOK_SECRET}\n      allowed_origins https:\u002F\u002Fapp.example.com https:\u002F\u002Fadmin.example.com\n\n      handshake_rate 100\n      handshake_burst 50\n      max_connections 10000\n      max_auth_body 16384\n      max_concurrent_auth 100\n      broker_queue_size 1024\n      shard_queue_size 1024\n\n      num_workers 2\n      num_shards 8\n\n      ping_period 54s\n      pong_wait 60s\n      write_wait 10s\n      shutdown_timeout 10s\n\n      # redis_host redis:6379\n      # redis_password {$REDIS_PASSWORD}\n      # redis_db 0\n      # redis_tls false\n    }\n  }\n\n  route {\n    root * public\n    encode zstd br gzip\n\n    php_server {\n      index frankenphp-worker.php\n      try_files {path} frankenphp-worker.php\n      resolve_root_symlink\n    }\n  }\n}\n","Caddyfile","caddyfile",[129,237,238,243,248,253,258,264,270,277,283,289,294,300,306,312,318,324,330,336,342,348,353,359,365,371,377,383,389,395,400,406,412,417,423,429,435,441,446,452,458,464,470,475,480,485,491,497,503,508,514,520,526,532,537,542],{"__ignoreMap":147},[151,239,240],{"class":153,"line":154},[151,241,242],{},"{\n",[151,244,245],{"class":153,"line":169},[151,246,247],{},"  frankenphp {\n",[151,249,250],{"class":153,"line":180},[151,251,252],{},"    worker {\n",[151,254,255],{"class":153,"line":190},[151,256,257],{},"      file public\u002Ffrankenphp-worker.php\n",[151,259,261],{"class":153,"line":260},5,[151,262,263],{},"    }\n",[151,265,267],{"class":153,"line":266},6,[151,268,269],{},"  }\n",[151,271,273],{"class":153,"line":272},7,[151,274,276],{"emptyLinePlaceholder":275},true,"\n",[151,278,280],{"class":153,"line":279},8,[151,281,282],{},"  order pogo_websocket before php_server\n",[151,284,286],{"class":153,"line":285},9,[151,287,288],{},"}\n",[151,290,292],{"class":153,"line":291},10,[151,293,276],{"emptyLinePlaceholder":275},[151,295,297],{"class":153,"line":296},11,[151,298,299],{},":8080 {\n",[151,301,303],{"class":153,"line":302},12,[151,304,305],{},"  route \u002Fapp\u002F* {\n",[151,307,309],{"class":153,"line":308},13,[151,310,311],{},"    pogo_websocket {\n",[151,313,315],{"class":153,"line":314},14,[151,316,317],{},"      app_id pogo-app\n",[151,319,321],{"class":153,"line":320},15,[151,322,323],{},"      app_secret {$WS_APP_SECRET}\n",[151,325,327],{"class":153,"line":326},16,[151,328,329],{},"      auth_path \u002Fpogo\u002Fauth\n",[151,331,333],{"class":153,"line":332},17,[151,334,335],{},"      auth_script public\u002Fwebsocket-worker.php\n",[151,337,339],{"class":153,"line":338},18,[151,340,341],{},"      webhook_secret {$POGO_WEBHOOK_SECRET}\n",[151,343,345],{"class":153,"line":344},19,[151,346,347],{},"      allowed_origins https:\u002F\u002Fapp.example.com https:\u002F\u002Fadmin.example.com\n",[151,349,351],{"class":153,"line":350},20,[151,352,276],{"emptyLinePlaceholder":275},[151,354,356],{"class":153,"line":355},21,[151,357,358],{},"      handshake_rate 100\n",[151,360,362],{"class":153,"line":361},22,[151,363,364],{},"      handshake_burst 50\n",[151,366,368],{"class":153,"line":367},23,[151,369,370],{},"      max_connections 10000\n",[151,372,374],{"class":153,"line":373},24,[151,375,376],{},"      max_auth_body 16384\n",[151,378,380],{"class":153,"line":379},25,[151,381,382],{},"      max_concurrent_auth 100\n",[151,384,386],{"class":153,"line":385},26,[151,387,388],{},"      broker_queue_size 1024\n",[151,390,392],{"class":153,"line":391},27,[151,393,394],{},"      shard_queue_size 1024\n",[151,396,398],{"class":153,"line":397},28,[151,399,276],{"emptyLinePlaceholder":275},[151,401,403],{"class":153,"line":402},29,[151,404,405],{},"      num_workers 2\n",[151,407,409],{"class":153,"line":408},30,[151,410,411],{},"      num_shards 8\n",[151,413,415],{"class":153,"line":414},31,[151,416,276],{"emptyLinePlaceholder":275},[151,418,420],{"class":153,"line":419},32,[151,421,422],{},"      ping_period 54s\n",[151,424,426],{"class":153,"line":425},33,[151,427,428],{},"      pong_wait 60s\n",[151,430,432],{"class":153,"line":431},34,[151,433,434],{},"      write_wait 10s\n",[151,436,438],{"class":153,"line":437},35,[151,439,440],{},"      shutdown_timeout 10s\n",[151,442,444],{"class":153,"line":443},36,[151,445,276],{"emptyLinePlaceholder":275},[151,447,449],{"class":153,"line":448},37,[151,450,451],{},"      # redis_host redis:6379\n",[151,453,455],{"class":153,"line":454},38,[151,456,457],{},"      # redis_password {$REDIS_PASSWORD}\n",[151,459,461],{"class":153,"line":460},39,[151,462,463],{},"      # redis_db 0\n",[151,465,467],{"class":153,"line":466},40,[151,468,469],{},"      # redis_tls false\n",[151,471,473],{"class":153,"line":472},41,[151,474,263],{},[151,476,478],{"class":153,"line":477},42,[151,479,269],{},[151,481,483],{"class":153,"line":482},43,[151,484,276],{"emptyLinePlaceholder":275},[151,486,488],{"class":153,"line":487},44,[151,489,490],{},"  route {\n",[151,492,494],{"class":153,"line":493},45,[151,495,496],{},"    root * public\n",[151,498,500],{"class":153,"line":499},46,[151,501,502],{},"    encode zstd br gzip\n",[151,504,506],{"class":153,"line":505},47,[151,507,276],{"emptyLinePlaceholder":275},[151,509,511],{"class":153,"line":510},48,[151,512,513],{},"    php_server {\n",[151,515,517],{"class":153,"line":516},49,[151,518,519],{},"      index frankenphp-worker.php\n",[151,521,523],{"class":153,"line":522},50,[151,524,525],{},"      try_files {path} frankenphp-worker.php\n",[151,527,529],{"class":153,"line":528},51,[151,530,531],{},"      resolve_root_symlink\n",[151,533,535],{"class":153,"line":534},52,[151,536,263],{},[151,538,540],{"class":153,"line":539},53,[151,541,269],{},[151,543,545],{"class":153,"line":544},54,[151,546,288],{},[76,548,549,550,553,554,556,557,560],{},"By default, WebSocket upgrades accept requests without an ",[129,551,552],{},"Origin"," header and browser requests whose ",[129,555,552],{}," host matches the request host. Configure ",[129,558,559],{},"allowed_origins"," when your frontend connects from a different origin.",[71,562,564],{"id":563},"application-integration","Application integration",[76,566,567],{},"Set Laravel environment variables:",[141,569,574],{"className":570,"code":571,"filename":572,"language":573,"meta":147,"style":147},"language-dotenv shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","BROADCAST_CONNECTION=pogo\nWS_APP_ID=pogo-app\nWS_APP_SECRET=change-me-to-a-long-random-secret\nPOGO_WEBHOOK_SECRET=change-me-to-a-different-random-secret\n\nVITE_POGO_APP_KEY=\"${WS_APP_ID}\"\nVITE_POGO_HOST=localhost\nVITE_POGO_PORT=80\nVITE_POGO_WSS_PORT=443\n",".env","dotenv",[129,575,576,581,586,591,596,600,605,610,615],{"__ignoreMap":147},[151,577,578],{"class":153,"line":154},[151,579,580],{},"BROADCAST_CONNECTION=pogo\n",[151,582,583],{"class":153,"line":169},[151,584,585],{},"WS_APP_ID=pogo-app\n",[151,587,588],{"class":153,"line":180},[151,589,590],{},"WS_APP_SECRET=change-me-to-a-long-random-secret\n",[151,592,593],{"class":153,"line":190},[151,594,595],{},"POGO_WEBHOOK_SECRET=change-me-to-a-different-random-secret\n",[151,597,598],{"class":153,"line":260},[151,599,276],{"emptyLinePlaceholder":275},[151,601,602],{"class":153,"line":266},[151,603,604],{},"VITE_POGO_APP_KEY=\"${WS_APP_ID}\"\n",[151,606,607],{"class":153,"line":272},[151,608,609],{},"VITE_POGO_HOST=localhost\n",[151,611,612],{"class":153,"line":279},[151,613,614],{},"VITE_POGO_PORT=80\n",[151,616,617],{"class":153,"line":285},[151,618,619],{},"VITE_POGO_WSS_PORT=443\n",[76,621,622],{},"Configure the broadcasting connection:",[141,624,628],{"className":625,"code":626,"filename":627,"language":219,"meta":147,"style":147},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","'pogo' => [\n    'driver' => 'pogo',\n    'app_id' => env('WS_APP_ID'),\n    'secret' => env('WS_APP_SECRET'),\n],\n","config\u002Fbroadcasting.php",[129,629,630,635,640,645,650],{"__ignoreMap":147},[151,631,632],{"class":153,"line":154},[151,633,634],{},"'pogo' => [\n",[151,636,637],{"class":153,"line":169},[151,638,639],{},"    'driver' => 'pogo',\n",[151,641,642],{"class":153,"line":180},[151,643,644],{},"    'app_id' => env('WS_APP_ID'),\n",[151,646,647],{"class":153,"line":190},[151,648,649],{},"    'secret' => env('WS_APP_SECRET'),\n",[151,651,652],{"class":153,"line":260},[151,653,654],{},"],\n",[76,656,657],{},"Use Laravel Echo with the Pusher client:",[141,659,664],{"className":660,"code":661,"filename":662,"language":663,"meta":147,"style":147},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import Echo from 'laravel-echo'\nimport Pusher from 'pusher-js'\n\nwindow.Pusher = Pusher\n\nwindow.Echo = new Echo({\n  broadcaster: 'pusher',\n  key: import.meta.env.VITE_POGO_APP_KEY || 'pogo-app',\n  cluster: 'mt1',\n  wsHost: import.meta.env.VITE_POGO_HOST || window.location.hostname,\n  wsPort: import.meta.env.VITE_POGO_PORT || 80,\n  wssPort: import.meta.env.VITE_POGO_WSS_PORT || 443,\n  forceTLS: false,\n  disableStats: true,\n  enabledTransports: ['ws', 'wss'],\n  authEndpoint: '\u002Fpogo\u002Fauth',\n  userAuthentication: {\n    endpoint: '\u002Fpogo\u002Fuser-auth'\n  }\n})\n","resources\u002Fjs\u002Fecho.js","js",[129,665,666,688,704,708,724,728,751,771,808,824,863,893,922,935,947,979,995,1005,1019,1023],{"__ignoreMap":147},[151,667,668,672,675,678,682,685],{"class":153,"line":154},[151,669,671],{"class":670},"s7zQu","import",[151,673,674],{"class":165}," Echo ",[151,676,677],{"class":670},"from",[151,679,681],{"class":680},"sMK4o"," '",[151,683,684],{"class":161},"laravel-echo",[151,686,687],{"class":680},"'\n",[151,689,690,692,695,697,699,702],{"class":153,"line":169},[151,691,671],{"class":670},[151,693,694],{"class":165}," Pusher ",[151,696,677],{"class":670},[151,698,681],{"class":680},[151,700,701],{"class":161},"pusher-js",[151,703,687],{"class":680},[151,705,706],{"class":153,"line":180},[151,707,276],{"emptyLinePlaceholder":275},[151,709,710,713,715,718,721],{"class":153,"line":190},[151,711,712],{"class":165},"window",[151,714,132],{"class":680},[151,716,717],{"class":165},"Pusher ",[151,719,720],{"class":680},"=",[151,722,723],{"class":165}," Pusher\n",[151,725,726],{"class":153,"line":260},[151,727,276],{"emptyLinePlaceholder":275},[151,729,730,732,734,737,739,742,746,749],{"class":153,"line":266},[151,731,712],{"class":165},[151,733,132],{"class":680},[151,735,736],{"class":165},"Echo ",[151,738,720],{"class":680},[151,740,741],{"class":680}," new",[151,743,745],{"class":744},"s2Zo4"," Echo",[151,747,748],{"class":165},"(",[151,750,242],{"class":680},[151,752,753,757,760,762,765,768],{"class":153,"line":272},[151,754,756],{"class":755},"swJcz","  broadcaster",[151,758,759],{"class":680},":",[151,761,681],{"class":680},[151,763,764],{"class":161},"pusher",[151,766,767],{"class":680},"'",[151,769,770],{"class":680},",\n",[151,772,773,776,778,781,783,786,788,791,793,796,799,801,804,806],{"class":153,"line":279},[151,774,775],{"class":755},"  key",[151,777,759],{"class":680},[151,779,780],{"class":670}," import",[151,782,132],{"class":680},[151,784,785],{"class":165},"meta",[151,787,132],{"class":680},[151,789,790],{"class":165},"env",[151,792,132],{"class":680},[151,794,795],{"class":165},"VITE_POGO_APP_KEY ",[151,797,798],{"class":680},"||",[151,800,681],{"class":680},[151,802,803],{"class":161},"pogo-app",[151,805,767],{"class":680},[151,807,770],{"class":680},[151,809,810,813,815,817,820,822],{"class":153,"line":285},[151,811,812],{"class":755},"  cluster",[151,814,759],{"class":680},[151,816,681],{"class":680},[151,818,819],{"class":161},"mt1",[151,821,767],{"class":680},[151,823,770],{"class":680},[151,825,826,829,831,833,835,837,839,841,843,846,848,851,853,856,858,861],{"class":153,"line":291},[151,827,828],{"class":755},"  wsHost",[151,830,759],{"class":680},[151,832,780],{"class":670},[151,834,132],{"class":680},[151,836,785],{"class":165},[151,838,132],{"class":680},[151,840,790],{"class":165},[151,842,132],{"class":680},[151,844,845],{"class":165},"VITE_POGO_HOST ",[151,847,798],{"class":680},[151,849,850],{"class":165}," window",[151,852,132],{"class":680},[151,854,855],{"class":165},"location",[151,857,132],{"class":680},[151,859,860],{"class":165},"hostname",[151,862,770],{"class":680},[151,864,865,868,870,872,874,876,878,880,882,885,887,891],{"class":153,"line":296},[151,866,867],{"class":755},"  wsPort",[151,869,759],{"class":680},[151,871,780],{"class":670},[151,873,132],{"class":680},[151,875,785],{"class":165},[151,877,132],{"class":680},[151,879,790],{"class":165},[151,881,132],{"class":680},[151,883,884],{"class":165},"VITE_POGO_PORT ",[151,886,798],{"class":680},[151,888,890],{"class":889},"sbssI"," 80",[151,892,770],{"class":680},[151,894,895,898,900,902,904,906,908,910,912,915,917,920],{"class":153,"line":302},[151,896,897],{"class":755},"  wssPort",[151,899,759],{"class":680},[151,901,780],{"class":670},[151,903,132],{"class":680},[151,905,785],{"class":165},[151,907,132],{"class":680},[151,909,790],{"class":165},[151,911,132],{"class":680},[151,913,914],{"class":165},"VITE_POGO_WSS_PORT ",[151,916,798],{"class":680},[151,918,919],{"class":889}," 443",[151,921,770],{"class":680},[151,923,924,927,929,933],{"class":153,"line":308},[151,925,926],{"class":755},"  forceTLS",[151,928,759],{"class":680},[151,930,932],{"class":931},"sfNiH"," false",[151,934,770],{"class":680},[151,936,937,940,942,945],{"class":153,"line":314},[151,938,939],{"class":755},"  disableStats",[151,941,759],{"class":680},[151,943,944],{"class":931}," true",[151,946,770],{"class":680},[151,948,949,952,954,957,959,962,964,967,969,972,974,977],{"class":153,"line":320},[151,950,951],{"class":755},"  enabledTransports",[151,953,759],{"class":680},[151,955,956],{"class":165}," [",[151,958,767],{"class":680},[151,960,961],{"class":161},"ws",[151,963,767],{"class":680},[151,965,966],{"class":680},",",[151,968,681],{"class":680},[151,970,971],{"class":161},"wss",[151,973,767],{"class":680},[151,975,976],{"class":165},"]",[151,978,770],{"class":680},[151,980,981,984,986,988,991,993],{"class":153,"line":326},[151,982,983],{"class":755},"  authEndpoint",[151,985,759],{"class":680},[151,987,681],{"class":680},[151,989,990],{"class":161},"\u002Fpogo\u002Fauth",[151,992,767],{"class":680},[151,994,770],{"class":680},[151,996,997,1000,1002],{"class":153,"line":332},[151,998,999],{"class":755},"  userAuthentication",[151,1001,759],{"class":680},[151,1003,1004],{"class":680}," {\n",[151,1006,1007,1010,1012,1014,1017],{"class":153,"line":338},[151,1008,1009],{"class":755},"    endpoint",[151,1011,759],{"class":680},[151,1013,681],{"class":680},[151,1015,1016],{"class":161},"\u002Fpogo\u002Fuser-auth",[151,1018,687],{"class":680},[151,1020,1021],{"class":153,"line":344},[151,1022,269],{"class":680},[151,1024,1025,1028],{"class":153,"line":350},[151,1026,1027],{"class":680},"}",[151,1029,1030],{"class":165},")\n",[71,1032,61],{"id":1033},"php-api",[141,1035,1037],{"className":625,"code":1036,"language":219,"meta":147,"style":147},"pogo_websocket_publish(string $appId, string $channel, string $event, string $data): int;\npogo_websocket_broadcast_multi(string $appId, string $channels, string $event, string $data): int;\n",[129,1038,1039,1044],{"__ignoreMap":147},[151,1040,1041],{"class":153,"line":154},[151,1042,1043],{},"pogo_websocket_publish(string $appId, string $channel, string $event, string $data): int;\n",[151,1045,1046],{"class":153,"line":169},[151,1047,1048],{},"pogo_websocket_broadcast_multi(string $appId, string $channels, string $event, string $data): int;\n",[76,1050,1051],{},"Return status codes:",[1053,1054,1055,1068],"table",{},[1056,1057,1058],"thead",{},[1059,1060,1061,1065],"tr",{},[1062,1063,1064],"th",{},"Code",[1062,1066,1067],{},"Meaning",[1069,1070,1071,1082,1092,1102,1112,1122,1132,1142,1152,1162],"tbody",{},[1059,1072,1073,1079],{},[1074,1075,1076],"td",{},[129,1077,1078],{},"0",[1074,1080,1081],{},"Success",[1059,1083,1084,1089],{},[1074,1085,1086],{},[129,1087,1088],{},"1",[1074,1090,1091],{},"Hub missing",[1059,1093,1094,1099],{},[1074,1095,1096],{},[129,1097,1098],{},"2",[1074,1100,1101],{},"Channel too long",[1059,1103,1104,1109],{},[1074,1105,1106],{},[129,1107,1108],{},"3",[1074,1110,1111],{},"Event too long",[1059,1113,1114,1119],{},[1074,1115,1116],{},[129,1117,1118],{},"4",[1074,1120,1121],{},"Payload too large",[1059,1123,1124,1129],{},[1074,1125,1126],{},[129,1127,1128],{},"5",[1074,1130,1131],{},"Invalid payload JSON",[1059,1133,1134,1139],{},[1074,1135,1136],{},[129,1137,1138],{},"6",[1074,1140,1141],{},"Broker publish failed",[1059,1143,1144,1149],{},[1074,1145,1146],{},[129,1147,1148],{},"7",[1074,1150,1151],{},"Invalid multi-channel JSON",[1059,1153,1154,1159],{},[1074,1155,1156],{},[129,1157,1158],{},"8",[1074,1160,1161],{},"Broker queue full",[1059,1163,1164,1169],{},[1074,1165,1166],{},[129,1167,1168],{},"9",[1074,1170,1171],{},"Shard queue full",[76,1173,1174,1175,132],{},"The Laravel broadcaster converts native failures into ",[129,1176,1177],{},"BroadcastException",[71,1179,1181],{"id":1180},"operations","Operations",[83,1183,1184,1194,1200,1203,1206],{},[86,1185,1186,1187,1190,1191,132],{},"Use strong, different values for ",[129,1188,1189],{},"WS_APP_SECRET"," and ",[129,1192,1193],{},"POGO_WEBHOOK_SECRET",[86,1195,1196,1197,1199],{},"Set ",[129,1198,559],{}," for browser clients that connect from another origin.",[86,1201,1202],{},"Enforce per-client connection limits at the reverse proxy if FrankenPHP is behind a proxy that hides client IPs.",[86,1204,1205],{},"Use Redis Pub\u002FSub only for best-effort multi-node fanout; messages are not persisted, replayed, or acknowledged.",[86,1207,1208,1209,132],{},"Prometheus metrics are exposed through Caddy admin metrics at ",[129,1210,1211],{},"\u002Fmetrics",[71,1213,1215],{"id":1214},"troubleshooting","Troubleshooting",[83,1217,1218,1229,1245,1257],{},[86,1219,1220,1224,1225,1228],{},[1221,1222,1223],"strong",{},"4100 over capacity:"," increase ",[129,1226,1227],{},"max_connections"," or reduce client count.",[86,1230,1231,1234,1235,1238,1239,1242,1243,132],{},[1221,1232,1233],{},"4009 connection unauthorized:"," verify ",[129,1236,1237],{},"app_id",", ",[129,1240,1241],{},"app_secret",", and ",[129,1244,1189],{},[86,1246,1247,1250,1251,1190,1254,132],{},[1221,1248,1249],{},"Too many requests:"," tune ",[129,1252,1253],{},"handshake_rate",[129,1255,1256],{},"handshake_burst",[86,1258,1259,1262,1263,1190,1265,1267],{},[1221,1260,1261],{},"Private or presence auth fails:"," confirm ",[129,1264,990],{},[129,1266,1016],{}," are reachable and protected by normal Laravel authentication.",[1269,1270,1271],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .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}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":147,"searchDepth":154,"depth":169,"links":1273},[1274,1275,1276,1277,1278,1279,1280,1281],{"id":73,"depth":169,"text":74},{"id":103,"depth":169,"text":104},{"id":135,"depth":169,"text":136},{"id":228,"depth":169,"text":229},{"id":563,"depth":169,"text":564},{"id":1033,"depth":169,"text":61},{"id":1180,"depth":169,"text":1181},{"id":1214,"depth":169,"text":1215},"Embedded Pusher-compatible WebSocket server and Laravel broadcaster.","md",null,{},{"icon":49},{"title":46,"description":1282},"1mI34b0Hcvcl-1n4wAIHOEQAUw35uUgbuGbYyRzS5HU",[1290,1292],{"title":41,"path":42,"stem":43,"description":1291,"icon":44,"children":-1},"Request-scoped parallel PHP jobs for fan-out and fan-in work.",{"title":56,"path":57,"stem":58,"description":1293,"icon":59,"children":-1},"Directive overview for Queue, Scheduler, Pogo, and WebSocket.",1779731238168]