registerHost method

Future<String> registerHost({
  1. required String displayName,
  2. Map<String, dynamic>? capabilities,
})

Register this host with the relay.

Implementation

Future<String> registerHost({
  required String displayName,
  Map<String, dynamic>? capabilities,
}) async {
  _socket = await WebSocket.connect(
    relayUrl,
    headers: {if (relayToken != null) 'Authorization': 'Bearer $relayToken'},
  );

  final registrationId = 'host_${DateTime.now().millisecondsSinceEpoch}';

  _socket!.add(
    jsonEncode({
      'type': 'register',
      'hostId': registrationId,
      'displayName': displayName,
      'capabilities': capabilities ?? {},
    }),
  );

  // Start heartbeat.
  _heartbeatTimer = Timer.periodic(const Duration(seconds: 30), (_) {
    _socket?.add(jsonEncode({'type': 'heartbeat', 'hostId': registrationId}));
  });

  _socket!.listen(
    (data) {
      try {
        final message = RemoteMessage.fromJson(
          jsonDecode(data as String) as Map<String, dynamic>,
        );
        _eventController.add(RemoteMessageReceived(message));
      } catch (_) {}
    },
    onDone: () {
      _eventController.add(
        const RemoteDisconnected('relay', 'Relay disconnected'),
      );
    },
  );

  return registrationId;
}