From 0090850e104d22c25b08e071be7070e147f55639 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Mon, 17 Jun 2024 20:59:25 -0400 Subject: [PATCH] Forgot the other end of blobs.get. --- src/ssb.rpc.c | 61 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/src/ssb.rpc.c b/src/ssb.rpc.c index 9798dcc5..112435ac 100644 --- a/src/ssb.rpc.c +++ b/src/ssb.rpc.c @@ -67,6 +67,41 @@ static void _tf_ssb_rpc_blobs_get_callback( { } +typedef struct _blobs_get_work_t +{ + int64_t request_number; + char id[k_id_base64_len]; + bool found; + uint8_t* blob; + size_t size; +} blobs_get_work_t; + +static void _tf_ssb_rpc_blobs_get_work(tf_ssb_connection_t* connection, void* user_data) +{ + blobs_get_work_t* work = user_data; + tf_ssb_t* ssb = tf_ssb_connection_get_ssb(connection); + work->found = tf_ssb_db_blob_get(ssb, work->id, &work->blob, &work->size); + +} + +static void _tf_ssb_rpc_blobs_get_after_work(tf_ssb_connection_t* connection, int status, void* user_data) +{ + blobs_get_work_t* work = user_data; + if (work->found) + { + const size_t k_send_max = 8192; + for (size_t offset = 0; offset < work->size; offset += k_send_max) + { + tf_ssb_connection_rpc_send(connection, k_ssb_rpc_flag_binary | k_ssb_rpc_flag_stream, -work->request_number, NULL, work->blob + offset, + offset + k_send_max <= work->size ? k_send_max : (work->size - offset), NULL, NULL, NULL); + } + tf_free(work->blob); + } + tf_ssb_connection_rpc_send(connection, k_ssb_rpc_flag_json | k_ssb_rpc_flag_end_error | k_ssb_rpc_flag_stream, -work->request_number, NULL, + (const uint8_t*)(work->found ? "true" : "false"), strlen(work->found ? "true" : "false"), NULL, NULL, NULL); + tf_free(work); +} + static void _tf_ssb_rpc_blobs_get(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data) { if (flags & k_ssb_rpc_flag_end_error) @@ -75,11 +110,10 @@ static void _tf_ssb_rpc_blobs_get(tf_ssb_connection_t* connection, uint8_t flags } tf_ssb_connection_add_request(connection, -request_number, "blobs.get", _tf_ssb_rpc_blobs_get_callback, NULL, NULL, NULL); - tf_ssb_t* ssb = tf_ssb_connection_get_ssb(connection); JSContext* context = tf_ssb_connection_get_context(connection); JSValue ids = JS_GetPropertyStr(context, args, "args"); int length = tf_util_get_length(context, ids); - bool success = false; + for (int i = 0; i < length; i++) { JSValue arg = JS_GetPropertyUint32(context, ids, i); @@ -94,25 +128,18 @@ static void _tf_ssb_rpc_blobs_get(tf_ssb_connection_t* connection, uint8_t flags id = JS_ToCString(context, key); JS_FreeValue(context, key); } - uint8_t* blob = NULL; - size_t size = 0; - const size_t k_send_max = 8192; - if (tf_ssb_db_blob_get(ssb, id, &blob, &size)) - { - for (size_t offset = 0; offset < size; offset += k_send_max) - { - tf_ssb_connection_rpc_send(connection, k_ssb_rpc_flag_binary | k_ssb_rpc_flag_stream, -request_number, NULL, blob + offset, - offset + k_send_max <= size ? k_send_max : (size - offset), NULL, NULL, NULL); - } - success = true; - tf_free(blob); - } + + blobs_get_work_t* work = tf_malloc(sizeof(blobs_get_work_t)); + *work = (blobs_get_work_t) { + .request_number = request_number, + }; + snprintf(work->id, sizeof(work->id), "%s", id); + tf_ssb_connection_run_work(connection, _tf_ssb_rpc_blobs_get_work, _tf_ssb_rpc_blobs_get_after_work, work); + JS_FreeCString(context, id); JS_FreeValue(context, arg); } JS_FreeValue(context, ids); - tf_ssb_connection_rpc_send(connection, k_ssb_rpc_flag_json | k_ssb_rpc_flag_end_error | k_ssb_rpc_flag_stream, -request_number, NULL, - (const uint8_t*)(success ? "true" : "false"), strlen(success ? "true" : "false"), NULL, NULL, NULL); } static void _tf_ssb_rpc_blobs_has(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data)