Fix some errors I've seen responding to blobs.get. Especially: handle sending large blobs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3715 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										21
									
								
								core/ssb.js
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								core/ssb.js
									
									
									
									
									
								
							@@ -168,10 +168,25 @@ ssb.addRpc(['blobs', 'has'], function(request) {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ssb.addRpc(['blobs', 'get'], function(request) {
 | 
					ssb.addRpc(['blobs', 'get'], function(request) {
 | 
				
			||||||
	for (let id of request.args) {
 | 
						for (let arg of request.args) {
 | 
				
			||||||
		var blob = ssb.blobGet(id);
 | 
							var blob;
 | 
				
			||||||
		request.send_binary(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);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						request.more(function(request) {});
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ssb.addRpc(['gossip', 'ping'], function(request) {
 | 
					ssb.addRpc(['gossip', 'ping'], function(request) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										56
									
								
								src/ssb.js.c
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								src/ssb.js.c
									
									
									
									
									
								
							@@ -375,6 +375,38 @@ static JSValue _tf_ssb_rpc_send_json(JSContext* context, JSValueConst this_val,
 | 
				
			|||||||
	return JS_UNDEFINED;
 | 
						return JS_UNDEFINED;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static JSValue _tf_ssb_rpc_send_json_end(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						JSValue connection_val = JS_GetPropertyStr(context, this_val, "connection");
 | 
				
			||||||
 | 
						tf_ssb_connection_t* connection = JS_GetOpaque(connection_val, tf_ssb_get_connection_class_id());
 | 
				
			||||||
 | 
						JSValue request_val = JS_GetPropertyStr(context, this_val, "request_number");
 | 
				
			||||||
 | 
						int32_t request_number;
 | 
				
			||||||
 | 
						JS_ToInt32(context, &request_number, request_val);
 | 
				
			||||||
 | 
						JS_FreeValue(context, request_val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						JSValue flags_val = JS_GetPropertyStr(context, this_val, "flags");
 | 
				
			||||||
 | 
						int32_t flags_number;
 | 
				
			||||||
 | 
						JS_ToInt32(context, &flags_number, flags_val);
 | 
				
			||||||
 | 
						JS_FreeValue(context, flags_val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						JSValue message_val = JS_JSONStringify(context, argv[0], JS_NULL, JS_NULL);
 | 
				
			||||||
 | 
						size_t size;
 | 
				
			||||||
 | 
						const char* message = JS_ToCStringLen(context, &size, message_val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tf_ssb_connection_rpc_send(
 | 
				
			||||||
 | 
							connection,
 | 
				
			||||||
 | 
							k_ssb_rpc_flag_json | (flags_number & ~k_ssb_rpc_mask_type) | k_ssb_rpc_flag_end_error,
 | 
				
			||||||
 | 
							-request_number,
 | 
				
			||||||
 | 
							(const uint8_t*)message,
 | 
				
			||||||
 | 
							size,
 | 
				
			||||||
 | 
							NULL,
 | 
				
			||||||
 | 
							NULL);
 | 
				
			||||||
 | 
						JS_FreeValue(context, connection_val);
 | 
				
			||||||
 | 
						JS_FreeCString(context, message);
 | 
				
			||||||
 | 
						JS_FreeValue(context, message_val);
 | 
				
			||||||
 | 
						return JS_UNDEFINED;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static JSValue _tf_ssb_rpc_more(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
 | 
					static JSValue _tf_ssb_rpc_more(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	JSValue connection_val = JS_GetPropertyStr(context, this_val, "connection");
 | 
						JSValue connection_val = JS_GetPropertyStr(context, this_val, "connection");
 | 
				
			||||||
@@ -412,6 +444,29 @@ static JSValue _tf_ssb_rpc_send_binary(JSContext* context, JSValueConst this_val
 | 
				
			|||||||
			NULL,
 | 
								NULL,
 | 
				
			||||||
			NULL);
 | 
								NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							size_t offset;
 | 
				
			||||||
 | 
							size_t element_size;
 | 
				
			||||||
 | 
							JSValue buffer = tf_util_try_get_typed_array_buffer(context, argv[0], &offset, &size, &element_size);
 | 
				
			||||||
 | 
							if (!JS_IsException(buffer))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								size_t total_size;
 | 
				
			||||||
 | 
								message = tf_util_try_get_array_buffer(context, &total_size, buffer);
 | 
				
			||||||
 | 
								if (message)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									tf_ssb_connection_rpc_send(
 | 
				
			||||||
 | 
										connection,
 | 
				
			||||||
 | 
										k_ssb_rpc_flag_binary | k_ssb_rpc_flag_stream,
 | 
				
			||||||
 | 
										-request_number,
 | 
				
			||||||
 | 
										(const uint8_t*)message + offset,
 | 
				
			||||||
 | 
										size,
 | 
				
			||||||
 | 
										NULL,
 | 
				
			||||||
 | 
										NULL);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							JS_FreeValue(context, buffer);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	JS_FreeValue(context, connection_val);
 | 
						JS_FreeValue(context, connection_val);
 | 
				
			||||||
	return JS_UNDEFINED;
 | 
						return JS_UNDEFINED;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -430,6 +485,7 @@ void _tf_ssb_on_rpc(tf_ssb_connection_t* connection, uint8_t flags, int32_t requ
 | 
				
			|||||||
	JS_SetPropertyStr(context, object, "message", message && size ? JS_NewArrayBufferCopy(context, message, size) : args);
 | 
						JS_SetPropertyStr(context, object, "message", message && size ? JS_NewArrayBufferCopy(context, message, size) : args);
 | 
				
			||||||
	JS_SetPropertyStr(context, object, "send_json", JS_NewCFunction(context, _tf_ssb_rpc_send_json, "send_json", 1));
 | 
						JS_SetPropertyStr(context, object, "send_json", JS_NewCFunction(context, _tf_ssb_rpc_send_json, "send_json", 1));
 | 
				
			||||||
	JS_SetPropertyStr(context, object, "send_binary", JS_NewCFunction(context, _tf_ssb_rpc_send_binary, "send_binary", 1));
 | 
						JS_SetPropertyStr(context, object, "send_binary", JS_NewCFunction(context, _tf_ssb_rpc_send_binary, "send_binary", 1));
 | 
				
			||||||
 | 
						JS_SetPropertyStr(context, object, "send_json_end", JS_NewCFunction(context, _tf_ssb_rpc_send_json_end, "send_json_end", 1));
 | 
				
			||||||
	JS_SetPropertyStr(context, object, "more", JS_NewCFunction(context, _tf_ssb_rpc_more, "more", 1));
 | 
						JS_SetPropertyStr(context, object, "more", JS_NewCFunction(context, _tf_ssb_rpc_more, "more", 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	JSValue result = JS_Call(context, callback, JS_UNDEFINED, 1, &object);
 | 
						JSValue result = JS_Call(context, callback, JS_UNDEFINED, 1, &object);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user