|
|
|
@ -339,55 +339,58 @@ class SyncReplicationHandler(ReplicationClientHandler): |
|
|
|
|
|
|
|
|
|
@defer.inlineCallbacks |
|
|
|
|
def process_and_notify(self, stream_name, token, rows): |
|
|
|
|
if stream_name == "events": |
|
|
|
|
# We shouldn't get multiple rows per token for events stream, so |
|
|
|
|
# we don't need to optimise this for multiple rows. |
|
|
|
|
for row in rows: |
|
|
|
|
event = yield self.store.get_event(row.event_id) |
|
|
|
|
extra_users = () |
|
|
|
|
if event.type == EventTypes.Member: |
|
|
|
|
extra_users = (event.state_key,) |
|
|
|
|
max_token = self.store.get_room_max_stream_ordering() |
|
|
|
|
self.notifier.on_new_room_event( |
|
|
|
|
event, token, max_token, extra_users |
|
|
|
|
try: |
|
|
|
|
if stream_name == "events": |
|
|
|
|
# We shouldn't get multiple rows per token for events stream, so |
|
|
|
|
# we don't need to optimise this for multiple rows. |
|
|
|
|
for row in rows: |
|
|
|
|
event = yield self.store.get_event(row.event_id) |
|
|
|
|
extra_users = () |
|
|
|
|
if event.type == EventTypes.Member: |
|
|
|
|
extra_users = (event.state_key,) |
|
|
|
|
max_token = self.store.get_room_max_stream_ordering() |
|
|
|
|
self.notifier.on_new_room_event( |
|
|
|
|
event, token, max_token, extra_users |
|
|
|
|
) |
|
|
|
|
elif stream_name == "push_rules": |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"push_rules_key", token, users=[row.user_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name == "push_rules": |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"push_rules_key", token, users=[row.user_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name in ("account_data", "tag_account_data",): |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"account_data_key", token, users=[row.user_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name == "receipts": |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"receipt_key", token, rooms=[row.room_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name == "typing": |
|
|
|
|
self.typing_handler.process_replication_rows(token, rows) |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"typing_key", token, rooms=[row.room_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name == "to_device": |
|
|
|
|
entities = [row.entity for row in rows if row.entity.startswith("@")] |
|
|
|
|
if entities: |
|
|
|
|
elif stream_name in ("account_data", "tag_account_data",): |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"to_device_key", token, users=entities, |
|
|
|
|
"account_data_key", token, users=[row.user_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name == "device_lists": |
|
|
|
|
all_room_ids = set() |
|
|
|
|
for row in rows: |
|
|
|
|
room_ids = yield self.store.get_rooms_for_user(row.user_id) |
|
|
|
|
all_room_ids.update(room_ids) |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"device_list_key", token, rooms=all_room_ids, |
|
|
|
|
) |
|
|
|
|
elif stream_name == "presence": |
|
|
|
|
yield self.presence_handler.process_replication_rows(token, rows) |
|
|
|
|
elif stream_name == "receipts": |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"groups_key", token, users=[row.user_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name == "receipts": |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"receipt_key", token, rooms=[row.room_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name == "typing": |
|
|
|
|
self.typing_handler.process_replication_rows(token, rows) |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"typing_key", token, rooms=[row.room_id for row in rows], |
|
|
|
|
) |
|
|
|
|
elif stream_name == "to_device": |
|
|
|
|
entities = [row.entity for row in rows if row.entity.startswith("@")] |
|
|
|
|
if entities: |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"to_device_key", token, users=entities, |
|
|
|
|
) |
|
|
|
|
elif stream_name == "device_lists": |
|
|
|
|
all_room_ids = set() |
|
|
|
|
for row in rows: |
|
|
|
|
room_ids = yield self.store.get_rooms_for_user(row.user_id) |
|
|
|
|
all_room_ids.update(room_ids) |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"device_list_key", token, rooms=all_room_ids, |
|
|
|
|
) |
|
|
|
|
elif stream_name == "presence": |
|
|
|
|
yield self.presence_handler.process_replication_rows(token, rows) |
|
|
|
|
elif stream_name == "receipts": |
|
|
|
|
self.notifier.on_new_event( |
|
|
|
|
"groups_key", token, users=[row.user_id for row in rows], |
|
|
|
|
) |
|
|
|
|
except Exception: |
|
|
|
|
logger.exception("Error processing replication") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def start(config_options): |
|
|
|
|