event_stream 功能

通过 event_stream 功能,组件可以订阅 发生在组件生命周期的各个阶段。 其中包括有关组件状态更改以及功能 路由。

有关支持的事件及其说明的完整列表,请参阅 fuchsia.component.EventType 参考文档。请参阅 RFC-121 针对 event_stream 功能的原始 RFC。

提供 event_stream 功能

event_stream 功能始终由组件管理器提供。它们分别是 从 overRoot 中向组件提供单个组件不能声明 事件,capabilities也不能使用from: "framework"

每个 event_stream 功能都有一个可选的 scope,用于确定 事件子树。scope 可以是 单个子树或引用多个子树。

路由 event_stream 功能

组件可以提供从接收的 event_stream 功能 映射到其他组件event_stream 功能无法公开。

如需详细了解该框架如何路由组件功能,请参阅 功能路由

成为协作者

提供事件功能可让子组件访问该功能:

{
    offer: [
        {
            event_stream: "started",
            from: "parent",
            scope: ["#child_a"]
            to: [ "#child-a", "#child_b" ],
        },
        {
            event_stream: "stopped",
            from: "parent",
            to: "#child-c",
        }
    ]
}

活动只能通过家长提供。

使用 event_stream 功能

如需使用事件 capability,该组件必须使用 event_stream 功能。可以通过在 单个 use

如需请求该功能,请为其添加 use 声明:

{
    use: [
        { event_stream: ["started", "stopped"] },
    ]
}

event_streams 只能在 from: "parent" 中使用。

event_stream 路由示例

请参考以下组件拓扑示例:

event_stream 示例

请注意此示例的以下几个关键方面:

  • core/archivist:通过startedroot 路由的事件功能。

    // root.cml
    {
        offer: [
            {
                event_stream: "started",
                from: "parent",
                to: "#core",
            },
        ]
    }
    
    // core.cml
    {
        offer: [
            {
                event_stream: "started",
                from: "parent",
                to: "#archivist",
            },
            {
                event_stream: "started",
                from: "parent",
                to: "#test_manager",
                scope: ["#test_manager"],
            }
        ]
    }
    
    // archivist.cml
    {
        use: [
            { event_stream: "started" },
        ]
    }
    
  • core/test_manager/archivist:接收所有测试的 started 事件 组件通过从 test_manager 路由的事件功能实现。

    // test_manager.cml
    {
        offer: [
            {
                event_stream: "started",
                from: "parent",
                to: "#archivist",
            },
            {
                event_stream: "started",
                from: "parent",
                to: "#tests",
                // Downscopes the event to the tests collection
                scope: ["#tests"],
            }
        ]
    }
    
    - The root Archivist gets `started` events for all components in the
    topology from the root, whereas the embedded Archivist only gets events from
    its own test collection.
    NOTE: An event_stream must be routed through the entire topology from the root
    component_manager all the way down to the component that wants to use the event.
    event_streams cannot be used `from: "framework"`, and they are not
    automatically made available in every component's environment.
    
    // archivist.cml
    {
          use: [
            {
                event_stream: "started",
                from: "parent",
            },
        ]
    }
    
  • core/test_manager/tests:test-12345:接收事物的已启动事件 通过 event_stream capability 传入其集合下, test_manager

    // test-12345.cml
    {
        use: [
            {
                event_stream: "started",
                from: "parent",
            },
        ]
    }