- MUC сохраняет согласованный журнал конфигурации, affiliations, nick,
ролей, членства и ограниченной истории без MAM. Изменение фиксируется до публикации ответа; при ошибке записи состояние комнаты откатывается. - Crash recovery использует последнее сохранённое поколение после SIGKILL, включая временные комнаты. Heartbeat обновляет живое членство; ожидающие записи сохраняют исходный deadline через повторные перезапуски. `muc_recovery_grace_period`: по умолчанию 300 секунд, пределы 1..604800. - Подтверждённые выходы, смена nick, ролей и политик комнаты не заменяются старой записью восстановления. Native config/state остаются экспортом для Prosody; согласованное восстановление Rust использует собственный sidecar. - Исправлены MUC probe, неизвестные типы presence, вход без MUC `<x/>`, ошибки доставки и статус 333. Обычные presence extensions сохраняются в живом обмене; поддельная MUC identity фильтруется. `subject` вместе с `body` либо `thread` не изменяет тему комнаты. - Подключены `muc_max_rooms`, `restrict_room_creation`, политики регистрации и зарегистрированного nick, `muc_tombstone_expiry`; добавлены встроенные административные ad-hoc команды уничтожения комнат и изменения affiliation. - Hub сохраняет resumable XEP-0198 сессии, счётчики и очередь. Resume после перезапуска доступен на новом TLS/SASL-транспорте через legacy SASL и SASL2. Действующие приватные SM-записи восстанавливают логические сессии и MUC до открытия listeners: offline-доставка попадает в очередь, синтетический join и история повторно не отправляются. SM resume не требует дополнительной available presence; без SM восстановление MUC требует новой аутентификации точного полного JID и available presence либо явного MUC-входа. Входящий handled-счётчик обновляется после обработки. Сокеты TCP/TLS не сохраняются; неопределённая сетевая отправка допускает повторную доставку. - Известные встроенные MUC-возможности Prosody отображаются на Rust-реализацию. Произвольные Lua/community-модули не исполняются; неизвестные явно включённые MUC-модули отклоняются при запуске. Общие и host `modules_disabled` учитываются для vCard и occupant-id. Порядок восстановления, ограничения хранения и отката на Prosody: [docs/MUC-RECOVERY.md](docs/MUC-RECOVERY.md). Проверка: 293 Rust tests, Clippy/fmt/release, полный сетевой прогон, 500 TLS MUC+SM ресурсов с SIGKILL/resume и native reference — успешно. Подробности: [docs/VALIDATION-0.8.0.md](docs/VALIDATION-0.8.0.md).
This commit is contained in:
1 parent
b30fc524d8
commit
7f60661eef
41 files changed
+9804
-452
No files matched your search
+29
@@ -11,7 +11,36 @@ pub struct Buffer {
|
||||
pub resume_delay: Duration,
|
||||
pub important_payloads: Vec<String>,
|
||||
}
|
||||
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
|
||||
pub(crate) struct DurableBuffer {
|
||||
inactive: bool,
|
||||
queue: Vec<String>,
|
||||
limit: usize,
|
||||
resume_delay_ms: u64,
|
||||
important_payloads: Vec<String>,
|
||||
}
|
||||
impl Buffer {
|
||||
pub(crate) fn durable(&self) -> DurableBuffer {
|
||||
DurableBuffer {
|
||||
inactive: self.inactive,
|
||||
queue: self.queue.clone(),
|
||||
limit: self.limit,
|
||||
resume_delay_ms: self.resume_delay.as_millis().min(u64::MAX as u128) as u64,
|
||||
important_payloads: self.important_payloads.clone(),
|
||||
}
|
||||
}
|
||||
pub(crate) fn from_durable(value: DurableBuffer) -> Self {
|
||||
Self {
|
||||
inactive: value.inactive,
|
||||
flushing_until: None,
|
||||
bytes: value.queue.iter().map(String::len).sum(),
|
||||
queue: value.queue,
|
||||
limit: value.limit,
|
||||
resume_delay: Duration::from_millis(value.resume_delay_ms),
|
||||
important_payloads: value.important_payloads,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn configure(&mut self, limit: usize, delay: Duration, payloads: Vec<String>) {
|
||||
self.limit = limit.max(1);
|
||||
self.resume_delay = delay;
|
||||
|
||||
Reference in new issue
Block a user