# Component topology

The _[component topology][glossary.component topology]_ is a general concept
that expresses the set of relationships between
[component instances](#component-instances).

These relationships are the following:

-   Component instance tree: Describes how component instances are
    [composed](#composition) together (their parent-child relationships).
-   Capability routing graph: Describes how component instances gain access to
    use capabilities published by other component instances (their
    provider-consumer relationships).

## Component instances {#component-instances}

A _component instance_ is a distinct embodiment of a
[component][glossary.component] running in its own sandbox that is isolated from
other component instances (including other instances of the same component).

You can often use the terms component and component instance interchangeably
when the context is clear. For example, it would be more precise to talk about
"starting a component instance" rather than "starting a component" but you can
easily infer that "starting a component" requires an instance of that component
to be created first so that the instance can be started.

While components are identified by a [URL][doc-component-urls], component
instances are identified by a [moniker](#monikers). Different instances of the
same component thus share the same URL but have different monikers.

## Component instance tree {#composition}

The _component instance tree_ expresses how components are assembled together to
make more complex components.

Using hierarchical composition, a parent component creates instances of other
components, which are known as its _children_. The child instances belong to the
parent and depend on the parent to provide them with the capabilities that they
need to run. Meanwhile, the parent gains access to the capabilities exposed by
its children through [capability routing](#capability-routing).

Children can be created in two ways:

-   Statically: The parent declares the existence of the child in its own
    [component declaration][doc-component-declaration]. The child is destroyed
    automatically if the child declaration is removed in an updated version of
    the parent's software.
-   Dynamically: The parent uses the
    [Realm framework protocol][doc-realm-framework-protocol] to add a child to a
    [component collection][doc-collections] that the parent declared. The parent
    destroys the child in a similar manner.

The component topology represents the structure of these parent-child
relationships as a [component instance tree][glossary.component-instance-tree].

<br>![Diagram of component instance tree](images/topology_instance_tree.png)<br>

## Monikers {#monikers}

A _moniker_ identifies a specific component instance in the component tree using
a topological path. There are three types of monikers, depending on how the
moniker is being used and kind of relationship it's describing: absolute,
relative, and child.

See the [monikers documentation][doc-monikers] for more information.

<br>![Diagram of component instance tree with monikers](images/topology_monikers.png)<br>

## Realms {#realms}

A _realm_ is a subtree of the component instance tree. Each realm is rooted by a
component instance and includes all of that instance's children and their
descendants. Put another way, realms express
[hierarchical composition](#composition) of component instances.

Realms are important [encapsulation](#encapsulation) boundaries in the component
topology. The root of each realm receives certain privileges to influence the
behavior of components, such as:

-   Declaring how capabilities flow into, out of, and within the realm.
-   Binding to child components to access their capabilities.
-   Creating and destroying child components.

See the [realms documentation][doc-realms] for more information.

<br>![Diagram of component realms](images/topology_realms.png)<br>

## Encapsulation {#encapsulation}

A component acts as an encapsulation boundary. Capabilities cannot escape a
component's [realm](#realms) unless explicitly allowed to by an
[expose][doc-expose] declaration.

Children remain forever dependent upon their parent; they cannot be reparented
and they cannot outlive their parent. When a parent is destroyed so are all of
its children.

This model resembles [composition][wiki-object-composition]{:.external} in
object-oriented programming languages.

See the [realms documentation][doc-realms] for more information.

<br>![Diagram of component instance encapsulation](images/topology_encapsulation.png)<br>

## Capability routing graph {#capability-routing}

The _capability routing graph_ describes how components gain access to use
capabilities exposed and offered by other components in the component instance
tree. For a capability provided by a component instance to be usable by a
consumer component instance, there must be capability routing path between them.
Such capability routes are determined by `use`, `offer`, and `expose`
declarations in [component declarations][doc-component-declaration].

See the [capability routing documentation][doc-capability-routing] for more
information.

<br>![Diagram of capability routing](images/topology_capability_routing.png)<br>

[glossary.component]: /docs/glossary/README.md#component
[glossary.component instance tree]: /docs/glossary/README.md#component-instance-tree
[glossary.component topology]: /docs/glossary#component-topology
[doc-collections]: /docs/concepts/components/v2/realms.md#collections
[doc-environments]: /docs/concepts/components/v2/environments.md
[doc-expose]: https://fuchsia.dev/reference/cml#expose
[doc-realms]: /docs/concepts/components/v2/realms.md
[doc-realm-framework-protocol]: /docs/concepts/components/v2/realms.md#realm-framework-protocol
[doc-monikers]: /docs/concepts/components/v2/identifiers.md#monikers
[doc-component-urls]: /docs/concepts/components/v2/identifiers.md#component-urls
[doc-capability-routing]: /docs/concepts/components/v2/capabilities/README.md#routing
[doc-component-declaration]: /docs/concepts/components/v2/component_manifests.md#component-declaration
[wiki-least-privilege]: https://en.wikipedia.org/wiki/Principle_of_least_privilege
[wiki-object-composition]: https://en.wikipedia.org/wiki/Object_composition
