import { PostHog } from './module';
import { SessionIdChangedCallback } from '@posthog/types';

/**
 * Public config is `string[]` today. Keep `boolean` internally because the
 * earliest browser-only `__add_tracing_headers` preview option shipped as a
 * boolean, where `true` meant "add tracing headers to every request".
 */
type TracingHeadersHostnames = string[] | boolean | undefined;
/**
 * Allow a provider so headers use the current distinct ID after bootstrap,
 * identify(), reset(), or other identity changes without re-patching fetch/XHR.
 */
type TracingHeadersDistinctId = string | (() => string | undefined);

declare class SessionIdManager {
    private readonly _sessionIdGenerator;
    private readonly _windowIdGenerator;
    private _config;
    private _persistence;
    private _windowId;
    private _sessionId;
    private readonly _window_id_storage_key;
    private readonly _primary_window_exists_storage_key;
    private _sessionStartTimestamp;
    private _pendingBootstrapSession;
    private _sessionActivityTimestamp;
    private _lastPersistedActivityTimestamp;
    private _lastCookieSyncTimestamp;
    private _sessionIdChangedHandlers;
    private readonly _sessionTimeoutMs;
    private _enforceIdleTimeout;
    private _beforeUnloadListener;
    private _destroyed;
    private _eventEmitter;
    on(event: 'forcedIdleReset', handler: () => void): () => void;
    constructor(instance: PostHog, sessionIdGenerator?: () => string, windowIdGenerator?: () => string);
    get sessionTimeoutMs(): number;
    onSessionId(callback: SessionIdChangedCallback): () => void;
    private _canUseSessionStorage;
    private _setWindowId;
    private _getWindowId;
    private _isActivityChangeBelowGranularity;
    private _setSessionId;
    private _useCrossTabRefreshHardening;
    private _refreshSessionIdFromStorage;
    private _flushPendingActivityTimestamp;
    private _freshestActivityTimestamp;
    private _isSessionIdleAfterCrossTabRefresh;
    private _getSessionId;
    resetSessionId(): void;
    setBootstrapSessionId(sessionID: string, deferUntilNextSession?: boolean): boolean;
    /**
     * Cleans up resources used by SessionIdManager.
     * Should be called when the SessionIdManager is no longer needed to prevent memory leaks.
     */
    destroy(): void;
    private _listenToReloadWindow;
    private _sessionHasBeenIdleTooLong;
    checkAndGetSessionAndWindowId(readOnly?: boolean, _timestamp?: number | null, persistenceAlreadySynced?: boolean): {
        sessionId: string;
        windowId: string;
        sessionStartTimestamp: number;
        changeReason: {
            noSessionId: boolean;
            activityTimeout: boolean;
            sessionPastMaximumLength: boolean;
            crossTabAdoption: boolean;
        } | undefined;
        lastActivityTimestamp: number;
    };
    private _resetIdleTimer;
}

declare const patchFns: {
    _patchFetch: (hostnames: TracingHeadersHostnames, distinctId: TracingHeadersDistinctId, sessionManager?: SessionIdManager) => (() => void);
    _patchXHR: (hostnames: TracingHeadersHostnames, distinctId: TracingHeadersDistinctId, sessionManager?: SessionIdManager) => (() => void);
};

export { patchFns as default };
