forked from cory/tildefriends
		
	Get rid of the JS bits of tunnels.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4056 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										61
									
								
								src/ssb.js.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								src/ssb.js.c
									
									
									
									
									
								
							| @@ -930,65 +930,6 @@ static JSValue _tf_ssb_hmacsha256_verify(JSContext* context, JSValueConst this_v | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| static JSValue _tf_ssb_createTunnel(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv) | ||||
| { | ||||
| 	tf_ssb_t* ssb = JS_GetOpaque(this_val, _tf_ssb_classId); | ||||
| 	const char* portal_id = JS_ToCString(context, argv[0]); | ||||
| 	int32_t request_number = 0; | ||||
| 	JS_ToInt32(context, &request_number, argv[1]); | ||||
| 	const char* target_id = JS_ToCString(context, argv[2]); | ||||
| 	tf_ssb_connection_tunnel_create(ssb, portal_id, request_number, target_id); | ||||
| 	JS_FreeCString(context, target_id); | ||||
| 	JS_FreeCString(context, portal_id); | ||||
| 	return JS_UNDEFINED; | ||||
| } | ||||
|  | ||||
| typedef struct tunnel_t | ||||
| { | ||||
| 	tf_ssb_connection_t* connection; | ||||
| 	int32_t request_number; | ||||
| } tunnel_t; | ||||
|  | ||||
| void _tf_ssb_tunnel_rpc_callback(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data) | ||||
| { | ||||
| 	tunnel_t* tun = user_data; | ||||
| 	tf_ssb_connection_rpc_send(tun->connection, flags, tun->request_number, message, size, NULL, NULL, NULL); | ||||
| } | ||||
|  | ||||
| void _tf_ssb_tunnel_cleanup(tf_ssb_t* ssb, void* user_data) | ||||
| { | ||||
| 	tf_free(user_data); | ||||
| } | ||||
|  | ||||
| static JSValue _tf_ssb_tunnel(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv) | ||||
| { | ||||
| 	tf_ssb_connection_t* connection0 = JS_GetOpaque(argv[0], tf_ssb_get_connection_class_id()); | ||||
| 	int32_t request_number0 = 0; | ||||
| 	JS_ToInt32(context, &request_number0, argv[1]); | ||||
|  | ||||
| 	tf_ssb_connection_t* connection1 = JS_GetOpaque(argv[2], tf_ssb_get_connection_class_id()); | ||||
| 	int32_t request_number1 = 0; | ||||
| 	JS_ToInt32(context, &request_number1, argv[3]); | ||||
|  | ||||
| 	tunnel_t* data0 = tf_malloc(sizeof(tunnel_t)); | ||||
| 	*data0 = (tunnel_t) | ||||
| 	{ | ||||
| 		.connection = connection1, | ||||
| 		.request_number = request_number1, | ||||
| 	}; | ||||
| 	tunnel_t* data1 = tf_malloc(sizeof(tunnel_t)); | ||||
| 	*data1 = (tunnel_t) | ||||
| 	{ | ||||
| 		.connection = connection0, | ||||
| 		.request_number = request_number0, | ||||
| 	}; | ||||
|  | ||||
| 	tf_ssb_connection_add_request(connection0, request_number0, _tf_ssb_tunnel_rpc_callback, _tf_ssb_tunnel_cleanup, data0, connection1); | ||||
| 	tf_ssb_connection_add_request(connection1, request_number1, _tf_ssb_tunnel_rpc_callback, _tf_ssb_tunnel_cleanup, data1, connection0); | ||||
|  | ||||
| 	return JS_UNDEFINED; | ||||
| } | ||||
|  | ||||
| static JSValue _tf_ssb_connectionSendJson(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv) | ||||
| { | ||||
| 	tf_ssb_t* ssb = JS_GetOpaque(this_val, _tf_ssb_classId); | ||||
| @@ -1054,8 +995,6 @@ void tf_ssb_register(JSContext* context, tf_ssb_t* ssb) | ||||
| 	JS_SetPropertyStr(context, object, "storeMessage", JS_NewCFunction(context, _tf_ssb_storeMessage, "storeMessage", 1)); | ||||
| 	JS_SetPropertyStr(context, object, "getBroadcasts", JS_NewCFunction(context, _tf_ssb_getBroadcasts, "getBroadcasts", 0)); | ||||
| 	JS_SetPropertyStr(context, object, "connect", JS_NewCFunction(context, _tf_ssb_connect, "connect", 1)); | ||||
| 	JS_SetPropertyStr(context, object, "createTunnel", JS_NewCFunction(context, _tf_ssb_createTunnel, "createTunnel", 3)); | ||||
| 	JS_SetPropertyStr(context, object, "tunnel", JS_NewCFunction(context, _tf_ssb_tunnel, "tunnel", 4)); | ||||
|  | ||||
| 	/* Should be trusted only. */ | ||||
| 	JS_SetPropertyStr(context, object, "addRpc", JS_NewCFunction(context, _tf_ssb_add_rpc, "addRpc", 2)); | ||||
|   | ||||
							
								
								
									
										109
									
								
								src/ssb.rpc.c
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								src/ssb.rpc.c
									
									
									
									
									
								
							| @@ -97,9 +97,118 @@ static void _tf_ssb_rpc_blobs_has(tf_ssb_connection_t* connection, uint8_t flags | ||||
| 		NULL); | ||||
| } | ||||
|  | ||||
| typedef struct tunnel_t | ||||
| { | ||||
| 	tf_ssb_connection_t* connection; | ||||
| 	int32_t request_number; | ||||
| } tunnel_t; | ||||
|  | ||||
| void _tf_ssb_rpc_tunnel_callback(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data) | ||||
| { | ||||
| 	tunnel_t* tun = user_data; | ||||
| 	tf_ssb_connection_rpc_send(tun->connection, flags, tun->request_number, message, size, NULL, NULL, NULL); | ||||
| } | ||||
|  | ||||
| void _tf_ssb_rpc_tunnel_cleanup(tf_ssb_t* ssb, void* user_data) | ||||
| { | ||||
| 	tf_free(user_data); | ||||
| } | ||||
|  | ||||
| static void _tf_ssb_rpc_tunnel_connect(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 arg_array = JS_GetPropertyStr(context, args, "args"); | ||||
| 	JSValue arg = JS_GetPropertyUint32(context, arg_array, 0); | ||||
| 	JSValue origin = JS_GetPropertyStr(context, arg, "origin"); | ||||
| 	JSValue portal = JS_GetPropertyStr(context, arg, "portal"); | ||||
| 	JSValue target = JS_GetPropertyStr(context, arg, "target"); | ||||
|  | ||||
| 	if (JS_IsUndefined(origin) && | ||||
| 		!JS_IsUndefined(portal) &&  | ||||
| 		!JS_IsUndefined(target)) | ||||
| 	{ | ||||
| 		const char* portal_str = JS_ToCString(context, portal); | ||||
| 		const char* target_str = JS_ToCString(context, target); | ||||
|  | ||||
| 		tf_ssb_connection_t* target_connection = tf_ssb_connection_get(ssb, target_str); | ||||
| 		int32_t tunnel_request_number = tf_ssb_connection_next_request_number(target_connection); | ||||
|  | ||||
| 		JSValue message = JS_NewObject(context); | ||||
| 		JSValue name = JS_NewArray(context); | ||||
| 		JS_SetPropertyUint32(context, name, 0, JS_NewString(context, "tunnel")); | ||||
| 		JS_SetPropertyUint32(context, name, 1, JS_NewString(context, "connect")); | ||||
| 		JS_SetPropertyStr(context, message, "name", name); | ||||
| 		JSValue arg_obj = JS_NewObject(context); | ||||
| 		char origin_str[k_id_base64_len] = ""; | ||||
| 		tf_ssb_connection_get_id(connection, origin_str, sizeof(origin_str)); | ||||
| 		JS_SetPropertyStr(context, arg_obj, "origin", JS_NewString(context, origin_str)); | ||||
| 		JS_SetPropertyStr(context, arg_obj, "portal", JS_NewString(context, portal_str)); | ||||
| 		JS_SetPropertyStr(context, arg_obj, "target", JS_NewString(context, target_str)); | ||||
| 		JSValue arg_array = JS_NewArray(context); | ||||
| 		JS_SetPropertyUint32(context, arg_array, 0, arg_obj); | ||||
| 		JS_SetPropertyStr(context, message, "args", arg_array); | ||||
| 		JS_SetPropertyStr(context, message, "type", JS_NewString(context, "duplex")); | ||||
| 		JSValue message_val = JS_JSONStringify(context, message, JS_NULL, JS_NULL); | ||||
| 		size_t size; | ||||
| 		const char* message_str = JS_ToCStringLen(context, &size, message_val); | ||||
|  | ||||
| 		tf_ssb_connection_rpc_send( | ||||
| 			target_connection, | ||||
| 			k_ssb_rpc_flag_json | k_ssb_rpc_flag_stream, | ||||
| 			tunnel_request_number, | ||||
| 			(const uint8_t*)message_str, | ||||
| 			size, | ||||
| 			NULL, | ||||
| 			NULL, | ||||
| 			NULL); | ||||
|  | ||||
| 		JS_FreeCString(context, message_str); | ||||
|  | ||||
| 		tunnel_t* data0 = tf_malloc(sizeof(tunnel_t)); | ||||
| 		*data0 = (tunnel_t) | ||||
| 		{ | ||||
| 			.connection = target_connection, | ||||
| 			.request_number = tunnel_request_number, | ||||
| 		}; | ||||
| 		tunnel_t* data1 = tf_malloc(sizeof(tunnel_t)); | ||||
| 		*data1 = (tunnel_t) | ||||
| 		{ | ||||
| 			.connection = connection, | ||||
| 			.request_number = -request_number, | ||||
| 		}; | ||||
| 		tf_ssb_connection_add_request(connection, -request_number, _tf_ssb_rpc_tunnel_callback, _tf_ssb_rpc_tunnel_cleanup, data0, connection); | ||||
| 		tf_ssb_connection_add_request(target_connection, tunnel_request_number, _tf_ssb_rpc_tunnel_callback, _tf_ssb_rpc_tunnel_cleanup, data1, target_connection); | ||||
|  | ||||
| 		JS_FreeValue(context, message_val); | ||||
| 		JS_FreeValue(context, message); | ||||
| 		JS_FreeCString(context, portal_str); | ||||
| 		JS_FreeCString(context, target_str); | ||||
| 	} | ||||
| 	else if (!JS_IsUndefined(origin) && | ||||
| 		!JS_IsUndefined(portal) &&  | ||||
| 		!JS_IsUndefined(target)) | ||||
| 	{ | ||||
| 		const char* origin_str = JS_ToCString(context, origin); | ||||
| 		const char* portal_str = JS_ToCString(context, portal); | ||||
| 		const char* target_str = JS_ToCString(context, target); | ||||
| 		tf_ssb_connection_tunnel_create(ssb, portal_str, -request_number, origin_str); | ||||
| 		JS_FreeCString(context, origin_str); | ||||
| 		JS_FreeCString(context, portal_str); | ||||
| 		JS_FreeCString(context, target_str); | ||||
| 	} | ||||
|  | ||||
| 	JS_FreeValue(context, origin); | ||||
| 	JS_FreeValue(context, portal); | ||||
| 	JS_FreeValue(context, target); | ||||
| 	JS_FreeValue(context, arg); | ||||
| 	JS_FreeValue(context, arg_array); | ||||
| } | ||||
|  | ||||
| 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); | ||||
| 	tf_ssb_add_rpc_callback(ssb, (const char*[]) { "blobs", "has", NULL }, _tf_ssb_rpc_blobs_has, NULL, NULL); | ||||
| 	tf_ssb_add_rpc_callback(ssb, (const char*[]) { "tunnel", "connect", NULL }, _tf_ssb_rpc_tunnel_connect, NULL, NULL); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user