sendTypingSignal method

Future<void> sendTypingSignal({
  1. required String type,
  2. required String actor,
  3. required DateTime expiresAt,
  4. Map<String, dynamic> extraPayload = const {},
  5. String? eventId,
})

Implementation

Future<void> sendTypingSignal({
  required String type,
  required String actor,
  required DateTime expiresAt,
  Map<String, dynamic> extraPayload = const {},
  String? eventId,
}) {
  final publisher = _ephemeralPublisher;
  final channel = _activeRoomChannel;
  final channelName = _activeRoomChannelName;
  final auth = _activeRoomAuth;
  final socketId = _socketId;
  if (publisher == null) {
    throw StateError('No EphemeralPublishPort configured on this client.');
  }
  if (channel == null || channelName == null || socketId == null) {
    throw StateError(
        'No active room subscription to send a typing signal for.');
  }
  if (auth == null) {
    throw StateError(
        'The active room\'s presence-channel authorization has not resolved yet.');
  }
  final envelope = <String, dynamic>{
    'version': 1,
    'id': eventId ?? generateEventId(),
    'kind': 'ephemeral',
    'domain': presenceDomain,
    'type': type,
    'tenant': channel.tenant,
    'occurred_at':
        DateTime.fromMillisecondsSinceEpoch(_clock.now(), isUtc: true)
            .toIso8601String(),
    'subject': {'type': 'room', 'id': channel.roomId},
    'expires_at': expiresAt.toUtc().toIso8601String(),
    'payload': {'actor': actor, ...extraPayload},
  };
  return publisher.publish(
    EphemeralPublishRequest(
      channelName: channelName,
      socketId: socketId,
      auth: auth.auth,
      channelData: auth.channelData ?? '',
      envelope: envelope,
    ),
  );
}