Перейти к содержимому

Political World — защита публичного Event Bus

✅ Source verified 🧯 Failure containment

Наивный Event Bus можно написать в несколько строк:

foreach (var callback in subscribers)
callback(data);

Для личного проекта этого иногда достаточно.

Для публичного addon framework появляются неприятные failure modes.

Event Bus Political World защищается как минимум от четырёх.

Наивный результат:

subscriber A throws
→ dispatch stops
→ B и C не запускаются
→ exception уходит в core

Political World вызывает каждый subscriber отдельно внутри try/catch.

Ошибка записывается в diagnostics конкретного addon, а dispatch продолжается.

Наивно:

foreach live List
→ callback делает unsubscribe
→ collection меняется во время iteration

Political World перед dispatch создаёт snapshot списка.

Изменения влияют на будущие события, а не ломают текущий loop.

Если всем выдать один mutable object:

A меняет data.NewValue
→ B получает уже изменённый payload

Political World клонирует PoliticalEventData для каждого callback.

Ограничение: вложенные ссылки Kingdom и Actor всё ещё указывают на реальные live WorldBox objects.

Например:

government changed event
→ addon пишет новое government
→ government changed event
→ addon опять пишет government
→ ...

Political World отслеживает nested dispatch depth и останавливает dispatch после depth 16.

Само число — implementation detail проверенного snapshot. Важен паттерн защиты.

Addon не может молча подписаться на случайный typo ID.

Unknown ID отклоняется, а diagnostics получает error.

Event framework не может автоматически сделать любой addon code безопасным.

Callback всё ещё может:

  • выполнять очень дорогую работу;
  • мутировать live game objects;
  • создавать логические loops ниже limit;
  • слишком долго хранить references;
  • делать несвязанные с событием side effects.

Event Bus — failure containment, а не sandbox.

Недостаточно написать:

«Вызовите Subscribe».

Нужно описывать:

  • поведение при callback failure;
  • mutation behavior;
  • assumptions об ordering;
  • recursion limits;
  • ownership/registration rules;
  • lifetime и mutability payload.

От этого зависит, смогут ли несколько community addons нормально жить вместе.