Forgot the other end of blobs.get.
This commit is contained in:
		| @@ -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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user