blob: 364902d063f4030c654b3999f3bc4aaf609d1727 [file] [log] [blame] [view]
# Capabilities
Components interact with one another through [capabilities][glossary.capability].
A capability combines access to a resource and a set of rights, providing a
access control and a means for interacting with the resource. Fuchsia
capabilities typically access underlying [kernel objects][glossary.kernel-object]
through [handles][glossary.handle] provided in the component's
[namespace][glossary.namespace].
A component can interact with the system and other components only through the
discoverable capabilities from its namespace and the few
[numbered handles][src-processargs] it receives.
## Capability routing {#routing}
Components declare new capabilities that they offer to the system and
capabilities provided by other components (or the framework) that they require
in their [component manifest][doc-component-manifest]. Component framework uses
these declarations to populate the namespace.
For capabilities to be available at runtime, there must also be a valid
[capability route][glossary.capability-routing] from the consuming component to
a provider. Since capabilities are most often routed through parent components
to their children, parent components play an important role in defining the
sandboxes for their child components.
Some capability types are routed to [environments][glossary.environment] rather
than individual component instances. Environments configure the behavior of
the framework for the realms where they are assigned. Capabilities routed to
environments are accessed and used by the framework. Component instances do not
have runtime access to the capabilities in their environment.
The [availability][capability-availability] feature lets components declare expectations
about the circumstances under which they expect capabilities to be available.
### Routing terminology {#routing-terminology}
Routing terminology divides into the following categories:
1. Declarations of how capabilities are routed between the component, its
parent, and its children:
- `offer`: Declares that the capability listed is made available to a
[child component][doc-children] instance or a
[child collection][doc-collections].
- `expose`: Declares that the capabilities listed are made available to
the parent component or to the framework. It is valid to `expose` from
`self` or from a child component.
1. Declarations of capabilities consumed or provided by the component:
- `use`: For executable components, declares capabilities that this
component requires in its [namespace][glossary.namespace] at runtime.
Capabilities are routed from the `parent` unless otherwise specified,
and each capability must have a valid route from its source.
- `capabilities`: Declares capabilities that this component provides.
Capabilities that are offered or exposed from `self` must appear here.
These capabilities often map to a node in the
[outgoing directory][glossary.outgoing-directory].
## Capability types {#capability-types}
The following capabilities can be routed:
| type | description | routed to |
| ------------------------------------ | ----------------------------- | --------------------------------- |
| [`protocol`][capability-protocol] | A filesystem node that is | components |
: : used to open a channel backed : :
: : by a FIDL protocol. : :
| [`service`][capability-service] | A filesystem directory that | components |
: : is used to open a channel to : :
: : one of several service : :
: : instances. : :
| [`directory`][capability-directory] | A filesystem directory. | components |
: : : :
| [`storage`][capability-storage] | A writable filesystem | components |
: : directory that is isolated to : :
: : the component using it. : :
| [`resolver`][capability-resolver] | A capability that, when | [environments][doc-environments] |
: : registered in an environment, : :
: : causes a component with a : :
: : particular URL scheme to be : :
: : resolved with that resolver. : :
| [`runner`][capability-runner] | A capability that, when | [environments][doc-environments] |
: : registered in an environment, : :
: : allows the framework to use : :
: : that runner when starting : :
: : components. : :
## Examples {#examples}
Consider the following example that describes capability routing through the
component instance tree:
<br>![Capability routing example](/docs/concepts/components/v2/images/capability_routing_example.png)<br>
In this example:
- The `echo` component instance provides the `fuchsia.Echo` protocol as one
of its declared *capabilities*.
- The `echo_tool` component instance requires the *use* of the
`fuchsia.Echo` protocol capability.
Each intermediate component cooperates to explicitly route `fuchsia.Echo`
from `echo` to `echo_tool`:
1. `echo` *exposes* `fuchsia.Echo` from `self` so the protocol is visible to
its parent, `services`.
1. `services` *exposes* `fuchsia.Echo` from its child `echo` to its parent,
`shell`.
1. `shell` *offers* `fuchsia.Echo` from its child `services` to another child,
`tools`.
1. `tools` *offers* `fuchsia.Echo` from `parent` to its child, `echo_tool`.
Component Framework grants the request from `echo_tool` to use `fuchsia.Echo`
because a valid route is found to a component providing that protocol capability.
For more information on how components connect to capabilities at runtime, see
[Life of a protocol open][doc-protocol-open].
[capability-protocol]: /docs/concepts/components/v2/capabilities/protocol.md
[capability-service]: /docs/concepts/components/v2/capabilities/service.md
[capability-directory]: /docs/concepts/components/v2/capabilities/directory.md
[capability-storage]: /docs/concepts/components/v2/capabilities/storage.md
[capability-resolver]: /docs/concepts/components/v2/capabilities/resolver.md
[capability-runner]: /docs/concepts/components/v2/capabilities/runner.md
[capability-availability]: /docs/concepts/components/v2/capabilities/availability.md
[doc-children]: /docs/concepts/components/v2/realms.md##child-component-instances
[doc-collections]: /docs/concepts/components/v2/realms.md#collections
[doc-component-manifest]: /docs/concepts/components/v2/component_manifests.md
[doc-environments]: /docs/concepts/components/v2/environments.md
[doc-outgoing-directory]: /docs/concepts/packages/system.md#outgoing_directory
[doc-protocol-open]: /docs/concepts/components/v2/capabilities/life_of_a_protocol_open.md
[doc-resolvers]: /docs/concepts/components/v2/capabilities/resolver.md
[glossary.capability]: /docs/glossary#capability
[glossary.capability-routing]: /docs/glossary#capability-routing
[glossary.child]: /docs/glossary#child-component-instance
[glossary.component]: /docs/glossary#component
[glossary.environment]: /docs/glossary#environment
[glossary.handle]: /docs/glossary#handle
[glossary.kernel-object]: /docs/glossary#kernel-object
[glossary.namespace]: /docs/glossary#namespace
[glossary.outgoing-directory]: /docs/glossary/README.md#outgoing-directory
[glossary.parent]: /docs/glossary#parent-component-instance
[src-processargs]: /zircon/system/public/zircon/processargs.h