Note: This document covers API impact only. For more details, see the ABI compatibility page

Remove a protocol event

Overview

-initstep 1step 2step 3step 4
fidllinklinklink
dartlinklink
golinklink
hlcpplinklink
llcpplinklink
rustlinklinklink

Initial State

FIDL

protocol Example {
    -> OnExistingEvent();
    -> OnOldEvent();
};

Dart

class Server extends fidllib.Example {
  final _onExistingEventStreamController = StreamController<void>();
  final _onOldEventStreamController = StreamController<void>();

  @override
  Stream<void> get onExistingEvent => _onExistingEventStreamController.stream;

  @override
  Stream<void> get onOldEvent => _onOldEventStreamController.stream;
}

void expectEvents(fidllib.ExampleProxy client) async {
  await client.onExistingEvent.first;
  await client.onOldEvent.first;
}

Go

func expectEvents(c *lib.ExampleWithCtxInterface) {
	_ = c.ExpectOnExistingEvent(context.Background())
	_ = c.ExpectOnOldEvent(context.Background())
}

func sendEvents(p *lib.ExampleEventProxy) {
	_ = p.OnExistingEvent()
	_ = p.OnOldEvent()
}

HLCPP

void expectEvents(fidl_test::ExamplePtr* client) {
  client->events().OnExistingEvent = []() {};
  client->events().OnOldEvent = []() {};
}

void sendEvents(fidl::Binding<fidl_test::Example>* server) {
  server->events().OnExistingEvent();
  server->events().OnOldEvent();
}

LLCPP

class AsyncEventHandler : public fidl::WireAsyncEventHandler<fidl_test::Example> {
  void OnExistingEvent(fidl::WireResponse<fidl_test::Example::OnExistingEvent>* event) override {}
  void OnOldEvent(fidl::WireResponse<fidl_test::Example::OnOldEvent>* event) override {}
};

class SyncEventHandler : public fidl::WireSyncEventHandler<fidl_test::Example> {
  void OnExistingEvent(fidl::WireResponse<fidl_test::Example::OnExistingEvent>* event) override {}
  void OnOldEvent(fidl::WireResponse<fidl_test::Example::OnOldEvent>* event) override {}
};

void sendEvents(fidl::ServerBindingRef<fidl_test::Example> server) {
  server->OnExistingEvent();
  server->OnOldEvent();
}

Rust

fn send_events(stream: fidl_lib::ExampleRequestStream) -> Result<(), fidl::Error> {
    let control_handle = stream.control_handle();
    control_handle.send_on_existing_event()?;
    control_handle.send_on_old_event()?;
    Ok(())
}

async fn receive_events(client: fidl_lib::ExampleProxy) -> Result<(), fidl::Error> {
    let mut event_stream = client.take_event_stream();
    while let Some(event) = event_stream.try_next().await? {
        match event {
            fidl_lib::ExampleEvent::OnExistingEvent { .. } => {}
            fidl_lib::ExampleEvent::OnOldEvent { .. } => {}
        }
    }
    Ok(())
}

Update FIDL Library

  • Mark the method that is being removed with the [Transitional] attribute.
  protocol Example {
      -> OnExistingEvent();
+     @transitional
      -> OnOldEvent();
  };

Update Source Code

Dart

  • Remove implementations of the event stream
  • Stop handling the event on the client side.
  class Server extends fidllib.Example {
    final _onExistingEventStreamController = StreamController<void>();
-   final _onOldEventStreamController = StreamController<void>();
  
    @override
    Stream<void> get onExistingEvent => _onExistingEventStreamController.stream;
- 
-   @override
-   Stream<void> get onOldEvent => _onOldEventStreamController.stream;
  }
  
  void expectEvents(fidllib.ExampleProxy client) async {
    await client.onExistingEvent.first;
-   await client.onOldEvent.first;
  }

Go

  • Remove usages of the event.
  func expectEvents(c *lib.ExampleWithCtxInterface) {
  	_ = c.ExpectOnExistingEvent(context.Background())
- 	_ = c.ExpectOnOldEvent(context.Background())
  }
  
  func sendEvents(p *lib.ExampleEventProxy) {
  	_ = p.OnExistingEvent()
- 	_ = p.OnOldEvent()
  }
  

HLCPP

  • Remove any uses of the event being removed.
  void expectEvents(fidl_test::ExamplePtr* client) {
    client->events().OnExistingEvent = []() {};
-   client->events().OnOldEvent = []() {};
  }
  
- void sendEvents(fidl::Binding<fidl_test::Example>* server) {
-   server->events().OnExistingEvent();
-   server->events().OnOldEvent();
- }
+ void sendEvents(fidl::Binding<fidl_test::Example>* server) { server->events().OnExistingEvent(); }

LLCPP

  • Remove any uses of the event being removed.
  class AsyncEventHandler : public fidl::WireAsyncEventHandler<fidl_test::Example> {
    void OnExistingEvent(fidl::WireResponse<fidl_test::Example::OnExistingEvent>* event) override {}
-   void OnOldEvent(fidl::WireResponse<fidl_test::Example::OnOldEvent>* event) override {}
  };
  
  class SyncEventHandler : public fidl::WireSyncEventHandler<fidl_test::Example> {
    void OnExistingEvent(fidl::WireResponse<fidl_test::Example::OnExistingEvent>* event) override {}
-   void OnOldEvent(fidl::WireResponse<fidl_test::Example::OnOldEvent>* event) override {}
  };
  
- void sendEvents(fidl::ServerBindingRef<fidl_test::Example> server) {
-   server->OnExistingEvent();
-   server->OnOldEvent();
- }
+ void sendEvents(fidl::ServerBindingRef<fidl_test::Example> server) { server->OnExistingEvent(); }

Rust

  • Add #[allow(unreachable_patterns)] to any client event stream match statements, and replace the arm for the event being removed with a catch-all (_) arm.
  • Servers should stop sending the event.
  fn send_events(stream: fidl_lib::ExampleRequestStream) -> Result<(), fidl::Error> {
      let control_handle = stream.control_handle();
      control_handle.send_on_existing_event()?;
-     control_handle.send_on_old_event()?;
      Ok(())
  }
  
  async fn receive_events(client: fidl_lib::ExampleProxy) -> Result<(), fidl::Error> {
      let mut event_stream = client.take_event_stream();
      while let Some(event) = event_stream.try_next().await? {
+         #[allow(unreachable_patterns)]
          match event {
              fidl_lib::ExampleEvent::OnExistingEvent { .. } => {}
-             fidl_lib::ExampleEvent::OnOldEvent { .. } => {}
+             _ => {}
          }
      }
      Ok(())
  }

Update FIDL Library

  • Remove the [Transitional] attribute.
  protocol Example {
      -> OnExistingEvent();
-     @transitional
-     -> OnOldEvent();
  };

Update Source Code

Rust

  • Remove #[allow(unreachable_patterns)] and the catch-all arm.
  fn send_events(stream: fidl_lib::ExampleRequestStream) -> Result<(), fidl::Error> {
      let control_handle = stream.control_handle();
      control_handle.send_on_existing_event()?;
      Ok(())
  }
  
  async fn receive_events(client: fidl_lib::ExampleProxy) -> Result<(), fidl::Error> {
      let mut event_stream = client.take_event_stream();
      while let Some(event) = event_stream.try_next().await? {
-         #[allow(unreachable_patterns)]
          match event {
              fidl_lib::ExampleEvent::OnExistingEvent { .. } => {}
-             _ => {}
          }
      }
      Ok(())
  }