From 548febfb229d1a361b69e1d8894bee63611c7be4 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Sun, 16 Jun 2024 15:29:59 -0400 Subject: [PATCH] Make ssb.storedConnections do its DB work not on the main thread. Five remaining by my new count? --- src/ssb.js.c | 53 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/src/ssb.js.c b/src/ssb.js.c index c7e9e63d..d5413f1f 100644 --- a/src/ssb.js.c +++ b/src/ssb.js.c @@ -969,24 +969,53 @@ static JSValue _tf_ssb_connections(JSContext* context, JSValueConst this_val, in return result; } +typedef struct _stored_connections_t +{ + int count; + tf_ssb_db_stored_connection_t* connections; + JSValue promise[2]; +} stored_connections_t; + +static void _tf_ssb_stored_connections_work(tf_ssb_t* ssb, void* user_data) +{ + stored_connections_t* work = user_data; + work->connections = tf_ssb_db_get_stored_connections(ssb, &work->count); +} + +static void _tf_ssb_stored_connections_after_work(tf_ssb_t* ssb, int status, void* user_data) +{ + stored_connections_t* work = user_data; + JSContext* context = tf_ssb_get_context(ssb); + JSValue result = JS_NewArray(context); + for (int i = 0; i < work->count; i++) + { + JSValue connection = JS_NewObject(context); + JS_SetPropertyStr(context, connection, "address", JS_NewString(context, work->connections[i].address)); + JS_SetPropertyStr(context, connection, "port", JS_NewInt32(context, work->connections[i].port)); + JS_SetPropertyStr(context, connection, "pubkey", JS_NewString(context, work->connections[i].pubkey)); + JS_SetPropertyUint32(context, result, i, connection); + } + tf_free(work->connections); + + JSValue error = JS_Call(context, work->promise[0], JS_UNDEFINED, 1, &result); + JS_FreeValue(context, result); + JS_FreeValue(context, work->promise[0]); + JS_FreeValue(context, work->promise[1]); + tf_util_report_error(context, error); + JS_FreeValue(context, error); + tf_free(work); +} + static JSValue _tf_ssb_storedConnections(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv) { JSValue result = JS_NULL; tf_ssb_t* ssb = JS_GetOpaque(this_val, _tf_ssb_classId); if (ssb) { - int count = 0; - tf_ssb_db_stored_connection_t* connections = tf_ssb_db_get_stored_connections(ssb, &count); - result = JS_NewArray(context); - for (int i = 0; i < count; i++) - { - JSValue connection = JS_NewObject(context); - JS_SetPropertyStr(context, connection, "address", JS_NewString(context, connections[i].address)); - JS_SetPropertyStr(context, connection, "port", JS_NewInt32(context, connections[i].port)); - JS_SetPropertyStr(context, connection, "pubkey", JS_NewString(context, connections[i].pubkey)); - JS_SetPropertyUint32(context, result, i, connection); - } - tf_free(connections); + stored_connections_t* work = tf_malloc(sizeof(stored_connections_t)); + *work = (stored_connections_t) { 0 }; + result = JS_NewPromiseCapability(context, work->promise); + tf_ssb_run_work(ssb, _tf_ssb_stored_connections_work, _tf_ssb_stored_connections_after_work, work); } return result; }