startSession static method

Future<void> startSession()

Implementation

static Future<void> startSession() async {
  // Guard against concurrent calls — can happen when a lifecycle callback
  // fires during an in-progress startSession() from SDK init. Without this
  // guard, the session_number is double-incremented and a duplicate
  // session_start event is recorded.
  if (_startingSession) return;
  _startingSession = true;
  try {
    await increaseSessionNumber();

    final sessionTs = await _reservePendingSessionStart(
      sessionNumber: getSessionNumber(),
      lastEventTs: getLastEventTimestamp(),
    );
    await setCurrentSessionStart(sessionTs);

    Event sessionStartEvent = await Event.createWithTimestamp(
      'session_start',
      sessionTs,
    );
    sessionStartEvent.addEventParams({'session_id': getCurrentSessionId()});

    if (onRecordEvent != null) {
      await onRecordEvent!(sessionStartEvent);
      await _confirmPendingSessionStartStored(sessionTs);
    }
  } catch (e, st) {
    dbLogger.severe('SessionHelper: startSession failed', e, st);
  } finally {
    _startingSession = false;
  }
}