forked from cory/tildefriends
Forgot the other end of blobs.get.
This commit is contained in:
parent
9efd64bd18
commit
0090850e10
@ -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)
|
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)
|
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_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);
|
JSContext* context = tf_ssb_connection_get_context(connection);
|
||||||
JSValue ids = JS_GetPropertyStr(context, args, "args");
|
JSValue ids = JS_GetPropertyStr(context, args, "args");
|
||||||
int length = tf_util_get_length(context, ids);
|
int length = tf_util_get_length(context, ids);
|
||||||
bool success = false;
|
|
||||||
for (int i = 0; i < length; i++)
|
for (int i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
JSValue arg = JS_GetPropertyUint32(context, ids, 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);
|
id = JS_ToCString(context, key);
|
||||||
JS_FreeValue(context, key);
|
JS_FreeValue(context, key);
|
||||||
}
|
}
|
||||||
uint8_t* blob = NULL;
|
|
||||||
size_t size = 0;
|
blobs_get_work_t* work = tf_malloc(sizeof(blobs_get_work_t));
|
||||||
const size_t k_send_max = 8192;
|
*work = (blobs_get_work_t) {
|
||||||
if (tf_ssb_db_blob_get(ssb, id, &blob, &size))
|
.request_number = request_number,
|
||||||
{
|
};
|
||||||
for (size_t offset = 0; offset < size; offset += k_send_max)
|
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);
|
||||||
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);
|
|
||||||
}
|
|
||||||
JS_FreeCString(context, id);
|
JS_FreeCString(context, id);
|
||||||
JS_FreeValue(context, arg);
|
JS_FreeValue(context, arg);
|
||||||
}
|
}
|
||||||
JS_FreeValue(context, ids);
|
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)
|
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user