forked from cory/tildefriends
		
	Get my foot in the door converting ssb.js to C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4050 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										29
									
								
								core/ssb.js
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								core/ssb.js
									
									
									
									
									
								
							| @@ -205,35 +205,8 @@ ssb.addRpc(['blobs', 'has'], function(request) { | |||||||
| 	request.send_json(found); | 	request.send_json(found); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| ssb.addRpc(['blobs', 'get'], function(request) { |  | ||||||
| 	for (let arg of request.args) { |  | ||||||
| 		var blob; |  | ||||||
| 		if (arg.key) { |  | ||||||
| 			blob = ssb.blobGet(arg.key); |  | ||||||
| 		} else { |  | ||||||
| 			blob = ssb.blobGet(arg); |  | ||||||
| 		} |  | ||||||
| 		const k_send_max = 8192; |  | ||||||
| 		if (blob.byteLength > k_send_max) { |  | ||||||
| 			for (var i = 0; i < blob.byteLength; i += k_send_max) { |  | ||||||
| 				var buffer = new Uint8Array(blob, i, Math.min(blob.byteLength - i, k_send_max)); |  | ||||||
| 				request.send_binary(buffer); |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			request.send_binary(blob); |  | ||||||
| 		} |  | ||||||
| 		request.send_json_end(true); |  | ||||||
| 	} |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| ssb.addRpc(['gossip', 'ping'], function(request) { |  | ||||||
| 	request.more(function ping(message) { |  | ||||||
| 		message.send_json(Date.now()); |  | ||||||
| 	}); |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| ssb.addRpc(['tunnel', 'isRoom'], function(request) { | ssb.addRpc(['tunnel', 'isRoom'], function(request) { | ||||||
| 	request.send_json({"name":"tilde friends tunnel","membership":false,"features":["tunnel","room1"]}); | 	request.send_json({"name": "tilde friends tunnel", "membership": false, "features": ["tunnel", "room1"]}); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| function notify_attendant_changed(id, type) { | function notify_attendant_changed(id, type) { | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| #include "mem.h" | #include "mem.h" | ||||||
| #include "ssb.connections.h" | #include "ssb.connections.h" | ||||||
| #include "ssb.db.h" | #include "ssb.db.h" | ||||||
|  | #include "ssb.rpc.h" | ||||||
| #include "trace.h" | #include "trace.h" | ||||||
| #include "util.js.h" | #include "util.js.h" | ||||||
|  |  | ||||||
| @@ -1779,6 +1780,7 @@ tf_ssb_t* tf_ssb_create(uv_loop_t* loop, JSContext* context, sqlite3* db) | |||||||
|  |  | ||||||
| 	ssb->connections_tracker = tf_ssb_connections_create(ssb); | 	ssb->connections_tracker = tf_ssb_connections_create(ssb); | ||||||
|  |  | ||||||
|  | 	tf_ssb_rpc_register(ssb); | ||||||
| 	return ssb; | 	return ssb; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										82
									
								
								src/ssb.rpc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/ssb.rpc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | #include "ssb.rpc.h" | ||||||
|  |  | ||||||
|  | #include "mem.h" | ||||||
|  | #include "ssb.h" | ||||||
|  | #include "ssb.db.h" | ||||||
|  | #include "util.js.h" | ||||||
|  |  | ||||||
|  | #include <inttypes.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <time.h> | ||||||
|  |  | ||||||
|  | static void _tf_ssb_rpc_gossip_ping(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data) | ||||||
|  | { | ||||||
|  | 	char buffer[256]; | ||||||
|  | 	snprintf(buffer, sizeof(buffer), "%" PRId64, (int64_t)time(NULL)); | ||||||
|  | 	tf_ssb_connection_rpc_send( | ||||||
|  | 		connection, | ||||||
|  | 		flags, | ||||||
|  | 		-request_number, | ||||||
|  | 		(const uint8_t*)buffer, | ||||||
|  | 		strlen(buffer), | ||||||
|  | 		NULL, | ||||||
|  | 		NULL, | ||||||
|  | 		NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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) | ||||||
|  | { | ||||||
|  | 	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); | ||||||
|  | 		if (!JS_IsString(arg)) { | ||||||
|  | 			JSValue key = JS_GetPropertyStr(context, arg, "key"); | ||||||
|  | 			JS_FreeValue(context, arg); | ||||||
|  | 			arg = key; | ||||||
|  | 		} | ||||||
|  | 		const char* id = JS_ToCString(context, arg); | ||||||
|  | 		uint8_t* blob = NULL; | ||||||
|  | 		size_t size = 0; | ||||||
|  | 		const int 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, | ||||||
|  | 					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_FreeValue(context, arg); | ||||||
|  | 	} | ||||||
|  | 	JS_FreeValue(context, ids); | ||||||
|  | 	tf_ssb_connection_rpc_send( | ||||||
|  | 		connection, | ||||||
|  | 		k_ssb_rpc_flag_json | k_ssb_rpc_flag_end_error, | ||||||
|  | 		-request_number, | ||||||
|  | 		(const uint8_t*)(success ? "true" : "false"), | ||||||
|  | 		strlen(success ? "true" : "false"), | ||||||
|  | 		NULL, | ||||||
|  | 		NULL, | ||||||
|  | 		NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void tf_ssb_rpc_register(tf_ssb_t* ssb) | ||||||
|  | { | ||||||
|  | 	tf_ssb_add_rpc_callback(ssb, (const char*[]) { "gossip", "ping", NULL }, _tf_ssb_rpc_gossip_ping, NULL, NULL); | ||||||
|  | 	tf_ssb_add_rpc_callback(ssb, (const char*[]) { "blobs", "get", NULL }, _tf_ssb_rpc_blobs_get, NULL, NULL); | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								src/ssb.rpc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/ssb.rpc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | typedef struct _tf_ssb_t tf_ssb_t; | ||||||
|  |  | ||||||
|  | void tf_ssb_rpc_register(tf_ssb_t* ssb); | ||||||
		Reference in New Issue
	
	Block a user