Skip to content

Дочерние Federations

Federation может включать другую Federation как один composite lifecycle-узел. Это позволяет приложению один раз вызвать root boot(context), а framework рекурсивно проведёт всё дерево через setup -> load -> build -> start.

Объявление дерева

ts
const Documents = EndgeFederation.define({
  id: 'documents',
  modules: DOCUMENT_MODULES,
})

const Workspace = EndgeFederation.define({
  id: 'workspace',
  modules: WORKSPACE_MODULES,
})

export const Application = EndgeFederation.define({
  id: 'application',
  modules: APPLICATION_MODULES,
  federations: [
    { key: 'workspace', federation: Workspace, after: 'configuration' },
    { key: 'documents', federation: Documents, after: 'workspace' },
  ],
})

before и after ссылаются только на sibling keys текущей Federation. В примере root graph знает о configuration, workspace и documents, но не обращается к внутренним Modules дочерних Federations.

Lifecycle

ts
await Application.boot(context)
await Application.build()
await Application.reset()

Перед первой phase framework рекурсивно конфигурирует и валидирует всё дерево: проверяет неизвестные dependencies, ordering cycles, конфликтующие ids и повторное присоединение child к разным parents. Затем каждая phase идёт в прямом resolved order, а reset — в обратном.

Если любой узел boot завершается с ошибкой, уже затронутые Modules и Federations откатываются в обратном порядке. Ошибки cleanup агрегируются вместе с исходной причиной.

Один lifecycle owner

После присоединения Workspace.boot(), Workspace.build() и Workspace.reset() нельзя вызывать напрямую. Lifecycle дочерней Federation принадлежит root.

Диагностическое дерево

createDiagnosticsSnapshot() использует тот же декларативный graph и возвращает рекурсивную inspectable-проекцию без запуска lifecycle:

ts
const tree = Application.createDiagnosticsSnapshot()

console.info(tree.id, tree.state)
for (const node of tree.nodes) {
  console.info(node.path, node.status)
}

Для Module вызывается его одноимённый метод, а дочерняя Federation продолжает обход собственного graph. Ошибка одного узла получает статус failed и не прерывает сбор остальных ветвей.

Что не считается child Federation

Submodule остаётся внутренней частью Module. Его создаёт и сбрасывает сам Module; framework не ищет Modules или Federations через reflection и не обходит поля объектов автоматически.