Три урока подряд из проектирования отладочного API одного движка:
1. (v4 → v6) Именуйте лайфсайкл, а не события движка. 2. (v6.2 → v6.4) Наблюдение ≠ координация — отдельные хуки для разных задач. 3. (v7) Когда N потребителей переизобретают одну и ту же координационную обвязку поверх ваших хуков — хук-контракт не *неполный*, он на не той *гранулярности*. Координационная машина состояний — это сосед хуков, а не их расширение.
v7 turing-machine-js выпустил DebugSession — класс-компаньон при TuringMachine на том же уровне библиотеки. Движок снова стал синхронным и без колбэков; сессия владеет координационной машиной состояний (четыре события со своими договорами о диспетчеризации, методы шага по глубине стека в духе DevTools, Promise паузы, одноразовый лайфсайкл). Воркер демо, раньше переизобретавший четыре механизма, стал тонким адаптером между своим протоколом сообщений и API сессии.
post-machine-js оборачивает движковую сессию в PostDebugSession — компаньон компаньона. Паттерн воспроизводится на уровень выше.
Мета-дизайн в одном предложении: когда форма обработчика повторяется у N потребителей без существенных различий — поднимите общий слой в соседний класс на уровне библиотеки. Не расширяйте хук. Постройте соседа.
Полная статья (RU + EN): https://mellonis.ru/ru/articles/klass-kompanion-debugsession/