blob: 75dce30e06e6fea5bea4919228e464d29772656f [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.element;
using fuchsia.sys;
using fuchsia.url;
@available(added=19)
const MANAGER_NAMESPACE string = "element_manager";
// The following annotation keys are all in the element manager namespace.
/// The name of the element in its collection. If not provided to `ProposeElement`, a random name is
/// chosen.
@available(added=19)
const ANNOTATION_KEY_NAME string = "name";
/// If present, the element will persist over a reboot.
@available(added=19)
const ANNOTATION_KEY_PERSIST_ELEMENT string = "persist_element";
/// The component URL of the element.
@available(added=19)
const ANNOTATION_KEY_URL string = "url";
/// An interface used to add elements to a session.
///
/// An *element* is a component that is expected to be instantiated as a child
/// of the session and (optionally) to interact with the user in some way.
///
/// The session will typically implement `Manager` and route it where needed.
/// For tools like `ffx session add` to work, the session must expose `Manager`
/// to its parent.
///
/// For example, a component in the session may be a non-interactive application that
/// listens to the network for a command to display an element to the user.
/// When it receives the command, the component calls `ProposeElement()`.
@discoverable
closed protocol Manager {
/// Proposes to add an element to the session.
///
/// If `ProposeElement` returns without error, the caller can assume
/// the element is now part of the session. However, whether or not the
/// element component is actively running, or not, depends on the session
/// implementation. For example, a session may decide to conserve resources by
/// suspending an element which is not visible, or delay the running of an
/// element until a more appropriate time.
///
/// ## Spec
///
/// * `spec.component_url` is required
/// + `spec` describes the element to add
/// + `controller` can be used to observe and affect the lifecycle of the
/// element, and to set and get annotations on the element
/// * error `ProposeElementError.NOT_FOUND` if `spec.component_url` could not be resolved
/// * error `ProposeElementError.INVALID_ARGS` if a required field is not present or annotations
/// are invalid
@available(replaced=19)
strict ProposeElement(resource struct {
spec Spec;
controller server_end:<Controller, optional>;
}) -> () error ProposeElementError;
@available(added=19)
strict ProposeElement(resource struct {
spec Spec;
controller server_end:<Controller, optional>;
}) -> () error ManagerError;
/// Removes the element identified by `name` from the session. If the element is a persistent
/// element, it is removed permanently. Any persistent storage that the element might have used
/// is left untouched.
@available(added=19)
strict RemoveElement(struct {
name string:MAX;
}) -> () error ManagerError;
};
/// Description of an element to be added to a session.
type Spec = resource table {
/// The component URL of the element. Required.
1: component_url fuchsia.url.Url;
/// Initial annotations on the element. Required, but can be an empty vector. If the element
/// manager URL annotation is included (which is allowed, but not necessary), then it *must*
/// match `component_url`.
2: annotations Annotations;
@available(removed=12)
3: additional_services fuchsia.sys.ServiceList;
@available(removed=12)
4: arguments vector<string:MAX>:MAX;
};
/// Errors that can be returned when using the Manager protocol.
@available(removed=19)
type ProposeElementError = strict enum {
/// The element spec was malformed.
INVALID_ARGS = 1;
/// The element's component URL could not be resolved.
NOT_FOUND = 2;
};
@available(added=19)
type ManagerError = strict enum {
/// The element spec was malformed.
INVALID_ARGS = 1;
/// The element's component URL could not be resolved.
NOT_FOUND = 2;
/// Unable to persist a proposed element because there was an issue writing to persistent
/// storage. The proposed element will not have been started.
UNABLE_TO_PERSIST = 3;
};
/// An interface that gives clients of `Manager` (element proposers) control
/// over the proposed element's lifecycle and annotations.
///
/// ## Lifecycle
///
/// The client must keep `Controller` connected to ensure the element
/// remains in the session and is not destroyed. Once `Controller` is closed,
/// the element and its component will be terminated. The element may also terminate
/// itself, which will cause `Controller` to close.
closed protocol Controller {
compose AnnotationController;
};