event_stream 功能

event_stream 功能可讓元件訂閱特定事件 在元件生命週期的不同階段發生。 這包括元件狀態變更的資訊 轉送。

如需支援的事件及其說明的完整清單,請參閱 fuchsia.component.EventType 參考說明文件。請參閱 RFC-121 針對 event_stream 功能,取得原始 RFC。

提供 event_stream 功能

event_stream 功能一律由元件管理員產生。這些 提供的元件個別元件無法宣告 事件 (capabilities) 也無法用於 from: "framework"

每個 event_stream 能力都有選用的 scope,用來決定 連結用戶端會收到的事件子樹狀結構。scope 可以是以下兩者之一 單一子樹狀結構或參照多個子項。

轉送 event_stream 功能

元件可以 offer 從事件串流中移除 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 功能

如要採用事件能力,元件必須使用 event_stream 技術。如要合併事件串流,只要在 單一 use

如要要求這項能力,請為該功能新增 use 宣告:

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

event_streams 只能用在 from: "parent"

event_stream 轉送範例

請參考以下元件拓撲範例:

event_stream 範例

請留意本範例的下列重要面向:

  • core/archivist:透過整個拓撲接收 started 事件 會從 root 轉送的事件能力。

    // 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 能力轉送 test_manager

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