blob: a56d7ed464318268962aae716054bb180cbe2338 [file] [log] [blame] [view]
# Guide to the Entity APIs
This document is a guide for using the Entity APIs. See the main
[entity](../entity.md) document for a conceptual overview.
## What is an Entity?
Conceptually, an Entity is a blob of data, accompanied with a type, that Agents
can manufacture and pass to other components (modules and agents). The data
behind an Entity is owned by the Agent that created it, and the Agent is
responsible for serving an Entity’s data when a component tries to access it.
Entities are the primary mechanism by which components share semantic data with
each other. For instance, a Google Contacts agent could manufacture an entity
describing a contact by tagging the entity with a type com.fuchsia.Contact and
passing it around to other components that want an Entity of type
com.fuchsia.Contact. When a component requests data out of the Entity, the
framework will bring up the agent that created the Entity and ask it to provide
the data for it. This means that agents ultimately own and supply the data
backing an Entity.
## How does an Agent make an Entity?
An Agent can create an Entity by calling
`AgentContext.GetReferenceFactory().CreateReference(cookie)` and supplying it a
`cookie` id. This cookie is how the Agent will identify this particular Entity.
For instance, `joe@domain.com` could be the cookie for a Contact whose name is
Joe. When this call is made, the framework will return an opaque, persistable
string reference meant for this Entity. This reference is used by a component to
get the data out of the Entity. Entity references can be persisted to disk, the
ledger, passed around to other components which may also do the same. Note that
because these references may be persisted to the ledger, it means that you can
create an Entity on one device, but dereference it on another device to get the
data out.
C++ example snippet of an Agent creating an entity.
```
auto component_context = sys::ComponentContext::Create();
auto agent_ctx = component_context->svc()
->Connect<fuchsia::modular::AgentContext>();
fuchsia::modular::EntityReferenceFactory factory;
agent_ctx->GetEntityReferenceFactory(factory.NewRequest());
factory->CreateReference("iamaperson@google.com", [] (std::string entity_reference) {
// Pass the |entity_reference| to a Module or Agent for consumption.
});
```
## How does a Module make an Entity?
A module can make an Entity by invoking `ModuleContext.CreateEntity()` with a
type and data. This entity's data will then be the framework and its reference
is valid for the duration for the Story; once the Story is deleted, all
entity references manufactured by its modules also become invalid.
C++ example snippet of a Module creating an entity.
```
auto component_context = sys::ComponentContext::Create();
auto module_ctx = component_context->svc()
->Connect<fuchsia::modular::ModuleContext>();
fuchsia::mem::Buffer data;
fsl::StringFromVmo("iamaperson@google.com", &data);
module_ctx->CreateEntity("com.fuchsia.Contact", std::move(data).ToTransport(),
entity.NewRequest(), [] (std::string entity_reference) {
// Pass the |entity_reference| to a Module or Agent for consumption.
});
```
## How does a Module or Agent get data out of an Entity?
A component can get data out of an entity reference by first resolving the
reference into an `Entity` interface, and then requesting data from it. It may do
so by calling `ComponentContext.GetEntityResolver().ResolveEntity(reference)`
which will give you an `Entity` interface. You can then get the supported types or
data out of the Entity by calling `Entity.GetTypes()` or
`Entity.GetData(typename)`, respectively.
C++ Example snippet getting data out of an `entity_reference`:
```
auto component_context = sys::ComponentContext::Create();
auto component_ctx = component_context->svc()
->Connect<fuchsia::modular::ComponentContext>();
fuchsia::modular::EntityResolverPtr resolver;
fuchsia::modular::EntityPtr entity;
component_ctx->GetEntityResolver(resolver.NewRequest());
resolver->ResolveEntity(entity_reference, entity.NewRequest());
entity->GetData("com.fuchsia.Contact", [] (fuchsia::mem::BufferPtr data) {
// ...
});
```
## How does an Agent provide data for an Entity?
An agent provides data for an Entity it created by implementing and exposing the
`EntityProvider` interface to the framework. When a component calls
`Entity.GetData(type)`, the framework will first bring up the agent that created
the entity reference and calls the corresponding `EntityProvider.GetData(cookie,
type)`. The cookie supplied here is the same cookie that the Agent was supplied
in its `EntityReferenceFactory.CreateReference()` call.