dispatch method

Future<void> dispatch(
  1. ArgosBaseModel model, {
  2. ArgosPacketRecord? record,
})

The single admission and metadata-allocation point for persistable events. Rejected events return immediately without notifying, writing, or consuming a sequence number.

Implementation

Future<void> dispatch(
  ArgosBaseModel model, {
  ArgosPacketRecord? record,
}) {
  if (_sessionState != ArgosSessionState.recording ||
      _activeSession == null) {
    return Future<void>.value();
  }

  final now = _nowMilliseconds;
  _applyAdaptivePolicyBeforeDispatch(now);
  final session = _activeSession;
  if (_sessionState != ArgosSessionState.recording || session == null) {
    return Future<void>.value();
  }

  final sequence = ++_nextSequence;
  final metadata = ArgosEventMetadata(
    id: '${session.id}:$sequence',
    sessionId: session.id,
    sequence: sequence,
  );
  model.eventMetadata = metadata;
  final eventAt = record == null
      ? now
      : (record.endTimestamp > 0
          ? record.endTimestamp
          : record.startTimestamp);
  _activeSession = session.copyWith(lastEventAt: eventAt);

  try {
    listener?.call(model);
  } catch (error, stackTrace) {
    debugPrint('ArgosManager listener error: $error\n$stackTrace');
  }

  if (!(config?.enableStorage ?? false) || record == null) {
    return Future<void>.value();
  }
  final assignedRecord = record.copyWith(
    id: metadata.id,
    sessionId: metadata.sessionId,
    sequence: metadata.sequence,
    routeName: currentRoute,
  );
  return ArgosPacketStorage.instance.appendRecord(
    assignedRecord,
    maxRecords: config?.maxPacketRecords ?? 200,
    resourceMaxRecords: config?.resourceMaxRecords ?? 50,
    maxSessions: config?.maxSessions ?? 5,
  );
}