diff --git a/include/ircd/m/sync.h b/include/ircd/m/sync.h index 0456ab4d4..f3520c181 100644 --- a/include/ircd/m/sync.h +++ b/include/ircd/m/sync.h @@ -42,7 +42,7 @@ namespace ircd::m::sync struct ircd::m::sync::item :instance_multimap> { - using handle = std::function; + using handle = std::function; std::string conf_name[2]; conf::item enable; @@ -54,9 +54,9 @@ struct ircd::m::sync::item string_view name() const; string_view member_name() const; - void poll(data &, const m::event &); - void linear(data &); - void polylog(data &); + bool poll(data &, const m::event &); + bool linear(data &); + bool polylog(data &); item(std::string name, handle polylog = {}, @@ -90,8 +90,6 @@ struct ircd::m::sync::data /// The json::stack master object json::stack out; - bool committed {false}; - bool commit(); // apropos contextual const m::event *event {nullptr}; diff --git a/ircd/m.cc b/ircd/m.cc index bd77ced08..1829f720d 100644 --- a/ircd/m.cc +++ b/ircd/m.cc @@ -531,13 +531,12 @@ ircd::m::sync::loghead(const data &data) return fmt::sprintf { - headbuf, "%s %s %lu:%lu %s commit:%b chunk:%zu %s in %s", + headbuf, "%s %s %lu:%lu %s chunk:%zu %s in %s", remstr, string_view{data.user.user_id}, data.range.first, data.range.second, ircd::pretty(iecbuf[0], iec(flush_bytes + size(data.out.completed()))), - data.committed, flush_count, ircd::pretty(iecbuf[1], iec(flush_bytes)), tmstr @@ -609,14 +608,6 @@ noexcept { } -bool -ircd::m::sync::data::commit() -{ - const auto ret{committed}; - committed = true; - return ret; -} - // // item // @@ -680,12 +671,12 @@ noexcept }; } -void +bool ircd::m::sync::item::polylog(data &data) try { if(!enable) - return; + return false; #ifdef RB_DEBUG sync::stats stats @@ -699,7 +690,10 @@ try stats.timer = {}; #endif - _polylog(data); + const bool ret + { + _polylog(data) + }; #ifdef RB_DEBUG if(data.stats && (stats_info || stats_debug)) @@ -708,13 +702,16 @@ try thread_local char tmbuf[32]; log::debug { - log, "polylog %s '%s' %s", + log, "polylog %s commit:%b '%s' %s", loghead(data), + ret, name(), ircd::pretty(tmbuf, stats.timer.at(), true) }; } #endif + + return ret; } catch(const std::bad_function_call &e) { @@ -725,6 +722,8 @@ catch(const std::bad_function_call &e) name(), e.what() }; + + return false; } catch(const m::error &e) { @@ -736,6 +735,8 @@ catch(const m::error &e) e.what(), e.content }; + + return false; } catch(const std::exception &e) { @@ -750,11 +751,11 @@ catch(const std::exception &e) throw; } -void +bool ircd::m::sync::item::linear(data &data) try { - _linear(data); + return _linear(data); } catch(const std::bad_function_call &e) { @@ -766,9 +767,11 @@ catch(const std::bad_function_call &e) name(), e.what() }; + + return false; } -void +bool ircd::m::sync::item::poll(data &data, const m::event &event) try @@ -778,7 +781,7 @@ try data.event, &event }; - _linear(data); + return _linear(data); } catch(const std::bad_function_call &e) { @@ -790,6 +793,8 @@ catch(const std::bad_function_call &e) name(), e.what() }; + + return false; } ircd::string_view diff --git a/modules/client/sync.cc b/modules/client/sync.cc index acdb54431..808ab5e69 100644 --- a/modules/client/sync.cc +++ b/modules/client/sync.cc @@ -160,7 +160,17 @@ ircd::m::sync::handle_get(client &client, void ircd::m::sync::empty_response(data &data) { - data.commit(); + // Empty objects added to output otherwise Riot b0rks. + json::stack::object + { + data.out, "rooms" + }; + + json::stack::object + { + data.out, "presence" + }; + json::stack::member { data.out, "next_batch", json::value @@ -168,10 +178,6 @@ ircd::m::sync::empty_response(data &data) lex_cast(data.range.second), json::STRING } }; - - // Empty objects added to output otherwise Riot b0rks. - json::stack::object{data.out, "rooms"}; - json::stack::object{data.out, "presence"}; } ircd::const_buffer @@ -179,12 +185,6 @@ ircd::m::sync::flush(data &data, resource::response::chunked &response, const const_buffer &buffer) { - if(!data.committed) - return const_buffer - { - buffer::data(buffer), 0UL - }; - const size_t wrote { response.write(buffer) @@ -210,32 +210,53 @@ bool ircd::m::sync::polylog::handle(data &data) try { - m::sync::for_each(string_view{}, [&data] + json::stack::checkpoint checkpoint + { + data.out + }; + + bool ret{false}; + m::sync::for_each(string_view{}, [&data, &ret] (item &item) { - json::stack::member member + json::stack::checkpoint checkpoint + { + data.out + }; + + json::stack::object object { data.out, item.member_name() }; - item.polylog(data); + if(item.polylog(data)) + ret = true; + else + checkpoint.rollback(); + return true; }); - json::stack::member - { - data.out, "next_batch", json::value + if(ret) + json::stack::member { - lex_cast(data.range.second), json::STRING - } - }; + data.out, "next_batch", json::value + { + lex_cast(data.range.second), json::STRING + } + }; + + if(!ret) + checkpoint.rollback(); if(stats_info) log::info { - log, "polylog %s complete", loghead(data) + log, "polylog %s commit:%b complete", + loghead(data), + ret }; - return data.committed; + return ret; } catch(const std::exception &e) { @@ -257,7 +278,8 @@ bool ircd::m::sync::linear::handle(data &data) try { - m::events::for_each(data.range, [&data] + bool ret{false}; + m::events::for_each(data.range, [&data, &ret] (const m::event::idx &event_idx, const m::event &event) { const scope_restore theirs @@ -265,7 +287,7 @@ try data.event, &event }; - m::sync::for_each(string_view{}, [&data] + m::sync::for_each(string_view{}, [&data, &ret] (item &item) { json::stack::member member @@ -273,7 +295,7 @@ try data.out, item.member_name() }; - item.linear(data); + ret |= item.linear(data); return true; }); @@ -293,7 +315,7 @@ try log, "linear %s complete", loghead(data) }; - return data.committed; + return ret; } catch(const std::exception &e) { diff --git a/modules/client/sync/account_data.cc b/modules/client/sync/account_data.cc index 88b9445bb..ca4414b04 100644 --- a/modules/client/sync/account_data.cc +++ b/modules/client/sync/account_data.cc @@ -17,8 +17,8 @@ IRCD_MODULE namespace ircd::m::sync { static bool account_data_(data &, const m::event &, const m::event::idx &); - static void account_data_polylog(data &); - static void account_data_linear(data &); + static bool account_data_polylog(data &); + static bool account_data_linear(data &); extern item account_data; } @@ -31,20 +31,15 @@ ircd::m::sync::account_data account_data_linear }; -void +bool ircd::m::sync::account_data_linear(data &data) { - + return false; } -void +bool ircd::m::sync::account_data_polylog(data &data) { - json::stack::object object - { - data.out - }; - json::stack::array array { data.out, "events" @@ -60,12 +55,14 @@ ircd::m::sync::account_data_polylog(data &data) data.user_room, &fopts }; - state.for_each("ircd.account_data", [&data, &array] + bool ret{false}; + state.for_each("ircd.account_data", [&data, &array, &ret] (const m::event &event) { - if(account_data_(data, event, index(event))) - data.commit(); + ret |= account_data_(data, event, index(event)); }); + + return ret; } bool @@ -82,8 +79,6 @@ ircd::m::sync::account_data_(data &data, if(json::get<"room_id"_>(event) != data.user_room.room_id) return false; - data.commit(); - // Each account_data event is an object in the events array json::stack::object object { diff --git a/modules/client/sync/device_lists.cc b/modules/client/sync/device_lists.cc index 1bd344e9b..10678210f 100644 --- a/modules/client/sync/device_lists.cc +++ b/modules/client/sync/device_lists.cc @@ -16,8 +16,8 @@ IRCD_MODULE namespace ircd::m::sync { - static void device_lists_polylog(data &); - static void device_lists_linear(data &); + static bool device_lists_polylog(data &); + static bool device_lists_linear(data &); extern item device_lists; } @@ -30,20 +30,15 @@ ircd::m::sync::device_lists device_lists_linear }; -void +bool ircd::m::sync::device_lists_linear(data &data) { - + return false; } -void +bool ircd::m::sync::device_lists_polylog(data &data) { - json::stack::object object - { - data.out - }; - json::stack::array { data.out, "changed" @@ -53,4 +48,6 @@ ircd::m::sync::device_lists_polylog(data &data) { data.out, "left" }; + + return false; } diff --git a/modules/client/sync/device_one_time_keys_count.cc b/modules/client/sync/device_one_time_keys_count.cc index f492bfea3..10251fa43 100644 --- a/modules/client/sync/device_one_time_keys_count.cc +++ b/modules/client/sync/device_one_time_keys_count.cc @@ -16,8 +16,8 @@ IRCD_MODULE namespace ircd::m::sync { - static void device_one_time_keys_count_polylog(data &); - static void device_one_time_keys_count_linear(data &); + static bool device_one_time_keys_count_polylog(data &); + static bool device_one_time_keys_count_linear(data &); extern item device_one_time_keys_count; } @@ -30,18 +30,14 @@ ircd::m::sync::device_one_time_keys_count device_one_time_keys_count_linear }; -void +bool ircd::m::sync::device_one_time_keys_count_linear(data &data) { - + return false; } -void +bool ircd::m::sync::device_one_time_keys_count_polylog(data &data) { - json::stack::object object - { - data.out - }; - + return false; } diff --git a/modules/client/sync/presence.cc b/modules/client/sync/presence.cc index b5691f37b..4f37606fa 100644 --- a/modules/client/sync/presence.cc +++ b/modules/client/sync/presence.cc @@ -16,11 +16,11 @@ IRCD_MODULE namespace ircd::m::sync { - static void presence_polylog_events(data &); - static void presence_polylog(data &); + static bool presence_polylog_events(data &); + static bool presence_polylog(data &); - static void presence_linear_events(data &); - static void presence_linear(data &); + static bool presence_linear_events(data &); + static bool presence_linear(data &); extern item presence; } @@ -33,11 +33,9 @@ ircd::m::sync::presence presence_linear, }; -void +bool ircd::m::sync::presence_linear(data &data) { - return; - assert(data.event); const m::event &event { @@ -45,10 +43,10 @@ ircd::m::sync::presence_linear(data &data) }; if(json::get<"type"_>(event) != "ircd.presence") - return; + return false; if(json::get<"sender"_>(event) != m::me.user_id) - return; + return false; // sender json::stack::member @@ -68,21 +66,16 @@ ircd::m::sync::presence_linear(data &data) data.out, "content", at<"content"_>(event) }; - return; + return true; } -void +bool ircd::m::sync::presence_polylog(data &data) { - json::stack::object object - { - data.out - }; - - presence_polylog_events(data); + return presence_polylog_events(data); } -void +bool ircd::m::sync::presence_polylog_events(data &data) { json::stack::array array @@ -90,16 +83,17 @@ ircd::m::sync::presence_polylog_events(data &data) data.out, "events" }; + bool ret{false}; ctx::mutex mutex; - const auto append_event{[&data, &array, &mutex] + const auto append_event{[&data, &array, &mutex, &ret] (const json::object &event) { // Lock the json::stack for the append operations. This mutex will only be // contended during a json::stack flush to the client; not during database // queries leading to this. const std::lock_guard l{mutex}; + ret = true; - data.commit(); json::stack::object object { array @@ -158,4 +152,6 @@ ircd::m::sync::presence_polylog_events(data &data) q[pos] = strlcpy(buf->at(pos), user.user_id); parallel(); }); + + return ret; } diff --git a/modules/client/sync/rooms.cc b/modules/client/sync/rooms.cc index b09ef3e2c..185c5164b 100644 --- a/modules/client/sync/rooms.cc +++ b/modules/client/sync/rooms.cc @@ -16,12 +16,12 @@ IRCD_MODULE namespace ircd::m::sync { - static void _rooms_polylog_room(data &, const m::room &); - static void _rooms_polylog(data &, const string_view &membership); - static void rooms_polylog(data &); + static bool _rooms_polylog_room(data &, const m::room &); + static bool _rooms_polylog(data &, const string_view &membership); + static bool rooms_polylog(data &); - static void _rooms_linear(data &, const string_view &membership); - static void rooms_linear(data &); + static bool _rooms_linear(data &, const string_view &membership); + static bool rooms_linear(data &); extern item rooms; } @@ -34,17 +34,33 @@ ircd::m::sync::rooms rooms_linear }; -void +bool ircd::m::sync::rooms_linear(data &data) { - json::stack::object object{data.out}; - _rooms_linear(data, "invite"); - _rooms_linear(data, "join"); - _rooms_linear(data, "leave"); - _rooms_linear(data, "ban"); + assert(data.event); + const auto &event{*data.event}; + if(!json::get<"room_id"_>(event)) + return false; + + const m::room room + { + json::get<"room_id"_>(event) + }; + + const scope_restore theirs + { + data.room, &room + }; + + bool ret{false}; + ret |= _rooms_linear(data, "invite"); + ret |= _rooms_linear(data, "join"); + ret |= _rooms_linear(data, "leave"); + ret |= _rooms_linear(data, "ban"); + return ret; } -void +bool ircd::m::sync::_rooms_linear(data &data, const string_view &membership) { @@ -53,30 +69,34 @@ ircd::m::sync::_rooms_linear(data &data, data.membership, membership }; - m::sync::for_each("rooms", [&](item &item) + bool ret{false}; + m::sync::for_each("rooms", [&data, &ret] + (item &item) { - json::stack::member member + json::stack::object object { data.out, item.member_name() }; - item.linear(data); + ret |= item.linear(data); return true; }); + + return ret; } -void +bool ircd::m::sync::rooms_polylog(data &data) { - json::stack::object object{data.out}; - _rooms_polylog(data, "invite"); - _rooms_polylog(data, "join"); - _rooms_polylog(data, "leave"); - _rooms_polylog(data, "ban"); - return; + bool ret{false}; + ret |= _rooms_polylog(data, "invite"); + ret |= _rooms_polylog(data, "join"); + ret |= _rooms_polylog(data, "leave"); + ret |= _rooms_polylog(data, "ban"); + return ret; } -void +bool ircd::m::sync::_rooms_polylog(data &data, const string_view &membership) { @@ -85,12 +105,18 @@ ircd::m::sync::_rooms_polylog(data &data, data.membership, membership }; + json::stack::checkpoint checkpoint + { + data.out + }; + json::stack::object object { data.out, membership }; - data.user_rooms.for_each(membership, [&data] + bool ret{false}; + data.user_rooms.for_each(membership, [&data, &ret] (const m::room &room, const string_view &membership_) { #if defined(RB_DEBUG) && 0 @@ -105,7 +131,7 @@ ircd::m::sync::_rooms_polylog(data &data, stats.timer = timer{}; #endif - _rooms_polylog_room(data, room); + ret |= _rooms_polylog_room(data, room); #if defined(RB_DEBUG) && 0 thread_local char tmbuf[32]; @@ -118,9 +144,14 @@ ircd::m::sync::_rooms_polylog(data &data, }; #endif }); + + if(!ret) + checkpoint.rollback(); + + return ret; } -void +bool ircd::m::sync::_rooms_polylog_room(data &data, const m::room &room) { @@ -129,6 +160,11 @@ ircd::m::sync::_rooms_polylog_room(data &data, data.room, &room }; + json::stack::checkpoint checkpoint + { + data.out + }; + json::stack::object object { data.out, room.room_id @@ -144,15 +180,30 @@ ircd::m::sync::_rooms_polylog_room(data &data, data.room_head, room_head }; - m::sync::for_each("rooms", [&data] + bool ret{false}; + m::sync::for_each("rooms", [&data, &ret] (item &item) { + json::stack::checkpoint checkpoint + { + data.out + }; + json::stack::object object { data.out, item.member_name() }; - item.polylog(data); + if(item.polylog(data)) + ret = true; + else + checkpoint.rollback(); + return true; }); + + if(!ret) + checkpoint.rollback(); + + return ret; } diff --git a/modules/client/sync/rooms/account_data.cc b/modules/client/sync/rooms/account_data.cc index bdbe80242..06ae6d7e3 100644 --- a/modules/client/sync/rooms/account_data.cc +++ b/modules/client/sync/rooms/account_data.cc @@ -16,9 +16,9 @@ IRCD_MODULE namespace ircd::m::sync { - static void room_account_data_polylog_events_event(data &, const m::event &); - static void room_account_data_polylog_events(data &); - static void room_account_data_polylog(data &); + static bool room_account_data_polylog_events_event(data &, const m::event &); + static bool room_account_data_polylog_events(data &); + static bool room_account_data_polylog(data &); extern item room_account_data; } @@ -30,13 +30,13 @@ ircd::m::sync::room_account_data room_account_data_polylog }; -void +bool ircd::m::sync::room_account_data_polylog(data &data) { - room_account_data_polylog_events(data); + return room_account_data_polylog_events(data); } -void +bool ircd::m::sync::room_account_data_polylog_events(data &data) { json::stack::array array @@ -61,19 +61,21 @@ ircd::m::sync::room_account_data_polylog_events(data &data) data.user_room, &fopts }; - state.for_each(type, [&data] + bool ret{false}; + state.for_each(type, [&data, &ret] (const m::event &event) { if(apropos(data, event)) - room_account_data_polylog_events_event(data, event); + ret |= room_account_data_polylog_events_event(data, event); }); + + return ret; } -void +bool ircd::m::sync::room_account_data_polylog_events_event(data &data, const m::event &event) { - data.commit(); json::stack::object object { data.out @@ -88,4 +90,6 @@ ircd::m::sync::room_account_data_polylog_events_event(data &data, { object, "content", at<"content"_>(event) }; + + return true; } diff --git a/modules/client/sync/rooms/ephemeral.cc b/modules/client/sync/rooms/ephemeral.cc index 7cb8d3abc..bc060a713 100644 --- a/modules/client/sync/rooms/ephemeral.cc +++ b/modules/client/sync/rooms/ephemeral.cc @@ -16,9 +16,9 @@ IRCD_MODULE namespace ircd::m::sync { - static void rooms_ephemeral_events_polylog(data &); - static void rooms_ephemeral_polylog(data &); - static void rooms_ephemeral_linear(data &); + static bool rooms_ephemeral_events_polylog(data &); + static bool rooms_ephemeral_polylog(data &); + static bool rooms_ephemeral_linear(data &); extern item rooms_ephemeral; } @@ -30,19 +30,19 @@ ircd::m::sync::rooms_ephemeral rooms_ephemeral_linear }; -void +bool ircd::m::sync::rooms_ephemeral_linear(data &data) { - + return false; } -void +bool ircd::m::sync::rooms_ephemeral_polylog(data &data) { - rooms_ephemeral_events_polylog(data); + return rooms_ephemeral_events_polylog(data); } -void +bool ircd::m::sync::rooms_ephemeral_events_polylog(data &data) { json::stack::array array @@ -50,10 +50,22 @@ ircd::m::sync::rooms_ephemeral_events_polylog(data &data) data.out, "events" }; - m::sync::for_each("rooms.ephemeral", [&] + bool ret{false}; + m::sync::for_each("rooms.ephemeral", [&data, &ret] (item &item) { - item.polylog(data); + json::stack::checkpoint checkpoint + { + data.out + }; + + if(item.polylog(data)) + ret = true; + else + checkpoint.rollback(); + return true; }); + + return ret; } diff --git a/modules/client/sync/rooms/ephemeral/receipt.cc b/modules/client/sync/rooms/ephemeral/receipt.cc index 10d2ecb51..1bb5dfd7f 100644 --- a/modules/client/sync/rooms/ephemeral/receipt.cc +++ b/modules/client/sync/rooms/ephemeral/receipt.cc @@ -16,9 +16,9 @@ IRCD_MODULE namespace ircd::m::sync { - static void _handle_message_receipt(data &, const m::event &); - static void _handle_message(data &, const m::event::idx &); - static void room_ephemeral_m_receipt_m_read_polylog(data &); + static bool _handle_message_receipt(data &, const m::event &); + static bool _handle_message(data &, const m::event::idx &); + static bool room_ephemeral_m_receipt_m_read_polylog(data &); extern item room_ephemeral_m_receipt_m_read; } @@ -29,7 +29,7 @@ ircd::m::sync::room_ephemeral_m_receipt_m_read room_ephemeral_m_receipt_m_read_polylog }; -void +bool ircd::m::sync::room_ephemeral_m_receipt_m_read_polylog(data &data) { const m::room &room{*data.room}; @@ -54,17 +54,24 @@ ircd::m::sync::room_ephemeral_m_receipt_m_read_polylog(data &data) if(i > 0 && !it && idx) it.seek(idx); + bool ret{false}; if(i > 0 && idx) for(; it && i > -1; ++it, --i) - _handle_message(data, it.event_idx()); + ret |= _handle_message(data, it.event_idx()); + + return ret; } -void +bool ircd::m::sync::_handle_message(data &data, const event::idx &idx) { + bool ret{false}; + if(!apropos(data, idx)) + return ret; + const event::refs refs{idx}; - refs.for_each(dbs::ref::M_RECEIPT__M_READ, [&data] + refs.for_each(dbs::ref::M_RECEIPT__M_READ, [&data, &ret] (const event::idx &idx, const auto &type) { assert(type == dbs::ref::M_RECEIPT__M_READ); @@ -79,17 +86,18 @@ ircd::m::sync::_handle_message(data &data, }; if(event.valid) - _handle_message_receipt(data, event); + ret |= _handle_message_receipt(data, event); return true; }); + + return ret; } -void +bool ircd::m::sync::_handle_message_receipt(data &data, const m::event &event) { - data.commit(); const json::object content { at<"content"_>(event) @@ -131,4 +139,6 @@ ircd::m::sync::_handle_message_receipt(data &data, { sender_, "ts", json::value(content.at("ts")) }; + + return true; } diff --git a/modules/client/sync/rooms/state.cc b/modules/client/sync/rooms/state.cc index a5ae611e4..25dc651ee 100644 --- a/modules/client/sync/rooms/state.cc +++ b/modules/client/sync/rooms/state.cc @@ -10,11 +10,11 @@ namespace ircd::m::sync { - static void room_state_polylog_events(data &); - static void room_state_polylog(data &); + static bool room_state_polylog_events(data &); + static bool room_state_polylog(data &); - static void room_state_linear_events(data &); - static void room_state_linear(data &); + static bool room_state_linear_events(data &); + static bool room_state_linear(data &); extern const event::keys::include _default_keys; extern event::fetch::opts _default_fopts; @@ -59,7 +59,7 @@ ircd::m::sync::_default_fopts _default_keys }; -void +bool ircd::m::sync::room_state_linear(data &data) { assert(data.event); @@ -67,22 +67,25 @@ ircd::m::sync::room_state_linear(data &data) assert(json::get<"room_id"_>(*data.event)); if(!json::get<"state_key"_>(*data.event)) - return; + return false; if(!data.room->membership(data.user, data.membership)) - return; + return false; //data.array->append(*data.event); + return false; } -void +bool ircd::m::sync::room_state_polylog(data &data) { - if(apropos(data, data.room_head)) - room_state_polylog_events(data); + if(!apropos(data, data.room_head)) + return false; + + return room_state_polylog_events(data); } -void +bool ircd::m::sync::room_state_polylog_events(data &data) { const m::room &room{*data.room}; @@ -92,8 +95,9 @@ ircd::m::sync::room_state_polylog_events(data &data) data.out, "events" }; + bool ret{false}; ctx::mutex mutex; - const event::closure_idx each_idx{[&data, &array, &mutex] + const event::closure_idx each_idx{[&data, &array, &mutex, &ret] (const m::event::idx event_idx) { const event::fetch event @@ -106,8 +110,8 @@ ircd::m::sync::room_state_polylog_events(data &data) return; const std::lock_guard lock{mutex}; - data.commit(); array.append(event); + ret = true; }}; //TODO: conf @@ -123,4 +127,6 @@ ircd::m::sync::room_state_polylog_events(data &data) if(apropos(data, event_idx)) parallel(event_idx); }); + + return ret; } diff --git a/modules/client/sync/rooms/timeline.cc b/modules/client/sync/rooms/timeline.cc index c1ae66438..1dd2c38df 100644 --- a/modules/client/sync/rooms/timeline.cc +++ b/modules/client/sync/rooms/timeline.cc @@ -16,11 +16,11 @@ IRCD_MODULE namespace ircd::m::sync { - static event::id::buf _room_timeline_polylog_events(data &, const m::room &, bool &); - static void room_timeline_polylog(data &); + static event::id::buf _room_timeline_polylog_events(data &, const m::room &, bool &, bool &); + static bool room_timeline_polylog(data &); static event::id::buf _room_timeline_linear_events(data &, const m::room &, bool &); - static void room_timeline_linear(data &); + static bool room_timeline_linear(data &); extern const event::keys::include default_keys; extern item room_timeline; @@ -49,11 +49,9 @@ ircd::m::sync::default_keys "type", }; -void +bool ircd::m::sync::room_timeline_linear(data &data) { - return; - json::stack::object object { data.out @@ -80,7 +78,7 @@ ircd::m::sync::room_timeline_linear(data &data) object, "limited", json::value{limited} }; - return; + return false; } ircd::m::event::id::buf @@ -96,18 +94,18 @@ ircd::m::sync::_room_timeline_linear_events(data &data, return {}; } -void +bool ircd::m::sync::room_timeline_polylog(data &data) { if(!apropos(data, data.room_head)) - return; + return false; // events assert(data.room); - bool limited{false}; + bool limited{false}, ret{false}; m::event::id::buf prev { - _room_timeline_polylog_events(data, *data.room, limited) + _room_timeline_polylog_events(data, *data.room, limited, ret) }; // prev_batch @@ -121,12 +119,15 @@ ircd::m::sync::room_timeline_polylog(data &data) { data.out, "limited", json::value{limited} }; + + return ret; } ircd::m::event::id::buf ircd::m::sync::_room_timeline_polylog_events(data &data, const m::room &room, - bool &limited) + bool &limited, + bool &ret) { static const event::fetch::opts fopts { @@ -159,23 +160,12 @@ ircd::m::sync::_room_timeline_polylog_events(data &data, } limited = i >= 10; - if(i > 0) - data.commit(); - if(i > 0 && !it) it.seek(event_id); - if(i > 0 && it) - { - data.commit(); - //const m::event &event{*it}; - //data.state_at = at<"depth"_>(event); - } - if(i > 0) for(; it && i > -1; ++it, --i) { - data.commit(); json::stack::object object { array @@ -183,6 +173,7 @@ ircd::m::sync::_room_timeline_polylog_events(data &data, const m::event &event(*it); object.append(event); + ret = true; json::stack::object unsigned_ { diff --git a/modules/client/sync/rooms/unread_notifications.cc b/modules/client/sync/rooms/unread_notifications.cc index e80f583c2..b45c9b22a 100644 --- a/modules/client/sync/rooms/unread_notifications.cc +++ b/modules/client/sync/rooms/unread_notifications.cc @@ -18,8 +18,8 @@ namespace ircd::m::sync { static long _notification_count(const room &, const event::idx &a, const event::idx &b); static long _highlight_count(const room &, const user &u, const event::idx &a, const event::idx &b); - static void room_unread_notifications_polylog(data &); - static void room_unread_notifications_linear(data &); + static bool room_unread_notifications_polylog(data &); + static bool room_unread_notifications_linear(data &); extern item room_unread_notifications; } @@ -31,25 +31,28 @@ ircd::m::sync::room_unread_notifications room_unread_notifications_linear }; -void +bool ircd::m::sync::room_unread_notifications_linear(data &data) { - + return false; } -void +bool ircd::m::sync::room_unread_notifications_polylog(data &data) { const auto &room{*data.room}; m::event::id::buf last_read; if(!m::receipt::read(last_read, room.room_id, data.user)) - return; + return false; const auto start_idx { index(last_read) }; + if(!apropos(data, start_idx)) + return false; + // highlight_count json::stack::member { @@ -68,7 +71,7 @@ ircd::m::sync::room_unread_notifications_polylog(data &data) } }; - data.commit(); + return true; } long diff --git a/modules/client/sync/to_device.cc b/modules/client/sync/to_device.cc index 315e2c0ce..edfe79aca 100644 --- a/modules/client/sync/to_device.cc +++ b/modules/client/sync/to_device.cc @@ -16,8 +16,8 @@ IRCD_MODULE namespace ircd::m::sync { - static void to_device_polylog(data &); - static void to_device_linear(data &); + static bool to_device_polylog(data &); + static bool to_device_linear(data &); extern item to_device; } @@ -30,20 +30,15 @@ ircd::m::sync::to_device to_device_linear }; -void +bool ircd::m::sync::to_device_linear(data &data) { - + return false; } -void +bool ircd::m::sync::to_device_polylog(data &data) { - json::stack::object object - { - data.out - }; - json::stack::array array { data.out, "events" @@ -59,6 +54,7 @@ ircd::m::sync::to_device_polylog(data &data) user_room }; + bool ret{false}; for(; it; ++it) { const auto &event_idx(it.event_idx()); @@ -75,10 +71,9 @@ ircd::m::sync::to_device_polylog(data &data) if(!relevant) continue; - m::get(std::nothrow, event_idx, "content", [&data, &array] + m::get(std::nothrow, event_idx, "content", [&data, &array, &ret] (const json::object &content) { - data.commit(); json::stack::object event { array @@ -109,6 +104,10 @@ ircd::m::sync::to_device_polylog(data &data) { content_, property, value }; + + ret = true; }); } + + return ret; }