emitWithAck method
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 = {};
}