| // 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.sys2; |
| |
| using fuchsia.component; |
| using fuchsia.io; |
| using fuchsia.url; |
| using zx; |
| |
| /// The maximum string length of a capability ID. |
| /// This value is currently set arbitrarily. |
| const uint64 MAX_CAPABILITY_ID_LENGTH = 50; |
| |
| /// The maximum string length of an error description. |
| const uint64 MAX_ERROR_DESCRIPTION_LENGTH = 100; |
| |
| /// These EventTypes are used for the EventStream protocol. |
| /// They are FIDL versions of the EventType enum in hooks.rs and have |
| /// the same meaning. |
| enum EventType { |
| /// A capability exposed to the framework by a component is available. |
| CAPABILITY_READY = 1; |
| |
| /// A capability provided by this component has been requested. The event |
| /// payload carries the request channel. |
| CAPABILITY_REQUESTED = 2; |
| |
| /// A capability is being requested by a component and its routing |
| /// has also been determined. |
| /// The event propagation system is used to supply the capability being requested. |
| CAPABILITY_ROUTED = 3; |
| |
| /// An instance was destroyed successfully. The instance is stopped and no longer |
| /// exists in the parent's realm. |
| DESTROYED = 4; |
| |
| /// A component instance was discovered. This is the first stage in the lifecycle |
| /// of components. Dispatched for dynamic children when they're created, for static |
| /// children when their parent is resolved, and for the root when the component manager |
| /// starts. |
| DISCOVERED = 5; |
| |
| /// Destruction of an instance has begun. The instance may/may not be stopped by this point. |
| /// The instance still exists in the parent's realm but will soon be removed. |
| /// TODO(fxbug.dev/39417): Ensure the instance is stopped before this event. |
| MARKED_FOR_DESTRUCTION = 6; |
| |
| /// An instance's declaration was resolved successfully for the first time. |
| RESOLVED = 7; |
| |
| /// This instance has started, according to component manager. However, if this is an |
| /// executable component, the runner has further work to do to launch the component. |
| STARTED = 8; |
| |
| /// An instance was stopped successfully. |
| /// This event must occur before Destroyed. |
| STOPPED = 9; |
| |
| /// If requested, this event is dispatched on subscription and indicates |
| /// that the instance has already started and is still running. |
| RUNNING = 10; |
| }; |
| |
| /// Describes the source of a routed capability. |
| flexible union CapabilitySource { |
| /// The capability is provided by another component. |
| 1: ComponentCapability component; |
| |
| /// The capability is provided by the framework and is scoped to a |
| /// realm. |
| 2: FrameworkCapability framework; |
| |
| /// The capability is provided by realm above the root, which is component manager itself. |
| 3: AboveRootCapability above_root; |
| }; |
| |
| /// Describes a capability provided by the framework, scoped to a realm. |
| table FrameworkCapability { |
| /// The moniker of the instance that this capability is scoped to. |
| 1: string:fuchsia.component.MAX_MONIKER_LENGTH scope_moniker; |
| }; |
| |
| /// Describes a capability provided by a component |
| table ComponentCapability { |
| /// The moniker of the instance that is providing this capability. |
| 1: string:fuchsia.component.MAX_MONIKER_LENGTH source_moniker; |
| }; |
| |
| /// Describes a capability provided by component manager at the realm above the |
| /// root. |
| table AboveRootCapability { |
| }; |
| |
| /// Describes the result of a state transition. |
| flexible resource union EventResult { |
| /// The payload of the event if the state transition described by the event |
| /// succeeds. |
| 1: EventPayload payload; |
| |
| /// The error that caused the state transition described by the event to |
| /// fail. |
| 2: EventError error; |
| }; |
| |
| /// Corresponds to an error that occurred during a state transition. |
| table EventError { |
| /// A string describing the error that occurred. |
| /// TODO(fxbug.dev/49792): We should be sending structured errors, and not simply strings. |
| /// This is a placeholder pending further internal component manager refactors. |
| 1: string:MAX_ERROR_DESCRIPTION_LENGTH description; |
| |
| /// The error payload of the event if any. |
| 2: EventErrorPayload error_payload; |
| }; |
| |
| /// Encapsulates additional data for some event errors. |
| flexible union EventErrorPayload { |
| /// Payload for CapabilityReady events |
| 1: CapabilityReadyError capability_ready; |
| |
| /// Payload for CapabilityRequested events |
| 2.: CapabilityRequestedError capability_requested; |
| |
| /// Payload for CapabilityRouted events |
| 3: CapabilityRoutedError capability_routed; |
| |
| /// Payload for Destroyed events. |
| 4: DestroyedError destroyed; |
| |
| /// Payload for Discovered events. |
| 5: DiscoveredError discovered; |
| |
| /// Payload for MarkedForDestruction events. |
| 6: MarkedForDestructionError marked_for_destruction; |
| |
| /// Payload for Resolved events |
| 7: ResolvedError resolved; |
| |
| /// Payload for Running events |
| 8: RunningError running; |
| |
| /// Payload for Started events |
| 9: StartedError started; |
| |
| /// Payload for Stopped events |
| 10: StoppedError stopped; |
| }; |
| |
| /// Error payload for CapabilityReady events |
| table CapabilityReadyError { |
| /// The name of the capability. |
| 1: fuchsia.component.name name; |
| }; |
| |
| /// Error payload for CapabilityRequested events |
| table CapabilityRequestedError { |
| /// The name of the capability being requested. |
| 1: fuchsia.component.name name; |
| }; |
| |
| /// Error payload for CapabilityRouted events |
| table CapabilityRoutedError { |
| /// Name of the capability being requested. |
| 1: fuchsia.component.name name; |
| }; |
| |
| /// Error payload for Discovered events. |
| table DiscoveredError { |
| }; |
| |
| /// Error payload for Destroyed events. |
| table DestroyedError { |
| }; |
| |
| /// Error payload for Resolved events. |
| table ResolvedError { |
| }; |
| |
| /// Error payload for Running events. |
| table RunningError { |
| /// Time when the component started. |
| 1: zx.time started_timestamp; |
| }; |
| |
| /// Error payload for MarkedForDestruction events. |
| table MarkedForDestructionError { |
| }; |
| |
| /// Error payload for Started events. |
| table StartedError { |
| }; |
| |
| /// Error payload for Stopped events. |
| table StoppedError { |
| }; |
| |
| /// Encapsulates additional data/protocols for some event types. |
| flexible resource union EventPayload { |
| /// Payload for CapabilityReady events |
| 1: CapabilityReadyPayload capability_ready; |
| |
| /// Payload for CapabilityRequested events |
| 2: CapabilityRequestedPayload capability_requested; |
| |
| /// Payload for CapabilityRouted events |
| 3: CapabilityRoutedPayload capability_routed; |
| |
| /// Payload for Destroyed events. |
| 4: DestroyedPayload destroyed; |
| |
| /// Payload for Discovered events. |
| 5: DiscoveredPayload discovered; |
| |
| /// Payload for MarkedForDestruction events. |
| 6: MarkedForDestructionPayload marked_for_destruction; |
| |
| /// Payload for Resolved events |
| 7: ResolvedPayload resolved; |
| |
| /// Payload for Running events |
| 8: RunningPayload running; |
| |
| /// Payload for Started events |
| 9: StartedPayload started; |
| |
| /// Payload for Stopped events |
| 10: StoppedPayload stopped; |
| }; |
| |
| /// Payload for CapabilityReady events |
| resource table CapabilityReadyPayload { |
| /// The name of the capability. |
| 1: fuchsia.component.name name; |
| |
| /// Channel to the node exposed by the event source at `path`. |
| 2: fuchsia.io.Node node; |
| }; |
| |
| /// Payload for CapabilityRequested events |
| resource table CapabilityRequestedPayload { |
| /// The name of the capability. |
| 1: fuchsia.component.name name; |
| |
| /// A handle to the server end of the channel to host |
| /// capability. |
| 2: zx.handle:CHANNEL capability; |
| }; |
| |
| /// Payload for CapabilityRouted events |
| resource table CapabilityRoutedPayload { |
| /// Allows setting a capability provider for |
| /// CapabilityRouted events |
| /// This will not be available with an async event. |
| 1: RoutingProtocol routing_protocol; |
| |
| /// Name of capability being requested. |
| 2: fuchsia.component.name name; |
| |
| /// Source of the capability that needs to be routed. |
| 3: CapabilitySource source; |
| }; |
| |
| /// Payload for Destroyed events. |
| table DestroyedPayload { |
| }; |
| |
| /// Payload for Discovered events. |
| table DiscoveredPayload { |
| }; |
| |
| /// Payload for MarkedForDestruction events. |
| table MarkedForDestructionPayload { |
| }; |
| |
| /// Payload for Resolved events. |
| table ResolvedPayload { |
| }; |
| |
| /// Payload for Running events. |
| table RunningPayload { |
| /// Time when the component started. |
| 1: zx.time started_timestamp; |
| }; |
| |
| /// Payload for Started events. |
| table StartedPayload { |
| }; |
| |
| /// Payload for Stopped events. |
| table StoppedPayload { |
| /// The epitaph set on the fuchsia.component.runner/ComponentController |
| /// protocol channel. This is the exit status of the component. The |
| /// possible status values and their meaning are described in the definition |
| /// of the ComponentController protocol. |
| 1: zx.status status; |
| }; |
| |
| /// A head providing metadata about a target component instance. |
| table EventHeader { |
| /// Event type corresponding to the event |
| 1: EventType event_type; |
| |
| /// Relative moniker identifying the component instance. Relative to the scope of the event. |
| 2: string:fuchsia.component.MAX_MONIKER_LENGTH moniker; |
| |
| /// URL used to resolve the component. |
| 3: fuchsia.url.Url component_url; |
| |
| /// Time when the event occurred. |
| 4: zx.time timestamp; |
| }; |
| |
| /// Contains all information about a single event |
| resource table Event { |
| /// Information about the component for which this event was generated. |
| 1: EventHeader header; |
| |
| /// Optional payload for some event types |
| 2: EventResult event_result; |
| |
| /// Handler for resuming from event |
| /// This will be absent if this is an async event. |
| 3: Handler handler; |
| }; |
| |
| /// Subscribe to events in component manager. |
| [Discoverable, FragileBase] |
| protocol EventSource { |
| /// Subscribes to the events of the provided EventTypes. |
| /// |
| /// Returns a EventStreamSync which can be used |
| /// to expect the registered types. |
| /// |
| /// Errors: |
| /// - `RESOURCE_UNAVAILABLE` when the component hasn't been granted the capability to subscribe |
| /// to some event in the requested `events`. |
| Subscribe(vector<fuchsia.component.name>:fuchsia.component.MAX_NUM_EVENTS_RECEIVED events, |
| EventStream stream) |
| -> () error fuchsia.component.Error; |
| }; |
| |
| /// Subscribe to events in component manager. |
| [Discoverable] |
| protocol BlockingEventSource { |
| compose EventSource; |
| |
| /// Resume the execution of components within the realm using a scoped |
| /// BlockingEventSource. This method is idempotent. |
| StartComponentTree() -> (); |
| }; |
| |
| /// Listener for events on the component hierarchy. The server won't wait for the client |
| /// to handle the request before sending more events. |
| [Discoverable] |
| protocol EventStream { |
| OnEvent(Event event); |
| }; |
| |
| /// Every Event supports this basic handler to allow resumption. |
| protocol Handler { |
| /// Resumes/unblocks from an event. |
| Resume() -> (); |
| }; |
| |
| /// Allows injecting capabilities over FIDL. |
| /// Used by RouteFrameworkCapability and RouteBuiltinCapability |
| protocol RoutingProtocol { |
| /// Set a CapabilityProvider. Invoking this method will replace |
| /// any existing provider. |
| /// |
| /// When a component attempts to connect to a capability, |
| /// this method can be used to mock/inject that capability. |
| SetProvider(CapabilityProvider client_end) -> (); |
| |
| /// Replace the existing provider with the given client_end and |
| /// open the existing provider with given server end. |
| /// |
| /// This method is used to interpose between a client and service: |
| /// Client <---> Interposer <---> Server |
| /// |
| /// Opening the existing provider sets up Interposer <---> Server |
| /// Replacing the existing provider sets up Client <---> Interposer |
| ReplaceAndOpen(CapabilityProvider client_end, zx.handle:CHANNEL server_end) -> (); |
| }; |
| |
| /// A FIDL-based version of a CapabilityProvider |
| protocol CapabilityProvider { |
| /// Called to bind a server end of a channel to the provided capability. |
| /// The flags, mode and path specified here are passed on from the fuchsia.io.Directory.Open |
| /// FIDL call that caused this capability routing to occur. |
| Open(zx.handle:CHANNEL server_end, uint32 flags, uint32 mode, string:fuchsia.io.MAX_PATH path) -> (); |
| }; |