emitWithAck method

void emitWithAck(
  1. String event,
  2. dynamic data, {
  3. Function? ack,
  4. bool binary = false,
})

Emits to this client.

@return {Socket} self @api public

Implementation

void emitWithAck(String event, dynamic data,
    {Function? ack, bool binary = false}) {
  if (reservedEvents.containsKey(event)) {
    throw Exception('"$event" is a reserved event name');
  }
  var sendData = <dynamic>[event];
  if (data is ByteBuffer || data is List<int>) {
    sendData.add(data);
  } else if (data is Iterable) {
    sendData.addAll(data);
  } else if (data != null) {
    sendData.add(data);
  }

  if (_opts?['retries'] != null &&
      !flags.containsKey('fromQueue') &&
      !flags.containsKey('volatile')) {
    if (ack != null) {
      sendData.add(ack);
    }
    _addToQueue(sendData);
    return;
  }

  var packet = {
    'type': EVENT,
    'data': sendData,
    'options': {'compress': flags.isNotEmpty == true && flags['compress']}
  };

  // event ack callback
  if (ack != null) {
    _logger.fine('emitting packet with ack id $ids');
    final id = ids++;
    _registerAckCallback(id.toInt(), ack);
    packet['id'] = '$id';
  }
  final isTransportWritable = io.engine != null &&
      io.engine!.transport != null &&
      io.engine!.transport!.writable == true;

  final discardPacket =
      flags['volatile'] != null && (!isTransportWritable || !connected);
  if (discardPacket) {
    _logger.fine('discard packet as the transport is not currently writable');
  } else if (connected) {
    notifyOutgoingListeners(packet);
    this.packet(packet);
  } else {
    sendBuffer.add(packet);
  }
  flags = {};
}