diff --git a/apps/ssb.json b/apps/ssb.json index 8745153b..f6d7bcc5 100644 --- a/apps/ssb.json +++ b/apps/ssb.json @@ -1,5 +1,5 @@ { "type": "tildefriends-app", "emoji": "🐌", - "previous": "&7L314QLuVl8kNbFIWuXXeLqIVefUe5S66WvEmOMQb2U=.sha256" + "previous": "&nPhjx+lscaqxp3pwcpLlQ2HyJDPQPssdfzcFKsPEMsI=.sha256" } diff --git a/apps/ssb/tf-tab-connections.js b/apps/ssb/tf-tab-connections.js index b6a4c282..865e0564 100644 --- a/apps/ssb/tf-tab-connections.js +++ b/apps/ssb/tf-tab-connections.js @@ -136,7 +136,8 @@ class TfTabConnectionsElement extends LitElement {
${requests.map( (x) => html` - ${x.request_number > 0 ? '🟩' : '🟥'} ${x.name} data; + _tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_update, NULL); +} + 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* user_data, tf_ssb_connection_t* dependent_connection) { @@ -690,6 +698,7 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ assert(!existing->cleanup); assert(!existing->user_data); assert(!existing->dependent_connection); + existing->last_active = time(NULL); existing->callback = callback; existing->cleanup = cleanup; existing->user_data = user_data; @@ -704,6 +713,7 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ .cleanup = cleanup, .user_data = user_data, .dependent_connection = dependent_connection, + .last_active = time(NULL), }; 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); @@ -714,9 +724,12 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ } connection->requests[index] = request; connection->requests_count++; - connection->ssb->request_count++; } + 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); + } _tf_ssb_notify_connections_changed(connection->ssb, k_tf_ssb_change_update, connection); } @@ -2216,6 +2229,11 @@ tf_ssb_t* tf_ssb_create(uv_loop_t* loop, JSContext* context, const char* db_path uv_timer_start(&ssb->trace_timer, _tf_ssb_trace_timer, 100, 100); uv_unref((uv_handle_t*)&ssb->trace_timer); + ssb->request_activity_timer.data = ssb; + uv_timer_init(ssb->loop, &ssb->request_activity_timer); + uv_timer_start(&ssb->request_activity_timer, _tf_ssb_request_activity_timer, 3000, 0); + uv_unref((uv_handle_t*)&ssb->request_activity_timer); + if (!_tf_ssb_load_keys(ssb)) { tf_printf("Generating a new keypair.\n"); @@ -2418,6 +2436,11 @@ void tf_ssb_destroy(tf_ssb_t* ssb) uv_close((uv_handle_t*)&ssb->trace_timer, _tf_ssb_on_handle_close); } + if (ssb->request_activity_timer.data && !uv_is_closing((uv_handle_t*)&ssb->request_activity_timer)) + { + uv_close((uv_handle_t*)&ssb->request_activity_timer, _tf_ssb_on_handle_close); + } + if (ssb->server.data && !uv_is_closing((uv_handle_t*)&ssb->server)) { uv_close((uv_handle_t*)&ssb->server, _tf_ssb_on_handle_close); @@ -2434,7 +2457,7 @@ void tf_ssb_destroy(tf_ssb_t* ssb) tf_printf("Waiting for closes.\n"); while (ssb->broadcast_listener.data || ssb->broadcast_sender.data || ssb->broadcast_timer.data || ssb->broadcast_cleanup_timer.data || ssb->trace_timer.data || - ssb->server.data || ssb->ref_count) + ssb->server.data || ssb->ref_count || ssb->request_activity_timer.data) { uv_run(ssb->loop, UV_RUN_ONCE); } @@ -4185,6 +4208,7 @@ JSValue tf_ssb_connection_requests_to_object(tf_ssb_connection_t* connection) JSValue request = JS_NewObject(context); JS_SetPropertyStr(context, request, "name", JS_NewString(context, connection->requests[i].name)); JS_SetPropertyStr(context, request, "request_number", JS_NewInt32(context, connection->requests[i].request_number)); + JS_SetPropertyStr(context, request, "active", JS_NewBool(context, time(NULL) - connection->requests[i].last_active < 3)); JS_SetPropertyUint32(context, object, i, request); } return object; diff --git a/src/ssb.connections.c b/src/ssb.connections.c index 8ab356be..547ee27a 100644 --- a/src/ssb.connections.c +++ b/src/ssb.connections.c @@ -21,6 +21,11 @@ typedef struct _tf_ssb_connections_t static void _tf_ssb_connections_changed_callback(tf_ssb_t* ssb, tf_ssb_change_t change, tf_ssb_connection_t* connection, void* user_data) { + if (!connection) + { + return; + } + tf_ssb_connections_t* connections = user_data; switch (change) {