| # Directory capabilities (Components v2) | 
 |  | 
 | <<../_v2_banner.md>> | 
 |  | 
 | [Directory capabilities][glossary-directory] allow components to connect to | 
 | directories provided by other components. | 
 |  | 
 | ## Providing directory capabilities | 
 |  | 
 | To provide a directory capability, a component must define the capability and | 
 | [route](#routing-directory-capabilities) it from `self`. The component hosts the | 
 | directory capability in its [outgoing directory][glossary-outgoing]. | 
 |  | 
 | To define the capability, add a `capabilities` declaration for it: | 
 |  | 
 | ```json5 | 
 | { | 
 |     capabilities: [ | 
 |         { | 
 |             directory: "data", | 
 |             rights: ["r*"], | 
 |             path: "/published-data", | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | This defines a capability hosted by this component whose outgoing directory path | 
 | is `/published-data`, and whose maximum usable | 
 | [rights](#directory-capability-rights) are `r*`. | 
 |  | 
 | ## Routing directory capabilities | 
 |  | 
 | Components route directory capabilities by either: | 
 |  | 
 | -   [exposing](#routing-directory-capability-expose) them, | 
 | -   or [offering](#routing-directory-capability-offer) them. | 
 |  | 
 | When a component wants to make one of its directories available to other | 
 | components, it specifies the path of that directory in its | 
 | [outgoing directory][glossary-outgoing] in one of the following ways: | 
 |  | 
 | ### Exposing {#routing-directory-capability-expose} | 
 |  | 
 | To [expose][expose] the directory to a parent: | 
 |  | 
 | ```json5 | 
 | { | 
 |     expose: [ | 
 |         { | 
 |             directory: "data", | 
 |             from: "#child-a", | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | Optionally, you may narrow the [rights](#directory-capability-rights) on the | 
 | directory: | 
 |  | 
 | ```json5 | 
 | { | 
 |     expose: [ | 
 |         { | 
 |             directory: "data", | 
 |             from: "#child-a", | 
 |             rights: ["r*"], | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | ### Offering {#routing-directory-capability-offer} | 
 |  | 
 | To [offer][offer] a directory to a child: | 
 |  | 
 | ```json5 | 
 | { | 
 |     offer: [ | 
 |         { | 
 |             directory: "data", | 
 |             from: "self", | 
 |             to: [ "#child-a", "#child-b" ], | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | Optionally, you may narrow the [rights](#directory-capability-rights) on the | 
 | directory: | 
 |  | 
 | ```json5 | 
 | { | 
 |     offer: [ | 
 |         { | 
 |             directory: "data", | 
 |             from: "self", | 
 |             rights: ["rw*"], | 
 |             to: [ "#child-a", "#child-b" ], | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | ## Consuming directory capabilities | 
 |  | 
 | When a component wants to make use of a directory from its parent, it does so by | 
 | [using][use] the directory. This will make the directory accessible from the | 
 | component's [namespace][glossary-namespace]. | 
 |  | 
 | This example shows a directory named `data` that is included in the component's | 
 | namespace. If the component instance accesses this directory during its | 
 | execution, the component framework performs | 
 | [capability routing][capability-routing] to find the component that provides it. | 
 | Then, the framework connects the directory from the component's namespace to | 
 | this provider. | 
 |  | 
 | ```json5 | 
 | { | 
 |     use: [ | 
 |         { | 
 |             directory: "data", | 
 |             rights: ["r*"], | 
 |             path: "/data", | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | `rights` must be a subset of the [rights](#directory-capability-rights) attached | 
 | to the directory. | 
 |  | 
 | See [`//examples/components/routing`][routing-example] for a working example of | 
 | routing a directory capability from one component to another. | 
 |  | 
 | ## Directory capability rights | 
 |  | 
 | As directories are [offered][offer] and [exposed][expose] throughout the system | 
 | a user may want to restrict what components who have access to this directory | 
 | may do. For example, a component could expose a directory as read-write to its | 
 | parent realm which could expose that directory it to its children as read-write | 
 | but to its parent as read-only. | 
 |  | 
 | [Directory rights][directory-rights] allow any directory declaration to specify | 
 | a rights field that indicates the set of rights that the directory would like to | 
 | [offer][offer], [expose][expose] or [use][use]. | 
 |  | 
 | ### Example | 
 |  | 
 | This example shows component `A` requesting access to `data` with read-write | 
 | rights: | 
 |  | 
 | ```json5 | 
 | // A.cml | 
 | { | 
 |     use: [ | 
 |         { | 
 |             directory: "data", | 
 |             rights: ["rw*"], | 
 |             path: "/data", | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | Furthermore, parent component `B` offers the directory `data` to component A but | 
 | with only read-only rights. In this case the routing fails and `data` wouldn't | 
 | be present in A's namespace. | 
 |  | 
 | ```json5 | 
 | // B.cml | 
 | { | 
 |     capabilities: [ | 
 |         { | 
 |             directory: "data", | 
 |             rights: ["r*"], | 
 |             path: "/published-data", | 
 |         }, | 
 |     ], | 
 |     offer: [ | 
 |         { | 
 |             directory: "data", | 
 |             from: "self", | 
 |             to: [ "#A" ], | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | ### Inference Rules | 
 |  | 
 | Directory rights are required in the following situations: | 
 |  | 
 | -   [use][use] - All directories use statements must specify their directory | 
 |     rights. | 
 | -   [capability][capability] - All `directory` `capability` declarations must | 
 |     specify rights. | 
 |  | 
 | If an expose or offer directory declaration does not specify optional rights, it | 
 | will inherit the rights from the source of the expose or offer. Rights specified | 
 | in a `use`, `offer`, or `expose` declaration must be a subset of the rights set | 
 | on the capability's source. | 
 |  | 
 | ### Framework directory capabilities | 
 |  | 
 | Some directory capabilities are available to all components through the | 
 | framework. When a component wants to use one of these directories, it does so by | 
 | [using][use] the directory with a source of `framework`. | 
 |  | 
 | ``` | 
 | { | 
 |     use: [ | 
 |         { | 
 |             directory: "hub", | 
 |             from: "framework", | 
 |             rights: ["r*"], | 
 |             path: "/hub", | 
 |         }, | 
 |     ], | 
 | } | 
 | ``` | 
 |  | 
 | [capability-routing]: ../component_manifests.md#capability-routing | 
 | [directory-rights]: ../component_manifests.md#directory-rights | 
 | [expose]: ../component_manifests.md#expose | 
 | [glossary-directory]: /docs/glossary.md#directory-capability | 
 | [glossary-fidl]: /docs/glossary.md#fidl | 
 | [glossary-namespace]: /docs/glossary.md#namespace | 
 | [glossary-outgoing]: /docs/glossary.md#outgoing-directory | 
 | [offer]: ../component_manifests.md#offer | 
 | [routing-example]: /examples/components/routing | 
 | [use]: ../component_manifests.md#use | 
 | [capability]: ../component_manifests.md#capability |