Project homepage Mailing List  Warmcat.com  API Docs  Github Mirror 
    npro  
 Modern all-safe Rust Network Protocol library supporting h1, h2, h3, ws, wt sans-IO and with socket IO + tls
git clone https://npro.rs/repo/npro
Author[]Andy Green <andy@warmcat.com> 2025-08-06 16:25 UTC
Committer[]Andy Green <andy@warmcat.com> 2025-08-06 16:25 UTC
Tree19e23ae7e572054e1f505477091db632e475cfc7   Raw Patch
 
viewer-count-is-bool
viewer-count-is-bool
diff --git a/src/server/s-comms.c b/src/server/s-comms.c index 01e1be1..b4e2905 100644 --- a/src/server/s-comms.c +++ b/src/server/s-comms.c @@ -713,6 +713,19 @@ callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user, * yet, until we get the ws rx */ lws_dll2_add_head(&pss->same, &vhd->builders); + + /* + * If viewers are already present, tell this new builder to + * start reporting immediately. + */ + if (vhd->viewers_are_present) { + sai_viewer_state_t *vsend = calloc(1, sizeof(*vsend)); + if (vsend) { + vsend->viewers = 1; /* true */ + lws_dll2_add_tail(&vsend->list, &pss->viewer_state_owner); + lws_callback_on_writable(pss->wsi); + } + } break; } diff --git a/src/server/s-private.h b/src/server/s-private.h index c985720..1ff2a36 100644 --- a/src/server/s-private.h +++ b/src/server/s-private.h @@ -200,6 +200,7 @@ struct vhd { const char *notification_key; unsigned int browser_viewer_count; + unsigned int viewers_are_present:1; sais_t server; }; diff --git a/src/server/s-websrv.c b/src/server/s-websrv.c index 9ad9faa..dd3f057 100644 --- a/src/server/s-websrv.c +++ b/src/server/s-websrv.c @@ -485,6 +485,7 @@ websrvss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags) { sai_viewer_state_t *vs = (sai_viewer_state_t *)a.dest; unsigned int total_viewers = 0; + char old_viewers_present = !!m->vhd->viewers_are_present; /* Store viewer count for this specific sai-web client */ m->viewers = vs->viewers; @@ -494,23 +495,27 @@ websrvss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags) sum_viewers_cb, &total_viewers); m->vhd->browser_viewer_count = total_viewers; - lwsl_notice("%s: Client viewer count %u\n", - __func__, m->vhd->browser_viewer_count); - /* Broadcast the new viewer state to all connected builders */ - lws_start_foreach_dll(struct lws_dll2 *, p, m->vhd->builders.head) { - struct pss *pss_builder = lws_container_of(p, - struct pss, same); - sai_viewer_state_t *vsend = calloc(1, sizeof(*vsend)); + m->vhd->viewers_are_present = !!total_viewers; - if (vsend) { - /* Send the new TOTAL viewer count */ - vsend->viewers = m->vhd->browser_viewer_count; - lws_dll2_add_tail(&vsend->list, - &pss_builder->viewer_state_owner); - lws_callback_on_writable(pss_builder->wsi); - } - } lws_end_foreach_dll(p); + /* + * Only broadcast to builders if the state has changed + * from 0 viewers to >0, or from >0 viewers to 0. + */ + if (old_viewers_present != m->vhd->viewers_are_present) { + lwsl_notice("%s: Viewer presence changed to %d. Broadcasting to builders.\n", + __func__, m->vhd->viewers_are_present); + lws_start_foreach_dll(struct lws_dll2 *, p, m->vhd->builders.head) { + struct pss *pss_builder = lws_container_of(p, struct pss, same); + sai_viewer_state_t *vsend = calloc(1, sizeof(*vsend)); + + if (vsend) { + vsend->viewers = m->vhd->viewers_are_present; + lws_dll2_add_tail(&vsend->list, &pss_builder->viewer_state_owner); + lws_callback_on_writable(pss_builder->wsi); + } + } lws_end_foreach_dll(p); + } break; } } @@ -567,21 +572,21 @@ websrvss_srv_state(void *userobj, void *sh, lws_ss_constate_t state, lws_ss_server_foreach_client(m->vhd->h_ss_websrv, sum_viewers_cb, &total_viewers); - if (m->vhd->browser_viewer_count != total_viewers) { - m->vhd->browser_viewer_count = total_viewers; - lwsl_notice("%s: A sai-web client disconnected, total viewers now %u\n", - __func__, total_viewers); + m->vhd->browser_viewer_count = total_viewers; + char new_viewers_present = !!total_viewers; + + if (m->vhd->viewers_are_present != new_viewers_present) { + m->vhd->viewers_are_present = !!new_viewers_present; + lwsl_notice("%s: A sai-web client disconnected, viewer presence changed to %d. Broadcasting.\n", + __func__, new_viewers_present); - /* Broadcast new count to builders */ + /* Broadcast new presence state to builders */ lws_start_foreach_dll(struct lws_dll2 *, p, m->vhd->builders.head) { - struct pss *pss_builder = lws_container_of(p, - struct pss, same); + struct pss *pss_builder = lws_container_of(p, struct pss, same); sai_viewer_state_t *vsend = calloc(1, sizeof(*vsend)); - if (vsend) { - vsend->viewers = m->vhd->browser_viewer_count; - lws_dll2_add_tail(&vsend->list, - &pss_builder->viewer_state_owner); + vsend->viewers = new_viewers_present; + lws_dll2_add_tail(&vsend->list, &pss_builder->viewer_state_owner); lws_callback_on_writable(pss_builder->wsi); } } lws_end_foreach_dll(p);
Page fetched 0s ago, creation time: 4ms (vhost etag hits: 0%, cache hits: 0%)