dispatch method
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,
);
}