async def METHOD_NAME(self) -> None:
    if self.connecting:
        return
    self.connecting = True
    backoff_time = 1
    while True:
        try:
            if self.relay.connected:
                await self.relay.disconnect()
            await self.relay.METHOD_NAME(
                f'{RELAY_HOST}?device_token={self.token}',
                socketio_path='/on_air/socket.io',
                transports=['websocket', 'polling'],  # favor websocket over polling
            )
            break
        except socketio.exceptions.ConnectionError:
            pass
        except ValueError:  # NOTE this sometimes happens when the internal socketio client is not yet ready
            await self.relay.disconnect()
        except Exception:
            globals.log.exception('Could not connect to NiceGUI On Air server.')
        await asyncio.sleep(backoff_time)
        backoff_time = min(backoff_time * 2, 32)
    self.connecting = False