UNPKG

top-analyze-sdk

Version:

SDK for TOP analytics

1 lines 46.4 kB
{"version":3,"sources":["../src/utils.ts","../src/constants.ts","../src/transformers/EventTransformer.ts","../src/adapters/TonConnectAdapter.ts","../src/sdk.ts","../src/index.ts"],"names":["getTelegramUserData","tg","user","isTelegramWebAppAvailable","BASE_URL","API_URL","MAX_PAYLOAD_SIZE","MAX_STRING_LENGTH","MAX_ARRAY_LENGTH","IMPORTANT_CLICKS","ALLOWED_TELEGRAM_EVENTS","EventTransformer","appName","userData","debug","event","eventType","eventName","eventProperties","data","pageUrl","userAgent","properties","error","item","sanitized","key","value","sanitizedKey","TonConnectAdapter","sendEvent","tonConnectInstance","uiInstance","originalOpenModal","address","client","result","originalSendTransaction","transaction","originalConnect","wallet","walletOverride","platformOverride","fallbackPlatform","device","app","platform","transport","version","walletCandidate","type","eventData","TopAnalyzeSDK","config","tonConnect","payload","timestamp","random","target","clickData","originalPushState","originalReplaceState","state","title","url","category","batch","events","mainEvents","sanitizedEvents","handleUnload","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { UserData } from './types';\n\n/**\n * Получить данные пользователя из Telegram WebApp API\n */\nexport function getTelegramUserData(): UserData {\n const tg = (window as any).Telegram?.WebApp;\n\n if (tg?.initDataUnsafe?.user) {\n const user = tg.initDataUnsafe.user;\n return {\n telegramId: user.id,\n locale: user.language_code,\n premium: user.is_premium || false,\n telegramUsername: user.username,\n telegramFirstname: user.first_name,\n telegramLastname: user.last_name,\n telegramPlatform: tg.platform,\n startapp: tg.initDataUnsafe.start_param,\n userProperties: {},\n };\n }\n\n throw new Error('Telegram WebApp API недоступен');\n}\n\n/**\n * Проверить, доступен ли Telegram WebApp API\n */\nexport function isTelegramWebAppAvailable(): boolean {\n return !!(window as any).Telegram?.WebApp;\n}\n","import { TelegramEventNames } from './types';\n\nexport const BASE_URL = 'https://analyze.playdeck.io';\nexport const API_URL = `${BASE_URL}/v1/e`;\n\n// Limits for validation\nexport const MAX_PAYLOAD_SIZE = 100000; // 100KB\nexport const MAX_STRING_LENGTH = 1000;\nexport const MAX_ARRAY_LENGTH = 100;\n\nexport const IMPORTANT_CLICKS = ['button', 'input', 'textarea', 'select', 'a', 'img'];\n\n// Allowed Telegram events for analytics\nexport const ALLOWED_TELEGRAM_EVENTS: TelegramEventNames[] = [\n 'invoiceClosed',\n 'settingsButtonClicked',\n 'backButtonClicked',\n 'mainButtonClicked',\n 'secondaryButtonClicked',\n 'popupClosed',\n 'qrTextReceived',\n 'clipboardTextReceived',\n 'writeAccessRequested',\n 'contactRequested',\n 'scanQrPopupClosed',\n 'activated',\n 'deactivated',\n 'fullscreenChanged',\n 'fullscreenFailed',\n 'homeScreenAdded',\n 'homeScreenChecked',\n 'locationManagerUpdated',\n 'locationRequested',\n 'shareMessageSent',\n 'shareMessageFailed',\n 'emojiStatusSet',\n 'emojiStatusFailed',\n 'emojiStatusAccessRequested',\n 'fileDownloadRequested',\n];\n","import { MAX_ARRAY_LENGTH, MAX_PAYLOAD_SIZE, MAX_STRING_LENGTH } from '@/constants';\nimport {\n type UserData,\n type AnalyticsEvent,\n type MainEventSchema,\n EVENT_CATEGORY,\n} from '@/types';\n\nexport class EventTransformer {\n private readonly userData: UserData | null;\n private readonly appName: string;\n private readonly debug: boolean;\n\n constructor(appName: string, userData: UserData | null, debug: boolean) {\n this.appName = appName;\n this.userData = userData;\n this.debug = debug;\n }\n\n public normalizeSchema(event: AnalyticsEvent): MainEventSchema {\n const eventType = event.type === 'custom' ? 'CUSTOM' : 'AUTO';\n const eventName = event.type === 'custom' ? event.data.eventName : event.type;\n const eventProperties =\n event.type === 'custom'\n ? event.data.payload\n : this.extractEventProperties(event.data);\n\n return {\n type: eventType,\n source: this.appName,\n ts: new Date(event.timestamp).toISOString(),\n pagePath: event.data.pageUrl || window.location.href,\n pageReferrer: document.referrer || '',\n name: eventName,\n telegramId: this.userData?.telegramId || null,\n locale: this.userData?.locale || 'unknown',\n premium: this.userData?.premium || false,\n userAgent: event.data.userAgent || navigator.userAgent,\n sessionId: event.sessionId,\n startapp: this.userData?.startapp || null,\n telegramUsername: this.userData?.telegramUsername || null,\n telegramFirstname: this.userData?.telegramFirstname || null,\n telegramLastname: this.userData?.telegramLastname || null,\n telegramPlatform: this.userData?.telegramPlatform || null,\n eventCategory: event.eventCategory as EVENT_CATEGORY,\n eventProperties,\n userProperties: {},\n };\n }\n\n private extractEventProperties(data: any): any {\n // Возвращаем все свойства без фильтрации\n const { pageUrl, userAgent, ...properties } = data;\n return properties;\n }\n\n public validatePayloadSize(data: any): boolean {\n try {\n const jsonString = JSON.stringify(data);\n return jsonString.length <= MAX_PAYLOAD_SIZE;\n } catch (error) {\n if (this.debug) console.log('Error validating payload size:', error);\n return false;\n }\n }\n\n public sanitizeData(data: any): any {\n if (data === null || data === undefined) return data;\n\n if (typeof data === 'string') {\n // Trim too long strings\n return data.length > MAX_STRING_LENGTH ? data.slice(0, MAX_STRING_LENGTH) : data;\n }\n\n if (Array.isArray(data)) {\n // Limit array length\n const limitedArray = data.slice(0, MAX_ARRAY_LENGTH);\n return limitedArray.map((item) => this.sanitizeData(item));\n }\n\n if (typeof data === 'object') {\n const sanitized: any = {};\n for (const [key, value] of Object.entries(data)) {\n // Limit key length\n const sanitizedKey = key.length > 100 ? key.slice(0, 100) : key;\n sanitized[sanitizedKey] = this.sanitizeData(value);\n }\n return sanitized;\n }\n\n return data;\n }\n}\n","import type { TonConnectUI } from '@tonconnect/ui';\nimport type { TonConnect } from '@tonconnect/sdk';\nimport {\n EventNames,\n UserData,\n EVENT_CATEGORY,\n TonConnectWrapper,\n SendEventFn,\n} from '@/types';\n\nexport class TonConnectAdapter {\n private readonly userData: UserData | null;\n private readonly debug: boolean;\n private tonConnectInstance: TonConnectWrapper | null = null;\n private tonConnectUIOriginal: TonConnectUI | null = null;\n private lastWalletInfo: { client?: string; address?: string } | null = null;\n private sendEvent: SendEventFn;\n\n constructor(userData: UserData | null, debug: boolean, sendEvent: SendEventFn) {\n this.userData = userData;\n this.debug = debug;\n this.tonConnectInstance = null;\n this.tonConnectUIOriginal = null;\n this.lastWalletInfo = null;\n this.sendEvent = sendEvent;\n\n if (debug) {\n console.log('🚀 TonConnectAdapter initialized');\n }\n }\n\n attachTonConnect(tonConnectInstance: TonConnectUI | TonConnect): void {\n // Convert TonConnectUI to TonConnectWrapper if needed\n if ('connector' in tonConnectInstance) {\n // It's TonConnectUI - сохраняем оригинал для проксирования\n this.tonConnectUIOriginal = tonConnectInstance;\n\n // Создаем обертку для совместимости\n this.tonConnectInstance = {\n sendTransaction: tonConnectInstance.sendTransaction.bind(tonConnectInstance),\n connect: tonConnectInstance.connector.connect.bind(tonConnectInstance.connector),\n disconnect: tonConnectInstance.disconnect.bind(tonConnectInstance),\n onStatusChange: tonConnectInstance.onStatusChange.bind(tonConnectInstance),\n get wallet() {\n return tonConnectInstance.wallet;\n },\n };\n } else {\n // It's TonConnect SDK\n this.tonConnectInstance = tonConnectInstance;\n this.tonConnectUIOriginal = null;\n }\n\n this.setupTonConnectProxies();\n this.setupTonConnectStatusListener();\n\n // Инициализируем информацию о кошельке, если он уже подключен\n if (this.tonConnectInstance.wallet) {\n this.updateWalletInfo();\n }\n\n if (this.debug) {\n console.log('🚀 TonConnectAdapter attached', {\n tonConnectInstance: this.tonConnectInstance,\n tonConnectUIOriginal: this.tonConnectUIOriginal,\n });\n }\n }\n\n setupTonConnectProxies(): void {\n if (!this.tonConnectInstance) return;\n\n // Если это TonConnectUI, проксируем openModal и sendTransaction\n if (this.tonConnectUIOriginal) {\n const uiInstance = this.tonConnectUIOriginal;\n\n // Проксирование openModal для отслеживания начала подключения\n if (uiInstance.openModal) {\n const originalOpenModal = uiInstance.openModal.bind(uiInstance);\n uiInstance.openModal = () => {\n if (this.debug) {\n console.log('🔵 [TON CONNECT] openModal() called');\n }\n // Отправляем событие начала подключения\n const { address, client } = this.buildWalletConnectStartInfo();\n this.sendTonWalletEvent(EventNames.WALLET_CONNECT_START, {\n ton_wallet_address: address,\n ton_wallet_client: client,\n });\n\n try {\n const result = originalOpenModal();\n if (this.debug) {\n console.log('🟢 [TON CONNECT] openModal() completed');\n }\n return result;\n } catch (error) {\n if (this.debug) {\n console.error('🔴 [TON CONNECT] openModal() error:', error);\n }\n throw error;\n }\n };\n }\n\n // Проксирование sendTransaction для TonConnectUI\n const originalSendTransaction = uiInstance.sendTransaction.bind(uiInstance);\n uiInstance.sendTransaction = async (transaction: any) => {\n if (this.debug) {\n console.log('🔵 [TON CONNECT] sendTransaction() called:', transaction);\n }\n try {\n this.sendTonWalletEvent(EventNames.TRANSACTION_SENT_FOR_SIGNATURE, {\n transaction,\n });\n const result = await originalSendTransaction(transaction);\n if (this.debug) {\n console.log('🟢 [TON CONNECT] sendTransaction() completed:', result);\n }\n this.sendTonWalletEvent(EventNames.TRANSACTION_SIGNED, { transaction, result });\n return result;\n } catch (error) {\n if (this.debug) {\n console.error('🔴 [TON CONNECT] sendTransaction() error:', error);\n }\n this.sendTonWalletEvent(EventNames.TRANSACTION_SIGNING_FAILED, {\n transaction,\n error: String(error),\n });\n throw error;\n }\n };\n } else {\n // Для обычного TonConnect SDK проксируем connect\n const originalConnect = this.tonConnectInstance.connect;\n this.tonConnectInstance.connect = (wallet?: any) => {\n // Отправляем событие начала подключения\n const { address, client } = this.buildWalletConnectStartInfo(wallet);\n this.sendTonWalletEvent(EventNames.WALLET_CONNECT_START, {\n ton_wallet_address: address,\n ton_wallet_client: client,\n });\n\n try {\n return originalConnect.call(this.tonConnectInstance, wallet);\n } catch (error) {\n // Отправляем событие при ошибке\n this.sendTonWalletEvent(EventNames.WALLET_CONNECT_ERROR, {\n error: String(error),\n error_code: (error as any)?.code || (error as any)?.message || 'unknown',\n });\n throw error;\n }\n };\n\n // Проксирование sendTransaction\n const originalSendTransaction = this.tonConnectInstance.sendTransaction;\n this.tonConnectInstance.sendTransaction = async (transaction: any) => {\n try {\n this.sendTonWalletEvent(EventNames.TRANSACTION_SENT_FOR_SIGNATURE, {\n transaction,\n });\n const result = await originalSendTransaction.call(\n this.tonConnectInstance,\n transaction\n );\n this.sendTonWalletEvent(EventNames.TRANSACTION_SIGNED, { transaction, result });\n return result;\n } catch (error) {\n this.sendTonWalletEvent(EventNames.TRANSACTION_SIGNING_FAILED, {\n transaction,\n error: String(error),\n });\n throw error;\n }\n };\n }\n }\n\n setupTonConnectStatusListener(): void {\n if (!this.tonConnectInstance?.onStatusChange) return;\n\n this.tonConnectInstance.onStatusChange((wallet: any) => {\n if (wallet) {\n // Обновляем информацию о кошельке при подключении\n this.updateWalletInfo();\n this.sendTonWalletEvent(EventNames.WALLET_CONNECTED);\n } else {\n // При отключении сначала отправляем событие с текущими данными\n this.sendTonWalletEvent(EventNames.WALLET_DISCONNECTED);\n // Затем очищаем информацию\n this.lastWalletInfo = null;\n }\n });\n }\n\n updateWalletInfo(): void {\n this.lastWalletInfo = this.getTonWalletInfo();\n }\n /**\n * Определение типа транспорта на основе косвенных факторов\n */\n private detectWalletTransport(walletOverride?: any): string {\n const wallet = walletOverride ?? this.tonConnectInstance?.wallet;\n\n if (!wallet) return 'unknown';\n\n try {\n // Проверяем наличие bridge\n if (wallet.connectItems?.tonProof || wallet.provider) {\n // HTTP Bridge - обычно используется когда есть provider\n if (wallet.provider || wallet.device?.features?.includes('SendTransaction')) {\n return 'http';\n }\n }\n\n // JS Bridge - обычно для embedded кошельков или расширений\n if (wallet.embedded || wallet.injected) {\n return 'js';\n }\n\n // SSE (Server-Sent Events) - используется некоторыми bridge-решениями\n if (wallet.device?.features?.includes('SSE')) {\n return 'sse';\n }\n\n // По умолчанию предполагаем HTTP для большинства кошельков\n return 'http';\n } catch (error) {\n if (this.debug) console.log('Error detecting transport:', error);\n return 'unknown';\n }\n }\n\n private formatWalletClientFromWallet(wallet: any, platformOverride?: string): string {\n const fallbackPlatform = platformOverride || 'unknown';\n\n if (!wallet) {\n return `unknown/${fallbackPlatform}/unknown/unknown`;\n }\n\n try {\n const device = wallet.device || {};\n\n const app = device.appName || device.name || 'unknown';\n const platform = platformOverride || device.platform || 'unknown';\n const transport = this.detectWalletTransport(wallet);\n const version = device.appVersion || 'unknown';\n\n return `${app}/${platform}/${transport}/${version}`;\n } catch (error) {\n if (this.debug) console.log('Error formatting wallet client:', error);\n return `unknown/${fallbackPlatform}/unknown/unknown`;\n }\n }\n\n /**\n * Форматирование информации о кошельке в строку App/Platform/Transport/Version\n */\n public formatWalletClient(): string {\n return this.formatWalletClientFromWallet(this.tonConnectInstance?.wallet);\n }\n\n public buildWalletConnectStartInfo(walletCandidate?: any): {\n address: string | null;\n client: string;\n } {\n const wallet = walletCandidate ?? this.tonConnectInstance?.wallet;\n const platform = this.userData?.telegramPlatform || 'unknown';\n\n return {\n address: wallet?.account?.address ?? null,\n client: this.formatWalletClientFromWallet(wallet, platform),\n };\n }\n\n /**\n * Получить информацию о TON кошельке\n */\n public getTonWalletInfo(): { client?: string; address?: string } | null {\n if (!this.tonConnectInstance?.wallet) return null;\n\n try {\n return {\n client: this.formatWalletClient(),\n address: this.tonConnectInstance.wallet.account?.address,\n };\n } catch (error) {\n if (this.debug) console.log('Error getting wallet info:', error);\n return null;\n }\n }\n\n public sendTonWalletEvent(type: EventNames, data: any = {}): void {\n const eventData = {\n ...data,\n ton_wallet_address:\n data?.ton_wallet_address ?? this.lastWalletInfo?.address ?? null,\n ton_wallet_client: data?.ton_wallet_client ?? this.lastWalletInfo?.client ?? null,\n };\n\n this.sendEvent(type, eventData, EVENT_CATEGORY.WALLET);\n }\n\n public isAttached(): boolean {\n return this.tonConnectInstance !== null;\n }\n}\n","import type { TonConnectUI } from '@tonconnect/ui';\nimport type { TonConnect } from '@tonconnect/sdk';\nimport {\n type TopAnalyzeConfig,\n type UserData,\n type AnalyticsEvent,\n type TelegramEventNames,\n EventNames,\n EVENT_CATEGORY,\n type MainEventSchema,\n} from './types';\nimport { getTelegramUserData, isTelegramWebAppAvailable } from './utils';\nimport { API_URL, ALLOWED_TELEGRAM_EVENTS, IMPORTANT_CLICKS } from './constants';\nimport { EventTransformer } from './transformers/EventTransformer';\nimport { TonConnectAdapter } from './adapters/TonConnectAdapter';\n\nexport class TopAnalyzeSDK {\n private readonly appName: string;\n private readonly userData: UserData | null;\n private readonly debug: boolean;\n private readonly maxBatchSize = 10;\n private readonly batchInterval = 5000;\n private readonly onlyImportantClicks: boolean;\n private readonly apiToken: string;\n\n private sessionId: string;\n private sessionStartTime: number;\n private isStarted = false;\n private events: AnalyticsEvent[] = [];\n private batchTimer: ReturnType<typeof setTimeout> | null = null;\n private eventTransformer: EventTransformer;\n private tonConnectAdapter: TonConnectAdapter;\n\n constructor(config: TopAnalyzeConfig) {\n this.appName = config.appName;\n this.userData = this.initUserData();\n this.debug = config.debug ?? false;\n this.sessionId = this.generateSessionId();\n this.sessionStartTime = Date.now();\n this.onlyImportantClicks = config.onlyImportantClicks ?? false;\n this.apiToken = config.apiToken;\n\n this.eventTransformer = new EventTransformer(this.appName, this.userData, this.debug);\n this.tonConnectAdapter = new TonConnectAdapter(\n this.userData,\n this.debug,\n this.sendEvent.bind(this)\n );\n\n this.setupPageUnloadHandlers();\n }\n\n start(): void {\n if (this.isStarted) return;\n\n this.isStarted = true;\n this.setupEventListeners();\n this.setupTelegramEventListeners();\n this.sendEvent(\n EventNames.SESSION_START,\n {\n pageUrl: window.location.href,\n userAgent: navigator.userAgent,\n },\n EVENT_CATEGORY.WEB\n );\n this.sendEvent(\n EventNames.PAGE_VIEW,\n {\n pageUrl: window.location.href,\n userAgent: navigator.userAgent,\n },\n EVENT_CATEGORY.WEB\n );\n\n if (this.debug) {\n console.log('🚀 Top Analyze SDK started', {\n sessionId: this.sessionId,\n appName: this.appName,\n });\n }\n }\n\n stop(): void {\n if (!this.isStarted) return;\n\n this.isStarted = false;\n this.removeEventListeners();\n this.flushEvents();\n if (this.debug) {\n console.log('🚀 Top Analyze SDK stopped', {\n sessionId: this.sessionId,\n appName: this.appName,\n });\n }\n }\n\n attachTonConnect(tonConnect: TonConnectUI | TonConnect): void {\n this.tonConnectAdapter.attachTonConnect(tonConnect);\n\n if (this.debug) {\n console.log('🚀 Top Analyze SDK attached TON Connect', {\n sessionId: this.sessionId,\n appName: this.appName,\n });\n }\n }\n\n /**\n * Send custom event\n */\n track(eventName: string, payload: Record<string, any> = {}): void {\n this.sendEvent(\n EventNames.CUSTOM,\n { eventName, payload: payload ?? {} },\n EVENT_CATEGORY.CUSTOM\n );\n }\n\n getTonWalletInfo(): { client?: string; address?: string } | null {\n return this.tonConnectAdapter.getTonWalletInfo();\n }\n\n getSessionInfo() {\n return {\n sessionId: this.sessionId,\n duration: Date.now() - this.sessionStartTime,\n isActive: this.isStarted,\n };\n }\n\n getStatus() {\n return {\n isInitialized: true,\n isStarted: this.isStarted,\n isTonConnectAttached: this.tonConnectAdapter.isAttached(),\n appName: this.appName,\n };\n }\n\n private initUserData(): UserData | null {\n try {\n if (isTelegramWebAppAvailable()) {\n return getTelegramUserData();\n }\n } catch (error) {\n if (this.debug) console.log('Error getting Telegram user data:', error);\n }\n\n return null;\n }\n\n private generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substr(2, 9);\n return `session_${timestamp}_${random}`;\n }\n\n private setupEventListeners(): void {\n if (typeof window === 'undefined') return;\n\n // Клики\n document.addEventListener('click', this.handleClick.bind(this), true);\n\n // Смена страницы\n window.addEventListener('popstate', this.handlePageView.bind(this));\n\n // Отслеживание изменений URL через History API\n this.setupHistoryTracking();\n }\n\n private removeEventListeners(): void {\n if (typeof window === 'undefined') return;\n\n document.removeEventListener('click', this.handleClick.bind(this), true);\n window.removeEventListener('popstate', this.handlePageView.bind(this));\n }\n\n private handleClick(event: MouseEvent): void {\n if (\n this.onlyImportantClicks &&\n !IMPORTANT_CLICKS.includes((event.target as Element).tagName.toLowerCase())\n ) {\n return;\n }\n\n const target = event.target as Element;\n if (!target) return;\n\n const clickData = {\n element_tag: target.tagName.toLowerCase(),\n element_text: target.textContent?.trim()?.slice(0, 100),\n element_slug:\n target.getAttribute('data-analytics-slug') ||\n target.id ||\n (typeof target.className === 'string'\n ? target.className.split(' ')[0]\n : target.className?.[0]),\n coordinates: {\n clientX: event.clientX,\n clientY: event.clientY,\n pageX: event.pageX,\n pageY: event.pageY,\n },\n pageUrl: window.location.href,\n };\n\n this.sendEvent(EventNames.CLICK, clickData, EVENT_CATEGORY.WEB);\n }\n\n private handlePageView(): void {\n this.sendEvent(\n EventNames.PAGE_VIEW,\n {\n pageUrl: window.location.href,\n userAgent: navigator.userAgent,\n },\n EVENT_CATEGORY.WEB\n );\n }\n\n private setupHistoryTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Сохраняем оригинальные методы History API\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n // Перехватываем pushState\n history.pushState = function (state, title, url) {\n originalPushState.call(history, state, title, url);\n // Отправляем событие смены страницы\n window.dispatchEvent(new PopStateEvent('popstate', { state }));\n };\n\n // Перехватываем replaceState\n history.replaceState = function (state, title, url) {\n originalReplaceState.call(history, state, title, url);\n // Отправляем событие смены страницы\n window.dispatchEvent(new PopStateEvent('popstate', { state }));\n };\n }\n\n private sendEvent(\n type: EventNames | TelegramEventNames,\n data: any,\n category: EVENT_CATEGORY\n ): void {\n if (!this.isStarted) return;\n\n const event: AnalyticsEvent = {\n type,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n appName: this.appName,\n data,\n eventCategory: category,\n };\n\n this.events.push(event);\n\n if (this.events.length >= this.maxBatchSize) {\n this.flushEvents();\n } else {\n this.startBatchTimer();\n }\n }\n\n private startBatchTimer(): void {\n if (this.batchTimer) return;\n\n this.batchTimer = setTimeout(() => {\n this.flushEvents();\n }, this.batchInterval);\n }\n\n private flushEvents(): void {\n if (this.events.length === 0) return;\n\n const batch = [...this.events];\n this.events = [];\n\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n\n this.sendBatchToAPI(batch);\n }\n\n private async sendBatchToAPI(events: AnalyticsEvent[]): Promise<void> {\n try {\n const mainEvents: MainEventSchema[] = events.map((event) =>\n this.eventTransformer.normalizeSchema(event)\n );\n\n if (!this.eventTransformer?.validatePayloadSize(mainEvents)) {\n if (this.debug) {\n console.warn('⚠️ Top Analyze: payload is too large, skipping send');\n }\n return;\n }\n\n const sanitizedEvents = this.eventTransformer?.sanitizeData(mainEvents);\n\n if (this.debug) {\n console.group(`📊 Top Analyze: sending ${sanitizedEvents.length} events`);\n sanitizedEvents.forEach((event: any) =>\n console.log(`${event.type} [${event.ts}]`, event)\n );\n console.groupEnd();\n }\n\n await fetch(API_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Auth-TAS': this.apiToken },\n body: JSON.stringify(sanitizedEvents),\n });\n } catch (error) {\n console.error('❌ Top Analyze: error sending batch:', error);\n }\n }\n\n private setupTelegramEventListeners(): void {\n if (typeof window === 'undefined') return;\n if (!isTelegramWebAppAvailable()) return;\n\n const tg = (window as any).Telegram?.WebApp;\n if (!tg?.onEvent) return;\n\n ALLOWED_TELEGRAM_EVENTS.forEach((eventName) => {\n tg.onEvent(eventName, (eventData: any) => {\n this.handleTelegramEvent(eventName, eventData);\n });\n });\n\n if (this.debug) {\n console.log('🚀 Top Analyze SDK: Telegram event listeners setup completed', {\n eventsCount: ALLOWED_TELEGRAM_EVENTS.length,\n });\n }\n }\n\n private handleTelegramEvent(eventName: TelegramEventNames, eventData: any): void {\n if (!this.isStarted) return;\n\n this.sendEvent(\n eventName,\n {\n telegram_event_data: eventData,\n pageUrl: window.location.href,\n },\n EVENT_CATEGORY.TELEGRAM\n );\n\n if (this.debug) {\n console.log('📱 Telegram Event:', eventName, eventData);\n }\n }\n\n private setupPageUnloadHandlers(): void {\n if (typeof window === 'undefined') return;\n\n const handleUnload = () => this.flushEvents();\n window.addEventListener('beforeunload', handleUnload);\n window.addEventListener('pagehide', handleUnload);\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') this.flushEvents();\n });\n }\n}\n","/**\n * Top Analyze SDK - упрощенная аналитика для TON Mini Apps\n *\n * @example\n * ```typescript\n * import { TopAnalyzeSDK } from '@top/analyze-sdk'\n *\n * const analytics = new TopAnalyzeSDK({\n * appName: 'MyTonApp',\n * debug: true\n * })\n * analytics.start()\n *\n * // TON Connect\n * analytics.attachTonConnect(tonConnectInstance)\n *\n * // Кастомные события\n * analytics.track('game_score', { score: 1500, level: 3 })\n * ```\n */\n\nimport { TopAnalyzeSDK } from './sdk';\nimport type { TopAnalyzeConfig } from './types';\nimport type { TonConnectUI } from '@tonconnect/ui';\nimport type { TonConnect } from '@tonconnect/sdk';\n\nexport { TopAnalyzeSDK };\nexport type { TopAnalyzeConfig, TonConnectUI, TonConnect };\n\nexport default TopAnalyzeSDK;\n"]}