/** * Session Analytics * * Authentication event tracking integration with unified analytics. * Session lifecycle events flow through the standard analytics pipeline. * * @packageDocumentation */ import type { AnalyticsEvent, ConversionEvent, Property } from '../analytics/types.js'; import type { SessionAnalyticsEvent } from './types.js'; /** Auth method types */ export type AuthMethod = 'password' | 'magic_link'; /** Authentication event actions */ export type AuthEventAction = 'auth_signup_start' | 'auth_signup_complete' | 'auth_signup_error' | 'auth_login_start' | 'auth_login_complete' | 'auth_login_error' | 'auth_logout' | 'auth_magic_link_sent' | 'auth_magic_link_clicked' | 'auth_token_refresh' | 'auth_session_expired' | 'auth_session_restored'; /** Auth event metadata by action type */ export interface AuthEventMetadata { auth_signup_start: { method: AuthMethod; }; auth_signup_complete: { method: AuthMethod; tier: string; }; auth_signup_error: { method: AuthMethod; error_code: string; }; auth_login_start: { method: AuthMethod; }; auth_login_complete: { method: AuthMethod; returning_user: boolean; }; auth_login_error: { method: AuthMethod; error_code: string; }; auth_logout: { session_duration_minutes?: number; }; auth_magic_link_sent: Record; auth_magic_link_clicked: { link_age_minutes: number; }; auth_token_refresh: { expires_in?: number; }; auth_session_expired: { had_access_token?: boolean; had_refresh_token?: boolean; }; auth_session_restored: { user_id?: string; }; } /** Auth analytics event */ export interface AuthAnalyticsEvent extends Omit { category: 'conversion'; action: AuthEventAction; metadata: AuthEventMetadata[AuthEventAction]; } /** * Create an auth analytics event * * @example * ```typescript * import { createAuthEvent, track } from '@create-something/components/analytics'; * * // On login button click * track(createAuthEvent('auth_login_start', { * method: 'password' * })); * * // On successful login * track(createAuthEvent('auth_login_complete', { * method: 'password', * returning_user: true * })); * ``` */ export declare function createAuthEvent(action: T, metadata: AuthEventMetadata[T], options: { property: Property; sessionId: string; userId?: string; url: string; }): AuthAnalyticsEvent; /** * Convert session lifecycle events to analytics events * * This adapter transforms internal session events (from session.ts) * into the analytics event format for tracking. * * @example * ```typescript * const sessionManager = createSessionManager(cookies, { * onAnalyticsEvent: (event) => { * const analyticsEvent = sessionEventToAnalytics(event, { * property: 'space', * sessionId: getSessionId(), * url: request.url * }); * trackEvent(analyticsEvent); * } * }); * ``` */ export declare function sessionEventToAnalytics(event: SessionAnalyticsEvent, options: { property: Property; sessionId: string; userId?: string; url: string; }): AuthAnalyticsEvent; export interface AuthAnalyticsOptions { /** Property identifier */ property: Property; /** Session ID getter */ getSessionId: () => string; /** Current URL getter */ getUrl: () => string; /** Optional user ID getter */ getUserId?: () => string | undefined; /** Event tracking function */ trackEvent: (event: AnalyticsEvent) => void; } /** * Create an analytics integration for auth events * * @example * ```typescript * // In +layout.svelte or app initialization * import { createAuthAnalytics } from '@create-something/components/auth'; * import { track, getAnalytics } from '@create-something/components/analytics'; * * const authAnalytics = createAuthAnalytics({ * property: 'space', * getSessionId: () => getAnalytics()?.sessionId ?? '', * getUrl: () => window.location.href, * trackEvent: track * }); * * // Use in forms * authAnalytics.trackSignupStart('password'); * authAnalytics.trackSignupComplete('password', 'free'); * authAnalytics.trackLoginComplete('password', false); * authAnalytics.trackLogout(45); * ``` */ export declare function createAuthAnalytics(options: AuthAnalyticsOptions): { trackSignupStart(method: AuthMethod): void; trackSignupComplete(method: AuthMethod, tier: string): void; trackSignupError(method: AuthMethod, errorCode: string): void; trackLoginStart(method: AuthMethod): void; trackLoginComplete(method: AuthMethod, returningUser: boolean): void; trackLoginError(method: AuthMethod, errorCode: string): void; trackLogout(sessionDurationMinutes?: number): void; trackMagicLinkSent(): void; trackMagicLinkClicked(linkAgeMinutes: number): void; trackTokenRefresh(expiresIn?: number): void; trackSessionExpired(hadAccessToken?: boolean, hadRefreshToken?: boolean): void; trackSessionRestored(userId?: string): void; /** * Create a session event handler for the session manager * * @example * ```typescript * const sessionManager = createSessionManager(cookies, { * onAnalyticsEvent: authAnalytics.createSessionEventHandler() * }); * ``` */ createSessionEventHandler(): (event: SessionAnalyticsEvent) => void; }; /** * Calculate session duration in minutes from token issue time */ export declare function calculateSessionDuration(tokenIssuedAt: number): number; /** * Calculate magic link age in minutes */ export declare function calculateLinkAge(linkCreatedAt: number): number;