createHistoryStream JS -> C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4110 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		@@ -678,6 +678,78 @@ static void _tf_ssb_rpc_connection_tunnel_isRoom_callback(tf_ssb_connection_t* c
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _tf_ssb_rpc_createHistoryStream(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_get_context(ssb);
 | 
			
		||||
	JSValue arg_array = JS_GetPropertyStr(context, args, "args");
 | 
			
		||||
	JSValue arg = JS_GetPropertyUint32(context, arg_array, 0);
 | 
			
		||||
	if (JS_IsUndefined(arg))
 | 
			
		||||
	{
 | 
			
		||||
		tf_ssb_connection_rpc_send_error(connection, flags, -request_number, "Missing request.args in createHistoryStream.");
 | 
			
		||||
	}
 | 
			
		||||
	JSValue id = JS_GetPropertyStr(context, arg, "id");
 | 
			
		||||
	JSValue seq = JS_GetPropertyStr(context, arg, "seq");
 | 
			
		||||
	JSValue keys = JS_GetPropertyStr(context, arg, "keys");
 | 
			
		||||
	JSValue live = JS_GetPropertyStr(context, arg, "live");
 | 
			
		||||
	bool is_keys = JS_IsUndefined(keys) || JS_ToBool(context, keys) > 0;
 | 
			
		||||
	bool is_live = JS_ToBool(context, live) > 0;
 | 
			
		||||
	int64_t sequence = 0;
 | 
			
		||||
	JS_ToInt64(context, &sequence, seq);
 | 
			
		||||
	const char* author = JS_ToCString(context, id);
 | 
			
		||||
 | 
			
		||||
	sqlite3* db = tf_ssb_get_db(ssb);
 | 
			
		||||
	sqlite3_stmt* statement;
 | 
			
		||||
	if (sqlite3_prepare(db, "SELECT previous, author, id, sequence, timestamp, hash, content, signature, sequence_before_author FROM messages WHERE author = ?1 AND sequence >= ?2 ORDER BY sequence", -1, &statement, NULL) == SQLITE_OK)
 | 
			
		||||
	{
 | 
			
		||||
		if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK &&
 | 
			
		||||
			sqlite3_bind_int64(statement, 2, sequence) == SQLITE_OK)
 | 
			
		||||
		{
 | 
			
		||||
			while (sqlite3_step(statement) == SQLITE_ROW)
 | 
			
		||||
			{
 | 
			
		||||
				JSValue message = JS_UNDEFINED;
 | 
			
		||||
 | 
			
		||||
				JSValue formatted = tf_ssb_format_message(
 | 
			
		||||
					context,
 | 
			
		||||
					(const char*)sqlite3_column_text(statement, 0),
 | 
			
		||||
					(const char*)sqlite3_column_text(statement, 1),
 | 
			
		||||
					sqlite3_column_int64(statement, 3),
 | 
			
		||||
					sqlite3_column_double(statement, 4),
 | 
			
		||||
					(const char*)sqlite3_column_text(statement, 5),
 | 
			
		||||
					(const char*)sqlite3_column_text(statement, 6),
 | 
			
		||||
					(const char*)sqlite3_column_text(statement, 7),
 | 
			
		||||
					sqlite3_column_int(statement, 8));
 | 
			
		||||
				if (is_keys)
 | 
			
		||||
				{
 | 
			
		||||
					message = JS_NewObject(context);
 | 
			
		||||
					JS_SetPropertyStr(context, message, "key", JS_NewString(context, (const char*)sqlite3_column_text(statement, 2)));
 | 
			
		||||
					JS_SetPropertyStr(context, message, "value", formatted);
 | 
			
		||||
					JS_SetPropertyStr(context, message, "timestamp", JS_NewString(context, (const char*)sqlite3_column_text(statement, 4)));
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					message = formatted;
 | 
			
		||||
				}
 | 
			
		||||
				tf_ssb_connection_rpc_send_json(connection, flags, -request_number, message, NULL, NULL, NULL);
 | 
			
		||||
				JS_FreeValue(context, message);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		sqlite3_finalize(statement);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (is_live)
 | 
			
		||||
	{
 | 
			
		||||
		tf_ssb_connection_add_new_message_request(connection, author, -request_number, is_keys);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	JS_FreeCString(context, author);
 | 
			
		||||
	JS_FreeValue(context, id);
 | 
			
		||||
	JS_FreeValue(context, seq);
 | 
			
		||||
	JS_FreeValue(context, keys);
 | 
			
		||||
	JS_FreeValue(context, arg);
 | 
			
		||||
	JS_FreeValue(context, arg_array);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _tf_ssb_rpc_connections_changed_callback(tf_ssb_t* ssb, tf_ssb_change_t change, tf_ssb_connection_t* connection, void* user_data)
 | 
			
		||||
{
 | 
			
		||||
	JSContext* context = tf_ssb_get_context(ssb);
 | 
			
		||||
@@ -760,4 +832,5 @@ void tf_ssb_rpc_register(tf_ssb_t* ssb)
 | 
			
		||||
	tf_ssb_add_rpc_callback(ssb, (const char*[]) { "tunnel", "connect", NULL }, _tf_ssb_rpc_tunnel_connect, NULL, NULL);
 | 
			
		||||
	tf_ssb_add_rpc_callback(ssb, (const char*[]) { "tunnel", "isRoom", NULL }, _tf_ssb_rpc_tunnel_is_room, NULL, NULL);
 | 
			
		||||
	tf_ssb_add_rpc_callback(ssb, (const char*[]) { "room", "attendants", NULL }, _tf_ssb_rpc_room_attendants, NULL, NULL);
 | 
			
		||||
	tf_ssb_add_rpc_callback(ssb, (const char*[]) { "createHistoryStream", NULL }, _tf_ssb_rpc_createHistoryStream, NULL, NULL);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user