forked from cory/tildefriends
		
	ssb: Show activity for each muxrpc request.
This commit is contained in:
		| @@ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
| 	"type": "tildefriends-app", | 	"type": "tildefriends-app", | ||||||
| 	"emoji": "🐌", | 	"emoji": "🐌", | ||||||
| 	"previous": "&7L314QLuVl8kNbFIWuXXeLqIVefUe5S66WvEmOMQb2U=.sha256" | 	"previous": "&nPhjx+lscaqxp3pwcpLlQ2HyJDPQPssdfzcFKsPEMsI=.sha256" | ||||||
| } | } | ||||||
|   | |||||||
| @@ -136,7 +136,8 @@ class TfTabConnectionsElement extends LitElement { | |||||||
| 			<div> | 			<div> | ||||||
| 				${requests.map( | 				${requests.map( | ||||||
| 					(x) => html` | 					(x) => html` | ||||||
| 						<span class="w3-tag w3-small" | 						<span | ||||||
|  | 							class=${'w3-tag w3-small ' + (x.active ? 'w3-blue' : 'w3-black')} | ||||||
| 							>${x.request_number > 0 ? '🟩' : '🟥'} ${x.name} | 							>${x.request_number > 0 ? '🟩' : '🟥'} ${x.name} | ||||||
| 							<span | 							<span | ||||||
| 								class="w3-badge w3-white" | 								class="w3-badge w3-white" | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								src/ssb.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/ssb.c
									
									
									
									
									
								
							| @@ -112,6 +112,7 @@ typedef struct _tf_ssb_request_t | |||||||
| 	tf_ssb_callback_cleanup_t* cleanup; | 	tf_ssb_callback_cleanup_t* cleanup; | ||||||
| 	void* user_data; | 	void* user_data; | ||||||
| 	tf_ssb_connection_t* dependent_connection; | 	tf_ssb_connection_t* dependent_connection; | ||||||
|  | 	time_t last_active; | ||||||
| 	int32_t request_number; | 	int32_t request_number; | ||||||
| } tf_ssb_request_t; | } tf_ssb_request_t; | ||||||
|  |  | ||||||
| @@ -211,6 +212,7 @@ typedef struct _tf_ssb_t | |||||||
| 	uv_timer_t broadcast_cleanup_timer; | 	uv_timer_t broadcast_cleanup_timer; | ||||||
| 	uv_timer_t broadcast_timer; | 	uv_timer_t broadcast_timer; | ||||||
| 	uv_timer_t trace_timer; | 	uv_timer_t trace_timer; | ||||||
|  | 	uv_timer_t request_activity_timer; | ||||||
| 	uv_tcp_t server; | 	uv_tcp_t server; | ||||||
|  |  | ||||||
| 	uint8_t network_key[32]; | 	uint8_t network_key[32]; | ||||||
| @@ -679,6 +681,12 @@ static bool _tf_ssb_connection_get_request_callback(tf_ssb_connection_t* connect | |||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void _tf_ssb_request_activity_timer(uv_timer_t* timer) | ||||||
|  | { | ||||||
|  | 	tf_ssb_t* ssb = timer->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 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) | 	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->cleanup); | ||||||
| 		assert(!existing->user_data); | 		assert(!existing->user_data); | ||||||
| 		assert(!existing->dependent_connection); | 		assert(!existing->dependent_connection); | ||||||
|  | 		existing->last_active = time(NULL); | ||||||
| 		existing->callback = callback; | 		existing->callback = callback; | ||||||
| 		existing->cleanup = cleanup; | 		existing->cleanup = cleanup; | ||||||
| 		existing->user_data = user_data; | 		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, | 			.cleanup = cleanup, | ||||||
| 			.user_data = user_data, | 			.user_data = user_data, | ||||||
| 			.dependent_connection = dependent_connection, | 			.dependent_connection = dependent_connection, | ||||||
|  | 			.last_active = time(NULL), | ||||||
| 		}; | 		}; | ||||||
| 		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); | ||||||
| @@ -714,9 +724,12 @@ void tf_ssb_connection_add_request(tf_ssb_connection_t* connection, int32_t requ | |||||||
| 		} | 		} | ||||||
| 		connection->requests[index] = request; | 		connection->requests[index] = request; | ||||||
| 		connection->requests_count++; | 		connection->requests_count++; | ||||||
|  |  | ||||||
| 		connection->ssb->request_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); | 	_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_timer_start(&ssb->trace_timer, _tf_ssb_trace_timer, 100, 100); | ||||||
| 	uv_unref((uv_handle_t*)&ssb->trace_timer); | 	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)) | 	if (!_tf_ssb_load_keys(ssb)) | ||||||
| 	{ | 	{ | ||||||
| 		tf_printf("Generating a new keypair.\n"); | 		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); | 		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)) | 	if (ssb->server.data && !uv_is_closing((uv_handle_t*)&ssb->server)) | ||||||
| 	{ | 	{ | ||||||
| 		uv_close((uv_handle_t*)&ssb->server, _tf_ssb_on_handle_close); | 		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"); | 	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 || | 	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); | 		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); | 		JSValue request = JS_NewObject(context); | ||||||
| 		JS_SetPropertyStr(context, request, "name", JS_NewString(context, connection->requests[i].name)); | 		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, "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); | 		JS_SetPropertyUint32(context, object, i, request); | ||||||
| 	} | 	} | ||||||
| 	return object; | 	return object; | ||||||
|   | |||||||
| @@ -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) | 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; | 	tf_ssb_connections_t* connections = user_data; | ||||||
| 	switch (change) | 	switch (change) | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user