ssb: Fix activity indication of muxrpc requests expiring.

This commit is contained in:
Cory McWilliams 2024-10-03 12:41:45 -04:00
parent 1bb9d737d8
commit 90e000c18e
3 changed files with 31 additions and 7 deletions

View File

@ -1,5 +1,5 @@
{ {
"type": "tildefriends-app", "type": "tildefriends-app",
"emoji": "🐌", "emoji": "🐌",
"previous": "&nPhjx+lscaqxp3pwcpLlQ2HyJDPQPssdfzcFKsPEMsI=.sha256" "previous": "&PK+UixgYQEYFKKPJ3BVacSKaDRRjiNO6M/fmgzDJaRM=.sha256"
} }

View File

@ -137,7 +137,8 @@ class TfTabConnectionsElement extends LitElement {
${requests.map( ${requests.map(
(x) => html` (x) => html`
<span <span
class=${'w3-tag w3-small ' + (x.active ? 'w3-blue' : 'w3-black')} class=${'w3-tag w3-small ' +
(x.active ? 'w3-theme-l3' : 'w3-theme-d3')}
>${x.request_number > 0 ? '🟩' : '🟥'} ${x.name} >${x.request_number > 0 ? '🟩' : '🟥'} ${x.name}
<span <span
class="w3-badge w3-white" class="w3-badge w3-white"

View File

@ -81,6 +81,7 @@ enum
k_seed_check_interval_seconds = 5 * 60, k_seed_check_interval_seconds = 5 * 60,
k_udp_discovery_expires_seconds = 10, k_udp_discovery_expires_seconds = 10,
k_handshake_timeout_ms = 15000, k_handshake_timeout_ms = 15000,
k_rpc_active_ms = 3000,
}; };
typedef struct _tf_ssb_broadcast_t tf_ssb_broadcast_t; typedef struct _tf_ssb_broadcast_t tf_ssb_broadcast_t;
@ -362,6 +363,8 @@ typedef struct _tf_ssb_connection_t
int read_back_pressure; int read_back_pressure;
int active_write_count; int active_write_count;
time_t last_notified_active;
} tf_ssb_connection_t; } tf_ssb_connection_t;
static JSClassID _connection_class_id; static JSClassID _connection_class_id;
@ -684,7 +687,25 @@ static bool _tf_ssb_connection_get_request_callback(tf_ssb_connection_t* connect
static void _tf_ssb_request_activity_timer(uv_timer_t* timer) static void _tf_ssb_request_activity_timer(uv_timer_t* timer)
{ {
tf_ssb_t* ssb = timer->data; tf_ssb_t* ssb = timer->data;
_tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_update, NULL); time_t now = time(NULL);
for (tf_ssb_connection_t* connection = ssb->connections; connection; connection = connection->next)
{
bool any_changed = false;
bool last_notified_active = (now - connection->last_notified_active) * 1000 < k_rpc_active_ms;
for (int i = 0; i < connection->requests_count; i++)
{
bool last_active = (now - connection->requests[i].last_active) * 1000 <= k_rpc_active_ms;
if (last_active != last_notified_active)
{
any_changed = true;
}
}
if (any_changed)
{
_tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_update, connection);
connection->last_notified_active = now;
}
}
} }
void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t request_number, const char* name, tf_ssb_rpc_callback_t* callback, tf_ssb_callback_cleanup_t* cleanup, void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t request_number, const char* name, tf_ssb_rpc_callback_t* callback, tf_ssb_callback_cleanup_t* cleanup,
@ -692,13 +713,14 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ
{ {
tf_ssb_request_t* existing = tf_ssb_request_t* existing =
connection->requests_count ? bsearch(&request_number, connection->requests, connection->requests_count, sizeof(tf_ssb_request_t), _request_compare) : NULL; connection->requests_count ? bsearch(&request_number, connection->requests, connection->requests_count, sizeof(tf_ssb_request_t), _request_compare) : NULL;
time_t now = time(NULL);
if (existing) if (existing)
{ {
assert(!existing->callback); assert(!existing->callback);
assert(!existing->cleanup); assert(!existing->cleanup);
assert(!existing->user_data); assert(!existing->user_data);
assert(!existing->dependent_connection); assert(!existing->dependent_connection);
existing->last_active = time(NULL); existing->last_active = now;
existing->callback = callback; existing->callback = callback;
existing->cleanup = cleanup; existing->cleanup = cleanup;
existing->user_data = user_data; existing->user_data = user_data;
@ -713,7 +735,7 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ
.cleanup = cleanup, .cleanup = cleanup,
.user_data = user_data, .user_data = user_data,
.dependent_connection = dependent_connection, .dependent_connection = dependent_connection,
.last_active = time(NULL), .last_active = now,
}; };
snprintf(request.name, sizeof(request.name), "%s", name); snprintf(request.name, sizeof(request.name), "%s", name);
int index = tf_util_insert_index(&request_number, connection->requests, connection->requests_count, sizeof(tf_ssb_request_t), _request_compare); int index = tf_util_insert_index(&request_number, connection->requests, connection->requests_count, sizeof(tf_ssb_request_t), _request_compare);
@ -728,9 +750,10 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ
} }
if (uv_timer_get_due_in(&connection->ssb->request_activity_timer) == 0) if (uv_timer_get_due_in(&connection->ssb->request_activity_timer) == 0)
{ {
uv_timer_start(&connection->ssb->request_activity_timer, _tf_ssb_request_activity_timer, 3000, 0); uv_timer_start(&connection->ssb->request_activity_timer, _tf_ssb_request_activity_timer, k_rpc_active_ms, 0);
} }
_tf_ssb_notify_connections_changed(connection->ssb, k_tf_ssb_change_update, connection); _tf_ssb_notify_connections_changed(connection->ssb, k_tf_ssb_change_update, connection);
connection->last_notified_active = now;
} }
static int _message_request_compare(const void* a, const void* b) static int _message_request_compare(const void* a, const void* b)
@ -2231,7 +2254,7 @@ tf_ssb_t* tf_ssb_create(uv_loop_t* loop, JSContext* context, const char* db_path
ssb->request_activity_timer.data = ssb; ssb->request_activity_timer.data = ssb;
uv_timer_init(ssb->loop, &ssb->request_activity_timer); uv_timer_init(ssb->loop, &ssb->request_activity_timer);
uv_timer_start(&ssb->request_activity_timer, _tf_ssb_request_activity_timer, 3000, 0); uv_timer_start(&ssb->request_activity_timer, _tf_ssb_request_activity_timer, k_rpc_active_ms, 0);
uv_unref((uv_handle_t*)&ssb->request_activity_timer); uv_unref((uv_handle_t*)&ssb->request_activity_timer);
if (!_tf_ssb_load_keys(ssb)) if (!_tf_ssb_load_keys(ssb))