forked from cory/tildefriends
ssb: Fix activity indication of muxrpc requests expiring.
This commit is contained in:
parent
1bb9d737d8
commit
90e000c18e
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"type": "tildefriends-app",
|
"type": "tildefriends-app",
|
||||||
"emoji": "🐌",
|
"emoji": "🐌",
|
||||||
"previous": "&nPhjx+lscaqxp3pwcpLlQ2HyJDPQPssdfzcFKsPEMsI=.sha256"
|
"previous": "&PK+UixgYQEYFKKPJ3BVacSKaDRRjiNO6M/fmgzDJaRM=.sha256"
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
33
src/ssb.c
33
src/ssb.c
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user