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

Remove a protocol event

Overview

- init step 1 step 2 step 3 step 4
fidl link link link
dart link link
go link link
hlcpp link link
llcpp link link
rust link link link

Initial State {#init}

FIDL {#fidl-init}

  1. protocol Example {
  2. -> OnExistingEvent();
  3. -> OnOldEvent();
  4. };

Dart {#dart-init}

  1. class Server extends fidllib.Example {
  2. final _onExistingEventStreamController = StreamController<void>();
  3. final _onOldEventStreamController = StreamController<void>();
  4. @override
  5. Stream<void> get onExistingEvent => _onExistingEventStreamController.stream;
  6. @override
  7. Stream<void> get onOldEvent => _onOldEventStreamController.stream;
  8. }
  9. void expectEvents(fidllib.ExampleProxy client) async {
  10. await client.onExistingEvent.first;
  11. await client.onOldEvent.first;
  12. }

Go {#go-init}

  1. func expectEvents(c *lib.ExampleWithCtxInterface) {
  2. _ = c.ExpectOnExistingEvent(context.Background())
  3. _ = c.ExpectOnOldEvent(context.Background())
  4. }
  5. func sendEvents(p *lib.ExampleEventProxy) {
  6. _ = p.OnExistingEvent()
  7. _ = p.OnOldEvent()
  8. }

HLCPP {#hlcpp-init}

  1. void expectEvents(fidl_test::ExamplePtr* client) {
  2. client->events().OnExistingEvent = []() {};
  3. client->events().OnOldEvent = []() {};
  4. }
  5. void sendEvents(fidl::Binding<fidl_test::Example>* server) {
  6. server->events().OnExistingEvent();
  7. server->events().OnOldEvent();
  8. }

LLCPP {#llcpp-init}

  1. class AsyncEventHandler : public fidl::WireAsyncEventHandler<fidl_test::Example> {
  2. void OnExistingEvent(fidl_test::Example::OnExistingEventResponse* event) override {}
  3. void OnOldEvent(fidl_test::Example::OnOldEventResponse* event) override {}
  4. };
  5. class SyncEventHandler : public fidl::WireSyncEventHandler<fidl_test::Example> {
  6. void OnExistingEvent(fidl_test::Example::OnExistingEventResponse* event) override {}
  7. void OnOldEvent(fidl_test::Example::OnOldEventResponse* event) override {}
  8. };
  9. void sendEvents(fidl::ServerBindingRef<fidl_test::Example> server) {
  10. server->OnExistingEvent();
  11. server->OnOldEvent();
  12. }

Rust {#rust-init}

  1. fn send_events(stream: fidl_lib::ExampleRequestStream) -> Result<(), fidl::Error> {
  2. let control_handle = stream.control_handle();
  3. control_handle.send_on_existing_event()?;
  4. control_handle.send_on_old_event()?;
  5. Ok(())
  6. }
  7. async fn receive_events(client: fidl_lib::ExampleProxy) -> Result<(), fidl::Error> {
  8. let mut event_stream = client.take_event_stream();
  9. while let Some(event) = event_stream.try_next().await? {
  10. match event {
  11. fidl_lib::ExampleEvent::OnExistingEvent { .. } => {}
  12. fidl_lib::ExampleEvent::OnOldEvent { .. } => {}
  13. }
  14. }
  15. Ok(())
  16. }

Update FIDL Library {#step-1}

  • Mark the method that is being removed with the [Transitional] attribute.
  1. protocol Example {
  2. -> OnExistingEvent();
  3. + [Transitional]
  4. -> OnOldEvent();
  5. };

Update Source Code {#step-2}

Dart {#dart-2}

  • Remove implementations of the event stream
  • Stop handling the event on the client side.
  1. class Server extends fidllib.Example {
  2. final _onExistingEventStreamController = StreamController<void>();
  3. - final _onOldEventStreamController = StreamController<void>();
  4. @override
  5. Stream<void> get onExistingEvent => _onExistingEventStreamController.stream;
  6. -
  7. - @override
  8. - Stream<void> get onOldEvent => _onOldEventStreamController.stream;
  9. }
  10. void expectEvents(fidllib.ExampleProxy client) async {
  11. await client.onExistingEvent.first;
  12. - await client.onOldEvent.first;
  13. }

Go {#go-2}

  • Remove usages of the event.
  1. func expectEvents(c *lib.ExampleWithCtxInterface) {
  2. _ = c.ExpectOnExistingEvent(context.Background())
  3. - _ = c.ExpectOnOldEvent(context.Background())
  4. }
  5. func sendEvents(p *lib.ExampleEventProxy) {
  6. _ = p.OnExistingEvent()
  7. - _ = p.OnOldEvent()
  8. }

HLCPP {#hlcpp-2}

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

LLCPP {#llcpp-2}

  • Remove any uses of the event being removed.
  1. class AsyncEventHandler : public fidl::WireAsyncEventHandler<fidl_test::Example> {
  2. void OnExistingEvent(fidl_test::Example::OnExistingEventResponse* event) override {}
  3. - void OnOldEvent(fidl_test::Example::OnOldEventResponse* event) override {}
  4. };
  5. class SyncEventHandler : public fidl::WireSyncEventHandler<fidl_test::Example> {
  6. void OnExistingEvent(fidl_test::Example::OnExistingEventResponse* event) override {}
  7. - void OnOldEvent(fidl_test::Example::OnOldEventResponse* event) override {}
  8. };
  9. - void sendEvents(fidl::ServerBindingRef<fidl_test::Example> server) {
  10. - server->OnExistingEvent();
  11. - server->OnOldEvent();
  12. - }
  13. + void sendEvents(fidl::ServerBindingRef<fidl_test::Example> server) { server->OnExistingEvent(); }

Rust {#rust-2}

  • 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.
  1. fn send_events(stream: fidl_lib::ExampleRequestStream) -> Result<(), fidl::Error> {
  2. let control_handle = stream.control_handle();
  3. control_handle.send_on_existing_event()?;
  4. - control_handle.send_on_old_event()?;
  5. Ok(())
  6. }
  7. async fn receive_events(client: fidl_lib::ExampleProxy) -> Result<(), fidl::Error> {
  8. let mut event_stream = client.take_event_stream();
  9. while let Some(event) = event_stream.try_next().await? {
  10. + #[allow(unreachable_patterns)]
  11. match event {
  12. fidl_lib::ExampleEvent::OnExistingEvent { .. } => {}
  13. - fidl_lib::ExampleEvent::OnOldEvent { .. } => {}
  14. + _ => {}
  15. }
  16. }
  17. Ok(())
  18. }

Update FIDL Library {#step-3}

  • Remove the [Transitional] attribute.
  1. protocol Example {
  2. -> OnExistingEvent();
  3. - [Transitional]
  4. - -> OnOldEvent();
  5. };

Update Source Code {#step-4}

Rust {#rust-4}

  • Remove #[allow(unreachable_patterns)] and the catch-all arm.
  1. fn send_events(stream: fidl_lib::ExampleRequestStream) -> Result<(), fidl::Error> {
  2. let control_handle = stream.control_handle();
  3. control_handle.send_on_existing_event()?;
  4. Ok(())
  5. }
  6. async fn receive_events(client: fidl_lib::ExampleProxy) -> Result<(), fidl::Error> {
  7. let mut event_stream = client.take_event_stream();
  8. while let Some(event) = event_stream.try_next().await? {
  9. - #[allow(unreachable_patterns)]
  10. match event {
  11. fidl_lib::ExampleEvent::OnExistingEvent { .. } => {}
  12. - _ => {}
  13. }
  14. }
  15. Ok(())
  16. }