@vircle/sdk-web 0.2.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.esm.js +22 -4
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +22 -4
- package/dist/index.js.map +1 -1
- package/dist/vircle-web-sdk.min.js +1 -1
- package/dist/vircle-web-sdk.min.js.map +1 -1
- package/dist/vircle-web-sdk.standalone.esm.js +1 -1
- package/dist/vircle-web-sdk.standalone.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vircle-web-sdk.min.js","sources":["../../core-ts/dist/index.mjs","../src/context/WebContextCollector.ts","../src/errors/VircleWebError.ts","../src/storage/LocalStorageAdapter.ts","../src/storage/IndexedDBAdapter.ts","../src/storage/StorageFactory.ts","../src/crypto/WebExtendedCryptoAdapter.ts","../src/polyfills/node-fetch.js","../src/VircleWeb.ts"],"sourcesContent":["var __require = /* @__PURE__ */ ((x) => typeof require !== \"undefined\" ? require : typeof Proxy !== \"undefined\" ? new Proxy(x, {\n get: (a, b) => (typeof require !== \"undefined\" ? require : a)[b]\n}) : x)(function(x) {\n if (typeof require !== \"undefined\") return require.apply(this, arguments);\n throw Error('Dynamic require of \"' + x + '\" is not supported');\n});\n\n// src/models/User.ts\nvar VircleUserFactory = class {\n /**\n * Create a new VircleUser with defaults\n */\n static create(userId, traits, anonymousId) {\n const now = (/* @__PURE__ */ new Date()).toISOString();\n return {\n id: userId || void 0,\n anonymousId: anonymousId || this.generateAnonymousId(),\n traits: traits || {},\n preferences: this.getDefaultPreferences(),\n createdAt: now,\n updatedAt: now\n };\n }\n /**\n * Generate a new anonymous ID\n */\n static generateAnonymousId() {\n return `anon_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n /**\n * Get default user preferences\n * This method safely handles browser-specific APIs (navigator.language, Intl)\n * to support both web and React Native environments without errors\n */\n static getDefaultPreferences() {\n let language = \"en\";\n try {\n if (typeof navigator !== \"undefined\" && navigator && \"language\" in navigator && typeof navigator.language === \"string\" && navigator.language.length > 0) {\n language = navigator.language.split(\"-\")[0];\n }\n } catch (e) {\n }\n let timezone = \"UTC\";\n try {\n if (typeof Intl !== \"undefined\" && Intl && Intl.DateTimeFormat) {\n const options = Intl.DateTimeFormat().resolvedOptions();\n timezone = options.timeZone || \"UTC\";\n }\n } catch (e) {\n }\n return {\n language,\n timezone,\n theme: \"auto\",\n notifications: {\n email: false,\n push: false,\n sms: false\n },\n privacy: {\n analytics: true,\n marketing: false,\n functional: true\n }\n };\n }\n};\n\n// src/errors/ErrorCodes.ts\nvar ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {\n ErrorCode2[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n ErrorCode2[\"INITIALIZATION_ERROR\"] = \"INITIALIZATION_ERROR\";\n ErrorCode2[\"SDK_INITIALIZATION_FAILED\"] = \"SDK_INITIALIZATION_FAILED\";\n ErrorCode2[\"SDK_NOT_INITIALIZED\"] = \"SDK_NOT_INITIALIZED\";\n ErrorCode2[\"NOT_INITIALIZED\"] = \"NOT_INITIALIZED\";\n ErrorCode2[\"ALREADY_INITIALIZED\"] = \"ALREADY_INITIALIZED\";\n ErrorCode2[\"INVALID_CONFIGURATION\"] = \"INVALID_CONFIGURATION\";\n ErrorCode2[\"MISSING_API_KEY\"] = \"MISSING_API_KEY\";\n ErrorCode2[\"INVALID_API_KEY\"] = \"INVALID_API_KEY\";\n ErrorCode2[\"MISSING_ENDPOINT\"] = \"MISSING_ENDPOINT\";\n ErrorCode2[\"INVALID_ENDPOINT\"] = \"INVALID_ENDPOINT\";\n ErrorCode2[\"CONFIG_UPDATE_FAILED\"] = \"CONFIG_UPDATE_FAILED\";\n ErrorCode2[\"VALIDATION_ERROR\"] = \"VALIDATION_ERROR\";\n ErrorCode2[\"EVENT_TOO_LARGE\"] = \"EVENT_TOO_LARGE\";\n ErrorCode2[\"INVALID_EVENT_NAME\"] = \"INVALID_EVENT_NAME\";\n ErrorCode2[\"INVALID_EVENT_PROPERTIES\"] = \"INVALID_EVENT_PROPERTIES\";\n ErrorCode2[\"BATCH_PROCESSING_FAILED\"] = \"BATCH_PROCESSING_FAILED\";\n ErrorCode2[\"EVENT_QUEUE_FULL\"] = \"EVENT_QUEUE_FULL\";\n ErrorCode2[\"EVENT_TRACKING_FAILED\"] = \"EVENT_TRACKING_FAILED\";\n ErrorCode2[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n ErrorCode2[\"REQUEST_TIMEOUT\"] = \"REQUEST_TIMEOUT\";\n ErrorCode2[\"REQUEST_FAILED\"] = \"REQUEST_FAILED\";\n ErrorCode2[\"UNAUTHORIZED\"] = \"UNAUTHORIZED\";\n ErrorCode2[\"FORBIDDEN\"] = \"FORBIDDEN\";\n ErrorCode2[\"NOT_FOUND\"] = \"NOT_FOUND\";\n ErrorCode2[\"TOO_MANY_REQUESTS\"] = \"TOO_MANY_REQUESTS\";\n ErrorCode2[\"SERVER_ERROR\"] = \"SERVER_ERROR\";\n ErrorCode2[\"SERVICE_UNAVAILABLE\"] = \"SERVICE_UNAVAILABLE\";\n ErrorCode2[\"REMOTE_CONFIG_FETCH_FAILED\"] = \"REMOTE_CONFIG_FETCH_FAILED\";\n ErrorCode2[\"STORAGE_ERROR\"] = \"STORAGE_ERROR\";\n ErrorCode2[\"STORAGE_FULL\"] = \"STORAGE_FULL\";\n ErrorCode2[\"STORAGE_UNAVAILABLE\"] = \"STORAGE_UNAVAILABLE\";\n ErrorCode2[\"STORAGE_NOT_AVAILABLE\"] = \"STORAGE_NOT_AVAILABLE\";\n ErrorCode2[\"STORAGE_QUOTA_EXCEEDED\"] = \"STORAGE_QUOTA_EXCEEDED\";\n ErrorCode2[\"SERIALIZATION_ERROR\"] = \"SERIALIZATION_ERROR\";\n ErrorCode2[\"DESERIALIZATION_ERROR\"] = \"DESERIALIZATION_ERROR\";\n ErrorCode2[\"PLUGIN_ERROR\"] = \"PLUGIN_ERROR\";\n ErrorCode2[\"PLUGIN_NOT_FOUND\"] = \"PLUGIN_NOT_FOUND\";\n ErrorCode2[\"PLUGIN_NOT_ENABLED\"] = \"PLUGIN_NOT_ENABLED\";\n ErrorCode2[\"PLUGIN_ALREADY_REGISTERED\"] = \"PLUGIN_ALREADY_REGISTERED\";\n ErrorCode2[\"PLUGIN_INITIALIZATION_FAILED\"] = \"PLUGIN_INITIALIZATION_FAILED\";\n ErrorCode2[\"PLUGIN_VALIDATION_FAILED\"] = \"PLUGIN_VALIDATION_FAILED\";\n ErrorCode2[\"PLUGIN_HOOK_FAILED\"] = \"PLUGIN_HOOK_FAILED\";\n ErrorCode2[\"PLUGIN_DEPENDENCY_ERROR\"] = \"PLUGIN_DEPENDENCY_ERROR\";\n ErrorCode2[\"DEVICE_INFO_UNAVAILABLE\"] = \"DEVICE_INFO_UNAVAILABLE\";\n ErrorCode2[\"GEOLOCATION_ERROR\"] = \"GEOLOCATION_ERROR\";\n ErrorCode2[\"PERMISSION_DENIED\"] = \"PERMISSION_DENIED\";\n ErrorCode2[\"INVALID_USER_ID\"] = \"INVALID_USER_ID\";\n ErrorCode2[\"INVALID_SESSION_ID\"] = \"INVALID_SESSION_ID\";\n ErrorCode2[\"SESSION_EXPIRED\"] = \"SESSION_EXPIRED\";\n ErrorCode2[\"USER_NOT_IDENTIFIED\"] = \"USER_NOT_IDENTIFIED\";\n ErrorCode2[\"USER_IDENTIFICATION_FAILED\"] = \"USER_IDENTIFICATION_FAILED\";\n ErrorCode2[\"FEATURE_NOT_SUPPORTED\"] = \"FEATURE_NOT_SUPPORTED\";\n ErrorCode2[\"FEATURE_DISABLED\"] = \"FEATURE_DISABLED\";\n ErrorCode2[\"BROWSER_NOT_SUPPORTED\"] = \"BROWSER_NOT_SUPPORTED\";\n ErrorCode2[\"CONSENT_REQUIRED\"] = \"CONSENT_REQUIRED\";\n ErrorCode2[\"CONSENT_DENIED\"] = \"CONSENT_DENIED\";\n ErrorCode2[\"PRIVACY_MODE_ENABLED\"] = \"PRIVACY_MODE_ENABLED\";\n ErrorCode2[\"FLUSH_FAILED\"] = \"FLUSH_FAILED\";\n ErrorCode2[\"CLEANUP_ERROR\"] = \"CLEANUP_ERROR\";\n ErrorCode2[\"SERVICE_DISPOSED\"] = \"SERVICE_DISPOSED\";\n ErrorCode2[\"ENCRYPTION_ERROR\"] = \"ENCRYPTION_ERROR\";\n return ErrorCode2;\n})(ErrorCode || {});\nvar ERROR_METADATA = {\n [\"UNKNOWN_ERROR\" /* UNKNOWN_ERROR */]: {\n code: \"UNKNOWN_ERROR\" /* UNKNOWN_ERROR */,\n severity: \"high\" /* HIGH */,\n category: \"system\" /* SYSTEM */,\n retryable: false,\n userMessage: \"An unknown error occurred\"\n },\n [\"INITIALIZATION_ERROR\" /* INITIALIZATION_ERROR */]: {\n code: \"INITIALIZATION_ERROR\" /* INITIALIZATION_ERROR */,\n severity: \"critical\" /* CRITICAL */,\n category: \"configuration\" /* CONFIGURATION */,\n retryable: false,\n userMessage: \"Failed to initialize SDK\"\n },\n [\"MISSING_API_KEY\" /* MISSING_API_KEY */]: {\n code: \"MISSING_API_KEY\" /* MISSING_API_KEY */,\n severity: \"critical\" /* CRITICAL */,\n category: \"configuration\" /* CONFIGURATION */,\n retryable: false,\n userMessage: \"API key is required\",\n troubleshooting: [\"Check that apiKey is provided in configuration\", \"Verify API key is not empty or null\"]\n },\n [\"NETWORK_ERROR\" /* NETWORK_ERROR */]: {\n code: \"NETWORK_ERROR\" /* NETWORK_ERROR */,\n severity: \"medium\" /* MEDIUM */,\n category: \"network\" /* NETWORK */,\n retryable: true,\n userMessage: \"Network connection failed\"\n },\n [\"REQUEST_TIMEOUT\" /* REQUEST_TIMEOUT */]: {\n code: \"REQUEST_TIMEOUT\" /* REQUEST_TIMEOUT */,\n severity: \"medium\" /* MEDIUM */,\n category: \"network\" /* NETWORK */,\n retryable: true,\n userMessage: \"Request timed out\"\n },\n [\"VALIDATION_ERROR\" /* VALIDATION_ERROR */]: {\n code: \"VALIDATION_ERROR\" /* VALIDATION_ERROR */,\n severity: \"medium\" /* MEDIUM */,\n category: \"validation\" /* VALIDATION */,\n retryable: false,\n userMessage: \"Data validation failed\"\n },\n [\"EVENT_TOO_LARGE\" /* EVENT_TOO_LARGE */]: {\n code: \"EVENT_TOO_LARGE\" /* EVENT_TOO_LARGE */,\n severity: \"medium\" /* MEDIUM */,\n category: \"validation\" /* VALIDATION */,\n retryable: false,\n userMessage: \"Event size exceeds maximum limit\",\n troubleshooting: [\n \"Reduce event payload size\",\n \"Remove unnecessary properties\",\n \"Consider splitting large events\"\n ]\n },\n [\"STORAGE_UNAVAILABLE\" /* STORAGE_UNAVAILABLE */]: {\n code: \"STORAGE_UNAVAILABLE\" /* STORAGE_UNAVAILABLE */,\n severity: \"high\" /* HIGH */,\n category: \"storage\" /* STORAGE */,\n retryable: false,\n userMessage: \"Storage is not available\"\n },\n [\"PLUGIN_NOT_FOUND\" /* PLUGIN_NOT_FOUND */]: {\n code: \"PLUGIN_NOT_FOUND\" /* PLUGIN_NOT_FOUND */,\n severity: \"medium\" /* MEDIUM */,\n category: \"plugin\" /* PLUGIN */,\n retryable: false,\n userMessage: \"Plugin not found\"\n },\n [\"FEATURE_NOT_SUPPORTED\" /* FEATURE_NOT_SUPPORTED */]: {\n code: \"FEATURE_NOT_SUPPORTED\" /* FEATURE_NOT_SUPPORTED */,\n severity: \"low\" /* LOW */,\n category: \"feature\" /* FEATURE */,\n retryable: false,\n userMessage: \"Feature is not supported in this environment\"\n },\n [\"CONSENT_REQUIRED\" /* CONSENT_REQUIRED */]: {\n code: \"CONSENT_REQUIRED\" /* CONSENT_REQUIRED */,\n severity: \"medium\" /* MEDIUM */,\n category: \"privacy\" /* PRIVACY */,\n retryable: false,\n userMessage: \"User consent is required for data collection\"\n },\n [\"ENCRYPTION_ERROR\" /* ENCRYPTION_ERROR */]: {\n code: \"ENCRYPTION_ERROR\" /* ENCRYPTION_ERROR */,\n severity: \"high\" /* HIGH */,\n category: \"system\" /* SYSTEM */,\n retryable: false,\n userMessage: \"Data encryption failed\",\n troubleshooting: [\n \"Ensure the provided public key is valid and in the correct format (DER-encoded SPKI, then Base64)\",\n \"Verify that the crypto environment (Web Crypto API or Node.js crypto) is available and not corrupted\"\n ]\n }\n // Add metadata for all other error codes...\n // (Truncated for brevity - in real implementation, include all)\n};\n\n// src/errors/VircleError.ts\nvar VircleError = class _VircleError extends Error {\n constructor(code, message, options = {}) {\n const defaultMetadata = ERROR_METADATA[code] || ERROR_METADATA[\"UNKNOWN_ERROR\" /* UNKNOWN_ERROR */];\n const finalMessage = message || defaultMetadata.userMessage || `Error: ${code}`;\n super(finalMessage);\n this.name = \"VircleError\";\n this.code = code;\n this.timestamp = options.timestamp || (/* @__PURE__ */ new Date()).toISOString();\n this.context = options.context || {};\n this.requestId = options.requestId;\n this.userId = options.userId;\n this.sessionId = options.sessionId;\n this.cause = options.cause;\n this.metadata = {\n ...defaultMetadata,\n ...options.metadata\n };\n this.severity = this.metadata.severity;\n this.category = this.metadata.category;\n this.retryable = this.metadata.retryable;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, _VircleError);\n }\n }\n /**\n * Convert error to JSON for logging/reporting\n */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n severity: this.severity,\n category: this.category,\n retryable: this.retryable,\n timestamp: this.timestamp,\n context: this.context,\n requestId: this.requestId,\n userId: this.userId,\n sessionId: this.sessionId,\n stack: this.stack,\n cause: this.cause ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack\n } : void 0,\n metadata: this.metadata\n };\n }\n /**\n * Get user-friendly error message\n */\n getUserMessage() {\n return this.metadata.userMessage || this.message;\n }\n /**\n * Get troubleshooting suggestions\n */\n getTroubleshooting() {\n return this.metadata.troubleshooting || [];\n }\n /**\n * Check if error should be retried\n */\n shouldRetry() {\n return this.retryable;\n }\n /**\n * Create error from HTTP response\n */\n static fromHttpError(status, message, options = {}) {\n let code;\n switch (status) {\n case 400:\n code = \"VALIDATION_ERROR\" /* VALIDATION_ERROR */;\n break;\n case 401:\n code = \"UNAUTHORIZED\" /* UNAUTHORIZED */;\n break;\n case 403:\n code = \"FORBIDDEN\" /* FORBIDDEN */;\n break;\n case 404:\n code = \"NOT_FOUND\" /* NOT_FOUND */;\n break;\n case 408:\n code = \"REQUEST_TIMEOUT\" /* REQUEST_TIMEOUT */;\n break;\n case 413:\n code = \"EVENT_TOO_LARGE\" /* EVENT_TOO_LARGE */;\n break;\n case 429:\n code = \"TOO_MANY_REQUESTS\" /* TOO_MANY_REQUESTS */;\n break;\n case 500:\n case 502:\n code = \"SERVER_ERROR\" /* SERVER_ERROR */;\n break;\n case 503:\n code = \"SERVICE_UNAVAILABLE\" /* SERVICE_UNAVAILABLE */;\n break;\n case 504:\n code = \"REQUEST_TIMEOUT\" /* REQUEST_TIMEOUT */;\n break;\n default:\n code = \"NETWORK_ERROR\" /* NETWORK_ERROR */;\n }\n return new _VircleError(code, message, {\n ...options,\n context: {\n ...options.context,\n httpStatus: status\n }\n });\n }\n /**\n * Create error from JavaScript Error\n */\n static fromError(error, code = \"UNKNOWN_ERROR\" /* UNKNOWN_ERROR */, options = {}) {\n return new _VircleError(code, error.message, {\n ...options,\n cause: error\n });\n }\n};\nvar ConfigurationError = class extends VircleError {\n constructor(message, options = {}) {\n super(\"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */, message, options);\n this.name = \"ConfigurationError\";\n }\n};\nvar ValidationError = class extends VircleError {\n constructor(message, validationErrors = [], options = {}) {\n super(\"VALIDATION_ERROR\" /* VALIDATION_ERROR */, message, options);\n this.name = \"ValidationError\";\n this.validationErrors = validationErrors;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n validationErrors: this.validationErrors\n };\n }\n};\nvar NetworkError = class extends VircleError {\n constructor(message, httpStatus, options = {}) {\n const code = httpStatus ? httpStatus >= 500 ? \"SERVER_ERROR\" /* SERVER_ERROR */ : \"NETWORK_ERROR\" /* NETWORK_ERROR */ : \"NETWORK_ERROR\" /* NETWORK_ERROR */;\n super(code, message, options);\n this.name = \"NetworkError\";\n this.httpStatus = httpStatus;\n this.responseBody = options.context?.responseBody;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n httpStatus: this.httpStatus,\n responseBody: this.responseBody\n };\n }\n};\nvar PluginError = class extends VircleError {\n constructor(pluginName, message, code = \"PLUGIN_ERROR\" /* PLUGIN_ERROR */, options = {}) {\n super(code, message, {\n ...options,\n context: {\n ...options.context,\n pluginName\n }\n });\n this.name = \"PluginError\";\n this.pluginName = pluginName;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n pluginName: this.pluginName\n };\n }\n};\nvar StorageError = class extends VircleError {\n constructor(message, code = \"STORAGE_ERROR\" /* STORAGE_ERROR */, options = {}) {\n super(code, message, options);\n this.name = \"StorageError\";\n }\n};\n\n// src/services/EventService.ts\nvar EventService = class {\n constructor(config, options = {}) {\n this.disposed = false;\n this.config = config;\n this.options = {\n autoEnrich: true,\n enableValidation: true,\n maxEventSize: 1024 * 100,\n // 100KB\n ...options\n };\n this.contextService = options.contextService;\n this.pluginService = options.pluginService;\n this.storageService = options.storageService;\n this.transportService = options.transportService;\n }\n /**\n * 이벤트 추적\n * @param event - 추적할 이벤트\n * @throws {VircleError} 이벤트 처리 실패 시\n */\n async track(event) {\n if (this.disposed) {\n throw new VircleError(\"SERVICE_DISPOSED\" /* SERVICE_DISPOSED */, \"EventService has been disposed\");\n }\n try {\n let processedEvent = await this.processEvent(event);\n if (this.pluginService) {\n processedEvent = await this.pluginService.executeHook(\"beforeEventSend\", processedEvent);\n }\n if (this.transportService) {\n if (this.config.debug) {\n console.log(\"[EventService] Sending event to transport:\", processedEvent.name);\n }\n await this.transportService.send(processedEvent);\n if (this.config.debug) {\n console.log(\"[EventService] Event sent to transport successfully:\", processedEvent.name);\n }\n } else {\n if (this.config.debug) {\n console.warn(\"[EventService] No transport service available\");\n }\n }\n if (this.pluginService) {\n await this.pluginService.executeHook(\"afterEventSend\", processedEvent);\n }\n } catch (error) {\n if (this.pluginService) {\n await this.pluginService.executeHook(\"onError\", {\n error,\n context: { event }\n });\n }\n throw error;\n }\n }\n /**\n * 이벤트 빌더 생성\n * @param name - 초기 이벤트 이름\n * @returns EventBuilder 인스턴스\n */\n createEvent(name) {\n return new EventBuilderImpl(this, name);\n }\n /**\n * 이벤트 내부 처리\n * @param event - 처리할 이벤트\n * @returns 처리된 이벤트\n * @throws {VircleError} 이벤트 크기 초과 시\n */\n async processEvent(event) {\n let processedEvent = { ...event };\n if (this.options.autoEnrich) {\n processedEvent = await this.enrichEvent(processedEvent);\n }\n if (this.options.maxEventSize) {\n const eventSize = this.calculateEventSize(processedEvent);\n if (eventSize > this.options.maxEventSize) {\n throw new VircleError(\n \"EVENT_TOO_LARGE\" /* EVENT_TOO_LARGE */,\n `Event size (${eventSize} bytes) exceeds maximum allowed size (${this.options.maxEventSize} bytes)`\n );\n }\n }\n return processedEvent;\n }\n /**\n * 이벤트 자동 컨텍스트 보강\n * @param event - 보강할 이벤트\n * @returns 보강된 이벤트\n */\n async enrichEvent(event) {\n const enriched = { ...event };\n if (!enriched.timestamp) {\n enriched.timestamp = (/* @__PURE__ */ new Date()).toISOString();\n }\n if (this.contextService) {\n try {\n const contextResult = await this.contextService.collectAutoContext();\n if (contextResult.context) {\n enriched.context = this.mergeContext(contextResult.context, enriched.context || {});\n }\n } catch (error) {\n const contextError = new Error(`Failed to collect auto context: ${error.message}`);\n if (this.options.onNonCriticalError) {\n this.options.onNonCriticalError(contextError);\n }\n }\n }\n return enriched;\n }\n /**\n * 컨텍스트 안전 병합\n * @param autoContext - 자동 수집된 컨텍스트\n * @param userContext - 사용자 정의 컨텍스트\n * @returns 병합된 컨텍스트\n */\n mergeContext(autoContext, userContext) {\n return {\n ...autoContext,\n ...userContext\n };\n }\n /**\n * 이벤트 크기 계산\n * @param event - 크기를 계산할 이벤트\n * @returns 바이트 단위 크기\n */\n calculateEventSize(event) {\n try {\n return new Blob([JSON.stringify(event)]).size;\n } catch {\n return JSON.stringify(event).length * 2;\n }\n }\n /**\n * 서비스 리소스 정리\n * 메모리 누수 방지를 위한 정리 메서드\n */\n dispose() {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.contextService = void 0;\n this.pluginService = void 0;\n this.storageService = void 0;\n this.transportService = void 0;\n this.config = {};\n this.options = {};\n }\n /**\n * 서비스 폐기 상태 확인\n * @returns 폐기 여부\n */\n isDisposed() {\n return this.disposed;\n }\n};\nvar EventBuilderImpl = class {\n constructor(eventService, name) {\n this.event = {};\n this.eventService = eventService;\n if (name) {\n this.event.name = name;\n }\n }\n /**\n * 이벤트 이름 설정\n * @param name - 이벤트 이름\n * @returns EventBuilder 인스턴스\n */\n name(name) {\n this.event.name = name;\n return this;\n }\n /**\n * 사용자 ID 설정\n * @param userId - 사용자 ID\n * @returns EventBuilder 인스턴스\n */\n userId(userId) {\n this.event.userId = userId;\n return this;\n }\n /**\n * 세션 ID 설정\n * @param sessionId - 세션 ID\n * @returns EventBuilder 인스턴스\n */\n sessionId(sessionId) {\n this.event.sessionId = sessionId;\n return this;\n }\n /**\n * 이벤트 속성 일괄 설정\n * @param properties - 설정할 속성\n * @returns EventBuilder 인스턴스\n */\n properties(properties) {\n this.event.properties = { ...this.event.properties, ...properties };\n return this;\n }\n /**\n * 이벤트 속성 개별 설정\n * @param key - 속성 키\n * @param value - 속성 값\n * @returns EventBuilder 인스턴스\n */\n property(key, value) {\n if (!this.event.properties) {\n this.event.properties = {};\n }\n this.event.properties[key] = value;\n return this;\n }\n /**\n * 컨텍스트 설정\n * @param context - 설정할 컨텍스트\n * @returns EventBuilder 인스턴스\n */\n context(context) {\n this.event.context = { ...this.event.context, ...context };\n return this;\n }\n /**\n * 디바이스 컨텍스트 설정\n * @param device - 디바이스 정보\n * @returns EventBuilder 인스턴스\n */\n device(device) {\n if (!this.event.context) {\n this.event.context = {};\n }\n this.event.context.device = { ...this.event.context.device, ...device };\n return this;\n }\n /**\n * 앱 컨텍스트 설정\n * @param app - 앱 정보\n * @returns EventBuilder 인스턴스\n */\n app(app) {\n if (!this.event.context) {\n this.event.context = {};\n }\n this.event.context.app = { ...this.event.context.app, ...app };\n return this;\n }\n /**\n * 페이지 컨텍스트 설정\n * @param page - 페이지 정보\n * @returns EventBuilder 인스턴스\n */\n page(page) {\n if (!this.event.context) {\n this.event.context = {};\n }\n this.event.context.page = { ...this.event.context.page, ...page };\n return this;\n }\n /**\n * 캠페인 컨텍스트 설정\n * @param campaign - 캠페인 정보\n * @returns EventBuilder 인스턴스\n */\n campaign(campaign) {\n if (!this.event.context) {\n this.event.context = {};\n }\n this.event.context.campaign = { ...this.event.context.campaign, ...campaign };\n return this;\n }\n /**\n * 커스텀 컨텍스트 설정\n * @param key - 컨텍스트 키\n * @param value - 컨텍스트 값\n * @returns EventBuilder 인스턴스\n */\n custom(key, value) {\n if (!this.event.context) {\n this.event.context = {};\n }\n if (!this.event.context.custom) {\n this.event.context.custom = {};\n }\n this.event.context.custom[key] = value;\n return this;\n }\n /**\n * 이벤트 추적 실행\n * @returns Promise<void>\n * @throws {VircleError} 이벤트 이름 누락 시\n */\n track() {\n const event = this.build();\n return this.eventService.track(event);\n }\n /**\n * 이벤트 객체 빌드\n * @returns 완성된 이벤트 객체\n * @throws {VircleError} 이벤트 이름 누락 시\n */\n build() {\n if (!this.event.name) {\n throw new VircleError(\"VALIDATION_ERROR\" /* VALIDATION_ERROR */, \"Event name is required\");\n }\n return {\n name: this.event.name,\n timestamp: this.event.timestamp,\n userId: this.event.userId,\n sessionId: this.event.sessionId,\n properties: this.event.properties || {},\n context: this.event.context || {}\n };\n }\n};\n\n// src/services/ConfigService.ts\nvar ConfigService = class {\n constructor(config) {\n this.config = { ...config };\n }\n /**\n * 현재 설정 반환\n */\n getConfig() {\n return { ...this.config };\n }\n /**\n * 설정 업데이트\n */\n updateConfig(newConfig) {\n this.config = { ...this.config, ...newConfig };\n }\n /**\n * 특정 설정 값 가져오기\n */\n get(key) {\n return this.config[key];\n }\n /**\n * 특정 설정 값 설정하기\n */\n set(key, value) {\n this.config[key] = value;\n }\n};\n\n// src/services/ContextService.ts\nvar ContextService = class {\n constructor(config) {\n this.config = config;\n }\n /**\n * 설정에 따른 자동 컨텍스트 수집\n * @returns 수집된 컨텍스트 결과\n */\n async collectAutoContext() {\n const context = {};\n const warnings = [];\n const errors = [];\n const autoCollect = this.config.autoCollect || {};\n try {\n if (autoCollect.device) {\n const deviceResult = await this.collectDeviceInfo();\n if (deviceResult.device) {\n context.device = deviceResult.device;\n }\n warnings.push(...deviceResult.warnings || []);\n errors.push(...deviceResult.errors || []);\n }\n if (autoCollect.app) {\n const appResult = await this.collectAppInfo();\n if (appResult.app) {\n context.app = appResult.app;\n }\n warnings.push(...appResult.warnings || []);\n errors.push(...appResult.errors || []);\n }\n if (autoCollect.page && this.isWebEnvironment()) {\n const pageResult = this.collectPageInfo();\n if (pageResult.page) {\n context.page = pageResult.page;\n }\n warnings.push(...pageResult.warnings || []);\n }\n if (autoCollect.userAgent) {\n const userAgentResult = this.collectUserAgent();\n if (userAgentResult.userAgent) {\n context.userAgent = userAgentResult.userAgent;\n }\n }\n if (autoCollect.referrer && this.isWebEnvironment()) {\n const referrerResult = this.collectReferrer();\n if (referrerResult.referrer) {\n context.referrer = referrerResult.referrer;\n }\n }\n if (autoCollect.campaign) {\n const campaignResult = this.collectCampaignInfo();\n if (campaignResult.campaign) {\n context.campaign = campaignResult.campaign;\n }\n }\n if (autoCollect.performance && this.isWebEnvironment()) {\n const performanceResult = this.collectPerformanceInfo();\n if (performanceResult.performance) {\n context.performance = performanceResult.performance;\n }\n warnings.push(...performanceResult.warnings || []);\n }\n } catch (error) {\n errors.push(`Failed to collect auto context: ${error.message}`);\n }\n return { context, warnings, errors };\n }\n /**\n * 디바이스 정보 수집\n * @returns 디바이스 컨텍스트와 경고/오류\n */\n async collectDeviceInfo() {\n if (this.cachedDeviceInfo) {\n return { device: this.cachedDeviceInfo };\n }\n const warnings = [];\n const errors = [];\n const device = {};\n try {\n if (this.isReactNativeEnvironment()) {\n warnings.push(\"Limited device info available in React Native - use platform-specific adapter for full info\");\n device.type = \"mobile\";\n try {\n if (typeof Intl !== \"undefined\" && Intl && Intl.DateTimeFormat) {\n device.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n } catch (e) {\n device.timezone = \"UTC\";\n }\n this.cachedDeviceInfo = device;\n return { device: this.cachedDeviceInfo, warnings };\n }\n if (this.isWebEnvironment() && typeof navigator !== \"undefined\") {\n const userAgent = navigator.userAgent;\n if (userAgent.includes(\"Chrome\")) {\n device.browser = \"Chrome\";\n const chromeMatch = userAgent.match(/Chrome\\/(\\d+\\.?\\d*)/);\n if (chromeMatch) device.browserVersion = chromeMatch[1];\n } else if (userAgent.includes(\"Firefox\")) {\n device.browser = \"Firefox\";\n const firefoxMatch = userAgent.match(/Firefox\\/(\\d+\\.?\\d*)/);\n if (firefoxMatch) device.browserVersion = firefoxMatch[1];\n } else if (userAgent.includes(\"Safari\")) {\n device.browser = \"Safari\";\n const safariMatch = userAgent.match(/Version\\/(\\d+\\.?\\d*)/);\n if (safariMatch) device.browserVersion = safariMatch[1];\n }\n if (userAgent.includes(\"Windows\")) {\n device.os = \"Windows\";\n const winMatch = userAgent.match(/Windows NT (\\d+\\.?\\d*)/);\n if (winMatch) device.osVersion = winMatch[1];\n } else if (userAgent.includes(\"Mac OS\")) {\n device.os = \"macOS\";\n const macMatch = userAgent.match(/Mac OS X (\\d+_?\\d*)/);\n if (macMatch) device.osVersion = macMatch[1].replace(\"_\", \".\");\n } else if (userAgent.includes(\"Linux\")) {\n device.os = \"Linux\";\n }\n if (this.isMobileEnvironment()) {\n device.type = \"mobile\";\n } else if (userAgent.includes(\"Tablet\") || userAgent.includes(\"iPad\")) {\n device.type = \"tablet\";\n } else {\n device.type = \"desktop\";\n }\n try {\n if (\"language\" in navigator && typeof navigator.language === \"string\" && navigator.language.length > 0) {\n device.language = navigator.language;\n }\n } catch (e) {\n }\n if (typeof screen !== \"undefined\") {\n device.screenResolution = `${screen.width}x${screen.height}`;\n } else if (typeof window !== \"undefined\" && window.screen) {\n device.screenResolution = `${window.screen.width}x${window.screen.height}`;\n }\n if (typeof window !== \"undefined\" && window.innerWidth && window.innerHeight) {\n device.viewport = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n }\n try {\n device.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n warnings.push(\"Failed to detect timezone\");\n }\n } else {\n warnings.push(\"Navigator API not available - limited device info\");\n }\n this.cachedDeviceInfo = device;\n return { device: this.cachedDeviceInfo, warnings, errors };\n } catch (error) {\n errors.push(`Failed to collect device info: ${error.message}`);\n return { warnings, errors };\n }\n }\n /**\n * 애플리케이션 정보 수집\n * @returns 앱 컨텍스트와 경고/오류\n */\n async collectAppInfo() {\n if (this.cachedAppInfo) {\n return { app: this.cachedAppInfo };\n }\n const warnings = [];\n const errors = [];\n const app = {};\n try {\n if (this.isWebEnvironment() && typeof document !== \"undefined\") {\n app.name = document.title || \"Unknown Web App\";\n }\n if (typeof process !== \"undefined\" && process.env) {\n app.version = process.env.npm_package_version || process.env.APP_VERSION;\n app.build = process.env.BUILD_NUMBER;\n const env = process.env.NODE_ENV;\n if (env === \"development\" || env === \"production\") {\n app.environment = env;\n }\n }\n this.cachedAppInfo = app;\n return { app: this.cachedAppInfo, warnings, errors };\n } catch (error) {\n errors.push(`Failed to collect app info: ${error.message}`);\n return { warnings, errors };\n }\n }\n /**\n * 페이지 정보 수집 (웹 전용)\n * @returns 페이지 컨텍스트와 경고\n */\n collectPageInfo() {\n if (!this.isWebEnvironment() || typeof document === \"undefined\") {\n return { warnings: [\"Page info collection only available in web environment\"] };\n }\n const page = {};\n const warnings = [];\n try {\n page.title = document.title;\n page.url = window.location.href;\n page.path = window.location.pathname;\n page.search = window.location.search;\n page.hash = window.location.hash;\n page.referrer = document.referrer;\n const metaTags = {};\n const metaElements = document.querySelectorAll(\"meta[name], meta[property]\");\n metaElements.forEach((meta) => {\n const name = meta.getAttribute(\"name\") || meta.getAttribute(\"property\");\n const content = meta.getAttribute(\"content\");\n if (name && content) {\n metaTags[name] = content;\n }\n });\n if (Object.keys(metaTags).length > 0) {\n page.meta = metaTags;\n }\n return { page, warnings };\n } catch (error) {\n warnings.push(`Failed to collect page info: ${error.message}`);\n return { warnings };\n }\n }\n /**\n * 사용자 에이전트 정보 수집\n * @returns 사용자 에이전트 문자열\n */\n collectUserAgent() {\n if (typeof navigator !== \"undefined\" && navigator.userAgent) {\n return { userAgent: navigator.userAgent };\n }\n return {};\n }\n /**\n * 리퍼러 정보 수집 (웹 전용)\n * @returns 리퍼러 문자열\n */\n collectReferrer() {\n if (this.isWebEnvironment() && typeof document !== \"undefined\" && document.referrer) {\n return { referrer: document.referrer };\n }\n return {};\n }\n /**\n * URL 파라미터로부터 캠페인 정보 수집\n * @returns 캠페인 컨텍스트\n */\n collectCampaignInfo() {\n if (!this.isWebEnvironment() || typeof window === \"undefined\") {\n return {};\n }\n const campaign = {};\n const urlParams = new URLSearchParams(window.location.search);\n const utmParams = [\"utm_source\", \"utm_medium\", \"utm_campaign\", \"utm_term\", \"utm_content\"];\n let hasCampaignData = false;\n utmParams.forEach((param) => {\n const value = urlParams.get(param);\n if (value) {\n campaign[param] = value;\n hasCampaignData = true;\n }\n });\n const otherParams = [\n \"gclid\",\n // Google Ads\n \"fbclid\",\n // Facebook Ads\n \"msclkid\",\n // Microsoft Ads\n \"ttclid\"\n // TikTok Ads\n ];\n otherParams.forEach((param) => {\n const value = urlParams.get(param);\n if (value) {\n campaign[param] = value;\n hasCampaignData = true;\n }\n });\n return hasCampaignData ? { campaign } : {};\n }\n /**\n * 성능 정보 수집 (웹 전용)\n * @returns 성능 컨텍스트와 경고\n */\n collectPerformanceInfo() {\n if (!this.isWebEnvironment() || typeof window === \"undefined\" || !window.performance) {\n return { warnings: [\"Performance API not available\"] };\n }\n const performance = {};\n const warnings = [];\n try {\n const timing = window.performance.timing;\n const navigation = window.performance.navigation;\n if (timing) {\n performance.loadTime = timing.loadEventEnd - timing.navigationStart;\n performance.domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n performance.responseTime = timing.responseEnd - timing.requestStart;\n performance.renderTime = timing.loadEventEnd - timing.responseEnd;\n }\n if (navigation) {\n performance.navigationType = navigation.type;\n performance.redirectCount = navigation.redirectCount;\n }\n if (\"connection\" in navigator) {\n const connection = navigator.connection;\n performance.connectionType = connection.effectiveType;\n performance.downlink = connection.downlink;\n performance.rtt = connection.rtt;\n }\n return { performance, warnings };\n } catch (error) {\n warnings.push(`Failed to collect performance info: ${error.message}`);\n return { warnings };\n }\n }\n /**\n * 사용자 제공 컨텍스트와 자동 수집 컨텍스트 병합\n * @param autoContext - 자동 수집된 컨텍스트\n * @param userContext - 사용자 제공 컨텍스트\n * @returns 병합된 컨텍스트\n */\n mergeContext(autoContext, userContext = {}) {\n return {\n ...autoContext,\n ...userContext,\n // Merge nested objects\n device: { ...autoContext.device, ...userContext.device },\n app: { ...autoContext.app, ...userContext.app },\n page: { ...autoContext.page, ...userContext.page },\n campaign: { ...autoContext.campaign, ...userContext.campaign },\n performance: { ...autoContext.performance, ...userContext.performance }\n };\n }\n /**\n * 캐시된 컨텍스트 정보 초기화 (SPA 라우트 변경 시 유용)\n */\n clearCache() {\n this.cachedAppInfo = void 0;\n }\n /**\n * 환경 감지 헬퍼 메서드\n */\n /**\n * React Native 환경 확인\n * @returns React Native 환경 여부\n */\n isReactNativeEnvironment() {\n return typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\";\n }\n /**\n * 웹 환경 확인\n * @returns 웹 환경 여부\n */\n isWebEnvironment() {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\" && !this.isReactNativeEnvironment();\n }\n /**\n * 모바일 환경 확인\n * @returns 모바일 환경 여부\n */\n isMobileEnvironment() {\n if (this.isReactNativeEnvironment()) {\n return true;\n }\n if (this.isWebEnvironment() && typeof navigator !== \"undefined\") {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || typeof window !== \"undefined\" && window.innerWidth <= 768;\n }\n return false;\n }\n};\n\n// src/services/PluginService.ts\nvar PluginService = class {\n constructor(config, options = {}) {\n this.plugins = /* @__PURE__ */ new Map();\n this.eventHandlers = /* @__PURE__ */ new Map();\n this.pluginEventHandlers = /* @__PURE__ */ new Map();\n this.pluginStorage = /* @__PURE__ */ new Map();\n this.config = config;\n this.options = {\n maxExecutionTime: 5e3,\n // 5 seconds\n enableTimeout: true,\n errorHandling: \"lenient\",\n ...options\n };\n }\n /**\n * SDK track 함수 주입\n */\n setTrackFn(fn) {\n this.trackFn = fn;\n }\n /**\n * SDK identify 함수 주입\n */\n setIdentifyFn(fn) {\n this.identifyFn = fn;\n }\n /**\n * 플러그인 등록\n * @param plugin - 등록할 플러그인\n * @throws {PluginError} 등록 실패 시\n */\n async register(plugin) {\n this.validatePlugin(plugin);\n if (this.plugins.has(plugin.name)) {\n throw new PluginError(\n plugin.name,\n `Plugin '${plugin.name}' is already registered`,\n \"PLUGIN_ALREADY_REGISTERED\" /* PLUGIN_ALREADY_REGISTERED */\n );\n }\n try {\n const context = this.createPluginContext(plugin.name);\n if (plugin.initialize) {\n await this.executeWithTimeout(\n () => plugin.initialize(this.config, context),\n `Plugin '${plugin.name}' initialization`\n );\n }\n this.plugins.set(plugin.name, plugin);\n } catch (error) {\n throw new PluginError(\n plugin.name,\n `Failed to register plugin: ${error.message}`,\n \"PLUGIN_INITIALIZATION_FAILED\" /* PLUGIN_INITIALIZATION_FAILED */,\n { cause: error }\n );\n }\n }\n /**\n * 플러그인 등록 해제\n * @param name - 플러그인 이름\n * @returns 해제 성공 여부\n * @throws {VircleError} 정리 실패 시\n */\n async unregister(name) {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n return false;\n }\n let cleanupError;\n try {\n if (plugin.cleanup) {\n await this.executeWithTimeout(() => plugin.cleanup(), `Plugin '${name}' cleanup`);\n }\n } catch (error) {\n cleanupError = error;\n } finally {\n this.plugins.delete(name);\n this.pluginStorage.delete(name);\n this.removePluginEventHandlers(name);\n }\n if (cleanupError) {\n throw new VircleError(\n \"PLUGIN_ERROR\" /* PLUGIN_ERROR */,\n `Plugin cleanup failed for '${name}': ${cleanupError.message}`,\n { cause: cleanupError }\n );\n }\n return true;\n }\n /**\n * 플러그인 훅 실행\n * @param hook - 실행할 훅 타입\n * @param data - 훅에 전달할 데이터\n * @returns 처리된 데이터 또는 결과\n * @throws {PluginError} strict 모드에서 훅 실패 시\n */\n async executeHook(hook, data) {\n const results = [];\n const errors = [];\n const applicablePlugins = Array.from(this.plugins.values()).filter((plugin) => {\n return plugin.hooks && plugin.hooks[hook];\n });\n if (applicablePlugins.length === 0) {\n return data;\n }\n for (const plugin of applicablePlugins) {\n try {\n const context = this.createPluginContext(plugin.name);\n const handler = plugin.hooks[hook];\n const result = await this.executeWithTimeout(\n () => handler(data, context),\n `Plugin '${plugin.name}' ${hook} hook`\n );\n results.push(result);\n if (hook === \"beforeEventSend\" || hook === \"afterEventSend\") {\n data = result || data;\n }\n } catch (error) {\n const pluginError = new PluginError(\n plugin.name,\n `Hook '${hook}' failed: ${error.message}`,\n \"PLUGIN_HOOK_FAILED\" /* PLUGIN_HOOK_FAILED */,\n { cause: error }\n );\n errors.push(pluginError);\n if (this.options.errorHandling === \"strict\") {\n throw pluginError;\n }\n }\n }\n if (errors.length > 0 && this.options.errorHandling === \"lenient\") {\n return {\n results,\n errors,\n data: hook === \"beforeEventSend\" || hook === \"afterEventSend\" ? data : void 0\n };\n }\n if (hook === \"beforeEventSend\" || hook === \"afterEventSend\") {\n return data;\n }\n return results;\n }\n /**\n * 등록된 플러그인 조회\n * @param name - 플러그인 이름\n * @returns 플러그인 또는 undefined\n */\n getPlugin(name) {\n return this.plugins.get(name);\n }\n /**\n * 모든 등록된 플러그인 조회\n * @returns 플러그인 배열\n */\n getPlugins() {\n return Array.from(this.plugins.values());\n }\n /**\n * 플러그인 이름 리스트 조회\n * @returns 플러그인 이름 배열\n */\n getPluginNames() {\n return Array.from(this.plugins.keys());\n }\n /**\n * 플러그인 등록 여부 확인\n * @param name - 플러그인 이름\n * @returns 등록 여부\n */\n hasPlugin(name) {\n return this.plugins.has(name);\n }\n /**\n * 플러그인 개수 조회\n * @returns 등록된 플러그인 수\n */\n getPluginCount() {\n return this.plugins.size;\n }\n /**\n * 모든 플러그인 라이프사이클 이벤트 실행\n * @param lifecycle - 라이프사이클 타입\n * @param data - 전달할 데이터\n */\n async executeLifecycle(lifecycle, data) {\n const lifecycleHook = this.getLifecycleHook(lifecycle);\n if (lifecycleHook) {\n await this.executeHook(lifecycleHook, data);\n }\n }\n /**\n * 모든 플러그인 정리\n */\n async cleanup() {\n const pluginNames = Array.from(this.plugins.keys());\n const cleanupPromises = pluginNames.map((name) => this.unregister(name));\n await Promise.all(cleanupPromises);\n }\n /**\n * 플러그인 상태 조회\n * @returns 플러그인별 상태 정보\n */\n getPluginHealth() {\n const health = {};\n for (const [name, plugin] of this.plugins) {\n try {\n if (!plugin.name || !plugin.version) {\n health[name] = {\n status: \"error\",\n error: \"Missing required plugin properties\"\n };\n } else {\n health[name] = { status: \"healthy\" };\n }\n } catch (error) {\n health[name] = {\n status: \"error\",\n error: error.message\n };\n }\n }\n return health;\n }\n /**\n * 플러그인 구조 검증\n * @param plugin - 검증할 플러그인\n * @throws {PluginError} 검증 실패 시\n */\n validatePlugin(plugin) {\n if (!plugin.name) {\n throw new PluginError(\"\", \"Plugin must have a name\", \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */);\n }\n if (!plugin.version) {\n throw new PluginError(plugin.name, \"Plugin must have a version\", \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */);\n }\n if (!/^[a-zA-Z0-9_-]+$/.test(plugin.name)) {\n throw new PluginError(\n plugin.name,\n \"Plugin name must contain only letters, numbers, underscores, and hyphens\",\n \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */\n );\n }\n if (!/^\\d+\\.\\d+\\.\\d+/.test(plugin.version)) {\n throw new PluginError(\n plugin.name,\n \"Plugin version must be in semver format (x.y.z)\",\n \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */\n );\n }\n if (plugin.hooks) {\n const validHooks = [\n \"beforeEvent\",\n \"afterEvent\",\n \"beforeBatch\",\n \"afterBatch\",\n \"onError\",\n \"beforeStart\",\n \"afterStart\",\n \"beforeStop\",\n \"afterStop\",\n \"beforeEventSend\",\n \"afterEventSend\",\n \"onConfigChange\",\n \"onUserIdentify\",\n \"onSessionStart\",\n \"onSessionEnd\"\n ];\n for (const hook of Object.keys(plugin.hooks)) {\n if (!validHooks.includes(hook)) {\n throw new PluginError(\n plugin.name,\n `Invalid plugin hook: ${hook}`,\n \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */\n );\n }\n if (typeof plugin.hooks[hook] !== \"function\") {\n throw new PluginError(\n plugin.name,\n `Plugin hook '${hook}' must be a function`,\n \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */\n );\n }\n }\n }\n }\n /**\n * 플러그인 컨텍스트 생성\n * @param pluginName - 플러그인 이름\n * @returns 플러그인 컨텍스트\n */\n createPluginContext(pluginName) {\n const self = this;\n return {\n getConfig: () => ({ ...this.config }),\n on: (event, handler) => {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, /* @__PURE__ */ new Set());\n }\n this.eventHandlers.get(event).add(handler);\n if (!this.pluginEventHandlers.has(pluginName)) {\n this.pluginEventHandlers.set(pluginName, []);\n }\n this.pluginEventHandlers.get(pluginName).push({ event, handler });\n },\n off: (event, handler) => {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n }\n const tracked = this.pluginEventHandlers.get(pluginName);\n if (tracked) {\n const idx = tracked.findIndex((h) => h.event === event && h.handler === handler);\n if (idx !== -1) tracked.splice(idx, 1);\n }\n },\n emit: (event, data) => {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n if (this.config.debug) {\n console.error(`Error in event handler for '${event}':`, error);\n }\n }\n });\n }\n },\n use: (middleware) => {\n if (this.config.debug) {\n console.warn(\"Middleware registration is not yet implemented\");\n }\n },\n getPlugin: (name) => self.plugins.get(name),\n track: (eventName, properties) => {\n if (!self.trackFn) {\n if (this.config.debug) {\n console.warn(`[Plugin:${pluginName}] track() called but SDK track function not injected`);\n }\n return;\n }\n self.trackFn(eventName, properties).catch((error) => {\n console.error(`[Plugin:${pluginName}] track() failed:`, error);\n });\n },\n identify: (userId, traits) => {\n if (!self.identifyFn) {\n if (this.config.debug) {\n console.warn(`[Plugin:${pluginName}] identify() called but SDK identify function not injected`);\n }\n return;\n }\n self.identifyFn(userId, traits).catch((error) => {\n console.error(`[Plugin:${pluginName}] identify() failed:`, error);\n });\n },\n logger: {\n debug: (message, ...args) => {\n if (this.config.debug) {\n console.debug(`[Plugin:${pluginName}] ${message}`, ...args);\n }\n },\n info: (message, ...args) => {\n if (this.config.debug) {\n console.info(`[Plugin:${pluginName}] ${message}`, ...args);\n }\n },\n warn: (message, ...args) => {\n if (this.config.debug) {\n console.warn(`[Plugin:${pluginName}] ${message}`, ...args);\n }\n },\n error: (message, ...args) => {\n if (this.config.debug) {\n console.error(`[Plugin:${pluginName}] ${message}`, ...args);\n }\n }\n },\n storage: {\n get: async (key) => {\n if (!self.pluginStorage.has(pluginName)) {\n return void 0;\n }\n return self.pluginStorage.get(pluginName).get(key);\n },\n set: async (key, value) => {\n if (!self.pluginStorage.has(pluginName)) {\n self.pluginStorage.set(pluginName, /* @__PURE__ */ new Map());\n }\n self.pluginStorage.get(pluginName).set(key, value);\n },\n remove: async (key) => {\n const storage = self.pluginStorage.get(pluginName);\n if (storage) {\n storage.delete(key);\n }\n }\n }\n };\n }\n /**\n * 타임아웃 제한 함수 실행\n * @param fn - 실행할 함수\n * @param operation - 작업 설명\n * @returns 함수 실행 결과\n * @throws {Error} 타임아웃 발생 시\n */\n async executeWithTimeout(fn, operation) {\n if (!this.options.enableTimeout) {\n return await fn();\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`${operation} timed out after ${this.options.maxExecutionTime}ms`));\n }, this.options.maxExecutionTime);\n Promise.resolve(fn()).then((result) => {\n clearTimeout(timeout);\n resolve(result);\n }).catch((error) => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n }\n /**\n * 플러그인이 등록한 이벤트 핸들러 일괄 제거\n * @param pluginName - 플러그인 이름\n */\n removePluginEventHandlers(pluginName) {\n const tracked = this.pluginEventHandlers.get(pluginName);\n if (tracked) {\n for (const { event, handler } of tracked) {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n }\n }\n this.pluginEventHandlers.delete(pluginName);\n }\n }\n /**\n * 라이프사이클을 훅으로 매핑\n * @param lifecycle - 라이프사이클 타입\n * @returns 매핑된 훅 타입\n */\n getLifecycleHook(lifecycle) {\n const mapping = {\n \"config-changed\": \"onConfigChange\",\n \"user-identified\": \"onUserIdentify\",\n \"session-started\": \"onSessionStart\",\n \"session-ended\": \"onSessionEnd\"\n };\n return mapping[lifecycle];\n }\n};\n\n// src/services/StorageService.ts\nvar MemoryStorageAdapter = class {\n constructor(maxSize = 1e3) {\n this.store = /* @__PURE__ */ new Map();\n this.maxSize = maxSize;\n }\n async get(key) {\n const item = this.store.get(key);\n if (!item) return null;\n if (item.ttl && Date.now() > item.timestamp + item.ttl * 1e3) {\n this.store.delete(key);\n return null;\n }\n return item.value;\n }\n async set(key, value, ttl) {\n if (this.store.size >= this.maxSize && !this.store.has(key)) {\n const oldestKey = this.store.keys().next().value;\n if (oldestKey) {\n this.store.delete(oldestKey);\n }\n }\n this.store.set(key, {\n value,\n timestamp: Date.now(),\n ttl\n });\n }\n async remove(key) {\n return this.store.delete(key);\n }\n async clear() {\n this.store.clear();\n }\n async keys() {\n return Array.from(this.store.keys());\n }\n async size() {\n return this.store.size;\n }\n};\nvar LocalStorageAdapter = class {\n constructor(prefix = \"vircle_\") {\n this.prefix = prefix;\n if (typeof localStorage === \"undefined\") {\n throw new StorageError(\"localStorage is not available\", \"STORAGE_NOT_AVAILABLE\" /* STORAGE_NOT_AVAILABLE */);\n }\n }\n async get(key) {\n try {\n const item = localStorage.getItem(this.prefix + key);\n if (!item) return null;\n const parsed = JSON.parse(item);\n if (parsed.ttl && Date.now() > parsed.timestamp + parsed.ttl * 1e3) {\n await this.remove(key);\n return null;\n }\n return parsed.value;\n } catch (error) {\n throw new StorageError(`Failed to get item '${key}': ${error.message}`);\n }\n }\n async set(key, value, ttl) {\n try {\n const item = {\n value,\n timestamp: Date.now(),\n ttl\n };\n localStorage.setItem(this.prefix + key, JSON.stringify(item));\n } catch (error) {\n if (error.name === \"QuotaExceededError\") {\n throw new StorageError(\"Storage quota exceeded\", \"STORAGE_QUOTA_EXCEEDED\" /* STORAGE_QUOTA_EXCEEDED */);\n }\n throw new StorageError(`Failed to set item '${key}': ${error.message}`);\n }\n }\n async remove(key) {\n try {\n const fullKey = this.prefix + key;\n const existed = localStorage.getItem(fullKey) !== null;\n localStorage.removeItem(fullKey);\n return existed;\n } catch (error) {\n throw new StorageError(`Failed to remove item '${key}': ${error.message}`);\n }\n }\n async clear() {\n try {\n const keys = Object.keys(localStorage).filter((key) => key.startsWith(this.prefix));\n keys.forEach((key) => localStorage.removeItem(key));\n } catch (error) {\n throw new StorageError(`Failed to clear storage: ${error.message}`);\n }\n }\n async keys() {\n try {\n return Object.keys(localStorage).filter((key) => key.startsWith(this.prefix)).map((key) => key.substring(this.prefix.length));\n } catch (error) {\n throw new StorageError(`Failed to get keys: ${error.message}`);\n }\n }\n async size() {\n try {\n return Object.keys(localStorage).filter((key) => key.startsWith(this.prefix)).length;\n } catch (error) {\n throw new StorageError(`Failed to get size: ${error.message}`);\n }\n }\n};\nvar IndexedDBAdapter = class {\n constructor(dbName = \"vircle_db\") {\n this.dbVersion = 1;\n this.storeName = \"vircle_store\";\n this.db = null;\n this.dbName = dbName;\n if (typeof indexedDB === \"undefined\") {\n throw new StorageError(\"IndexedDB is not available\", \"STORAGE_NOT_AVAILABLE\" /* STORAGE_NOT_AVAILABLE */);\n }\n }\n async initDB() {\n if (this.db) return this.db;\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.dbVersion);\n request.onerror = () => {\n reject(new StorageError(\"Failed to open IndexedDB\", \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n this.db = request.result;\n resolve(this.db);\n };\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName, { keyPath: \"key\" });\n }\n };\n });\n }\n async get(key) {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const request = store.get(key);\n request.onerror = () => {\n reject(new StorageError(`Failed to get item '${key}'`, \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n const result = request.result;\n if (!result) {\n resolve(null);\n return;\n }\n const item = result.data;\n if (item.ttl && Date.now() > item.timestamp + item.ttl * 1e3) {\n this.remove(key);\n resolve(null);\n return;\n }\n resolve(item.value);\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to get item '${key}': ${error.message}`);\n }\n }\n async set(key, value, ttl) {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n const item = {\n value,\n timestamp: Date.now(),\n ttl\n };\n return new Promise((resolve, reject) => {\n const request = store.put({ key, data: item });\n request.onerror = () => {\n reject(new StorageError(`Failed to set item '${key}'`, \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n resolve();\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to set item '${key}': ${error.message}`);\n }\n }\n async remove(key) {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const getRequest = store.get(key);\n getRequest.onsuccess = () => {\n const existed = getRequest.result !== void 0;\n const deleteRequest = store.delete(key);\n deleteRequest.onerror = () => {\n reject(new StorageError(`Failed to remove item '${key}'`, \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n deleteRequest.onsuccess = () => {\n resolve(existed);\n };\n };\n getRequest.onerror = () => {\n reject(new StorageError(`Failed to check item '${key}'`, \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to remove item '${key}': ${error.message}`);\n }\n }\n async clear() {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const request = store.clear();\n request.onerror = () => {\n reject(new StorageError(\"Failed to clear storage\", \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n resolve();\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to clear storage: ${error.message}`);\n }\n }\n async keys() {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const request = store.getAllKeys();\n request.onerror = () => {\n reject(new StorageError(\"Failed to get keys\", \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to get keys: ${error.message}`);\n }\n }\n async size() {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const request = store.count();\n request.onerror = () => {\n reject(new StorageError(\"Failed to get size\", \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to get size: ${error.message}`);\n }\n }\n};\nvar StorageService = class {\n constructor(options = {}) {\n this.options = {\n type: \"memory\",\n maxSize: 10 * 1024 * 1024,\n // 10MB\n keyPrefix: \"vircle_\",\n ...options\n };\n this.adapter = options.adapter || this.createAdapter();\n }\n /**\n * 저장소에서 값 조회\n * @param key - 조회할 키\n * @returns 저장된 값 또는 null\n * @throws {StorageError} 조회 실패 시\n */\n async get(key) {\n try {\n return await this.adapter.get(key);\n } catch (error) {\n throw new StorageError(`Failed to get '${key}': ${error.message}`);\n }\n }\n /**\n * 저장소에 값 설정\n * @param key - 저장할 키\n * @param value - 저장할 값\n * @param ttl - TTL (초)\n * @throws {StorageError} 저장 실패 시\n */\n async set(key, value, ttl) {\n try {\n const finalTtl = ttl ?? this.options.ttl;\n await this.adapter.set(key, value, finalTtl);\n } catch (error) {\n throw new StorageError(`Failed to set '${key}': ${error.message}`);\n }\n }\n /**\n * 저장소에서 값 제거\n * @param key - 제거할 키\n * @returns 제거 성공 여부\n * @throws {StorageError} 제거 실패 시\n */\n async remove(key) {\n try {\n return await this.adapter.remove(key);\n } catch (error) {\n throw new StorageError(`Failed to remove '${key}': ${error.message}`);\n }\n }\n /**\n * 모든 값 초기화\n * @throws {StorageError} 초기화 실패 시\n */\n async clear() {\n try {\n await this.adapter.clear();\n } catch (error) {\n throw new StorageError(`Failed to clear storage: ${error.message}`);\n }\n }\n /**\n * 모든 키 조회\n * @returns 키 배열\n * @throws {StorageError} 조회 실패 시\n */\n async keys() {\n try {\n return await this.adapter.keys();\n } catch (error) {\n throw new StorageError(`Failed to get keys: ${error.message}`);\n }\n }\n /**\n * 저장소 크기 조회\n * @returns 저장된 항목 수\n * @throws {StorageError} 조회 실패 시\n */\n async size() {\n try {\n return await this.adapter.size();\n } catch (error) {\n throw new StorageError(`Failed to get size: ${error.message}`);\n }\n }\n /**\n * 키 존재 여부 확인\n * @param key - 확인할 키\n * @returns 키 존재 여부\n * @throws {StorageError} 확인 실패 시\n */\n async has(key) {\n try {\n const value = await this.adapter.get(key);\n return value !== null;\n } catch (error) {\n throw new StorageError(`Failed to check key '${key}': ${error.message}`);\n }\n }\n /**\n * 다중 값 조회\n * @param keys - 조회할 키 배열\n * @returns 키-값 매핑 객체\n */\n async getMultiple(keys) {\n const result = {};\n await Promise.all(\n keys.map(async (key) => {\n try {\n result[key] = await this.adapter.get(key);\n } catch (error) {\n result[key] = null;\n }\n })\n );\n return result;\n }\n /**\n * 다중 값 설정\n * @param items - 설정할 키-값 매핑\n * @param ttl - TTL (초)\n */\n async setMultiple(items, ttl) {\n await Promise.all(\n Object.entries(items).map(([key, value]) => this.adapter.set(key, value, ttl ?? this.options.ttl))\n );\n }\n /**\n * 타입에 따른 저장소 어댑터 생성\n * @returns 생성된 어댑터\n */\n createAdapter() {\n switch (this.options.type) {\n case \"localStorage\":\n return new LocalStorageAdapter(this.options.keyPrefix);\n case \"indexedDB\":\n return new IndexedDBAdapter(`${this.options.keyPrefix}db`);\n case \"memory\":\n default:\n return new MemoryStorageAdapter(this.options.maxSize || 1e3);\n }\n }\n /**\n * 저장소 사용 가능 테스트\n * @param type - 테스트할 저장소 타입\n * @returns 사용 가능 여부\n */\n static async testStorageAvailability(type) {\n try {\n switch (type) {\n case \"localStorage\":\n if (typeof localStorage === \"undefined\") return false;\n localStorage.setItem(\"vircle_test\", \"test\");\n localStorage.removeItem(\"vircle_test\");\n return true;\n case \"indexedDB\":\n if (typeof indexedDB === \"undefined\") return false;\n return true;\n case \"memory\":\n return true;\n default:\n return false;\n }\n } catch {\n return false;\n }\n }\n /**\n * 현재 환경에 따른 권장 저장소 타입 조회\n * @returns 권장 저장소 타입\n */\n static getRecommendedStorageType() {\n if (typeof window !== \"undefined\") {\n if (typeof indexedDB !== \"undefined\") return \"indexedDB\";\n if (typeof localStorage !== \"undefined\") return \"localStorage\";\n return \"memory\";\n }\n return \"memory\";\n }\n};\n\n// src/utils/SecurityUtils.ts\nfunction maskApiKey(apiKey) {\n if (!apiKey) return \"***\";\n const length = apiKey.length;\n if (length < 8) {\n return \"***\";\n }\n if (length <= 16) {\n return `${apiKey.substring(0, 2)}...${apiKey.substring(length - 2)}`;\n }\n return `${apiKey.substring(0, 4)}...${apiKey.substring(length - 4)}`;\n}\nfunction sanitizeConfig(config) {\n if (!config || typeof config !== \"object\") {\n return config;\n }\n const sanitized = { ...config };\n if (\"apiKey\" in sanitized) {\n sanitized.apiKey = maskApiKey(sanitized.apiKey);\n }\n if (sanitized.headers) {\n const headers = { ...sanitized.headers };\n Object.keys(headers).forEach((key) => {\n if (key.toLowerCase() === \"authorization\") {\n const value = headers[key];\n if (typeof value === \"string\") {\n if (value.startsWith(\"Bearer \")) {\n headers[key] = `Bearer ${maskApiKey(value.substring(7))}`;\n } else {\n headers[key] = maskApiKey(value);\n }\n }\n }\n });\n sanitized.headers = headers;\n }\n Object.keys(sanitized).forEach((key) => {\n if (typeof sanitized[key] === \"object\" && sanitized[key] !== null) {\n sanitized[key] = sanitizeConfig(sanitized[key]);\n }\n });\n return sanitized;\n}\nasync function createHmacSignature(payload, secret, cryptoAdapter) {\n if (cryptoAdapter && typeof cryptoAdapter.createHmacSignature === \"function\") {\n return cryptoAdapter.createHmacSignature(payload, secret);\n }\n if (typeof crypto !== \"undefined\" && crypto.subtle) {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(payload));\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n {\n name: \"HMAC\",\n hash: \"SHA-256\"\n },\n false,\n [\"sign\"]\n );\n const signature = await crypto.subtle.sign(\"HMAC\", key, data);\n return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n throw new Error(\"No crypto implementation available for HMAC signature\");\n}\nfunction validateApiKey(apiKey) {\n const warnings = [];\n if (!apiKey || typeof apiKey !== \"string\") {\n return {\n isValid: false,\n isTestKey: false,\n warnings: [\"API key is required\"]\n };\n }\n if (apiKey.length < 10) {\n warnings.push(\"API key appears to be too short\");\n }\n const testPatterns = [/^test/i, /^demo/i, /^sample/i, /^example/i];\n const isTestKey = testPatterns.some((pattern) => pattern.test(apiKey));\n if (isTestKey) {\n warnings.push(\"API key appears to be a test key\");\n }\n const invalidPatterns = [\n /^[0-9]+$/,\n // 숫자만\n /^[a-zA-Z]+$/,\n // 문자만\n /^(.)\\1+$/,\n // 반복 문자\n /password/i,\n /secret/i,\n /\\s/\n // 공백 포함\n ];\n const hasInvalidPattern = invalidPatterns.some((pattern) => pattern.test(apiKey));\n if (hasInvalidPattern) {\n warnings.push(\"API key format appears to be invalid\");\n }\n return {\n isValid: !hasInvalidPattern && apiKey.length >= 10,\n isTestKey,\n warnings\n };\n}\n\n// src/utils/PriorityQueue.ts\nvar PriorityQueue = class {\n constructor(maxSize) {\n this.items = [];\n this.maxSize = maxSize;\n }\n /**\n * 큐에 아이템 추가\n * @param data - 추가할 데이터\n * @param priority - 우선순위 (높을수록 우선)\n */\n enqueue(data, priority = 0) {\n const item = {\n data,\n priority,\n timestamp: Date.now()\n };\n const index = this.findInsertIndex(priority);\n this.items.splice(index, 0, item);\n if (this.maxSize && this.items.length > this.maxSize) {\n this.items.pop();\n }\n }\n /**\n * 최고 우선순위 아이템 제거 및 반환\n * @returns 최고 우선순위 아이템 또는 undefined\n */\n dequeue() {\n const item = this.items.shift();\n return item?.data;\n }\n /**\n * 특정 우선순위 이상의 아이템들 추출\n * @param minPriority - 최소 우선순위\n * @returns 추출된 아이템들\n */\n extractByPriority(minPriority) {\n const extracted = [];\n const remaining = [];\n for (const item of this.items) {\n if (item.priority >= minPriority) {\n extracted.push(item.data);\n } else {\n remaining.push(item);\n }\n }\n this.items = remaining;\n return extracted;\n }\n /**\n * 특정 개수만큼 아이템 추출\n * @param count - 추출할 개수\n * @returns 추출된 아이템들\n */\n extractBatch(count) {\n const extracted = [];\n for (let i = 0; i < count && this.items.length > 0; i++) {\n const item = this.items.shift();\n if (item) {\n extracted.push(item.data);\n }\n }\n return extracted;\n }\n /**\n * 특정 시간 이전의 아이템들 추출\n * @param maxAge - 최대 경과 시간 (밀리초)\n * @returns 추출된 아이템들\n */\n extractOldItems(maxAge) {\n const now = Date.now();\n const extracted = [];\n const remaining = [];\n for (const item of this.items) {\n if (now - item.timestamp > maxAge) {\n extracted.push(item.data);\n } else {\n remaining.push(item);\n }\n }\n this.items = remaining;\n return extracted;\n }\n /**\n * 큐의 첫 번째 아이템 확인 (제거하지 않음)\n * @returns 첫 번째 아이템 또는 undefined\n */\n peek() {\n return this.items[0]?.data;\n }\n /**\n * 큐 크기 반환\n * @returns 큐에 있는 아이템 개수\n */\n size() {\n return this.items.length;\n }\n /**\n * 큐가 비어있는지 확인\n * @returns 비어있으면 true\n */\n isEmpty() {\n return this.items.length === 0;\n }\n /**\n * 큐 비우기\n */\n clear() {\n this.items = [];\n }\n /**\n * 우선순위별 아이템 개수 통계\n * @returns 우선순위별 개수 맵\n */\n getStatsByPriority() {\n const stats = /* @__PURE__ */ new Map();\n for (const item of this.items) {\n const count = stats.get(item.priority) || 0;\n stats.set(item.priority, count + 1);\n }\n return stats;\n }\n /**\n * 이진 탐색으로 삽입 위치 찾기\n * @param priority - 우선순위\n * @returns 삽입 인덱스\n */\n findInsertIndex(priority) {\n let left = 0;\n let right = this.items.length;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (this.items[mid].priority >= priority) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n return left;\n }\n};\nvar DEFAULT_EVENT_PRIORITY = {\n // Critical events\n \"purchase\": 100 /* CRITICAL */,\n \"payment\": 100 /* CRITICAL */,\n \"error\": 100 /* CRITICAL */,\n \"crash\": 100 /* CRITICAL */,\n // High priority events\n \"identify\": 75 /* HIGH */,\n \"signup\": 75 /* HIGH */,\n \"login\": 75 /* HIGH */,\n \"logout\": 75 /* HIGH */,\n \"click\": 75 /* HIGH */,\n \"submit\": 75 /* HIGH */,\n // Normal events\n \"page_view\": 50 /* NORMAL */,\n \"screen_view\": 50 /* NORMAL */,\n \"scroll\": 50 /* NORMAL */,\n // Low priority events\n \"heartbeat\": 25 /* LOW */,\n \"session_extend\": 25 /* LOW */,\n // Background events\n \"background_sync\": 0 /* BACKGROUND */,\n \"cache_update\": 0 /* BACKGROUND */\n};\nfunction getEventPriority(eventName, customPriority) {\n const defaultPriority = DEFAULT_EVENT_PRIORITY[eventName.toLowerCase()];\n if (defaultPriority !== void 0) {\n return defaultPriority;\n }\n if (eventName.includes(\"error\") || eventName.includes(\"fail\")) {\n return 100 /* CRITICAL */;\n }\n if (eventName.includes(\"click\") || eventName.includes(\"tap\")) {\n return 75 /* HIGH */;\n }\n if (eventName.includes(\"view\") || eventName.includes(\"load\")) {\n return 50 /* NORMAL */;\n }\n return 50 /* NORMAL */;\n}\n\n// src/utils/CircuitBreaker.ts\nvar CircuitBreaker = class {\n constructor(options = {}) {\n this.state = \"CLOSED\" /* CLOSED */;\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = 0;\n this.halfOpenRetries = 0;\n this.requestVolume = [];\n this.options = {\n failureThreshold: 5,\n resetTimeout: 6e4,\n // 1분\n halfOpenRetries: 3,\n volumeThreshold: 10,\n errorThresholdPercentage: 50,\n onStateChange: () => {\n },\n ...options\n };\n }\n /**\n * 함수 실행을 Circuit Breaker로 보호\n * @param fn - 실행할 함수\n * @returns 함수 실행 결과\n * @throws Circuit이 Open 상태일 때 에러\n */\n async execute(fn) {\n if (this.isOpen()) {\n throw new Error(\n `Circuit breaker is OPEN. Next retry at ${new Date(this.getNextRetryTime()).toISOString()}`\n );\n }\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n /**\n * Circuit이 Open 상태인지 확인\n * @returns Open 상태 여부\n */\n isOpen() {\n if (this.state === \"OPEN\" /* OPEN */) {\n if (Date.now() >= this.getNextRetryTime()) {\n this.transitionTo(\"HALF_OPEN\" /* HALF_OPEN */);\n return false;\n }\n return true;\n }\n return false;\n }\n /**\n * 성공 처리\n */\n onSuccess() {\n this.recordRequest(true);\n this.successes++;\n switch (this.state) {\n case \"CLOSED\" /* CLOSED */:\n this.failures = 0;\n break;\n case \"HALF_OPEN\" /* HALF_OPEN */:\n if (this.successes >= this.options.halfOpenRetries) {\n this.transitionTo(\"CLOSED\" /* CLOSED */);\n }\n break;\n }\n }\n /**\n * 실패 처리\n */\n onFailure() {\n this.recordRequest(false);\n this.lastFailureTime = Date.now();\n switch (this.state) {\n case \"CLOSED\" /* CLOSED */:\n this.failures++;\n if (this.shouldOpen()) {\n this.transitionTo(\"OPEN\" /* OPEN */);\n }\n break;\n case \"HALF_OPEN\" /* HALF_OPEN */:\n this.transitionTo(\"OPEN\" /* OPEN */);\n break;\n }\n }\n /**\n * 상태 전환\n * @param newState - 새로운 상태\n */\n transitionTo(newState) {\n const oldState = this.state;\n this.state = newState;\n switch (newState) {\n case \"CLOSED\" /* CLOSED */:\n this.failures = 0;\n this.successes = 0;\n break;\n case \"OPEN\" /* OPEN */:\n this.halfOpenRetries = 0;\n break;\n case \"HALF_OPEN\" /* HALF_OPEN */:\n this.successes = 0;\n this.failures = 0;\n break;\n }\n if (oldState !== newState) {\n this.options.onStateChange(newState);\n }\n }\n /**\n * Circuit을 Open 상태로 전환해야 하는지 확인\n * @returns Open 전환 여부\n */\n shouldOpen() {\n if (this.failures >= this.options.failureThreshold) {\n return true;\n }\n const recentRequests = this.getRecentRequests();\n if (recentRequests.length >= this.options.volumeThreshold) {\n const errorRate = this.calculateErrorRate(recentRequests);\n return errorRate >= this.options.errorThresholdPercentage;\n }\n return false;\n }\n /**\n * 요청 기록\n * @param success - 성공 여부\n */\n recordRequest(success) {\n const now = Date.now();\n this.requestVolume.push({ timestamp: now, success });\n const cutoff = now - 5 * 60 * 1e3;\n this.requestVolume = this.requestVolume.filter((req) => req.timestamp > cutoff);\n }\n /**\n * 최근 요청 조회\n * @returns 최근 1분간의 요청들\n */\n getRecentRequests() {\n const cutoff = Date.now() - 60 * 1e3;\n return this.requestVolume.filter((req) => req.timestamp > cutoff);\n }\n /**\n * 에러율 계산\n * @param requests - 요청 배열\n * @returns 에러율 (%)\n */\n calculateErrorRate(requests) {\n if (requests.length === 0) return 0;\n const failures = requests.filter((req) => !req.success).length;\n return failures / requests.length * 100;\n }\n /**\n * 다음 재시도 시간 계산\n * @returns 다음 재시도 시간 (timestamp)\n */\n getNextRetryTime() {\n return this.lastFailureTime + this.options.resetTimeout;\n }\n /**\n * Circuit 상태 조회\n * @returns Circuit 통계\n */\n getStats() {\n const recentRequests = this.getRecentRequests();\n const errorRate = this.calculateErrorRate(recentRequests);\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime || void 0,\n nextRetryTime: this.state === \"OPEN\" /* OPEN */ ? this.getNextRetryTime() : void 0,\n errorRate\n };\n }\n /**\n * Circuit 수동 리셋\n */\n reset() {\n this.transitionTo(\"CLOSED\" /* CLOSED */);\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = 0;\n this.halfOpenRetries = 0;\n this.requestVolume = [];\n }\n /**\n * Circuit 수동 Open\n */\n trip() {\n this.transitionTo(\"OPEN\" /* OPEN */);\n this.lastFailureTime = Date.now();\n }\n};\nfunction calculateBackoffDelay(attempt, baseDelay = 1e3, maxDelay = 3e4) {\n const delay = Math.min(baseDelay * Math.pow(2, attempt - 1), maxDelay);\n const jitter = delay * 0.2 * (Math.random() * 2 - 1);\n return Math.round(delay + jitter);\n}\n\n// src/utils/EncryptionUtils.ts\nvar nodeCrypto;\nif (typeof window === \"undefined\" && typeof global !== \"undefined\") {\n try {\n nodeCrypto = __require(\"crypto\");\n } catch (e) {\n }\n}\nvar EncryptionUtils = class {\n // 128 bits\n /**\n * 안전한 Base64 인코딩\n * 큰 데이터에서 스택 오버플로우 방지를 위한 청크 단위 처리\n * @param buffer - 인코딩할 버퍼\n * @returns Base64 문자열\n */\n static safeBase64Encode(buffer) {\n if (typeof Buffer !== \"undefined\") {\n const buf = buffer instanceof ArrayBuffer ? Buffer.from(buffer) : Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n return buf.toString(\"base64\");\n } else {\n const uint8Array = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n const chunks = [];\n const chunkSize = 32768;\n for (let i = 0; i < uint8Array.length; i += chunkSize) {\n const chunk = uint8Array.subarray(i, i + chunkSize);\n chunks.push(String.fromCharCode.apply(null, Array.from(chunk)));\n }\n return btoa(chunks.join(\"\"));\n }\n }\n /**\n * 안전한 Base64 디코딩\n * @param base64 - 디코딩할 Base64 문자열\n * @returns 디코딩된 버퍼\n */\n static safeBase64Decode(base64) {\n if (typeof Buffer !== \"undefined\") {\n return new Uint8Array(Buffer.from(base64, \"base64\"));\n } else {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n }\n }\n /**\n * 텍스트를 암호화\n * @param text - 암호화할 텍스트\n * @param key - Base64 인코딩된 암호화 키\n * @returns 암호화된 데이터 (Base64)\n */\n static async encrypt(text, key) {\n try {\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n return this.encryptWebCrypto(text, key);\n }\n if (typeof global !== \"undefined\" && global.crypto) {\n return this.encryptNodeCrypto(text, key);\n }\n throw new Error(\"No crypto implementation available\");\n } catch (error) {\n throw new VircleError(\"ENCRYPTION_ERROR\" /* ENCRYPTION_ERROR */, \"Failed to encrypt data\", { cause: error });\n }\n }\n /**\n * Web Crypto API를 사용한 암호화\n */\n static async encryptWebCrypto(text, keyBase64) {\n const encoder = new TextEncoder();\n const data = encoder.encode(text);\n const keyData = this.safeBase64Decode(keyBase64);\n const cryptoKey = await crypto.subtle.importKey(\n \"raw\",\n keyData.buffer.slice(keyData.byteOffset, keyData.byteOffset + keyData.byteLength),\n { name: this.ALGORITHM, length: this.KEY_LENGTH },\n false,\n [\"encrypt\"]\n );\n const iv = crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));\n const encrypted = await crypto.subtle.encrypt({ name: this.ALGORITHM, iv }, cryptoKey, data);\n const result = new Uint8Array(iv.length + encrypted.byteLength);\n result.set(iv, 0);\n result.set(new Uint8Array(encrypted), iv.length);\n return this.safeBase64Encode(result);\n }\n /**\n * Node.js crypto를 사용한 암호화\n */\n static async encryptNodeCrypto(text, keyBase64) {\n const crypto2 = nodeCrypto;\n const key = Buffer.from(keyBase64, \"base64\");\n const iv = crypto2.randomBytes(this.IV_LENGTH);\n const cipher = crypto2.createCipheriv(\"aes-256-gcm\", key, iv);\n let encrypted = cipher.update(text, \"utf8\");\n encrypted = Buffer.concat([encrypted, cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([iv, encrypted, tag]).toString(\"base64\");\n }\n /**\n * AES 키 생성\n * @returns 생성된 AES 키\n */\n static async generateAESKey() {\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n return crypto.subtle.generateKey({ name: this.ALGORITHM, length: this.KEY_LENGTH }, true, [\n \"encrypt\",\n \"decrypt\"\n ]);\n } else if (nodeCrypto) {\n return nodeCrypto.randomBytes(32);\n } else {\n throw new Error(\"No crypto implementation available\");\n }\n }\n /**\n * RSA 공개키로 AES 키 암호화\n * @param aesKey - AES 키\n * @param publicKeyBase64 - Base64 인코딩된 RSA 공개키\n * @returns Base64 인코딩된 암호화된 AES 키\n */\n static async encryptAESKey(aesKey, publicKeyBase64) {\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n const publicKeyData = this.safeBase64Decode(publicKeyBase64);\n const publicKey = await crypto.subtle.importKey(\n \"spki\",\n publicKeyData.buffer.slice(\n publicKeyData.byteOffset,\n publicKeyData.byteOffset + publicKeyData.byteLength\n ),\n { name: \"RSA-OAEP\", hash: \"SHA-256\" },\n false,\n [\"encrypt\"]\n );\n const exportedKey = await crypto.subtle.exportKey(\"raw\", aesKey);\n const encryptedKey = await crypto.subtle.encrypt({ name: \"RSA-OAEP\" }, publicKey, exportedKey);\n return this.safeBase64Encode(new Uint8Array(encryptedKey));\n } else if (nodeCrypto) {\n const publicKey = nodeCrypto.createPublicKey({\n key: Buffer.from(publicKeyBase64, \"base64\"),\n format: \"der\",\n type: \"spki\"\n });\n const encryptedKey = nodeCrypto.publicEncrypt(\n {\n key: publicKey,\n oaepHash: \"sha256\",\n padding: nodeCrypto.constants.RSA_PKCS1_OAEP_PADDING\n },\n aesKey\n );\n return encryptedKey.toString(\"base64\");\n } else {\n throw new Error(\"No crypto implementation available\");\n }\n }\n /**\n * 전체 페이로드를 하이브리드 암호화\n * @param data - 암호화할 데이터\n * @param publicKeyBase64 - Base64 인코딩된 RSA 공개키\n * @returns 암호화된 페이로드\n */\n static async encryptPayload(data, publicKeyBase64) {\n try {\n const jsonStr = JSON.stringify(data);\n const aesKey = await this.generateAESKey();\n let encryptedData;\n let iv;\n let authTag;\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(jsonStr);\n const ivBuffer = crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));\n const encryptedBuffer = await crypto.subtle.encrypt(\n { name: this.ALGORITHM, iv: ivBuffer },\n aesKey,\n dataBuffer\n );\n const tagLengthBytes = 16;\n const dataLength = encryptedBuffer.byteLength - tagLengthBytes;\n const encryptedDataBuffer = encryptedBuffer.slice(0, dataLength);\n const authTagBuffer = encryptedBuffer.slice(dataLength);\n encryptedData = this.safeBase64Encode(new Uint8Array(encryptedDataBuffer));\n authTag = this.safeBase64Encode(new Uint8Array(authTagBuffer));\n iv = this.safeBase64Encode(ivBuffer);\n } else if (nodeCrypto) {\n const ivBuffer = nodeCrypto.randomBytes(this.IV_LENGTH);\n const cipher = nodeCrypto.createCipheriv(\"aes-256-gcm\", aesKey, ivBuffer);\n let encrypted = cipher.update(jsonStr, \"utf8\");\n encrypted = Buffer.concat([encrypted, cipher.final()]);\n authTag = cipher.getAuthTag();\n encryptedData = Buffer.concat([encrypted, authTag]).toString(\"base64\");\n iv = ivBuffer.toString(\"base64\");\n } else {\n throw new Error(\"No crypto implementation available\");\n }\n const encryptedKey = await this.encryptAESKey(aesKey, publicKeyBase64);\n return {\n data: encryptedData,\n key: encryptedKey,\n iv,\n authTag,\n metadata: {\n algorithm: this.ALGORITHM,\n keyAlgorithm: \"RSA-OAEP\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n }\n };\n } catch (error) {\n throw new VircleError(\"ENCRYPTION_ERROR\" /* ENCRYPTION_ERROR */, \"Failed to encrypt payload\", { cause: error });\n }\n }\n};\n// 하이브리드 암호화 구현 - AES-256-GCM으로 페이로드 암호화, RSA-OAEP로 AES 키 암호화\nEncryptionUtils.ALGORITHM = \"AES-GCM\";\nEncryptionUtils.KEY_LENGTH = 256;\nEncryptionUtils.IV_LENGTH = 12;\n// 96 bits (recommended for AES-GCM) - NIST 권장 사항\nEncryptionUtils.TAG_LENGTH = 16;\n\n// src/constants/index.ts\nvar STORAGE_KEYS = {\n USER: \"vircle_user\",\n SESSION: \"vircle_session\",\n EVENTS_QUEUE: \"vircle_events_queue\"\n};\nvar CACHE_TIMES = {\n DEFAULT_CONTEXT: 6e4,\n // 1분\n WEB_CONTEXT: 3e5,\n // 5분\n RN_CONTEXT: 3e4\n // 30초\n};\nvar getEnvVar = (key, defaultValue) => {\n if (typeof process !== \"undefined\" && process.env && typeof process.env === \"object\") {\n return process.env[key] || defaultValue;\n }\n return defaultValue;\n};\nvar ENCRYPTION_CONFIG = {\n // 폴백용 RSA 공개키 - 환경 변수로만 설정 가능\n // 보안상 소스 코드에 하드코딩하지 않음\n // RemoteConfigService를 통해 프로젝트별 키를 가져오는 것이 권장됨\n // 환경 변수 VIRCLE_RSA_PUBLIC_KEY와 VIRCLE_ALLOW_FALLBACK_KEY를 함께 설정해야 함\n PUBLIC_KEY: getEnvVar(\"VIRCLE_RSA_PUBLIC_KEY\", \"\")\n};\nvar API_ENDPOINTS = {\n development: \"https://dev-integration.vircle.co.kr/v1/track/events\",\n production: \"https://integration.vircle.co.kr/v1/track/events\"\n};\nvar CDN_ENDPOINTS = {\n development: \"https://dstatic.vircle.co.kr/sdk/v1/config\",\n production: \"https://static.vircle.co.kr/sdk/v1/config\"\n};\n\n// src/services/TransportService.ts\nvar TransportService = class {\n constructor(config, options = {}) {\n this.eventQueue = new PriorityQueue();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n this.isFlushingQueue = false;\n this.disposed = false;\n this.config = config;\n this.options = {\n timeout: 3e4,\n // 30 seconds\n retryAttempts: 3,\n retryDelay: 1e3,\n // 1 second\n batchSize: 50,\n enableBatching: true,\n enableCompression: false,\n ...options\n };\n this.cryptoAdapter = options.cryptoAdapter;\n this.circuitBreaker = new CircuitBreaker({\n failureThreshold: 5,\n resetTimeout: 6e4,\n // 1분\n errorThresholdPercentage: 50,\n onStateChange: (state) => {\n if (this.config.debug) {\n console.warn(`[TransportService] Circuit breaker state changed to: ${state}`);\n }\n }\n });\n this.setupAutoFlush();\n }\n /**\n * 자동 플러시 설정\n */\n setupAutoFlush() {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n this.flushTimer = setInterval(async () => {\n try {\n await this.flushPriorityQueue();\n } catch (error) {\n if (this.config.debug) {\n console.error(\"[TransportService] Auto-flush error:\", error);\n }\n }\n }, this.config.batch?.flushInterval || 1e4);\n }\n /**\n * 단일 이벤트 전송\n * @param event - 전송할 이벤트\n * @returns 전송 결과\n */\n async send(event) {\n if (this.disposed) {\n throw new VircleError(\"SERVICE_DISPOSED\" /* SERVICE_DISPOSED */, \"TransportService has been disposed\");\n }\n if (this.config.debug) {\n console.log(\"[TransportService] Received event:\", event.name);\n }\n const priority = getEventPriority(event.name);\n this.eventQueue.enqueue(event, priority);\n if (this.config.debug) {\n console.log(\n \"[TransportService] Event enqueued with priority:\",\n priority,\n \"Queue size:\",\n this.eventQueue.size()\n );\n }\n if (priority >= 100 /* CRITICAL */) {\n const result = await this.flushPriorityQueue();\n return result.results[0] || { success: true };\n }\n if (this.eventQueue.size() >= (this.options.batchSize || 50)) {\n const result = await this.flushPriorityQueue();\n return result.results[0] || { success: true };\n }\n if (this.config.debug || this.config.environment === \"development\") {\n if (this.config.debug) {\n console.log(\"[TransportService] Debug mode: flushing immediately\");\n }\n const result = await this.flushPriorityQueue();\n return result.results[0] || { success: true };\n }\n this.scheduleNextTickFlush();\n return { success: true };\n }\n /**\n * 다음 이벤트 루프 틱에 flush 스케줄.\n * 이미 스케줄된 flush가 있으면 중복 스케줄하지 않아 같은 틱의 이벤트를 배치로 묶는다.\n */\n scheduleNextTickFlush() {\n if (this.pendingFlushTimer) return;\n this.pendingFlushTimer = setTimeout(() => {\n this.pendingFlushTimer = void 0;\n this.flushPriorityQueue().catch(() => {\n });\n }, 0);\n }\n /**\n * 이벤트 배치 전송\n * @param events - 전송할 이벤트 배열\n * @returns 배치 전송 결과\n */\n async sendBatch(events) {\n if (this.disposed) {\n throw new VircleError(\"SERVICE_DISPOSED\" /* SERVICE_DISPOSED */, \"TransportService has been disposed\");\n }\n if (events.length === 0) {\n return {\n totalEvents: 0,\n successfulEvents: 0,\n failedEvents: 0,\n results: []\n };\n }\n for (const event of events) {\n const priority = getEventPriority(event.name);\n this.eventQueue.enqueue(event, priority);\n }\n return this.flushPriorityQueue();\n }\n /**\n * 우선순위 큐 플러시\n * @returns 전송 결과\n */\n async flushPriorityQueue() {\n if (this.isFlushingQueue) {\n if (this.config.debug) {\n console.log(\"[TransportService] Already flushing queue, skipping...\");\n }\n return {\n totalEvents: 0,\n successfulEvents: 0,\n failedEvents: 0,\n results: []\n };\n }\n if (this.eventQueue.isEmpty()) {\n return {\n totalEvents: 0,\n successfulEvents: 0,\n failedEvents: 0,\n results: []\n };\n }\n this.isFlushingQueue = true;\n try {\n const criticalEvents = this.eventQueue.extractByPriority(100 /* CRITICAL */);\n const highPriorityEvents = this.eventQueue.extractByPriority(75 /* HIGH */);\n const normalEvents = this.eventQueue.extractBatch(this.options.batchSize || 50);\n const results = [];\n let successfulEvents = 0;\n let failedEvents = 0;\n if (criticalEvents.length > 0) {\n const criticalResult = await this.executeBatchRequest(criticalEvents);\n results.push(...criticalResult.results);\n successfulEvents += criticalResult.successfulEvents;\n failedEvents += criticalResult.failedEvents;\n }\n if (highPriorityEvents.length > 0) {\n const highResult = await this.executeBatchRequest(highPriorityEvents);\n results.push(...highResult.results);\n successfulEvents += highResult.successfulEvents;\n failedEvents += highResult.failedEvents;\n }\n if (normalEvents.length > 0) {\n const normalResult = await this.executeBatchRequest(normalEvents);\n results.push(...normalResult.results);\n successfulEvents += normalResult.successfulEvents;\n failedEvents += normalResult.failedEvents;\n }\n return {\n totalEvents: results.length,\n successfulEvents,\n failedEvents,\n results\n };\n } finally {\n this.isFlushingQueue = false;\n }\n }\n /**\n * 요청 큐 처리\n */\n async processQueue() {\n if (this.isProcessingQueue || this.requestQueue.length === 0) {\n return;\n }\n this.isProcessingQueue = true;\n try {\n while (this.requestQueue.length > 0) {\n const batch = [];\n const batchEvents = [];\n let currentSize = 0;\n while (this.requestQueue.length > 0 && currentSize < this.options.batchSize) {\n const request = this.requestQueue.shift();\n const remainingCapacity = this.options.batchSize - currentSize;\n if (request.events.length <= remainingCapacity) {\n batch.push(request);\n batchEvents.push(...request.events);\n currentSize += request.events.length;\n } else {\n const partialEvents = request.events.slice(0, remainingCapacity);\n const remainingEvents = request.events.slice(remainingCapacity);\n batch.push({\n events: partialEvents,\n resolve: request.resolve,\n reject: request.reject\n });\n batchEvents.push(...partialEvents);\n currentSize += partialEvents.length;\n this.requestQueue.unshift({\n events: remainingEvents,\n resolve: request.resolve,\n reject: request.reject\n });\n break;\n }\n }\n try {\n const result = await this.executeBatchRequest(batchEvents);\n let eventIndex = 0;\n for (const request of batch) {\n const requestResults = result.results.slice(eventIndex, eventIndex + request.events.length);\n const requestResult = {\n totalEvents: request.events.length,\n successfulEvents: requestResults.filter((r) => r.success).length,\n failedEvents: requestResults.filter((r) => !r.success).length,\n results: requestResults\n };\n request.resolve(requestResult);\n eventIndex += request.events.length;\n }\n } catch (error) {\n for (const request of batch) {\n request.reject(error);\n }\n }\n }\n } finally {\n this.isProcessingQueue = false;\n }\n }\n /**\n * 지수 백오프 재시도로 배치 요청 실행\n * @param events - 전송할 이벤트 배열\n * @returns 배치 전송 결과\n * Enhanced retry logic with exponential backoff and jitter\n */\n async executeBatchRequest(events) {\n let lastError = null;\n if (this.config.debug) {\n console.log(`[Vircle SDK] executeBatchRequest start - events :`, events);\n }\n try {\n return await this.circuitBreaker.execute(async () => {\n for (let attempt = 0; attempt <= this.options.retryAttempts; attempt++) {\n try {\n const result = await this.makeHttpRequest(events);\n if (result.success) {\n return {\n totalEvents: events.length,\n successfulEvents: events.length,\n failedEvents: 0,\n results: events.map(() => result)\n };\n } else if (!result.retryable) {\n return {\n totalEvents: events.length,\n successfulEvents: 0,\n failedEvents: events.length,\n results: events.map(() => result)\n };\n }\n lastError = result.error || new Error(\"Unknown error\");\n } catch (error) {\n lastError = error;\n if (this.config.debug) {\n console.log(`[Vircle SDK] error : ${JSON.stringify(lastError)}`);\n }\n }\n if (attempt < this.options.retryAttempts) {\n const delay = calculateBackoffDelay(attempt + 1, this.options.retryDelay);\n if (this.config.debug) {\n console.log(\n `[Vircle SDK] Retry attempt ${attempt + 1}/${this.options.retryAttempts} after ${delay}ms delay`\n );\n }\n await this.delay(delay);\n }\n }\n const failureResult = {\n success: false,\n error: lastError || new Error(\"Max retry attempts exceeded\"),\n retryable: false\n };\n return {\n totalEvents: events.length,\n successfulEvents: 0,\n failedEvents: events.length,\n results: events.map(() => failureResult)\n };\n });\n } catch (error) {\n const circuitError = error;\n const failureResult = {\n success: false,\n error: circuitError,\n retryable: false\n };\n return {\n totalEvents: events.length,\n successfulEvents: 0,\n failedEvents: events.length,\n results: events.map(() => failureResult)\n };\n }\n }\n /**\n * HTTP 요청 실행\n * @param events - 전송할 이벤트 배열\n * @returns 전송 결과\n */\n async makeHttpRequest(events) {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] config:\", this.config);\n }\n const environment = this.config.environment || \"production\";\n const url = API_ENDPOINTS[environment];\n const timestamp = (/* @__PURE__ */ new Date()).toISOString();\n let payload = {\n payload: {\n events\n },\n timestamp\n };\n const headers = {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Vircle-SDK-TypeScript/1.0.0\",\n ...this.config.headers,\n ...this.options.headers\n };\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n headers[\"X-Vircle-Timestamp\"] = timestamp;\n }\n if (this.encryptionConfig?.enabled && this.encryptionConfig.publicKey) {\n try {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] start encryption - config: \", this.encryptionConfig);\n }\n let encryptedPayload;\n if (this.cryptoAdapter && typeof this.cryptoAdapter.encryptPayload === \"function\") {\n if (this.config.debug) {\n console.log(\n \"[makeHttpRequest] Using platform-specific crypto adapter:\",\n this.cryptoAdapter.constructor.name\n );\n console.log(\n \"[makeHttpRequest] Payload to encrypt:\",\n JSON.stringify(payload.payload).substring(0, 100) + \"...\"\n );\n console.log(\"[makeHttpRequest] Public key available:\", !!this.encryptionConfig.publicKey);\n console.log(\"[makeHttpRequest] Public key length:\", this.encryptionConfig.publicKey.length);\n }\n encryptedPayload = await this.cryptoAdapter.encryptPayload(\n payload.payload,\n this.encryptionConfig.publicKey\n );\n } else {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] Fall back to built-in EncryptionUtils\");\n }\n encryptedPayload = await EncryptionUtils.encryptPayload(\n payload.payload,\n this.encryptionConfig.publicKey\n );\n }\n payload = {\n encrypted: true,\n payload: encryptedPayload,\n timestamp\n };\n const signature = await createHmacSignature(payload, this.config.apiKey, this.cryptoAdapter);\n if (this.config.debug) {\n console.debug(\"[makeHttpRequest] signature:\", signature);\n }\n headers[\"X-Vircle-Signature\"] = signature;\n headers[\"X-Vircle-Encrypted\"] = \"true\";\n if (this.config.debug) {\n console.debug(\"[makeHttpRequest] headers:\", headers);\n }\n } catch (error) {\n const encryptionError = new NetworkError(\n \"Failed to encrypt payload. Aborting transmission for security.\",\n void 0,\n { cause: error }\n );\n if (this.config.debug) {\n console.error(\"[makeHttpRequest] Encryption failed:\", error);\n console.error(\"[makeHttpRequest] Error type:\", typeof error);\n console.error(\n \"[makeHttpRequest] Error name:\",\n error instanceof Error ? error.name : \"Not an Error instance\"\n );\n console.error(\n \"[makeHttpRequest] Error message:\",\n error instanceof Error ? error.message : String(error)\n );\n console.error(\n \"[makeHttpRequest] Error stack:\",\n error instanceof Error ? error.stack : \"No stack trace\"\n );\n console.error(\n \"[makeHttpRequest] Crypto adapter type:\",\n this.cryptoAdapter ? this.cryptoAdapter.constructor.name : \"No adapter\"\n );\n console.error(\n \"[makeHttpRequest] Public key preview:\",\n this.encryptionConfig.publicKey.substring(0, 50) + \"...\"\n );\n }\n return {\n success: false,\n error: encryptionError,\n retryable: false\n };\n }\n }\n let promiseResolved = false;\n let warningTimeout;\n let abortController;\n let abortTimeout;\n try {\n let signal;\n if (typeof AbortController !== \"undefined\") {\n abortController = new AbortController();\n signal = abortController.signal;\n abortTimeout = setTimeout(() => {\n abortController?.abort();\n }, this.options.timeout);\n }\n let requestBody;\n try {\n requestBody = JSON.stringify(payload);\n } catch (error) {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] Failed to stringify payload:\", error);\n }\n return {\n success: false,\n error: new NetworkError(\"Failed to serialize request payload\", void 0, {\n cause: error,\n context: {\n errorName: error instanceof Error ? error.name : \"Unknown\",\n isSerializationError: true\n }\n }),\n retryable: false\n // 직렬화 오류는 재시도해도 동일\n };\n }\n const request = {\n method: \"POST\",\n headers,\n body: requestBody,\n signal\n };\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] fetch - url:\", url);\n console.log(\"[makeHttpRequest] fetch - request:\", request);\n console.log(\"[makeHttpRequest] fetch - starting request...\");\n }\n warningTimeout = setTimeout(() => {\n if (!promiseResolved && this.config.debug) {\n console.log(\"[makeHttpRequest] fetch - Promise still pending after 10 seconds\");\n console.log(\n \"[makeHttpRequest] fetch - Possible causes: ATS policy, network proxy, or fetch polyfill issue\"\n );\n }\n }, 1e4);\n const response = await this.fetch(url, request);\n promiseResolved = true;\n if (warningTimeout) clearTimeout(warningTimeout);\n if (abortTimeout) clearTimeout(abortTimeout);\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] fetch - response received\");\n console.log(\"[makeHttpRequest] fetch - response status:\", response.status);\n console.log(\"[makeHttpRequest] fetch - response ok:\", response.ok);\n }\n let responseBody;\n try {\n const textPromise = response.text();\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error(\"Response body read timeout\")), 5e3);\n });\n responseBody = await Promise.race([textPromise, timeoutPromise]);\n } catch (error) {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] Failed to read response body:\", error);\n }\n return {\n success: response.ok,\n statusCode: response.status,\n responseBody: null,\n retryable: this.isRetryableHttpStatus(response.status)\n };\n }\n let parsedBody = null;\n try {\n parsedBody = JSON.parse(responseBody);\n } catch {\n }\n if (response.ok) {\n return {\n success: true,\n statusCode: response.status,\n responseBody: parsedBody\n };\n } else {\n const error = new NetworkError(\n parsedBody?.message || `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n { context: { responseBody } }\n );\n return {\n success: false,\n statusCode: response.status,\n responseBody: parsedBody,\n error,\n retryable: this.isRetryableHttpStatus(response.status)\n };\n }\n } catch (error) {\n promiseResolved = true;\n if (warningTimeout) clearTimeout(warningTimeout);\n if (abortTimeout) clearTimeout(abortTimeout);\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] Request failed:\", error);\n console.log(\"[makeHttpRequest] Error type:\", typeof error);\n console.log(\"[makeHttpRequest] Error name:\", error instanceof Error ? error.name : \"Unknown\");\n console.log(\"[makeHttpRequest] Error message:\", error instanceof Error ? error.message : String(error));\n console.log(\"[makeHttpRequest] Error stack:\", error instanceof Error ? error.stack : \"No stack\");\n }\n const errorMessage = error instanceof Error ? error.message : String(error);\n const isAbortError = error instanceof Error && error.name === \"AbortError\";\n const isTypeError = error instanceof Error && error.name === \"TypeError\";\n const isNetworkError = errorMessage.includes(\"Network request failed\") || errorMessage.includes(\"Failed to fetch\") || errorMessage.includes(\"Load failed\");\n const networkError = new NetworkError(\n isAbortError ? `Request timeout after ${this.options.timeout}ms` : `Network request failed: ${errorMessage}`,\n void 0,\n {\n cause: error,\n context: {\n errorName: error instanceof Error ? error.name : \"Unknown\",\n isAbortError,\n isTypeError,\n isNetworkError,\n timeout: this.options.timeout,\n url,\n environment: typeof window !== \"undefined\" ? \"browser\" : typeof global !== \"undefined\" ? \"node/react-native\" : \"unknown\"\n }\n }\n );\n return {\n success: false,\n error: networkError,\n retryable: !isAbortError && this.isRetryableError(error)\n };\n }\n }\n /**\n * fetch 구현 획듍\n * 브라우저/Node.js 환경 지원\n * @param url - 요청 URL\n * @param options - 요청 옵션\n * @returns Response 객체\n * @throws {NetworkError} fetch 구현 없을 시\n */\n async fetch(url, options) {\n if (typeof fetch !== \"undefined\") {\n if (this.config.debug) {\n console.log(\"[fetch] Using global fetch implementation\");\n }\n return fetch(url, options);\n }\n if (typeof window !== \"undefined\" && window.fetch) {\n if (this.config.debug) {\n console.log(\"[fetch] Using window.fetch implementation\");\n }\n return window.fetch(url, options);\n }\n if (typeof global !== \"undefined\") {\n try {\n const fetchModule = await import(\n /* webpackIgnore: true */\n 'node-fetch'\n );\n const nodeFetch = fetchModule.default || fetchModule;\n if (this.config.debug) {\n console.log(\"[fetch] Using node-fetch implementation\");\n }\n return nodeFetch(url, options);\n } catch {\n }\n }\n throw new NetworkError(\"No fetch implementation available\", void 0, {\n context: {\n environment: typeof window !== \"undefined\" ? \"browser\" : \"node\",\n hasFetch: typeof fetch !== \"undefined\",\n hasWindowFetch: typeof window !== \"undefined\" && typeof window.fetch !== \"undefined\"\n }\n });\n }\n /**\n * HTTP 상태 코드 재시도 가능 확인\n * @param status - HTTP 상태 코드\n * @returns 재시도 가능 여부\n */\n isRetryableHttpStatus(status) {\n return status >= 500 || status === 408 || status === 429;\n }\n /**\n * 에러 재시도 가능 확인\n * @param error - 확인할 에러\n * @returns 재시도 가능 여부\n */\n isRetryableError(error) {\n const retryableMessages = [\"timeout\", \"network\", \"connection\", \"econnreset\", \"enotfound\", \"econnrefused\"];\n const message = error.message.toLowerCase();\n return retryableMessages.some((keyword) => message.includes(keyword));\n }\n /**\n * 딜레이 유틸리티\n * @param ms - 대기 시간 (밀리초)\n * @returns Promise<void>\n */\n delay(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n /**\n * sendBeacon을 사용하여 이벤트 전송 (페이지 언로드 시 사용)\n * 커스텀 헤더를 설정할 수 없으므로 apiKey를 body에 포함\n * 암호화는 비동기 API가 필요하므로 스킵\n * @param events - 전송할 이벤트 배열\n * @returns 전송 성공 여부\n */\n sendViaBeacon(events) {\n if (typeof navigator === \"undefined\" || typeof navigator.sendBeacon !== \"function\") {\n return false;\n }\n if (events.length === 0) {\n return true;\n }\n const environment = this.config.environment || \"production\";\n const url = API_ENDPOINTS[environment];\n const timestamp = (/* @__PURE__ */ new Date()).toISOString();\n const payload = {\n payload: { events },\n timestamp,\n apiKey: this.config.apiKey,\n beacon: true\n };\n try {\n const blob = new Blob([JSON.stringify(payload)], {\n type: \"application/json\"\n });\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n }\n /**\n * sendBeacon으로 큐의 대기 이벤트를 전송하고 큐를 비움\n * @returns 전송 성공 여부\n */\n flushViaBeacon() {\n const events = this.eventQueue.extractBatch(this.eventQueue.size());\n if (events.length === 0) {\n return true;\n }\n return this.sendViaBeacon(events);\n }\n /**\n * 큐 상태 조회\n * @returns 큐 크기와 처리 상태\n */\n getQueueStatus() {\n return {\n queueSize: this.requestQueue.length,\n isProcessing: this.isProcessingQueue\n };\n }\n /**\n * 큐 즉시 전송\n */\n async flush() {\n await this.flushPriorityQueue();\n if (this.requestQueue.length > 0) {\n await this.processQueue();\n }\n }\n /**\n * 큐 초기화\n */\n clearQueue() {\n this.eventQueue.clear();\n const clearError = new VircleError(\"CLEANUP_ERROR\" /* CLEANUP_ERROR */, \"Transport queue cleared during shutdown\");\n for (const request of this.requestQueue) {\n request.reject(clearError);\n }\n this.requestQueue = [];\n }\n /**\n * 설정 업데이트\n * @param config - 업데이트할 설정\n */\n updateConfig(config) {\n this.config = { ...this.config, ...config };\n }\n /**\n * 암호화 설정\n * @param encryptionConfig - 암호화 설정\n */\n setEncryptionConfig(encryptionConfig) {\n this.encryptionConfig = encryptionConfig;\n }\n /**\n * 전송 옵션 업데이트\n * @param options - 업데이트할 옵션\n */\n updateOptions(options) {\n this.options = { ...this.options, ...options };\n }\n /**\n * 서비스 리소스 정리\n * 메모리 누수 방지를 위한 정리 메서드\n */\n dispose() {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = void 0;\n }\n if (this.pendingFlushTimer) {\n clearTimeout(this.pendingFlushTimer);\n this.pendingFlushTimer = void 0;\n }\n this.clearQueue();\n this.circuitBreaker.reset();\n this.config = {};\n this.options = {};\n }\n /**\n * 서비스 폐기 상태 확인\n * @returns 폐기 여부\n */\n isDisposed() {\n return this.disposed;\n }\n};\n\n// src/validators/BaseValidator.ts\nvar BaseValidator = class {\n constructor() {\n this.rules = [];\n }\n /**\n * 검증 규칙 추가\n * @param rule - 추가할 검증 규칙\n * @returns this 인스턴스 (체이닝)\n */\n addRule(rule) {\n this.rules.push(rule);\n return this;\n }\n /**\n * 검증 규칙 제거\n * @param name - 제거할 규칙 이름\n * @returns this 인스턴스 (체이닝)\n */\n removeRule(name) {\n this.rules = this.rules.filter((rule) => rule.name !== name);\n return this;\n }\n /**\n * 모든 규칙에 대해 값 검증\n * @param value - 검증할 값\n * @returns 검증 결과\n */\n validate(value) {\n const errors = [];\n const warnings = [];\n for (const rule of this.rules) {\n try {\n const result = rule.validate(value);\n errors.push(...result.errors);\n warnings.push(...result.warnings);\n } catch (error) {\n errors.push(`Validation rule '${rule.name}' failed: ${error.message}`);\n }\n }\n return {\n isValid: errors.length === 0,\n errors,\n warnings\n };\n }\n /**\n * 공통 검증 유틸리티\n */\n /**\n * 필수 값 검증\n * @param value - 검증할 값\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateRequired(value, fieldName) {\n if (value === null || value === void 0 || value === \"\") {\n return {\n isValid: false,\n errors: [`${fieldName} is required`],\n warnings: []\n };\n }\n return { isValid: true, errors: [], warnings: [] };\n }\n /**\n * 문자열 길이 검증\n * @param value - 검증할 문자열\n * @param min - 최소 길이\n * @param max - 최대 길이\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateStringLength(value, min, max, fieldName = \"Field\") {\n const errors = [];\n if (typeof value !== \"string\") {\n errors.push(`${fieldName} must be a string`);\n } else {\n if (min !== void 0 && value.length < min) {\n errors.push(`${fieldName} must be at least ${min} characters long`);\n }\n if (max !== void 0 && value.length > max) {\n errors.push(`${fieldName} must be at most ${max} characters long`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings: [] };\n }\n /**\n * 숫자 범위 검증\n * @param value - 검증할 숫자\n * @param min - 최소값\n * @param max - 최대값\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateNumberRange(value, min, max, fieldName = \"Field\") {\n const errors = [];\n if (typeof value !== \"number\" || isNaN(value)) {\n errors.push(`${fieldName} must be a valid number`);\n } else {\n if (min !== void 0 && value < min) {\n errors.push(`${fieldName} must be at least ${min}`);\n }\n if (max !== void 0 && value > max) {\n errors.push(`${fieldName} must be at most ${max}`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings: [] };\n }\n /**\n * 열거형 값 검증\n * @param value - 검증할 값\n * @param enumObject - 열거형 객체\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateEnum(value, enumObject, fieldName = \"Field\") {\n const validValues = Object.values(enumObject);\n if (!validValues.includes(value)) {\n return {\n isValid: false,\n errors: [`${fieldName} must be one of: ${validValues.join(\", \")}`],\n warnings: []\n };\n }\n return { isValid: true, errors: [], warnings: [] };\n }\n /**\n * URL 형식 검증\n * @param value - 검증할 URL\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateUrl(value, fieldName = \"URL\") {\n try {\n new URL(value);\n return { isValid: true, errors: [], warnings: [] };\n } catch {\n return {\n isValid: false,\n errors: [`${fieldName} must be a valid URL`],\n warnings: []\n };\n }\n }\n /**\n * 이메일 형식 검증\n * @param value - 검증할 이메일\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateEmail(value, fieldName = \"Email\") {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return {\n isValid: false,\n errors: [`${fieldName} must be a valid email address`],\n warnings: []\n };\n }\n return { isValid: true, errors: [], warnings: [] };\n }\n /**\n * 객체 필수 속성 검증\n * @param obj - 검증할 객체\n * @param requiredProps - 필수 속성 배열\n * @param objectName - 객체 이름\n * @returns 검증 결과\n */\n validateRequiredProperties(obj, requiredProps, objectName = \"Object\") {\n const errors = [];\n if (typeof obj !== \"object\" || obj === null) {\n errors.push(`${objectName} must be an object`);\n } else {\n for (const prop of requiredProps) {\n if (!(prop in obj) || obj[prop] === null || obj[prop] === void 0) {\n errors.push(`${objectName}.${prop} is required`);\n }\n }\n }\n return { isValid: errors.length === 0, errors, warnings: [] };\n }\n /**\n * 배열 항목 검증\n * @param array - 검증할 배열\n * @param itemValidator - 항목 검증 함수\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateArray(array, itemValidator, fieldName = \"Array\") {\n const errors = [];\n const warnings = [];\n if (!Array.isArray(array)) {\n errors.push(`${fieldName} must be an array`);\n } else {\n array.forEach((item, index) => {\n const result = itemValidator(item, index);\n errors.push(...result.errors.map((error) => `${fieldName}[${index}]: ${error}`));\n warnings.push(...result.warnings.map((warning) => `${fieldName}[${index}]: ${warning}`));\n });\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 위험 콘텐츠 검사\n * @param value - 검사할 값\n * @param fieldName - 필드 이름\n * @returns 검증 결과 (경고 및 오류 포함)\n */\n checkSecurity(value, fieldName) {\n const warnings = [];\n const errors = [];\n if (typeof value === \"string\") {\n if (/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi.test(value)) {\n errors.push(`${fieldName} contains potentially dangerous script content`);\n }\n const suspiciousPatterns = [/javascript:/i, /data:text\\/html/i, /vbscript:/i, /on\\w+\\s*=/i];\n for (const pattern of suspiciousPatterns) {\n if (pattern.test(value)) {\n warnings.push(`${fieldName} contains potentially suspicious content`);\n break;\n }\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n};\n\n// src/validators/EventValidator.ts\nvar EventValidator = class extends BaseValidator {\n constructor(config = {}) {\n super();\n this.config = {\n maxEventNameLength: 100,\n maxPropertyKeyLength: 50,\n maxPropertyValueLength: 1e3,\n maxPropertiesCount: 100,\n maxEventSize: 100 * 1024,\n // 100KB\n allowedEventNamePattern: /^[a-zA-Z0-9_.-]+$/,\n forbiddenPropertyNames: [\"__proto__\", \"constructor\", \"prototype\"],\n enableSecurityChecks: true,\n ...config\n };\n this.setupValidationRules();\n }\n /**\n * 향상된 결과로 이벤트 검증\n * @param event - 검증할 이벤트\n * @returns 향상된 검증 결과\n */\n validate(event) {\n const result = super.validate(event);\n return {\n isValid: result.isValid,\n errors: result.errors,\n warnings: result.warnings\n };\n }\n /**\n * 검증 규칙 설정\n */\n setupValidationRules() {\n this.addRule({\n name: \"required_fields\",\n validate: (event) => this.validateRequiredFields(event)\n });\n this.addRule({\n name: \"event_name\",\n validate: (event) => this.validateEventName(event.name)\n });\n this.addRule({\n name: \"properties\",\n validate: (event) => this.validateProperties(event.properties)\n });\n this.addRule({\n name: \"context\",\n validate: (event) => this.validateContext(event.context)\n });\n this.addRule({\n name: \"user_id\",\n validate: (event) => this.validateUserId(event.userId)\n });\n this.addRule({\n name: \"session_id\",\n validate: (event) => this.validateSessionId(event.sessionId)\n });\n this.addRule({\n name: \"timestamp\",\n validate: (event) => this.validateTimestamp(event.timestamp)\n });\n this.addRule({\n name: \"event_size\",\n validate: (event) => this.validateEventSize(event)\n });\n if (this.config.enableSecurityChecks) {\n this.addRule({\n name: \"security\",\n validate: (event) => this.validateSecurity(event)\n });\n }\n }\n /**\n * 필수 필드 검증\n * @param event - 검증할 이벤트\n * @returns 검증 결과\n */\n validateRequiredFields(event) {\n const errors = [];\n if (!event.name) {\n errors.push(\"Event name is required\");\n }\n return { isValid: errors.length === 0, errors, warnings: [] };\n }\n /**\n * 이벤트 이름 검증\n * @param name - 검증할 이벤트 이름\n * @returns 검증 결과\n */\n validateEventName(name) {\n const errors = [];\n const warnings = [];\n if (!name) {\n return { isValid: true, errors, warnings };\n }\n if (name.length > this.config.maxEventNameLength) {\n errors.push(`Event name must not exceed ${this.config.maxEventNameLength} characters`);\n }\n if (!this.config.allowedEventNamePattern.test(name)) {\n errors.push(\n \"Event name contains invalid characters. Use only letters, numbers, underscores, dots, and hyphens\"\n );\n }\n const reservedNames = [\"error\", \"debug\", \"log\", \"warn\", \"info\"];\n if (reservedNames.includes(name.toLowerCase())) {\n warnings.push(`Event name '${name}' is reserved and may cause conflicts`);\n }\n if (name.includes(\" \")) {\n warnings.push(\"Event name contains spaces. Consider using underscores or camelCase\");\n }\n if (name !== name.toLowerCase() && name.includes(\"_\")) {\n warnings.push(\"Mixing camelCase and snake_case in event name is not recommended\");\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 이벤트 속성 검증\n * @param properties - 검증할 속성\n * @returns 검증 결과\n */\n validateProperties(properties) {\n const errors = [];\n const warnings = [];\n if (!properties) {\n return { isValid: true, errors, warnings };\n }\n if (typeof properties !== \"object\" || Array.isArray(properties)) {\n errors.push(\"Properties must be an object\");\n return { isValid: false, errors, warnings };\n }\n const propertyKeys = Object.keys(properties);\n if (propertyKeys.length > this.config.maxPropertiesCount) {\n errors.push(`Too many properties. Maximum allowed: ${this.config.maxPropertiesCount}`);\n }\n for (const key of propertyKeys) {\n const value = properties[key];\n if (key.length > this.config.maxPropertyKeyLength) {\n errors.push(`Property key '${key}' exceeds maximum length of ${this.config.maxPropertyKeyLength}`);\n }\n if (this.config.forbiddenPropertyNames.includes(key)) {\n errors.push(`Property name '${key}' is forbidden`);\n }\n if (key.startsWith(\"_\") && !key.startsWith(\"_vircle_\")) {\n warnings.push(`Property '${key}' starts with underscore. This may conflict with internal properties`);\n }\n const valueValidation = this.validatePropertyValue(value, key);\n errors.push(...valueValidation.errors);\n warnings.push(...valueValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 속성 값 검증\n * @param value - 검증할 값\n * @param key - 속성 키\n * @returns 검증 결과\n */\n validatePropertyValue(value, key) {\n const errors = [];\n const warnings = [];\n if (value === null || value === void 0) {\n warnings.push(`Property '${key}' has null/undefined value`);\n return { isValid: true, errors, warnings };\n }\n const valueType = typeof value;\n const allowedTypes = [\"string\", \"number\", \"boolean\", \"object\"];\n if (!allowedTypes.includes(valueType)) {\n errors.push(`Property '${key}' has unsupported type '${valueType}'`);\n return { isValid: false, errors, warnings };\n }\n if (valueType === \"string\") {\n if (value.length > this.config.maxPropertyValueLength) {\n errors.push(`Property '${key}' value exceeds maximum length of ${this.config.maxPropertyValueLength}`);\n }\n if (this.config.enableSecurityChecks) {\n const securityCheck = this.checkSecurity(value, `Property '${key}'`);\n errors.push(...securityCheck.errors);\n warnings.push(...securityCheck.warnings);\n }\n }\n if (valueType === \"number\") {\n if (!Number.isFinite(value)) {\n errors.push(`Property '${key}' has invalid number value (Infinity/NaN)`);\n }\n }\n if (valueType === \"object\" && value !== null) {\n if (Array.isArray(value)) {\n if (value.length > 100) {\n warnings.push(`Property '${key}' array is very large (${value.length} items)`);\n }\n } else {\n const nestedValidation = this.validateProperties(value);\n errors.push(...nestedValidation.errors.map((error) => `${key}.${error}`));\n warnings.push(...nestedValidation.warnings.map((warning) => `${key}.${warning}`));\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 컨텍스트 검증\n * @param context - 검증할 컨텍스트\n * @returns 검증 결과\n */\n validateContext(context) {\n if (!context) {\n return { isValid: true, errors: [], warnings: [] };\n }\n return this.validateProperties(context);\n }\n /**\n * 사용자 ID 검증\n * @param userId - 검증할 사용자 ID\n * @returns 검증 결과\n */\n validateUserId(userId) {\n if (!userId) {\n return { isValid: true, errors: [], warnings: [] };\n }\n return this.validateStringLength(userId, 1, 255, \"User ID\");\n }\n /**\n * 세션 ID 검증\n * @param sessionId - 검증할 세션 ID\n * @returns 검증 결과\n */\n validateSessionId(sessionId) {\n if (!sessionId) {\n return { isValid: true, errors: [], warnings: [] };\n }\n return this.validateStringLength(sessionId, 1, 255, \"Session ID\");\n }\n /**\n * 타임스탬프 검증\n * @param timestamp - 검증할 타임스탬프\n * @returns 검증 결과\n */\n validateTimestamp(timestamp) {\n const errors = [];\n const warnings = [];\n if (!timestamp) {\n return { isValid: true, errors, warnings };\n }\n let date;\n if (timestamp instanceof Date) {\n date = timestamp;\n } else if (typeof timestamp === \"string\") {\n date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n errors.push(\"Invalid timestamp format\");\n return { isValid: false, errors, warnings };\n }\n } else {\n errors.push(\"Timestamp must be a Date object or ISO string\");\n return { isValid: false, errors, warnings };\n }\n const now = /* @__PURE__ */ new Date();\n const oneYearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate());\n const oneHourFromNow = new Date(now.getTime() + 60 * 60 * 1e3);\n if (date < oneYearAgo) {\n warnings.push(\"Timestamp is more than a year old\");\n }\n if (date > oneHourFromNow) {\n warnings.push(\"Timestamp is in the future\");\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 이벤트 크기 검증\n * @param event - 검증할 이벤트\n * @returns 검증 결과\n */\n validateEventSize(event) {\n try {\n const eventString = JSON.stringify(event);\n const eventSize = new Blob([eventString]).size;\n if (eventSize > this.config.maxEventSize) {\n return {\n isValid: false,\n errors: [\n `Event size (${eventSize} bytes) exceeds maximum allowed size (${this.config.maxEventSize} bytes)`\n ],\n warnings: []\n };\n }\n const warnings = [];\n if (eventSize > this.config.maxEventSize * 0.8) {\n warnings.push(`Event size (${eventSize} bytes) is approaching the maximum limit`);\n }\n return { isValid: true, errors: [], warnings };\n } catch (error) {\n return {\n isValid: false,\n errors: [`Failed to calculate event size: ${error.message}`],\n warnings: []\n };\n }\n }\n /**\n * 보안 검증\n * @param event - 검증할 이벤트\n * @returns 검증 결과\n */\n validateSecurity(event) {\n const errors = [];\n const warnings = [];\n const nameCheck = this.checkSecurity(event.name, \"Event name\");\n errors.push(...nameCheck.errors);\n warnings.push(...nameCheck.warnings);\n if (event.userId) {\n const userIdCheck = this.checkSecurity(event.userId, \"User ID\");\n errors.push(...userIdCheck.errors);\n warnings.push(...userIdCheck.warnings);\n }\n if (event.sessionId) {\n const sessionIdCheck = this.checkSecurity(event.sessionId, \"Session ID\");\n errors.push(...sessionIdCheck.errors);\n warnings.push(...sessionIdCheck.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n};\n\n// src/validators/ConfigValidator.ts\nvar ConfigValidator = class extends BaseValidator {\n constructor(options = {}) {\n super();\n this.options = {\n requireApiKey: true,\n allowedEnvironments: [\"development\", \"production\"],\n maxBatchSize: 1e3,\n maxQueueSize: 1e4,\n maxRetryAttempts: 10,\n ...options\n };\n this.setupValidationRules();\n }\n /**\n * 향상된 결과로 설정 검증\n * @param config - 검증할 설정\n * @returns 향상된 검증 결과\n */\n validate(config) {\n const result = super.validate(config);\n return {\n isValid: result.isValid,\n errors: result.errors,\n warnings: result.warnings\n };\n }\n /**\n * 검증 규칙 설정\n */\n setupValidationRules() {\n this.addRule({\n name: \"api_key\",\n validate: (config) => this.validateApiKey(config.apiKey, config)\n });\n this.addRule({\n name: \"environment\",\n validate: (config) => this.validateEnvironment(config.environment)\n });\n this.addRule({\n name: \"batch_config\",\n validate: (config) => this.validateBatchConfig(config.batch)\n });\n this.addRule({\n name: \"queue_config\",\n validate: (config) => this.validateQueueConfig(config.queue)\n });\n this.addRule({\n name: \"retry_config\",\n validate: (config) => this.validateRetryConfig(config.retry)\n });\n this.addRule({\n name: \"transport_config\",\n validate: (config) => this.validateTransportConfig(config.transport)\n });\n this.addRule({\n name: \"storage_config\",\n validate: (config) => this.validateStorageConfig(config.storage)\n });\n this.addRule({\n name: \"plugin_config\",\n validate: (config) => this.validatePluginConfig(config.plugins)\n });\n this.addRule({\n name: \"auto_collect_config\",\n validate: (config) => this.validateAutoCollectConfig(config.autoCollect)\n });\n this.addRule({\n name: \"privacy_config\",\n validate: (config) => this.validatePrivacyConfig(config.privacy)\n });\n this.addRule({\n name: \"headers\",\n validate: (config) => this.validateHeaders(config.headers)\n });\n }\n /**\n * API 키 검증\n * @param apiKey - 검증할 API 키\n * @param config - 전체 설정 객체\n * @returns 검증 결과\n */\n validateApiKey(apiKey, config) {\n const errors = [];\n const warnings = [];\n if (this.options.requireApiKey) {\n if (!apiKey) {\n errors.push(\"API key is required\");\n return { isValid: false, errors, warnings };\n }\n }\n if (apiKey) {\n if (apiKey.length < 10) {\n errors.push(\"API key seems too short (minimum 10 characters)\");\n }\n if (apiKey.length > 500) {\n errors.push(\"API key seems too long (maximum 500 characters)\");\n }\n if (!/^[a-zA-Z0-9_.-]+$/.test(apiKey)) {\n warnings.push(\"API key contains unusual characters\");\n }\n const apiKeyValidation = validateApiKey(apiKey);\n if (!apiKeyValidation.isValid) {\n errors.push(\"Invalid API key format\");\n }\n if (apiKeyValidation.isTestKey) {\n warnings.push(\"Test API key detected - ensure you use a production key in production\");\n }\n warnings.push(...apiKeyValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 환경 검증\n * @param environment - 검증할 환경\n * @returns 검증 결과\n */\n validateEnvironment(environment) {\n if (!environment) {\n return { isValid: true, errors: [], warnings: [] };\n }\n return this.validateEnum(\n environment,\n this.options.allowedEnvironments.reduce((obj, env) => ({ ...obj, [env]: env }), {}),\n \"Environment\"\n );\n }\n /**\n * 배치 설정 검증\n * @param batch - 검증할 배치 설정\n * @returns 검증 결과\n */\n validateBatchConfig(batch) {\n const errors = [];\n const warnings = [];\n if (!batch) {\n return { isValid: true, errors, warnings };\n }\n if (typeof batch !== \"object\") {\n errors.push(\"Batch configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (batch.size !== void 0) {\n const sizeValidation = this.validateNumberRange(batch.size, 1, this.options.maxBatchSize, \"Batch size\");\n errors.push(...sizeValidation.errors);\n warnings.push(...sizeValidation.warnings);\n if (batch.size > 100) {\n warnings.push(\"Large batch sizes may impact performance\");\n }\n }\n if (batch.timeout !== void 0) {\n const timeoutValidation = this.validateNumberRange(batch.timeout, 100, 3e5, \"Batch timeout\");\n errors.push(...timeoutValidation.errors);\n warnings.push(...timeoutValidation.warnings);\n if (batch.timeout < 1e3) {\n warnings.push(\"Very short batch timeout may cause frequent network requests\");\n }\n }\n if (batch.maxBytes !== void 0) {\n const maxBytesValidation = this.validateNumberRange(\n batch.maxBytes,\n 1024,\n 50 * 1024 * 1024,\n \"Batch max bytes\"\n );\n errors.push(...maxBytesValidation.errors);\n warnings.push(...maxBytesValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 큐 설정 검증\n * @param queue - 검증할 큐 설정\n * @returns 검증 결과\n */\n validateQueueConfig(queue) {\n const errors = [];\n const warnings = [];\n if (!queue) {\n return { isValid: true, errors, warnings };\n }\n if (typeof queue !== \"object\") {\n errors.push(\"Queue configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (queue.maxSize !== void 0) {\n const sizeValidation = this.validateNumberRange(\n queue.maxSize,\n 10,\n this.options.maxQueueSize,\n \"Queue max size\"\n );\n errors.push(...sizeValidation.errors);\n warnings.push(...sizeValidation.warnings);\n if (queue.maxSize > 5e3) {\n warnings.push(\"Large queue sizes may consume significant memory\");\n }\n }\n if (queue.workers !== void 0) {\n const workersValidation = this.validateNumberRange(queue.workers, 1, 10, \"Queue workers\");\n errors.push(...workersValidation.errors);\n warnings.push(...workersValidation.warnings);\n }\n if (queue.strategy !== void 0) {\n const validStrategies = { fifo: \"fifo\", lifo: \"lifo\", priority: \"priority\" };\n const strategyValidation = this.validateEnum(queue.strategy, validStrategies, \"Queue strategy\");\n errors.push(...strategyValidation.errors);\n warnings.push(...strategyValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 재시도 설정 검증\n * @param retry - 검증할 재시도 설정\n * @returns 검증 결과\n */\n validateRetryConfig(retry) {\n const errors = [];\n const warnings = [];\n if (!retry) {\n return { isValid: true, errors, warnings };\n }\n if (typeof retry !== \"object\") {\n errors.push(\"Retry configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (retry.maxAttempts !== void 0) {\n const attemptsValidation = this.validateNumberRange(\n retry.maxAttempts,\n 0,\n this.options.maxRetryAttempts,\n \"Max retry attempts\"\n );\n errors.push(...attemptsValidation.errors);\n warnings.push(...attemptsValidation.warnings);\n if (retry.maxAttempts > 5) {\n warnings.push(\"High retry attempts may delay error reporting\");\n }\n }\n if (retry.initialDelay !== void 0) {\n const delayValidation = this.validateNumberRange(retry.initialDelay, 10, 6e4, \"Initial retry delay\");\n errors.push(...delayValidation.errors);\n warnings.push(...delayValidation.warnings);\n }\n if (retry.maxDelay !== void 0) {\n const maxDelayValidation = this.validateNumberRange(retry.maxDelay, 100, 36e5, \"Max retry delay\");\n errors.push(...maxDelayValidation.errors);\n warnings.push(...maxDelayValidation.warnings);\n }\n if (retry.multiplier !== void 0) {\n const multiplierValidation = this.validateNumberRange(retry.multiplier, 1, 10, \"Retry multiplier\");\n errors.push(...multiplierValidation.errors);\n warnings.push(...multiplierValidation.warnings);\n }\n if (retry.initialDelay && retry.maxDelay && retry.initialDelay >= retry.maxDelay) {\n errors.push(\"Initial retry delay must be less than max retry delay\");\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 전송 설정 검증\n * @param transport - 검증할 전송 설정\n * @returns 검증 결과\n */\n validateTransportConfig(transport) {\n const errors = [];\n const warnings = [];\n if (!transport) {\n return { isValid: true, errors, warnings };\n }\n if (typeof transport !== \"object\") {\n errors.push(\"Transport configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (transport.timeout !== void 0) {\n const timeoutValidation = this.validateNumberRange(transport.timeout, 1e3, 3e5, \"Transport timeout\");\n errors.push(...timeoutValidation.errors);\n warnings.push(...timeoutValidation.warnings);\n }\n if (transport.connectionTimeout !== void 0) {\n const connTimeoutValidation = this.validateNumberRange(\n transport.connectionTimeout,\n 1e3,\n 6e4,\n \"Connection timeout\"\n );\n errors.push(...connTimeoutValidation.errors);\n warnings.push(...connTimeoutValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 저장소 설정 검증\n * @param storage - 검증할 저장소 설정\n * @returns 검증 결과\n */\n validateStorageConfig(storage) {\n const errors = [];\n const warnings = [];\n if (!storage) {\n return { isValid: true, errors, warnings };\n }\n if (typeof storage !== \"object\") {\n errors.push(\"Storage configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (storage.type !== void 0) {\n const validTypes = { memory: \"memory\", localStorage: \"localStorage\", indexedDB: \"indexedDB\", file: \"file\" };\n const typeValidation = this.validateEnum(storage.type, validTypes, \"Storage type\");\n errors.push(...typeValidation.errors);\n warnings.push(...typeValidation.warnings);\n }\n if (storage.maxSize !== void 0) {\n const sizeValidation = this.validateNumberRange(\n storage.maxSize,\n 1024,\n 1024 * 1024 * 1024,\n \"Storage max size\"\n );\n errors.push(...sizeValidation.errors);\n warnings.push(...sizeValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 플러그인 설정 검증\n * @param plugins - 검증할 플러그인 배열\n * @returns 검증 결과\n */\n validatePluginConfig(plugins) {\n const errors = [];\n const warnings = [];\n if (!plugins) {\n return { isValid: true, errors, warnings };\n }\n if (!Array.isArray(plugins)) {\n errors.push(\"Plugins configuration must be an array\");\n return { isValid: false, errors, warnings };\n }\n const pluginNames = /* @__PURE__ */ new Set();\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (typeof plugin !== \"object\" || !plugin) {\n errors.push(`Plugin at index ${i} must be an object`);\n continue;\n }\n if (!plugin.name) {\n errors.push(`Plugin at index ${i} must have a name`);\n continue;\n }\n if (pluginNames.has(plugin.name)) {\n errors.push(`Duplicate plugin name: ${plugin.name}`);\n } else {\n pluginNames.add(plugin.name);\n }\n if (typeof plugin.name !== \"string\" || plugin.name.length === 0) {\n errors.push(`Plugin at index ${i} must have a valid name`);\n }\n if (plugin.version !== void 0 && typeof plugin.version !== \"string\") {\n errors.push(`Plugin '${plugin.name}' version must be a string`);\n }\n if (plugin.initialize !== void 0 && typeof plugin.initialize !== \"function\") {\n errors.push(`Plugin '${plugin.name}' initialize must be a function`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 자동 수집 설정 검증\n * @param autoCollect - 검증할 자동 수집 설정\n * @returns 검증 결과\n */\n validateAutoCollectConfig(autoCollect) {\n const errors = [];\n const warnings = [];\n if (!autoCollect) {\n return { isValid: true, errors, warnings };\n }\n if (typeof autoCollect !== \"object\") {\n errors.push(\"Auto-collect configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n const booleanProps = [\"device\", \"app\", \"page\", \"userAgent\", \"referrer\", \"campaign\", \"performance\"];\n for (const prop of booleanProps) {\n if (autoCollect[prop] !== void 0 && typeof autoCollect[prop] !== \"boolean\") {\n errors.push(`Auto-collect ${prop} must be a boolean`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 개인정보 보호 설정 검증\n * @param privacy - 검증할 개인정보 보호 설정\n * @returns 검증 결과\n */\n validatePrivacyConfig(privacy) {\n const errors = [];\n const warnings = [];\n if (!privacy) {\n return { isValid: true, errors, warnings };\n }\n if (typeof privacy !== \"object\") {\n errors.push(\"Privacy configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n const booleanProps = [\n \"respectDoNotTrack\",\n \"anonymizeIP\",\n \"requireCookieConsent\",\n \"gdprCompliant\",\n \"requireOptIn\"\n ];\n for (const prop of booleanProps) {\n if (privacy[prop] !== void 0 && typeof privacy[prop] !== \"boolean\") {\n errors.push(`Privacy ${prop} must be a boolean`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * HTTP 헤더 검증\n * @param headers - 검증할 헤더 맵\n * @returns 검증 결과\n */\n validateHeaders(headers) {\n const errors = [];\n const warnings = [];\n if (!headers) {\n return { isValid: true, errors, warnings };\n }\n if (typeof headers !== \"object\") {\n errors.push(\"Headers must be an object\");\n return { isValid: false, errors, warnings };\n }\n for (const [key, value] of Object.entries(headers)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n errors.push(`Header '${key}' must have string key and value`);\n }\n if (!/^[a-zA-Z0-9-_]+$/.test(key)) {\n errors.push(`Invalid header name format: ${key}`);\n }\n const sensitiveHeaders = [\"authorization\", \"cookie\", \"set-cookie\"];\n if (sensitiveHeaders.includes(key.toLowerCase())) {\n warnings.push(`Setting sensitive header '${key}' may have security implications`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n};\n\n// src/utils/EventUtils.ts\nfunction normalizeEventName(name) {\n return name.trim();\n}\nfunction mergeEventProperties(base = {}, override = {}) {\n const merged = {};\n for (const [key, value] of Object.entries(base)) {\n merged[key] = cloneValue(value);\n }\n for (const [key, value] of Object.entries(override)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value) && typeof merged[key] === \"object\" && merged[key] !== null && !Array.isArray(merged[key])) {\n merged[key] = mergeEventProperties(merged[key], value);\n } else {\n merged[key] = cloneValue(value);\n }\n }\n return merged;\n}\nfunction mergeEventContext(base = {}, override = {}) {\n const merged = {};\n for (const [key, value] of Object.entries(base)) {\n merged[key] = cloneValue(value);\n }\n for (const [key, value] of Object.entries(override)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value) && typeof merged[key] === \"object\" && merged[key] !== null && !Array.isArray(merged[key])) {\n merged[key] = mergeEventProperties(merged[key], value);\n } else {\n merged[key] = cloneValue(value);\n }\n }\n return merged;\n}\nfunction cloneValue(value, seen = /* @__PURE__ */ new WeakSet()) {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n if (value instanceof Date) {\n return new Date(value);\n }\n if (Array.isArray(value)) {\n seen.add(value);\n const result = value.map((item) => cloneValue(item, seen));\n seen.delete(value);\n return result;\n }\n if (typeof value === \"object\") {\n seen.add(value);\n const result = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = cloneValue(val, seen);\n }\n seen.delete(value);\n return result;\n }\n return value;\n}\nfunction normalizeTimestamp(timestamp) {\n if (!timestamp) {\n return (/* @__PURE__ */ new Date()).toISOString();\n }\n if (timestamp instanceof Date) {\n return timestamp.toISOString();\n }\n if (typeof timestamp === \"string\") {\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n return (/* @__PURE__ */ new Date()).toISOString();\n }\n return date.toISOString();\n }\n if (typeof timestamp === \"number\") {\n return new Date(timestamp).toISOString();\n }\n return (/* @__PURE__ */ new Date()).toISOString();\n}\n\n// src/utils/ContextCache.ts\nvar ContextCache = class {\n constructor(options = {}) {\n this.cache = /* @__PURE__ */ new Map();\n this.pendingCollectors = /* @__PURE__ */ new Map();\n this.options = {\n cacheTime: options.cacheTime ?? 6e4,\n getCacheKey: options.getCacheKey ?? (() => \"default\")\n };\n }\n /**\n * 캐시된 컨텍스트 조회 또는 새로 생성\n * @param collector - 컨텍스트를 수집하는 비동기 함수\n * @returns 캐시된 또는 새로 수집된 컨텍스트\n */\n async getOrCollect(collector) {\n const key = this.options.getCacheKey();\n const cached = this.cache.get(key);\n const now = Date.now();\n if (cached && now - cached.timestamp < this.options.cacheTime) {\n return cached.context;\n }\n const pending = this.pendingCollectors.get(key);\n if (pending) {\n return pending;\n }\n const collectPromise = collector();\n this.pendingCollectors.set(key, collectPromise);\n try {\n const context = await collectPromise;\n this.cache.set(key, {\n context,\n timestamp: now\n });\n return context;\n } catch (error) {\n if (cached) {\n console.warn(\"[ContextCache] Collection failed, returning stale cache:\", error);\n return cached.context;\n }\n throw error;\n } finally {\n this.pendingCollectors.delete(key);\n }\n }\n /**\n * 특정 키의 캐시 무효화\n * @param key - 캐시 키 (없으면 현재 키 사용)\n */\n invalidate(key) {\n const targetKey = key ?? this.options.getCacheKey();\n this.cache.delete(targetKey);\n }\n /**\n * 모든 캐시 제거\n */\n clear() {\n this.cache.clear();\n }\n /**\n * 캐시 상태 조회\n * @returns 캐시 정보\n */\n getStats() {\n return {\n size: this.cache.size,\n keys: Array.from(this.cache.keys())\n };\n }\n /**\n * 캐시 만료 시간 업데이트\n * @param cacheTime - 새로운 캐시 시간 (밀리초)\n */\n setCacheTime(cacheTime) {\n this.options.cacheTime = cacheTime;\n }\n /**\n * 만료된 캐시 항목 정리\n */\n cleanup() {\n const now = Date.now();\n for (const [key, cached] of this.cache.entries()) {\n if (now - cached.timestamp >= this.options.cacheTime) {\n this.cache.delete(key);\n }\n }\n }\n};\n\n// src/utils/PerformanceUtils.ts\nvar IdleScheduler = class {\n};\nvar WebIdleScheduler = class extends IdleScheduler {\n constructor() {\n super(...arguments);\n this.handles = /* @__PURE__ */ new Set();\n }\n schedule(callback, options) {\n const timeout = options?.timeout ?? 3e3;\n if (typeof window !== \"undefined\" && \"requestIdleCallback\" in window) {\n const handle = window.requestIdleCallback(\n async (deadline) => {\n this.handles.delete(handle);\n try {\n await callback();\n } catch (error) {\n console.error(\"[WebIdleScheduler] Callback error:\", error);\n }\n },\n { timeout }\n );\n this.handles.add(handle);\n return handle;\n } else {\n const handle = setTimeout(async () => {\n this.handles.delete(handle);\n try {\n await callback();\n } catch (error) {\n console.error(\"[WebIdleScheduler] Callback error:\", error);\n }\n }, 0);\n this.handles.add(handle);\n return handle;\n }\n }\n cancel(handle) {\n if (typeof window !== \"undefined\" && \"cancelIdleCallback\" in window) {\n window.cancelIdleCallback(handle);\n } else {\n clearTimeout(handle);\n }\n this.handles.delete(handle);\n }\n cancelAll() {\n for (const handle of this.handles) {\n this.cancel(handle);\n }\n this.handles.clear();\n }\n};\nvar DefaultIdleScheduler = class extends IdleScheduler {\n constructor() {\n super(...arguments);\n this.handles = /* @__PURE__ */ new Map();\n this.nextId = 0;\n }\n schedule(callback, options) {\n const id = this.nextId++;\n const timeout = setTimeout(async () => {\n this.handles.delete(id);\n try {\n await callback();\n } catch (error) {\n console.error(\"[DefaultIdleScheduler] Callback error:\", error);\n }\n }, 0);\n this.handles.set(id, timeout);\n return id;\n }\n cancel(handle) {\n const timeout = this.handles.get(handle);\n if (timeout) {\n clearTimeout(timeout);\n this.handles.delete(handle);\n }\n }\n cancelAll() {\n for (const timeout of this.handles.values()) {\n clearTimeout(timeout);\n }\n this.handles.clear();\n }\n};\nvar TaskScheduler = class {\n constructor(scheduler, maxQueueSize = 1e3) {\n this.queue = [];\n this.isProcessing = false;\n this.scheduler = scheduler;\n this.maxQueueSize = maxQueueSize;\n }\n /**\n * 작업을 큐에 추가\n * @param task - 실행할 작업\n * @param priority - 우선순위 (높을수록 먼저 실행)\n * @param options - IdleScheduler 옵션\n */\n enqueue(task, priority = 0, options) {\n this.queue.push({\n task,\n priority,\n timestamp: Date.now()\n });\n this.queue.sort((a, b) => b.priority - a.priority);\n while (this.queue.length > this.maxQueueSize) {\n this.queue.pop();\n }\n if (!this.isProcessing) {\n this.scheduleProcessing(options);\n }\n }\n /**\n * 큐 처리 예약\n * @param options - IdleScheduler 옵션\n */\n scheduleProcessing(options) {\n if (this.handle) {\n this.scheduler.cancel(this.handle);\n }\n this.handle = this.scheduler.schedule(async () => {\n await this.processQueue();\n }, options);\n }\n /**\n * 큐 처리\n */\n async processQueue() {\n if (this.isProcessing || this.queue.length === 0) {\n return;\n }\n this.isProcessing = true;\n try {\n while (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item) {\n try {\n await item.task();\n } catch (error) {\n console.error(\"[TaskScheduler] Task error:\", error);\n }\n }\n }\n } finally {\n this.isProcessing = false;\n this.handle = void 0;\n }\n }\n /**\n * 모든 대기 중인 작업 취소\n */\n clear() {\n this.queue = [];\n if (this.handle) {\n this.scheduler.cancel(this.handle);\n this.handle = void 0;\n }\n this.isProcessing = false;\n }\n /**\n * 큐 상태 조회\n */\n getStats() {\n return {\n queueSize: this.queue.length,\n isProcessing: this.isProcessing\n };\n }\n};\nfunction createIdleScheduler() {\n if (typeof window !== \"undefined\") {\n return new WebIdleScheduler();\n }\n return new DefaultIdleScheduler();\n}\n\n// src/utils/environment.ts\nfunction hasProcess() {\n return typeof process !== \"undefined\" && process && typeof process === \"object\";\n}\nfunction getEnv(key, defaultValue = \"\") {\n if (hasProcess() && process.env && typeof process.env === \"object\") {\n return process.env[key] || defaultValue;\n }\n return defaultValue;\n}\n\n// src/services/RemoteConfigService.ts\nvar STORAGE_CACHE_PREFIX = \"__vircle_config_\";\nvar RemoteConfigService = class _RemoteConfigService {\n constructor() {\n this.configCache = /* @__PURE__ */ new Map();\n this.configPromises = /* @__PURE__ */ new Map();\n // 메모리 캐시 시간 (5분)\n this.CACHE_DURATION = 5 * 60 * 1e3;\n this.cacheTimestamps = /* @__PURE__ */ new Map();\n }\n static getInstance() {\n if (!_RemoteConfigService.instance) {\n _RemoteConfigService.instance = new _RemoteConfigService();\n }\n return _RemoteConfigService.instance;\n }\n /**\n * API 키를 기반으로 프로젝트 설정을 가져옵니다.\n * MPA에서 매 페이지 로드마다 CDN 요청을 방지하기 위해\n * 메모리 캐시 → localStorage 캐시 → CDN 순으로 조회한다.\n */\n async getProjectConfig(apiKey, environment = \"production\") {\n const memoryCached = this.getCachedConfig(apiKey);\n if (memoryCached) {\n return memoryCached;\n }\n const storageCached = this.getStorageCachedConfig(apiKey);\n if (storageCached) {\n this.setCachedConfig(apiKey, storageCached);\n return storageCached;\n }\n const existingPromise = this.configPromises.get(apiKey);\n if (existingPromise) {\n return existingPromise;\n }\n const configPromise = this.fetchConfig(apiKey, environment);\n this.configPromises.set(apiKey, configPromise);\n try {\n const config = await configPromise;\n this.setCachedConfig(apiKey, config);\n this.setStorageCachedConfig(apiKey, config);\n this.configPromises.delete(apiKey);\n return config;\n } catch (error) {\n this.configPromises.delete(apiKey);\n throw error;\n }\n }\n /**\n * 설정을 가져오는 메인 로직\n */\n async fetchConfig(apiKey, environment) {\n const projectId = this.extractProjectId(apiKey);\n try {\n return await this.fetchFromCDN(projectId, apiKey, environment);\n } catch (cdnError) {\n throw new VircleError(\n \"REMOTE_CONFIG_FETCH_FAILED\" /* REMOTE_CONFIG_FETCH_FAILED */,\n `Failed to fetch configuration for project ${projectId}. Please ensure the project is properly configured.`,\n {\n context: {\n projectId,\n cdnError: cdnError instanceof Error ? cdnError.message : String(cdnError),\n environment\n }\n }\n );\n }\n }\n /**\n * CDN에서 설정 가져오기\n */\n async fetchFromCDN(projectId, apiKey, environment) {\n const cdnUrl = getEnv(\"VIRCLE_CONFIG_CDN_URL\") || CDN_ENDPOINTS[environment];\n const url = `${cdnUrl}/${projectId}/config.json`;\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n },\n // 브라우저 캐시 활용\n cache: \"default\",\n // CORS\n mode: \"cors\"\n });\n if (!response.ok) {\n throw new Error(`CDN returned ${response.status}`);\n }\n const config = await response.json();\n return this.validateConfig(config, environment);\n }\n /**\n * API 키에서 프로젝트 ID 추출\n * 형식: pk_{projectId}_{randomString}\n */\n extractProjectId(apiKey) {\n const match = apiKey.match(/^pk_([^_]+)_/);\n if (match && match[1]) {\n return match[1];\n }\n return this.hashApiKey(apiKey).substring(0, 8);\n }\n /**\n * API 키를 해시하여 프로젝트 ID 생성\n */\n hashApiKey(apiKey) {\n let hash = 0;\n for (let i = 0; i < apiKey.length; i++) {\n const char = apiKey.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n }\n /**\n * 설정 유효성 검증\n */\n validateConfig(config, requestedEnvironment) {\n if (!config || typeof config !== \"object\") {\n throw new VircleError(\"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */, \"Invalid project configuration format\");\n }\n if (!config.projectId) {\n throw new VircleError(\"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */, \"Project ID is required\");\n }\n if (!config.environment) {\n throw new VircleError(\n \"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */,\n \"Environment field is required in project configuration\"\n );\n }\n if (config.environment !== \"development\" && config.environment !== \"production\") {\n throw new VircleError(\n \"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */,\n `Invalid environment value: ${config.environment}. Must be 'development' or 'production'`\n );\n }\n if (config.environment !== requestedEnvironment) {\n throw new VircleError(\n \"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */,\n `Environment mismatch: requested '${requestedEnvironment}' but config is for '${config.environment}'`\n );\n }\n if (config.publicKey && !this.isValidPublicKey(config.publicKey)) {\n throw new VircleError(\"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */, \"Invalid public key format\");\n }\n return {\n projectId: config.projectId,\n environment: config.environment,\n publicKey: config.publicKey,\n features: {\n encryption: config.features?.encryption ?? false,\n compression: config.features?.compression ?? true,\n batching: config.features?.batching ?? true\n },\n settings: config.settings\n };\n }\n /**\n * 공개키 형식 검증\n */\n isValidPublicKey(publicKey) {\n try {\n if (typeof atob !== \"undefined\") {\n atob(publicKey);\n } else {\n Buffer.from(publicKey, \"base64\");\n }\n return publicKey.length > 100;\n } catch {\n return false;\n }\n }\n /**\n * 기본 설정 반환\n */\n getDefaultConfig(projectId) {\n return {\n projectId,\n environment: \"production\",\n features: {\n encryption: false,\n compression: true,\n batching: true\n }\n };\n }\n /**\n * 캐시된 설정 가져오기\n */\n getCachedConfig(apiKey) {\n const cached = this.configCache.get(apiKey);\n const timestamp = this.cacheTimestamps.get(apiKey);\n if (cached && timestamp) {\n const age = Date.now() - timestamp;\n if (age < this.CACHE_DURATION) {\n return cached;\n }\n }\n return null;\n }\n /**\n * 설정 캐시에 저장\n */\n setCachedConfig(apiKey, config) {\n this.configCache.set(apiKey, config);\n this.cacheTimestamps.set(apiKey, Date.now());\n }\n /**\n * localStorage에서 캐시된 설정 조회\n * MPA에서 페이지 전환 시 CDN 요청 없이 즉시 초기화할 수 있도록 한다.\n */\n getStorageCachedConfig(apiKey) {\n try {\n if (typeof localStorage === \"undefined\") return null;\n const raw = localStorage.getItem(STORAGE_CACHE_PREFIX + apiKey);\n if (!raw) return null;\n const { config, timestamp } = JSON.parse(raw);\n if (Date.now() - timestamp < this.CACHE_DURATION) {\n return config;\n }\n localStorage.removeItem(STORAGE_CACHE_PREFIX + apiKey);\n } catch {\n }\n return null;\n }\n /**\n * localStorage에 설정 캐시 저장\n */\n setStorageCachedConfig(apiKey, config) {\n try {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n STORAGE_CACHE_PREFIX + apiKey,\n JSON.stringify({ config, timestamp: Date.now() })\n );\n } catch {\n }\n }\n /**\n * 캐시 초기화\n */\n clearCache() {\n try {\n if (typeof localStorage !== \"undefined\") {\n const keysToRemove = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_CACHE_PREFIX)) {\n keysToRemove.push(key);\n }\n }\n for (const key of keysToRemove) {\n localStorage.removeItem(key);\n }\n }\n } catch {\n }\n this.configCache.clear();\n this.configPromises.clear();\n this.cacheTimestamps.clear();\n }\n};\n\n// src/VircleCore.ts\nvar _VircleCore = class _VircleCore {\n constructor(config, options = {}) {\n this.isInitialized = false;\n this.globalContext = {};\n this.lastSessionPersistTime = 0;\n this.config = { ...config };\n this.options = {\n enableValidation: true,\n enableAutoContext: true,\n enablePlugins: true,\n pluginTimeout: 5e3,\n storageType: \"memory\",\n debug: false,\n ...options\n };\n this.configService = new ConfigService(this.config);\n this.contextService = new ContextService(this.config);\n this.pluginService = new PluginService(this.config, {\n maxExecutionTime: this.options.pluginTimeout\n });\n this.pluginService.setTrackFn(\n (eventName, properties) => this.track(eventName, properties)\n );\n this.pluginService.setIdentifyFn(\n (userId, traits) => this.identify(userId, traits)\n );\n this.storageService = new StorageService({\n type: this.options.storageType,\n adapter: this.options.storageAdapter\n });\n this.transportService = new TransportService(this.config, {\n cryptoAdapter: this.options.cryptoAdapter\n });\n this.remoteConfigService = RemoteConfigService.getInstance();\n this.eventService = new EventService(this.config, {\n contextService: this.contextService,\n pluginService: this.options.enablePlugins ? this.pluginService : void 0,\n storageService: this.storageService,\n transportService: this.transportService\n });\n if (this.options.enableValidation) {\n this.eventValidator = new EventValidator();\n this.configValidator = new ConfigValidator();\n }\n this.contextCache = new ContextCache({\n cacheTime: this.options.contextCacheTime || 6e4\n });\n const idleScheduler = this.options.idleScheduler || createIdleScheduler();\n this.taskScheduler = new TaskScheduler(idleScheduler);\n }\n /**\n * SDK 초기화\n * @throws {VircleError} 초기화 실패 시 에러 발생\n */\n async initialize() {\n if (this.isInitialized) {\n return;\n }\n try {\n await this.validateConfiguration();\n try {\n const remoteConfig = await this.remoteConfigService.getProjectConfig(\n this.config.apiKey,\n this.config.environment || \"production\"\n );\n if (this.options.debug) {\n console.log(\"[VircleCore] Remote config loaded:\", {\n projectId: remoteConfig.projectId,\n environment: remoteConfig.environment,\n features: remoteConfig.features\n });\n }\n if (this.options.enableEncryption && remoteConfig.publicKey) {\n this.transportService.setEncryptionConfig({\n enabled: true,\n publicKey: remoteConfig.publicKey\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Applied remote encryption config\");\n }\n } else if (remoteConfig.features.encryption) {\n console.warn(\"[VircleCore] Remote config has encryption enabled but no public key provided\");\n if (getEnv(\"VIRCLE_ALLOW_FALLBACK_KEY\", \"false\") === \"true\" && ENCRYPTION_CONFIG.PUBLIC_KEY) {\n this.transportService.setEncryptionConfig({\n enabled: true,\n publicKey: ENCRYPTION_CONFIG.PUBLIC_KEY\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Using fallback encryption key\");\n }\n } else {\n this.options.enableEncryption = false;\n console.warn(\"[VircleCore] Encryption disabled - no valid public key available\");\n }\n }\n if (remoteConfig.settings) {\n if (remoteConfig.settings.batchSize && !this.config.batch) {\n this.config.batch = { size: remoteConfig.settings.batchSize };\n } else if (remoteConfig.settings.batchSize && this.config.batch) {\n this.config.batch.size = remoteConfig.settings.batchSize;\n }\n if (remoteConfig.settings.flushInterval && !this.config.batch) {\n this.config.batch = { flushInterval: remoteConfig.settings.flushInterval };\n } else if (remoteConfig.settings.flushInterval && this.config.batch) {\n this.config.batch.flushInterval = remoteConfig.settings.flushInterval;\n }\n if (remoteConfig.settings.maxRetries && !this.config.retry) {\n this.config.retry = { maxAttempts: remoteConfig.settings.maxRetries };\n } else if (remoteConfig.settings.maxRetries && this.config.retry) {\n this.config.retry.maxAttempts = remoteConfig.settings.maxRetries;\n }\n this.configService.updateConfig(this.config);\n this.transportService.updateConfig(this.config);\n }\n } catch (configError) {\n if (this.options.debug) {\n console.log(\"[VircleCore] Failed to load remote config, using defaults\", configError);\n }\n if (getEnv(\"VIRCLE_ALLOW_FALLBACK_KEY\", \"false\") === \"true\" && ENCRYPTION_CONFIG.PUBLIC_KEY) {\n this.transportService.setEncryptionConfig({\n enabled: true,\n publicKey: ENCRYPTION_CONFIG.PUBLIC_KEY\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Using fallback encryption key after config fetch failure\");\n }\n } else {\n this.options.enableEncryption = false;\n console.warn(\"[VircleCore] Encryption disabled - remote config failed and no fallback key\");\n }\n }\n await this.loadPersistedUser();\n await this.restoreOrCreateSession();\n this.isInitialized = true;\n if (this.options.enablePlugins && this.config.plugins) {\n await this.initializePlugins();\n }\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"session-started\", {\n sessionId: this.sessionId,\n user: this.currentUser\n });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Initialized successfully\", {\n config: sanitizeConfig(this.config),\n // API 키 마스킹\n sessionId: this.sessionId\n });\n }\n } catch (error) {\n throw new VircleError(\n \"SDK_INITIALIZATION_FAILED\" /* SDK_INITIALIZATION_FAILED */,\n `Failed to initialize Vircle SDK: ${error.message}`,\n { cause: error }\n );\n }\n }\n /**\n * 이벤트 추적\n * @param name - 이벤트 이름\n * @param properties - 이벤트 속성\n * @param context - 이벤트 컨텍스트\n * @throws {ValidationError} 이벤트 검증 실패 시\n * @throws {VircleError} 이벤트 추적 실패 시\n */\n async track(name, properties, context) {\n this.ensureInitialized();\n try {\n const event = {\n name: normalizeEventName(name),\n properties: mergeEventProperties(properties || {}),\n context: mergeEventContext(this.globalContext, context),\n userId: this.currentUser?.id,\n anonymousId: this.currentUser?.anonymousId,\n sessionId: this.sessionId,\n timestamp: normalizeTimestamp()\n };\n if (this.eventValidator) {\n const validation = this.eventValidator.validate(event);\n if (!validation.isValid) {\n throw new ValidationError(\"Event validation failed\", validation.errors);\n }\n if (this.options.debug && validation.warnings.length > 0) {\n console.warn(\"[VircleCore] Event validation warnings:\", validation.warnings);\n }\n }\n await this.eventService.track(event);\n this.persistSession().catch(() => {\n });\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Track error:\", error);\n }\n throw new VircleError(\"EVENT_TRACKING_FAILED\" /* EVENT_TRACKING_FAILED */, `Failed to track event \"${name}\"`, {\n cause: error\n });\n }\n }\n /**\n * 다중 이벤트 일괄 추적\n * @param events - 추적할 이벤트 배열\n * @throws {ValidationError} 이벤트 검증 실패 시\n * @throws {VircleError} 배치 처리 실패 시\n */\n async trackBatch(events) {\n this.ensureInitialized();\n try {\n const vircleEvents = events.map((event) => ({\n name: normalizeEventName(event.name),\n properties: mergeEventProperties(event.properties),\n context: mergeEventContext(this.globalContext, event.context),\n userId: event.userId || this.currentUser?.id,\n anonymousId: this.currentUser?.anonymousId,\n sessionId: event.sessionId || this.sessionId,\n timestamp: normalizeTimestamp(event.timestamp)\n }));\n if (this.eventValidator) {\n for (const event of vircleEvents) {\n const validation = this.eventValidator.validate(event);\n if (!validation.isValid) {\n throw new ValidationError(`Event validation failed for \"${event.name}\"`, validation.errors);\n }\n }\n }\n for (const event of vircleEvents) {\n await this.eventService.track(event);\n }\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] TrackBatch error:\", error);\n }\n throw new VircleError(\"BATCH_PROCESSING_FAILED\" /* BATCH_PROCESSING_FAILED */, \"Failed to track batch events\", {\n cause: error\n });\n }\n }\n /**\n * 이벤트 빌더 생성\n * @param name - 초기 이벤트 이름 (선택사항)\n * @returns EventBuilder 인스턴스\n */\n createEvent(name) {\n this.ensureInitialized();\n return this.eventService.createEvent(name);\n }\n /**\n * 사용자 식별\n * @param userId - 사용자 ID\n * @param traits - 사용자 속성\n * @throws {VircleError} 사용자 식별 실패 시\n */\n async identify(userId, traits) {\n this.ensureInitialized();\n try {\n if (this.options.debug) {\n console.log(\"[VircleCore] Creating user with factory...\");\n }\n const user = VircleUserFactory.create(userId, traits || {}, this.currentUser?.anonymousId);\n if (this.options.debug) {\n console.log(\"[VircleCore] User created successfully:\", user);\n }\n this.currentUser = user;\n if (this.options.debug) {\n console.log(\"[VircleCore] Persisting user to storage...\");\n }\n try {\n await this.storageService.set(STORAGE_KEYS.USER, user);\n if (this.options.debug) {\n console.log(\"[VircleCore] User persisted successfully\");\n }\n } catch (storageError) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Failed to persist user:\", storageError);\n }\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Sending identify event for user:\", userId);\n }\n try {\n await this.track(\"identify\", {\n userId,\n ...traits\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Identify event tracked successfully\");\n }\n } catch (trackError) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Failed to track identify event:\", trackError);\n console.error(\n \"[VircleCore] Track error stack:\",\n trackError instanceof Error ? trackError.stack : \"No stack\"\n );\n }\n throw trackError;\n }\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"user-identified\", {\n user,\n sessionId: this.sessionId\n });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] User identified:\", { userId, traits });\n }\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Identify error:\", error);\n }\n throw new VircleError(\"USER_IDENTIFICATION_FAILED\" /* USER_IDENTIFICATION_FAILED */, `Failed to identify user \"${userId}\"`, {\n cause: error\n });\n }\n }\n /**\n * 현재 사용자의 anonymousId 반환\n * 크로스 도메인 어트리뷰션에서 _vuid 파라미터 값으로 사용.\n * user_idx 대신 anonymousId를 전달하여 실제 사용자 ID 노출을 방지한다.\n */\n getAnonymousId() {\n return this.currentUser?.anonymousId;\n }\n /**\n * 세션 ID 설정\n * @param sessionId - 새 세션 ID\n */\n setSessionId(sessionId) {\n this.sessionId = sessionId;\n if (this.options.debug) {\n console.log(\"[VircleCore] Session ID updated:\", sessionId);\n }\n }\n /**\n * 전역 컨텍스트 설정\n * @param context - 추가할 컨텍스트\n */\n setContext(context) {\n this.globalContext = mergeEventContext(this.globalContext, context);\n if (this.options.debug) {\n console.log(\"[VircleCore] Global context updated:\", this.globalContext);\n }\n }\n /**\n * 전역 컨텍스트 초기화\n */\n clearContext() {\n this.globalContext = {};\n if (this.options.debug) {\n console.log(\"[VircleCore] Global context cleared\");\n }\n }\n /**\n * 플러그인 등록\n * @param plugin - 등록할 플러그인\n * @throws {VircleError} 플러그인 비활성화 상태 시\n */\n async registerPlugin(plugin) {\n this.ensureInitialized();\n if (!this.options.enablePlugins) {\n throw new VircleError(\"PLUGIN_NOT_ENABLED\" /* PLUGIN_NOT_ENABLED */, \"Plugins are not enabled in SDK configuration\");\n }\n await this.pluginService.register(plugin);\n if (this.options.debug) {\n console.log(\"[VircleCore] Plugin registered:\", plugin.name);\n }\n }\n /**\n * 플러그인 등록 해제\n * @param name - 플러그인 이름\n * @returns 등록 해제 성공 여부\n */\n async unregisterPlugin(name) {\n this.ensureInitialized();\n if (!this.options.enablePlugins) {\n return false;\n }\n const result = await this.pluginService.unregister(name);\n if (this.options.debug && result) {\n console.log(\"[VircleCore] Plugin unregistered:\", name);\n }\n return result;\n }\n /**\n * 설정 업데이트\n * @param newConfig - 새 설정 값\n * @throws {ValidationError} 설정 검증 실패 시\n * @throws {VircleError} 설정 업데이트 실패 시\n */\n async updateConfig(newConfig) {\n this.ensureInitialized();\n try {\n const mergedConfig = { ...this.config, ...newConfig };\n if (this.configValidator) {\n const validation = this.configValidator.validate(mergedConfig);\n if (!validation.isValid) {\n throw new ValidationError(\"Configuration validation failed\", validation.errors);\n }\n }\n this.config = mergedConfig;\n this.configService.updateConfig(this.config);\n this.transportService.updateConfig(this.config);\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"config-changed\", {\n config: this.config\n });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Configuration updated:\", newConfig);\n }\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Config update error:\", error);\n }\n if (error instanceof VircleError) {\n throw error;\n }\n throw new VircleError(\"CONFIG_UPDATE_FAILED\" /* CONFIG_UPDATE_FAILED */, \"Failed to update configuration\", {\n cause: error\n });\n }\n }\n /**\n * 대기중인 이벤트 즉시 전송\n * @param timeoutMs - 타임아웃 시간 (밀리초)\n * @throws {Error} 타임아웃 발생 시\n */\n async flush(timeoutMs) {\n this.ensureInitialized();\n if (timeoutMs) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error(\"Flush timeout\")), timeoutMs);\n });\n await Promise.race([this.transportService.flush(), timeoutPromise]);\n } else {\n await this.transportService.flush();\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Events flushed\");\n }\n }\n /**\n * SDK 상태 초기화\n * @throws {Error} 초기화 실패 시\n */\n async reset() {\n this.ensureInitialized();\n try {\n this.currentUser = void 0;\n this.sessionId = this.generateSessionId();\n this.globalContext = {};\n await this.persistSession(true);\n await this.storageService.clear();\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"session-ended\");\n await this.pluginService.executeLifecycle(\"session-started\", {\n sessionId: this.sessionId\n });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] SDK reset completed\");\n }\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Reset error:\", error);\n }\n throw error;\n }\n }\n /**\n * SDK 상태 조회\n * @returns SDK 상태 정보\n */\n getStatus() {\n return {\n isInitialized: this.isInitialized,\n sessionId: this.sessionId,\n userId: this.currentUser?.id,\n pluginCount: this.options.enablePlugins ? this.pluginService.getPluginCount() : 0,\n queueSize: this.transportService.getQueueStatus().queueSize\n };\n }\n /**\n * SDK 런타임 메트릭 조회\n * @returns 현재 큐 상태 및 처리 상태\n */\n getMetrics() {\n const transportStatus = this.transportService.getQueueStatus();\n return {\n queueSize: transportStatus.queueSize,\n isProcessing: transportStatus.isProcessing\n };\n }\n /**\n * SDK 리소스 정리\n * @throws {VircleError} 정리 과정에서 에러 발생 시\n */\n async cleanup() {\n if (!this.isInitialized) {\n return;\n }\n const errors = [];\n try {\n await this.flush();\n } catch (error) {\n errors.push(\n new VircleError(\"FLUSH_FAILED\" /* FLUSH_FAILED */, \"Failed to flush events during cleanup\", {\n cause: error\n })\n );\n }\n try {\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"session-ended\");\n await this.pluginService.cleanup();\n }\n } catch (error) {\n errors.push(\n new VircleError(\"PLUGIN_ERROR\" /* PLUGIN_ERROR */, \"Failed to cleanup plugins\", { cause: error })\n );\n }\n this.transportService.clearQueue();\n try {\n this.eventService.dispose();\n const services = [this.storageService, this.contextService, this.transportService, this.pluginService];\n for (const service of services) {\n if (service && \"dispose\" in service && typeof service.dispose === \"function\") {\n try {\n service.dispose();\n } catch (error) {\n console.warn(\"[VircleCore] Error disposing service:\", error);\n }\n }\n }\n this.taskScheduler.clear();\n this.contextCache.clear();\n } catch (error) {\n errors.push(\n new VircleError(\"CLEANUP_ERROR\" /* CLEANUP_ERROR */, \"Failed to dispose services\", { cause: error })\n );\n }\n this.currentUser = void 0;\n this.sessionId = void 0;\n this.globalContext = {};\n this.isInitialized = false;\n if (errors.length > 0) {\n const errorMessage = `Cleanup completed with ${errors.length} error(s): ${errors.map((e) => e.message).join(\"; \")}`;\n if (this.options.debug) {\n console.error(\"[VircleCore] \" + errorMessage, errors);\n }\n throw new VircleError(\"CLEANUP_ERROR\" /* CLEANUP_ERROR */, errorMessage, { context: { errors } });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Cleanup completed successfully\");\n }\n }\n /**\n * Private 메서드\n */\n /**\n * SDK 초기화 상태 확인\n * @throws {VircleError} SDK 미초기화 상태 시\n */\n ensureInitialized() {\n if (!this.isInitialized) {\n throw new VircleError(\n \"SDK_NOT_INITIALIZED\" /* SDK_NOT_INITIALIZED */,\n \"Vircle SDK must be initialized before use. Call initialize() first.\"\n );\n }\n }\n /**\n * SDK 설정 검증\n * @throws {ConfigurationError} 설정 검증 실패 시\n */\n async validateConfiguration() {\n if (!this.configValidator) {\n return;\n }\n const validation = this.configValidator.validate(this.config);\n if (!validation.isValid) {\n throw new ConfigurationError(\"Invalid SDK configuration\", { context: { errors: validation.errors } });\n }\n if (this.options.debug && validation.warnings.length > 0) {\n console.warn(\"[VircleCore] Configuration warnings:\", validation.warnings);\n }\n }\n /**\n * 플러그인 초기화\n */\n async initializePlugins() {\n if (!this.config.plugins || !this.options.enablePlugins) {\n return;\n }\n const errors = [];\n for (const plugin of this.config.plugins) {\n try {\n await this.pluginService.register(plugin);\n if (this.options.debug) {\n console.log(`[VircleCore] Plugin auto-loaded: ${plugin.name}`);\n }\n } catch (error) {\n errors.push(error);\n if (this.options.debug) {\n console.warn(`[VircleCore] Failed to auto-load plugin '${plugin.name}':`, error);\n }\n }\n }\n if (errors.length > 0 && this.options.debug) {\n console.warn(`[VircleCore] Plugin initialization completed with ${errors.length} error(s)`);\n }\n }\n /**\n * 저장된 사용자 정보 로드\n */\n async loadPersistedUser() {\n try {\n const user = await this.storageService.get(STORAGE_KEYS.USER);\n if (user) {\n this.currentUser = user;\n if (this.options.debug) {\n console.log(\"[VircleCore] Loaded persisted user:\", user.id);\n }\n return;\n }\n } catch (error) {\n if (this.options.debug) {\n console.warn(\"[VircleCore] Failed to load persisted user:\", error);\n }\n }\n const anonymousUser = VircleUserFactory.create(\"\", {});\n this.currentUser = anonymousUser;\n try {\n await this.storageService.set(STORAGE_KEYS.USER, anonymousUser);\n } catch (error) {\n if (this.options.debug) {\n console.warn(\"[VircleCore] Failed to persist anonymous user:\", error);\n }\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Created anonymous user:\", anonymousUser.anonymousId);\n }\n }\n /**\n * 스토리지에서 세션을 복원하거나 새로 생성\n * MPA(멀티페이지 앱)에서 페이지 이동 시 세션 연속성을 보장한다.\n * localStorage에 세션 데이터를 저장하고, 30분 비활동 시 새 세션을 생성한다.\n */\n async restoreOrCreateSession() {\n try {\n const sessionData = await this.storageService.get(STORAGE_KEYS.SESSION);\n if (sessionData) {\n const elapsed = Date.now() - sessionData.lastActivity;\n if (elapsed < _VircleCore.SESSION_TIMEOUT_MS) {\n this.sessionId = sessionData.id;\n await this.persistSession(true);\n return;\n }\n }\n } catch {\n }\n this.sessionId = this.generateSessionId();\n await this.persistSession(true);\n }\n /**\n * 세션 데이터를 스토리지에 저장 (throttle 적용)\n * track() 호출마다 스토리지 쓰기를 방지하기 위해 10초 throttle 적용.\n * force=true는 세션 생성/복원 시 즉시 저장이 필요한 경우 사용.\n */\n async persistSession(force = false) {\n if (!this.sessionId) return;\n const now = Date.now();\n if (!force && now - this.lastSessionPersistTime < _VircleCore.SESSION_PERSIST_THROTTLE_MS) {\n return;\n }\n try {\n await this.storageService.set(STORAGE_KEYS.SESSION, {\n id: this.sessionId,\n lastActivity: now\n });\n this.lastSessionPersistTime = now;\n } catch {\n }\n }\n /**\n * 세션 ID 생성\n * @returns 새로운 세션 ID\n */\n generateSessionId() {\n return `sess_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n }\n};\n/** 세션 비활동 타임아웃: 30분 */\n_VircleCore.SESSION_TIMEOUT_MS = 30 * 60 * 1e3;\n/** 세션 갱신 throttle 간격: 10초 */\n_VircleCore.SESSION_PERSIST_THROTTLE_MS = 1e4;\nvar VircleCore = _VircleCore;\n\n// src/utils/RNIdleScheduler.ts\nvar RNIdleScheduler = class extends IdleScheduler {\n constructor() {\n super();\n this.handles = /* @__PURE__ */ new Map();\n this.nextId = 0;\n try {\n if (typeof global !== \"undefined\" && global.__fbBatchedBridge) {\n const RN = __require(\"react-native\");\n this.interactionManager = RN.InteractionManager;\n }\n } catch (e) {\n }\n }\n schedule(callback, options) {\n const id = this.nextId++;\n if (this.interactionManager) {\n let timeoutId;\n const handle = this.interactionManager.runAfterInteractions(async () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n this.handles.delete(id);\n try {\n await callback();\n } catch (error) {\n console.error(\"[RNIdleScheduler] Callback error:\", error);\n }\n });\n this.handles.set(id, handle);\n if (options?.timeout) {\n timeoutId = setTimeout(() => {\n if (this.handles.has(id)) {\n this.cancel(id);\n Promise.resolve(callback()).catch((error) => {\n console.error(\"[RNIdleScheduler] Timeout callback error:\", error);\n });\n }\n }, options.timeout);\n }\n } else {\n const timeout = setTimeout(async () => {\n this.handles.delete(id);\n try {\n await callback();\n } catch (error) {\n console.error(\"[RNIdleScheduler] Callback error:\", error);\n }\n }, 0);\n this.handles.set(id, timeout);\n }\n return id;\n }\n cancel(handle) {\n const item = this.handles.get(handle);\n if (item) {\n if (\"cancel\" in item) {\n item.cancel();\n } else {\n clearTimeout(item);\n }\n this.handles.delete(handle);\n }\n }\n cancelAll() {\n for (const [handle] of this.handles) {\n this.cancel(handle);\n }\n this.handles.clear();\n }\n};\n\nexport { CACHE_TIMES, ConfigurationError, ContextCache, ErrorCode, IdleScheduler, NetworkError, RNIdleScheduler, TaskScheduler, ValidationError, VircleCore, VircleError, WebIdleScheduler };\n//# sourceMappingURL=index.mjs.map\n//# sourceMappingURL=index.mjs.map",null,null,null,null,null,null,"// Browser polyfill for node-fetch\n// Simply export the global fetch API\nexport default typeof fetch !== 'undefined'\n ? fetch\n : () => {\n throw new Error('Fetch API is not available');\n };\n\nexport const Headers = window.Headers;\nexport const Request = window.Request;\nexport const Response = window.Response;\n",null],"names":["__require","x","require","Proxy","get","a","b","apply","this","arguments","Error","VircleUserFactory","create","userId","traits","anonymousId","now","Date","toISOString","id","generateAnonymousId","preferences","getDefaultPreferences","createdAt","updatedAt","Math","random","toString","substr","language","navigator","length","split","e","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","theme","notifications","email","push","sms","privacy","analytics","marketing","functional","ERROR_METADATA","UNKNOWN_ERROR","code","severity","category","retryable","userMessage","INITIALIZATION_ERROR","MISSING_API_KEY","troubleshooting","NETWORK_ERROR","REQUEST_TIMEOUT","VALIDATION_ERROR","EVENT_TOO_LARGE","STORAGE_UNAVAILABLE","PLUGIN_NOT_FOUND","FEATURE_NOT_SUPPORTED","CONSENT_REQUIRED","ENCRYPTION_ERROR","VircleError","_VircleError","constructor","message","options","defaultMetadata","super","name","timestamp","context","requestId","sessionId","cause","metadata","captureStackTrace","toJSON","stack","getUserMessage","getTroubleshooting","shouldRetry","fromHttpError","status","httpStatus","fromError","error","ConfigurationError","ValidationError","validationErrors","NetworkError","responseBody","PluginError","pluginName","StorageError","EventService","config","disposed","autoEnrich","enableValidation","maxEventSize","contextService","pluginService","storageService","transportService","track","event","processedEvent","processEvent","executeHook","debug","console","log","send","warn","createEvent","EventBuilderImpl","enrichEvent","eventSize","calculateEventSize","enriched","contextResult","collectAutoContext","mergeContext","contextError","onNonCriticalError","autoContext","userContext","Blob","JSON","stringify","size","dispose","isDisposed","eventService","properties","property","key","value","device","app","page","campaign","custom","build","ConfigService","getConfig","updateConfig","newConfig","set","ContextService","warnings","errors","autoCollect","deviceResult","collectDeviceInfo","appResult","collectAppInfo","isWebEnvironment","pageResult","collectPageInfo","userAgent","userAgentResult","collectUserAgent","referrer","referrerResult","collectReferrer","campaignResult","collectCampaignInfo","performance","performanceResult","collectPerformanceInfo","cachedDeviceInfo","isReactNativeEnvironment","type","includes","browser","chromeMatch","match","browserVersion","firefoxMatch","safariMatch","os","winMatch","osVersion","macMatch","replace","isMobileEnvironment","screen","screenResolution","width","height","window","innerWidth","innerHeight","viewport","cachedAppInfo","document","title","url","location","href","path","pathname","search","hash","metaTags","querySelectorAll","forEach","meta","getAttribute","content","Object","keys","urlParams","URLSearchParams","hasCampaignData","param","timing","navigation","loadTime","loadEventEnd","navigationStart","domReadyTime","domContentLoadedEventEnd","responseTime","responseEnd","requestStart","renderTime","navigationType","redirectCount","connection","connectionType","effectiveType","downlink","rtt","clearCache","product","test","PluginService","plugins","Map","eventHandlers","pluginEventHandlers","pluginStorage","maxExecutionTime","enableTimeout","errorHandling","setTrackFn","fn","trackFn","setIdentifyFn","identifyFn","register","plugin","validatePlugin","has","createPluginContext","initialize","executeWithTimeout","unregister","cleanupError","cleanup","delete","removePluginEventHandlers","hook","data","results","applicablePlugins","Array","from","values","filter","hooks","handler","result","pluginError","getPlugin","getPlugins","getPluginNames","hasPlugin","getPluginCount","executeLifecycle","lifecycle","lifecycleHook","getLifecycleHook","cleanupPromises","map","Promise","all","getPluginHealth","health","version","validHooks","self","on","Set","add","off","handlers","tracked","idx","findIndex","h","splice","emit","use","middleware","eventName","catch","identify","logger","args","info","storage","async","remove","operation","resolve","reject","timeout","setTimeout","then","clearTimeout","MemoryStorageAdapter","maxSize","store","item","ttl","oldestKey","next","clear","LocalStorageAdapter","prefix","localStorage","getItem","parsed","parse","setItem","fullKey","existed","removeItem","startsWith","substring","IndexedDBAdapter","dbName","dbVersion","storeName","db","indexedDB","initDB","request","open","onerror","onsuccess","onupgradeneeded","objectStoreNames","contains","createObjectStore","keyPath","transaction","objectStore","put","getRequest","deleteRequest","getAllKeys","count","StorageService","keyPrefix","adapter","createAdapter","finalTtl","getMultiple","setMultiple","items","entries","testStorageAvailability","getRecommendedStorageType","maskApiKey","apiKey","sanitizeConfig","sanitized","headers","toLowerCase","PriorityQueue","enqueue","priority","index","findInsertIndex","pop","dequeue","shift","extractByPriority","minPriority","extracted","remaining","extractBatch","i","extractOldItems","maxAge","peek","isEmpty","getStatsByPriority","stats","left","right","mid","floor","DEFAULT_EVENT_PRIORITY","purchase","payment","crash","signup","login","logout","click","submit","page_view","screen_view","scroll","heartbeat","session_extend","background_sync","cache_update","getEventPriority","customPriority","defaultPriority","nodeCrypto","CircuitBreaker","state","failures","successes","lastFailureTime","halfOpenRetries","requestVolume","failureThreshold","resetTimeout","volumeThreshold","errorThresholdPercentage","onStateChange","execute","isOpen","getNextRetryTime","onSuccess","onFailure","transitionTo","recordRequest","shouldOpen","newState","oldState","recentRequests","getRecentRequests","calculateErrorRate","success","cutoff","req","requests","getStats","errorRate","nextRetryTime","reset","trip","calculateBackoffDelay","attempt","baseDelay","maxDelay","delay","min","pow","jitter","round","global","EncryptionUtils","safeBase64Encode","buffer","Buffer","ArrayBuffer","byteOffset","byteLength","uint8Array","Uint8Array","chunks","chunkSize","chunk","subarray","String","fromCharCode","btoa","join","safeBase64Decode","base64","binaryString","atob","bytes","charCodeAt","encrypt","text","crypto","subtle","encryptWebCrypto","encryptNodeCrypto","keyBase64","TextEncoder","encode","keyData","cryptoKey","importKey","slice","ALGORITHM","KEY_LENGTH","iv","getRandomValues","IV_LENGTH","encrypted","crypto2","randomBytes","cipher","createCipheriv","update","concat","final","tag","getAuthTag","generateAESKey","generateKey","encryptAESKey","aesKey","publicKeyBase64","publicKeyData","publicKey","exportedKey","exportKey","encryptedKey","createPublicKey","format","publicEncrypt","oaepHash","padding","constants","RSA_PKCS1_OAEP_PADDING","encryptPayload","jsonStr","encryptedData","authTag","dataBuffer","ivBuffer","encryptedBuffer","tagLengthBytes","dataLength","encryptedDataBuffer","authTagBuffer","algorithm","keyAlgorithm","TAG_LENGTH","defaultValue","STORAGE_KEYS","ENCRYPTION_CONFIG","PUBLIC_KEY","API_ENDPOINTS","development","production","CDN_ENDPOINTS","TransportService","eventQueue","requestQueue","isProcessingQueue","isFlushingQueue","retryAttempts","retryDelay","batchSize","enableBatching","enableCompression","cryptoAdapter","circuitBreaker","setupAutoFlush","flushTimer","clearInterval","setInterval","flushPriorityQueue","batch","flushInterval","environment","scheduleNextTickFlush","pendingFlushTimer","sendBatch","events","totalEvents","successfulEvents","failedEvents","criticalEvents","highPriorityEvents","normalEvents","criticalResult","executeBatchRequest","highResult","normalResult","processQueue","batchEvents","currentSize","remainingCapacity","partialEvents","remainingEvents","unshift","eventIndex","requestResults","requestResult","r","lastError","makeHttpRequest","failureResult","payload","encryptionConfig","enabled","encryptedPayload","signature","secret","createHmacSignature","encoder","sign","padStart","encryptionError","warningTimeout","abortController","abortTimeout","promiseResolved","signal","requestBody","AbortController","abort","errorName","isSerializationError","method","body","response","fetch","ok","textPromise","timeoutPromise","_","race","statusCode","isRetryableHttpStatus","parsedBody","statusText","errorMessage","isAbortError","isTypeError","isNetworkError","isRetryableError","fetchModule","nodeFetch$1","nodeFetch","default","hasFetch","hasWindowFetch","some","keyword","ms","sendViaBeacon","sendBeacon","beacon","blob","flushViaBeacon","getQueueStatus","queueSize","isProcessing","flush","clearQueue","clearError","setEncryptionConfig","updateOptions","BaseValidator","rules","addRule","rule","removeRule","validate","isValid","validateRequired","fieldName","validateStringLength","max","validateNumberRange","isNaN","validateEnum","enumObject","validValues","validateUrl","URL","validateEmail","validateRequiredProperties","obj","requiredProps","objectName","prop","validateArray","array","itemValidator","isArray","warning","checkSecurity","suspiciousPatterns","pattern","EventValidator","maxEventNameLength","maxPropertyKeyLength","maxPropertyValueLength","maxPropertiesCount","allowedEventNamePattern","forbiddenPropertyNames","enableSecurityChecks","setupValidationRules","validateRequiredFields","validateEventName","validateProperties","validateContext","validateUserId","validateSessionId","validateTimestamp","validateEventSize","validateSecurity","propertyKeys","valueValidation","validatePropertyValue","valueType","securityCheck","Number","isFinite","nestedValidation","date","getTime","oneYearAgo","getFullYear","getMonth","getDate","oneHourFromNow","eventString","nameCheck","userIdCheck","sessionIdCheck","ConfigValidator","requireApiKey","allowedEnvironments","maxBatchSize","maxQueueSize","maxRetryAttempts","validateApiKey","validateEnvironment","validateBatchConfig","validateQueueConfig","queue","validateRetryConfig","retry","validateTransportConfig","transport","validateStorageConfig","validatePluginConfig","validateAutoCollectConfig","validatePrivacyConfig","validateHeaders","apiKeyValidation","isTestKey","hasInvalidPattern","reduce","env","sizeValidation","timeoutValidation","maxBytes","maxBytesValidation","workers","workersValidation","strategy","validStrategies","fifo","lifo","strategyValidation","maxAttempts","attemptsValidation","initialDelay","delayValidation","maxDelayValidation","multiplier","multiplierValidation","connectionTimeout","connTimeoutValidation","validTypes","memory","file","typeValidation","pluginNames","booleanProps","normalizeEventName","trim","mergeEventProperties","base","override","merged","cloneValue","mergeEventContext","seen","WeakSet","val","normalizeTimestamp","ContextCache","cache","pendingCollectors","cacheTime","getCacheKey","getOrCollect","collector","cached","pending","collectPromise","invalidate","targetKey","setCacheTime","IdleScheduler","WebIdleScheduler","handles","schedule","callback","handle","requestIdleCallback","deadline","cancel","cancelIdleCallback","cancelAll","DefaultIdleScheduler","nextId","TaskScheduler","scheduler","task","sort","scheduleProcessing","getEnv","STORAGE_CACHE_PREFIX","RemoteConfigService","_RemoteConfigService","configCache","configPromises","CACHE_DURATION","cacheTimestamps","getInstance","instance","getProjectConfig","memoryCached","getCachedConfig","storageCached","getStorageCachedConfig","setCachedConfig","existingPromise","configPromise","fetchConfig","setStorageCachedConfig","projectId","extractProjectId","fetchFromCDN","cdnError","Accept","mode","json","validateConfig","hashApiKey","abs","requestedEnvironment","isValidPublicKey","features","encryption","compression","batching","settings","getDefaultConfig","raw","keysToRemove","_VircleCore","isInitialized","globalContext","lastSessionPersistTime","enableAutoContext","enablePlugins","pluginTimeout","storageType","configService","storageAdapter","remoteConfigService","eventValidator","configValidator","contextCache","contextCacheTime","idleScheduler","taskScheduler","validateConfiguration","remoteConfig","enableEncryption","maxRetries","configError","loadPersistedUser","restoreOrCreateSession","initializePlugins","user","currentUser","ensureInitialized","validation","persistSession","trackBatch","vircleEvents","storageError","trackError","getAnonymousId","setSessionId","setContext","clearContext","registerPlugin","unregisterPlugin","mergedConfig","timeoutMs","generateSessionId","getStatus","pluginCount","getMetrics","transportStatus","services","service","anonymousUser","sessionData","lastActivity","SESSION_TIMEOUT_MS","force","SESSION_PERSIST_THROTTLE_MS","VircleCore","WebContextCollector","collect","collectDeviceContext","collectPageContext","collectAppContext","collectCustomContext","collectCampaignContext","ua","platform","getDeviceType","getOS","getOSVersion","getBrowser","getBrowserVersion","getAppName","getAppVersion","getEnvironment","cookieEnabled","doNotTrack","nav","saveData","perf","usedJSHeapSize","totalJSHeapSize","jsHeapSizeLimit","undefined","params","allKeys","CAMPAIGN_PARAMS_MAP","hasUrlCampaign","sessionStorage","STORAGE_PREFIX","hasParams","paramKey","contextKey","stored","appNameMeta","querySelector","ogSiteName","versionMeta","hostname","utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","msclkid","ttclid","VircleWebError","details","VircleStorageError","isAvailable","checkAvailability","testKey","getKey","getFullKey","serialized","clearOldItems","retryError","parseError","prefixedKeys","deleteCount","setWithTimestamp","initPromise","isClosed","init","openDB","target","createIndex","unique","openCursor","keysToDelete","cursor","continue","deletePromises","resolveDelete","rejectDelete","percentage","primaryKey","close","StorageFactory","createAuto","createAsync","createAutoAsync","isIndexedDBAvailableAsync","isIndexedDBAvailable","deleteDatabase","onblocked","isLocalStorageAvailable","WebExtendedCryptoAdapter","available","initCrypto","globalThis","generateUUID","randomUUID","hex","c","arrayBufferToHex","step","dataBytes","tagLength","encryptedBytes","ciphertext","rawAesKey","rsaPublicKey","importRsaPublicKey","arrayBufferToBase64","cleanedKey","base64ToArrayBuffer","binary","Headers","Request","Response","storagePrefix","pageViewTracked","lastActivityTime","webConfig","webOptions","flushOnUnload","contextCollector","sessionTimeout","setupAutoTracking","trackPageViews","trackPageView","pageContext","mergedContext","getCachedContext","unloadHandler","addEventListener","visibilityChangeHandler","visibilityState","checkSessionTimeout","trackErrors","setupErrorTracking","trackClicks","setupClickTracking","trackForms","setupFormTracking","singlePageApp","setupSPATracking","errorHandler","source","filename","line","lineno","column","colno","unhandledRejectionHandler","reason","promise","clickHandler","shouldTrackElement","extractElementProperties","submitHandler","form","form_id","form_name","form_action","action","form_method","originalPushState","history","pushState","originalReplaceState","replaceState","wrappedPush","handleRouteChange","__vircle_wrapped","wrappedReplace","popstateHandler","elapsed","newSessionId","previous_session_duration","element","hasAttribute","parent","parentElement","tagName","tag_name","element_id","element_class","className","element_href","element_text","textContent","dataAttributes","attributes","attr","data_attributes","removeEventListener","getCurrentUrl","isOnline","onLine"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vircle-web-sdk.min.js","sources":["../../core-ts/dist/index.mjs","../src/context/WebContextCollector.ts","../src/errors/VircleWebError.ts","../src/storage/LocalStorageAdapter.ts","../src/storage/IndexedDBAdapter.ts","../src/storage/StorageFactory.ts","../src/crypto/WebExtendedCryptoAdapter.ts","../src/polyfills/node-fetch.js","../src/VircleWeb.ts"],"sourcesContent":["var __require = /* @__PURE__ */ ((x) => typeof require !== \"undefined\" ? require : typeof Proxy !== \"undefined\" ? new Proxy(x, {\n get: (a, b) => (typeof require !== \"undefined\" ? require : a)[b]\n}) : x)(function(x) {\n if (typeof require !== \"undefined\") return require.apply(this, arguments);\n throw Error('Dynamic require of \"' + x + '\" is not supported');\n});\n\n// src/models/User.ts\nvar VircleUserFactory = class {\n /**\n * Create a new VircleUser with defaults\n */\n static create(userId, traits, anonymousId) {\n const now = (/* @__PURE__ */ new Date()).toISOString();\n return {\n id: userId || void 0,\n anonymousId: anonymousId || this.generateAnonymousId(),\n traits: traits || {},\n preferences: this.getDefaultPreferences(),\n createdAt: now,\n updatedAt: now\n };\n }\n /**\n * Generate a new anonymous ID\n */\n static generateAnonymousId() {\n return `anon_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n /**\n * Get default user preferences\n * This method safely handles browser-specific APIs (navigator.language, Intl)\n * to support both web and React Native environments without errors\n */\n static getDefaultPreferences() {\n let language = \"en\";\n try {\n if (typeof navigator !== \"undefined\" && navigator && \"language\" in navigator && typeof navigator.language === \"string\" && navigator.language.length > 0) {\n language = navigator.language.split(\"-\")[0];\n }\n } catch (e) {\n }\n let timezone = \"UTC\";\n try {\n if (typeof Intl !== \"undefined\" && Intl && Intl.DateTimeFormat) {\n const options = Intl.DateTimeFormat().resolvedOptions();\n timezone = options.timeZone || \"UTC\";\n }\n } catch (e) {\n }\n return {\n language,\n timezone,\n theme: \"auto\",\n notifications: {\n email: false,\n push: false,\n sms: false\n },\n privacy: {\n analytics: true,\n marketing: false,\n functional: true\n }\n };\n }\n};\n\n// src/errors/ErrorCodes.ts\nvar ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {\n ErrorCode2[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n ErrorCode2[\"INITIALIZATION_ERROR\"] = \"INITIALIZATION_ERROR\";\n ErrorCode2[\"SDK_INITIALIZATION_FAILED\"] = \"SDK_INITIALIZATION_FAILED\";\n ErrorCode2[\"SDK_NOT_INITIALIZED\"] = \"SDK_NOT_INITIALIZED\";\n ErrorCode2[\"NOT_INITIALIZED\"] = \"NOT_INITIALIZED\";\n ErrorCode2[\"ALREADY_INITIALIZED\"] = \"ALREADY_INITIALIZED\";\n ErrorCode2[\"INVALID_CONFIGURATION\"] = \"INVALID_CONFIGURATION\";\n ErrorCode2[\"MISSING_API_KEY\"] = \"MISSING_API_KEY\";\n ErrorCode2[\"INVALID_API_KEY\"] = \"INVALID_API_KEY\";\n ErrorCode2[\"MISSING_ENDPOINT\"] = \"MISSING_ENDPOINT\";\n ErrorCode2[\"INVALID_ENDPOINT\"] = \"INVALID_ENDPOINT\";\n ErrorCode2[\"CONFIG_UPDATE_FAILED\"] = \"CONFIG_UPDATE_FAILED\";\n ErrorCode2[\"VALIDATION_ERROR\"] = \"VALIDATION_ERROR\";\n ErrorCode2[\"EVENT_TOO_LARGE\"] = \"EVENT_TOO_LARGE\";\n ErrorCode2[\"INVALID_EVENT_NAME\"] = \"INVALID_EVENT_NAME\";\n ErrorCode2[\"INVALID_EVENT_PROPERTIES\"] = \"INVALID_EVENT_PROPERTIES\";\n ErrorCode2[\"BATCH_PROCESSING_FAILED\"] = \"BATCH_PROCESSING_FAILED\";\n ErrorCode2[\"EVENT_QUEUE_FULL\"] = \"EVENT_QUEUE_FULL\";\n ErrorCode2[\"EVENT_TRACKING_FAILED\"] = \"EVENT_TRACKING_FAILED\";\n ErrorCode2[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n ErrorCode2[\"REQUEST_TIMEOUT\"] = \"REQUEST_TIMEOUT\";\n ErrorCode2[\"REQUEST_FAILED\"] = \"REQUEST_FAILED\";\n ErrorCode2[\"UNAUTHORIZED\"] = \"UNAUTHORIZED\";\n ErrorCode2[\"FORBIDDEN\"] = \"FORBIDDEN\";\n ErrorCode2[\"NOT_FOUND\"] = \"NOT_FOUND\";\n ErrorCode2[\"TOO_MANY_REQUESTS\"] = \"TOO_MANY_REQUESTS\";\n ErrorCode2[\"SERVER_ERROR\"] = \"SERVER_ERROR\";\n ErrorCode2[\"SERVICE_UNAVAILABLE\"] = \"SERVICE_UNAVAILABLE\";\n ErrorCode2[\"REMOTE_CONFIG_FETCH_FAILED\"] = \"REMOTE_CONFIG_FETCH_FAILED\";\n ErrorCode2[\"STORAGE_ERROR\"] = \"STORAGE_ERROR\";\n ErrorCode2[\"STORAGE_FULL\"] = \"STORAGE_FULL\";\n ErrorCode2[\"STORAGE_UNAVAILABLE\"] = \"STORAGE_UNAVAILABLE\";\n ErrorCode2[\"STORAGE_NOT_AVAILABLE\"] = \"STORAGE_NOT_AVAILABLE\";\n ErrorCode2[\"STORAGE_QUOTA_EXCEEDED\"] = \"STORAGE_QUOTA_EXCEEDED\";\n ErrorCode2[\"SERIALIZATION_ERROR\"] = \"SERIALIZATION_ERROR\";\n ErrorCode2[\"DESERIALIZATION_ERROR\"] = \"DESERIALIZATION_ERROR\";\n ErrorCode2[\"PLUGIN_ERROR\"] = \"PLUGIN_ERROR\";\n ErrorCode2[\"PLUGIN_NOT_FOUND\"] = \"PLUGIN_NOT_FOUND\";\n ErrorCode2[\"PLUGIN_NOT_ENABLED\"] = \"PLUGIN_NOT_ENABLED\";\n ErrorCode2[\"PLUGIN_ALREADY_REGISTERED\"] = \"PLUGIN_ALREADY_REGISTERED\";\n ErrorCode2[\"PLUGIN_INITIALIZATION_FAILED\"] = \"PLUGIN_INITIALIZATION_FAILED\";\n ErrorCode2[\"PLUGIN_VALIDATION_FAILED\"] = \"PLUGIN_VALIDATION_FAILED\";\n ErrorCode2[\"PLUGIN_HOOK_FAILED\"] = \"PLUGIN_HOOK_FAILED\";\n ErrorCode2[\"PLUGIN_DEPENDENCY_ERROR\"] = \"PLUGIN_DEPENDENCY_ERROR\";\n ErrorCode2[\"DEVICE_INFO_UNAVAILABLE\"] = \"DEVICE_INFO_UNAVAILABLE\";\n ErrorCode2[\"GEOLOCATION_ERROR\"] = \"GEOLOCATION_ERROR\";\n ErrorCode2[\"PERMISSION_DENIED\"] = \"PERMISSION_DENIED\";\n ErrorCode2[\"INVALID_USER_ID\"] = \"INVALID_USER_ID\";\n ErrorCode2[\"INVALID_SESSION_ID\"] = \"INVALID_SESSION_ID\";\n ErrorCode2[\"SESSION_EXPIRED\"] = \"SESSION_EXPIRED\";\n ErrorCode2[\"USER_NOT_IDENTIFIED\"] = \"USER_NOT_IDENTIFIED\";\n ErrorCode2[\"USER_IDENTIFICATION_FAILED\"] = \"USER_IDENTIFICATION_FAILED\";\n ErrorCode2[\"FEATURE_NOT_SUPPORTED\"] = \"FEATURE_NOT_SUPPORTED\";\n ErrorCode2[\"FEATURE_DISABLED\"] = \"FEATURE_DISABLED\";\n ErrorCode2[\"BROWSER_NOT_SUPPORTED\"] = \"BROWSER_NOT_SUPPORTED\";\n ErrorCode2[\"CONSENT_REQUIRED\"] = \"CONSENT_REQUIRED\";\n ErrorCode2[\"CONSENT_DENIED\"] = \"CONSENT_DENIED\";\n ErrorCode2[\"PRIVACY_MODE_ENABLED\"] = \"PRIVACY_MODE_ENABLED\";\n ErrorCode2[\"FLUSH_FAILED\"] = \"FLUSH_FAILED\";\n ErrorCode2[\"CLEANUP_ERROR\"] = \"CLEANUP_ERROR\";\n ErrorCode2[\"SERVICE_DISPOSED\"] = \"SERVICE_DISPOSED\";\n ErrorCode2[\"ENCRYPTION_ERROR\"] = \"ENCRYPTION_ERROR\";\n return ErrorCode2;\n})(ErrorCode || {});\nvar ERROR_METADATA = {\n [\"UNKNOWN_ERROR\" /* UNKNOWN_ERROR */]: {\n code: \"UNKNOWN_ERROR\" /* UNKNOWN_ERROR */,\n severity: \"high\" /* HIGH */,\n category: \"system\" /* SYSTEM */,\n retryable: false,\n userMessage: \"An unknown error occurred\"\n },\n [\"INITIALIZATION_ERROR\" /* INITIALIZATION_ERROR */]: {\n code: \"INITIALIZATION_ERROR\" /* INITIALIZATION_ERROR */,\n severity: \"critical\" /* CRITICAL */,\n category: \"configuration\" /* CONFIGURATION */,\n retryable: false,\n userMessage: \"Failed to initialize SDK\"\n },\n [\"MISSING_API_KEY\" /* MISSING_API_KEY */]: {\n code: \"MISSING_API_KEY\" /* MISSING_API_KEY */,\n severity: \"critical\" /* CRITICAL */,\n category: \"configuration\" /* CONFIGURATION */,\n retryable: false,\n userMessage: \"API key is required\",\n troubleshooting: [\"Check that apiKey is provided in configuration\", \"Verify API key is not empty or null\"]\n },\n [\"NETWORK_ERROR\" /* NETWORK_ERROR */]: {\n code: \"NETWORK_ERROR\" /* NETWORK_ERROR */,\n severity: \"medium\" /* MEDIUM */,\n category: \"network\" /* NETWORK */,\n retryable: true,\n userMessage: \"Network connection failed\"\n },\n [\"REQUEST_TIMEOUT\" /* REQUEST_TIMEOUT */]: {\n code: \"REQUEST_TIMEOUT\" /* REQUEST_TIMEOUT */,\n severity: \"medium\" /* MEDIUM */,\n category: \"network\" /* NETWORK */,\n retryable: true,\n userMessage: \"Request timed out\"\n },\n [\"VALIDATION_ERROR\" /* VALIDATION_ERROR */]: {\n code: \"VALIDATION_ERROR\" /* VALIDATION_ERROR */,\n severity: \"medium\" /* MEDIUM */,\n category: \"validation\" /* VALIDATION */,\n retryable: false,\n userMessage: \"Data validation failed\"\n },\n [\"EVENT_TOO_LARGE\" /* EVENT_TOO_LARGE */]: {\n code: \"EVENT_TOO_LARGE\" /* EVENT_TOO_LARGE */,\n severity: \"medium\" /* MEDIUM */,\n category: \"validation\" /* VALIDATION */,\n retryable: false,\n userMessage: \"Event size exceeds maximum limit\",\n troubleshooting: [\n \"Reduce event payload size\",\n \"Remove unnecessary properties\",\n \"Consider splitting large events\"\n ]\n },\n [\"STORAGE_UNAVAILABLE\" /* STORAGE_UNAVAILABLE */]: {\n code: \"STORAGE_UNAVAILABLE\" /* STORAGE_UNAVAILABLE */,\n severity: \"high\" /* HIGH */,\n category: \"storage\" /* STORAGE */,\n retryable: false,\n userMessage: \"Storage is not available\"\n },\n [\"PLUGIN_NOT_FOUND\" /* PLUGIN_NOT_FOUND */]: {\n code: \"PLUGIN_NOT_FOUND\" /* PLUGIN_NOT_FOUND */,\n severity: \"medium\" /* MEDIUM */,\n category: \"plugin\" /* PLUGIN */,\n retryable: false,\n userMessage: \"Plugin not found\"\n },\n [\"FEATURE_NOT_SUPPORTED\" /* FEATURE_NOT_SUPPORTED */]: {\n code: \"FEATURE_NOT_SUPPORTED\" /* FEATURE_NOT_SUPPORTED */,\n severity: \"low\" /* LOW */,\n category: \"feature\" /* FEATURE */,\n retryable: false,\n userMessage: \"Feature is not supported in this environment\"\n },\n [\"CONSENT_REQUIRED\" /* CONSENT_REQUIRED */]: {\n code: \"CONSENT_REQUIRED\" /* CONSENT_REQUIRED */,\n severity: \"medium\" /* MEDIUM */,\n category: \"privacy\" /* PRIVACY */,\n retryable: false,\n userMessage: \"User consent is required for data collection\"\n },\n [\"ENCRYPTION_ERROR\" /* ENCRYPTION_ERROR */]: {\n code: \"ENCRYPTION_ERROR\" /* ENCRYPTION_ERROR */,\n severity: \"high\" /* HIGH */,\n category: \"system\" /* SYSTEM */,\n retryable: false,\n userMessage: \"Data encryption failed\",\n troubleshooting: [\n \"Ensure the provided public key is valid and in the correct format (DER-encoded SPKI, then Base64)\",\n \"Verify that the crypto environment (Web Crypto API or Node.js crypto) is available and not corrupted\"\n ]\n }\n // Add metadata for all other error codes...\n // (Truncated for brevity - in real implementation, include all)\n};\n\n// src/errors/VircleError.ts\nvar VircleError = class _VircleError extends Error {\n constructor(code, message, options = {}) {\n const defaultMetadata = ERROR_METADATA[code] || ERROR_METADATA[\"UNKNOWN_ERROR\" /* UNKNOWN_ERROR */];\n const finalMessage = message || defaultMetadata.userMessage || `Error: ${code}`;\n super(finalMessage);\n this.name = \"VircleError\";\n this.code = code;\n this.timestamp = options.timestamp || (/* @__PURE__ */ new Date()).toISOString();\n this.context = options.context || {};\n this.requestId = options.requestId;\n this.userId = options.userId;\n this.sessionId = options.sessionId;\n this.cause = options.cause;\n this.metadata = {\n ...defaultMetadata,\n ...options.metadata\n };\n this.severity = this.metadata.severity;\n this.category = this.metadata.category;\n this.retryable = this.metadata.retryable;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, _VircleError);\n }\n }\n /**\n * Convert error to JSON for logging/reporting\n */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n severity: this.severity,\n category: this.category,\n retryable: this.retryable,\n timestamp: this.timestamp,\n context: this.context,\n requestId: this.requestId,\n userId: this.userId,\n sessionId: this.sessionId,\n stack: this.stack,\n cause: this.cause ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack\n } : void 0,\n metadata: this.metadata\n };\n }\n /**\n * Get user-friendly error message\n */\n getUserMessage() {\n return this.metadata.userMessage || this.message;\n }\n /**\n * Get troubleshooting suggestions\n */\n getTroubleshooting() {\n return this.metadata.troubleshooting || [];\n }\n /**\n * Check if error should be retried\n */\n shouldRetry() {\n return this.retryable;\n }\n /**\n * Create error from HTTP response\n */\n static fromHttpError(status, message, options = {}) {\n let code;\n switch (status) {\n case 400:\n code = \"VALIDATION_ERROR\" /* VALIDATION_ERROR */;\n break;\n case 401:\n code = \"UNAUTHORIZED\" /* UNAUTHORIZED */;\n break;\n case 403:\n code = \"FORBIDDEN\" /* FORBIDDEN */;\n break;\n case 404:\n code = \"NOT_FOUND\" /* NOT_FOUND */;\n break;\n case 408:\n code = \"REQUEST_TIMEOUT\" /* REQUEST_TIMEOUT */;\n break;\n case 413:\n code = \"EVENT_TOO_LARGE\" /* EVENT_TOO_LARGE */;\n break;\n case 429:\n code = \"TOO_MANY_REQUESTS\" /* TOO_MANY_REQUESTS */;\n break;\n case 500:\n case 502:\n code = \"SERVER_ERROR\" /* SERVER_ERROR */;\n break;\n case 503:\n code = \"SERVICE_UNAVAILABLE\" /* SERVICE_UNAVAILABLE */;\n break;\n case 504:\n code = \"REQUEST_TIMEOUT\" /* REQUEST_TIMEOUT */;\n break;\n default:\n code = \"NETWORK_ERROR\" /* NETWORK_ERROR */;\n }\n return new _VircleError(code, message, {\n ...options,\n context: {\n ...options.context,\n httpStatus: status\n }\n });\n }\n /**\n * Create error from JavaScript Error\n */\n static fromError(error, code = \"UNKNOWN_ERROR\" /* UNKNOWN_ERROR */, options = {}) {\n return new _VircleError(code, error.message, {\n ...options,\n cause: error\n });\n }\n};\nvar ConfigurationError = class extends VircleError {\n constructor(message, options = {}) {\n super(\"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */, message, options);\n this.name = \"ConfigurationError\";\n }\n};\nvar ValidationError = class extends VircleError {\n constructor(message, validationErrors = [], options = {}) {\n super(\"VALIDATION_ERROR\" /* VALIDATION_ERROR */, message, options);\n this.name = \"ValidationError\";\n this.validationErrors = validationErrors;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n validationErrors: this.validationErrors\n };\n }\n};\nvar NetworkError = class extends VircleError {\n constructor(message, httpStatus, options = {}) {\n const code = httpStatus ? httpStatus >= 500 ? \"SERVER_ERROR\" /* SERVER_ERROR */ : \"NETWORK_ERROR\" /* NETWORK_ERROR */ : \"NETWORK_ERROR\" /* NETWORK_ERROR */;\n super(code, message, options);\n this.name = \"NetworkError\";\n this.httpStatus = httpStatus;\n this.responseBody = options.context?.responseBody;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n httpStatus: this.httpStatus,\n responseBody: this.responseBody\n };\n }\n};\nvar PluginError = class extends VircleError {\n constructor(pluginName, message, code = \"PLUGIN_ERROR\" /* PLUGIN_ERROR */, options = {}) {\n super(code, message, {\n ...options,\n context: {\n ...options.context,\n pluginName\n }\n });\n this.name = \"PluginError\";\n this.pluginName = pluginName;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n pluginName: this.pluginName\n };\n }\n};\nvar StorageError = class extends VircleError {\n constructor(message, code = \"STORAGE_ERROR\" /* STORAGE_ERROR */, options = {}) {\n super(code, message, options);\n this.name = \"StorageError\";\n }\n};\n\n// src/services/EventService.ts\nvar EventService = class {\n constructor(config, options = {}) {\n this.disposed = false;\n this.config = config;\n this.options = {\n autoEnrich: true,\n enableValidation: true,\n maxEventSize: 1024 * 100,\n // 100KB\n ...options\n };\n this.contextService = options.contextService;\n this.pluginService = options.pluginService;\n this.storageService = options.storageService;\n this.transportService = options.transportService;\n }\n /**\n * 이벤트 추적\n * @param event - 추적할 이벤트\n * @throws {VircleError} 이벤트 처리 실패 시\n */\n async track(event) {\n if (this.disposed) {\n throw new VircleError(\"SERVICE_DISPOSED\" /* SERVICE_DISPOSED */, \"EventService has been disposed\");\n }\n try {\n let processedEvent = await this.processEvent(event);\n if (this.pluginService) {\n processedEvent = await this.pluginService.executeHook(\"beforeEventSend\", processedEvent);\n }\n if (this.transportService) {\n if (this.config.debug) {\n console.log(\"[EventService] Sending event to transport:\", processedEvent.name);\n }\n await this.transportService.send(processedEvent);\n if (this.config.debug) {\n console.log(\"[EventService] Event sent to transport successfully:\", processedEvent.name);\n }\n } else {\n if (this.config.debug) {\n console.warn(\"[EventService] No transport service available\");\n }\n }\n if (this.pluginService) {\n await this.pluginService.executeHook(\"afterEventSend\", processedEvent);\n }\n } catch (error) {\n if (this.pluginService) {\n await this.pluginService.executeHook(\"onError\", {\n error,\n context: { event }\n });\n }\n throw error;\n }\n }\n /**\n * 이벤트 빌더 생성\n * @param name - 초기 이벤트 이름\n * @returns EventBuilder 인스턴스\n */\n createEvent(name) {\n return new EventBuilderImpl(this, name);\n }\n /**\n * 이벤트 내부 처리\n * @param event - 처리할 이벤트\n * @returns 처리된 이벤트\n * @throws {VircleError} 이벤트 크기 초과 시\n */\n async processEvent(event) {\n let processedEvent = { ...event };\n if (this.options.autoEnrich) {\n processedEvent = await this.enrichEvent(processedEvent);\n }\n if (this.options.maxEventSize) {\n const eventSize = this.calculateEventSize(processedEvent);\n if (eventSize > this.options.maxEventSize) {\n throw new VircleError(\n \"EVENT_TOO_LARGE\" /* EVENT_TOO_LARGE */,\n `Event size (${eventSize} bytes) exceeds maximum allowed size (${this.options.maxEventSize} bytes)`\n );\n }\n }\n return processedEvent;\n }\n /**\n * 이벤트 자동 컨텍스트 보강\n * @param event - 보강할 이벤트\n * @returns 보강된 이벤트\n */\n async enrichEvent(event) {\n const enriched = { ...event };\n if (!enriched.timestamp) {\n enriched.timestamp = (/* @__PURE__ */ new Date()).toISOString();\n }\n if (this.contextService) {\n try {\n const contextResult = await this.contextService.collectAutoContext();\n if (contextResult.context) {\n enriched.context = this.mergeContext(contextResult.context, enriched.context || {});\n }\n } catch (error) {\n const contextError = new Error(`Failed to collect auto context: ${error.message}`);\n if (this.options.onNonCriticalError) {\n this.options.onNonCriticalError(contextError);\n }\n }\n }\n return enriched;\n }\n /**\n * 컨텍스트 안전 병합\n * @param autoContext - 자동 수집된 컨텍스트\n * @param userContext - 사용자 정의 컨텍스트\n * @returns 병합된 컨텍스트\n */\n mergeContext(autoContext, userContext) {\n return {\n ...autoContext,\n ...userContext\n };\n }\n /**\n * 이벤트 크기 계산\n * @param event - 크기를 계산할 이벤트\n * @returns 바이트 단위 크기\n */\n calculateEventSize(event) {\n try {\n return new Blob([JSON.stringify(event)]).size;\n } catch {\n return JSON.stringify(event).length * 2;\n }\n }\n /**\n * 서비스 리소스 정리\n * 메모리 누수 방지를 위한 정리 메서드\n */\n dispose() {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.contextService = void 0;\n this.pluginService = void 0;\n this.storageService = void 0;\n this.transportService = void 0;\n this.config = {};\n this.options = {};\n }\n /**\n * 서비스 폐기 상태 확인\n * @returns 폐기 여부\n */\n isDisposed() {\n return this.disposed;\n }\n};\nvar EventBuilderImpl = class {\n constructor(eventService, name) {\n this.event = {};\n this.eventService = eventService;\n if (name) {\n this.event.name = name;\n }\n }\n /**\n * 이벤트 이름 설정\n * @param name - 이벤트 이름\n * @returns EventBuilder 인스턴스\n */\n name(name) {\n this.event.name = name;\n return this;\n }\n /**\n * 사용자 ID 설정\n * @param userId - 사용자 ID\n * @returns EventBuilder 인스턴스\n */\n userId(userId) {\n this.event.userId = userId;\n return this;\n }\n /**\n * 세션 ID 설정\n * @param sessionId - 세션 ID\n * @returns EventBuilder 인스턴스\n */\n sessionId(sessionId) {\n this.event.sessionId = sessionId;\n return this;\n }\n /**\n * 이벤트 속성 일괄 설정\n * @param properties - 설정할 속성\n * @returns EventBuilder 인스턴스\n */\n properties(properties) {\n this.event.properties = { ...this.event.properties, ...properties };\n return this;\n }\n /**\n * 이벤트 속성 개별 설정\n * @param key - 속성 키\n * @param value - 속성 값\n * @returns EventBuilder 인스턴스\n */\n property(key, value) {\n if (!this.event.properties) {\n this.event.properties = {};\n }\n this.event.properties[key] = value;\n return this;\n }\n /**\n * 컨텍스트 설정\n * @param context - 설정할 컨텍스트\n * @returns EventBuilder 인스턴스\n */\n context(context) {\n this.event.context = { ...this.event.context, ...context };\n return this;\n }\n /**\n * 디바이스 컨텍스트 설정\n * @param device - 디바이스 정보\n * @returns EventBuilder 인스턴스\n */\n device(device) {\n if (!this.event.context) {\n this.event.context = {};\n }\n this.event.context.device = { ...this.event.context.device, ...device };\n return this;\n }\n /**\n * 앱 컨텍스트 설정\n * @param app - 앱 정보\n * @returns EventBuilder 인스턴스\n */\n app(app) {\n if (!this.event.context) {\n this.event.context = {};\n }\n this.event.context.app = { ...this.event.context.app, ...app };\n return this;\n }\n /**\n * 페이지 컨텍스트 설정\n * @param page - 페이지 정보\n * @returns EventBuilder 인스턴스\n */\n page(page) {\n if (!this.event.context) {\n this.event.context = {};\n }\n this.event.context.page = { ...this.event.context.page, ...page };\n return this;\n }\n /**\n * 캠페인 컨텍스트 설정\n * @param campaign - 캠페인 정보\n * @returns EventBuilder 인스턴스\n */\n campaign(campaign) {\n if (!this.event.context) {\n this.event.context = {};\n }\n this.event.context.campaign = { ...this.event.context.campaign, ...campaign };\n return this;\n }\n /**\n * 커스텀 컨텍스트 설정\n * @param key - 컨텍스트 키\n * @param value - 컨텍스트 값\n * @returns EventBuilder 인스턴스\n */\n custom(key, value) {\n if (!this.event.context) {\n this.event.context = {};\n }\n if (!this.event.context.custom) {\n this.event.context.custom = {};\n }\n this.event.context.custom[key] = value;\n return this;\n }\n /**\n * 이벤트 추적 실행\n * @returns Promise<void>\n * @throws {VircleError} 이벤트 이름 누락 시\n */\n track() {\n const event = this.build();\n return this.eventService.track(event);\n }\n /**\n * 이벤트 객체 빌드\n * @returns 완성된 이벤트 객체\n * @throws {VircleError} 이벤트 이름 누락 시\n */\n build() {\n if (!this.event.name) {\n throw new VircleError(\"VALIDATION_ERROR\" /* VALIDATION_ERROR */, \"Event name is required\");\n }\n return {\n name: this.event.name,\n timestamp: this.event.timestamp,\n userId: this.event.userId,\n sessionId: this.event.sessionId,\n properties: this.event.properties || {},\n context: this.event.context || {}\n };\n }\n};\n\n// src/services/ConfigService.ts\nvar ConfigService = class {\n constructor(config) {\n this.config = { ...config };\n }\n /**\n * 현재 설정 반환\n */\n getConfig() {\n return { ...this.config };\n }\n /**\n * 설정 업데이트\n */\n updateConfig(newConfig) {\n this.config = { ...this.config, ...newConfig };\n }\n /**\n * 특정 설정 값 가져오기\n */\n get(key) {\n return this.config[key];\n }\n /**\n * 특정 설정 값 설정하기\n */\n set(key, value) {\n this.config[key] = value;\n }\n};\n\n// src/services/ContextService.ts\nvar ContextService = class {\n constructor(config) {\n this.config = config;\n }\n /**\n * 설정에 따른 자동 컨텍스트 수집\n * @returns 수집된 컨텍스트 결과\n */\n async collectAutoContext() {\n const context = {};\n const warnings = [];\n const errors = [];\n const autoCollect = this.config.autoCollect || {};\n try {\n if (autoCollect.device) {\n const deviceResult = await this.collectDeviceInfo();\n if (deviceResult.device) {\n context.device = deviceResult.device;\n }\n warnings.push(...deviceResult.warnings || []);\n errors.push(...deviceResult.errors || []);\n }\n if (autoCollect.app) {\n const appResult = await this.collectAppInfo();\n if (appResult.app) {\n context.app = appResult.app;\n }\n warnings.push(...appResult.warnings || []);\n errors.push(...appResult.errors || []);\n }\n if (autoCollect.page && this.isWebEnvironment()) {\n const pageResult = this.collectPageInfo();\n if (pageResult.page) {\n context.page = pageResult.page;\n }\n warnings.push(...pageResult.warnings || []);\n }\n if (autoCollect.userAgent) {\n const userAgentResult = this.collectUserAgent();\n if (userAgentResult.userAgent) {\n context.userAgent = userAgentResult.userAgent;\n }\n }\n if (autoCollect.referrer && this.isWebEnvironment()) {\n const referrerResult = this.collectReferrer();\n if (referrerResult.referrer) {\n context.referrer = referrerResult.referrer;\n }\n }\n if (autoCollect.campaign) {\n const campaignResult = this.collectCampaignInfo();\n if (campaignResult.campaign) {\n context.campaign = campaignResult.campaign;\n }\n }\n if (autoCollect.performance && this.isWebEnvironment()) {\n const performanceResult = this.collectPerformanceInfo();\n if (performanceResult.performance) {\n context.performance = performanceResult.performance;\n }\n warnings.push(...performanceResult.warnings || []);\n }\n } catch (error) {\n errors.push(`Failed to collect auto context: ${error.message}`);\n }\n return { context, warnings, errors };\n }\n /**\n * 디바이스 정보 수집\n * @returns 디바이스 컨텍스트와 경고/오류\n */\n async collectDeviceInfo() {\n if (this.cachedDeviceInfo) {\n return { device: this.cachedDeviceInfo };\n }\n const warnings = [];\n const errors = [];\n const device = {};\n try {\n if (this.isReactNativeEnvironment()) {\n warnings.push(\"Limited device info available in React Native - use platform-specific adapter for full info\");\n device.type = \"mobile\";\n try {\n if (typeof Intl !== \"undefined\" && Intl && Intl.DateTimeFormat) {\n device.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n } catch (e) {\n device.timezone = \"UTC\";\n }\n this.cachedDeviceInfo = device;\n return { device: this.cachedDeviceInfo, warnings };\n }\n if (this.isWebEnvironment() && typeof navigator !== \"undefined\") {\n const userAgent = navigator.userAgent;\n if (userAgent.includes(\"Chrome\")) {\n device.browser = \"Chrome\";\n const chromeMatch = userAgent.match(/Chrome\\/(\\d+\\.?\\d*)/);\n if (chromeMatch) device.browserVersion = chromeMatch[1];\n } else if (userAgent.includes(\"Firefox\")) {\n device.browser = \"Firefox\";\n const firefoxMatch = userAgent.match(/Firefox\\/(\\d+\\.?\\d*)/);\n if (firefoxMatch) device.browserVersion = firefoxMatch[1];\n } else if (userAgent.includes(\"Safari\")) {\n device.browser = \"Safari\";\n const safariMatch = userAgent.match(/Version\\/(\\d+\\.?\\d*)/);\n if (safariMatch) device.browserVersion = safariMatch[1];\n }\n if (userAgent.includes(\"Windows\")) {\n device.os = \"Windows\";\n const winMatch = userAgent.match(/Windows NT (\\d+\\.?\\d*)/);\n if (winMatch) device.osVersion = winMatch[1];\n } else if (userAgent.includes(\"Mac OS\")) {\n device.os = \"macOS\";\n const macMatch = userAgent.match(/Mac OS X (\\d+_?\\d*)/);\n if (macMatch) device.osVersion = macMatch[1].replace(\"_\", \".\");\n } else if (userAgent.includes(\"Linux\")) {\n device.os = \"Linux\";\n }\n if (this.isMobileEnvironment()) {\n device.type = \"mobile\";\n } else if (userAgent.includes(\"Tablet\") || userAgent.includes(\"iPad\")) {\n device.type = \"tablet\";\n } else {\n device.type = \"desktop\";\n }\n try {\n if (\"language\" in navigator && typeof navigator.language === \"string\" && navigator.language.length > 0) {\n device.language = navigator.language;\n }\n } catch (e) {\n }\n if (typeof screen !== \"undefined\") {\n device.screenResolution = `${screen.width}x${screen.height}`;\n } else if (typeof window !== \"undefined\" && window.screen) {\n device.screenResolution = `${window.screen.width}x${window.screen.height}`;\n }\n if (typeof window !== \"undefined\" && window.innerWidth && window.innerHeight) {\n device.viewport = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n }\n try {\n device.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n warnings.push(\"Failed to detect timezone\");\n }\n } else {\n warnings.push(\"Navigator API not available - limited device info\");\n }\n this.cachedDeviceInfo = device;\n return { device: this.cachedDeviceInfo, warnings, errors };\n } catch (error) {\n errors.push(`Failed to collect device info: ${error.message}`);\n return { warnings, errors };\n }\n }\n /**\n * 애플리케이션 정보 수집\n * @returns 앱 컨텍스트와 경고/오류\n */\n async collectAppInfo() {\n if (this.cachedAppInfo) {\n return { app: this.cachedAppInfo };\n }\n const warnings = [];\n const errors = [];\n const app = {};\n try {\n if (this.isWebEnvironment() && typeof document !== \"undefined\") {\n app.name = document.title || \"Unknown Web App\";\n }\n if (typeof process !== \"undefined\" && process.env) {\n app.version = process.env.npm_package_version || process.env.APP_VERSION;\n app.build = process.env.BUILD_NUMBER;\n const env = process.env.NODE_ENV;\n if (env === \"development\" || env === \"production\") {\n app.environment = env;\n }\n }\n this.cachedAppInfo = app;\n return { app: this.cachedAppInfo, warnings, errors };\n } catch (error) {\n errors.push(`Failed to collect app info: ${error.message}`);\n return { warnings, errors };\n }\n }\n /**\n * 페이지 정보 수집 (웹 전용)\n * @returns 페이지 컨텍스트와 경고\n */\n collectPageInfo() {\n if (!this.isWebEnvironment() || typeof document === \"undefined\") {\n return { warnings: [\"Page info collection only available in web environment\"] };\n }\n const page = {};\n const warnings = [];\n try {\n page.title = document.title;\n page.url = window.location.href;\n page.path = window.location.pathname;\n page.search = window.location.search;\n page.hash = window.location.hash;\n page.referrer = document.referrer;\n const metaTags = {};\n const metaElements = document.querySelectorAll(\"meta[name], meta[property]\");\n metaElements.forEach((meta) => {\n const name = meta.getAttribute(\"name\") || meta.getAttribute(\"property\");\n const content = meta.getAttribute(\"content\");\n if (name && content) {\n metaTags[name] = content;\n }\n });\n if (Object.keys(metaTags).length > 0) {\n page.meta = metaTags;\n }\n return { page, warnings };\n } catch (error) {\n warnings.push(`Failed to collect page info: ${error.message}`);\n return { warnings };\n }\n }\n /**\n * 사용자 에이전트 정보 수집\n * @returns 사용자 에이전트 문자열\n */\n collectUserAgent() {\n if (typeof navigator !== \"undefined\" && navigator.userAgent) {\n return { userAgent: navigator.userAgent };\n }\n return {};\n }\n /**\n * 리퍼러 정보 수집 (웹 전용)\n * @returns 리퍼러 문자열\n */\n collectReferrer() {\n if (this.isWebEnvironment() && typeof document !== \"undefined\" && document.referrer) {\n return { referrer: document.referrer };\n }\n return {};\n }\n /**\n * URL 파라미터로부터 캠페인 정보 수집\n * @returns 캠페인 컨텍스트\n */\n collectCampaignInfo() {\n if (!this.isWebEnvironment() || typeof window === \"undefined\") {\n return {};\n }\n const campaign = {};\n const urlParams = new URLSearchParams(window.location.search);\n const utmParams = [\"utm_source\", \"utm_medium\", \"utm_campaign\", \"utm_term\", \"utm_content\"];\n let hasCampaignData = false;\n utmParams.forEach((param) => {\n const value = urlParams.get(param);\n if (value) {\n campaign[param] = value;\n hasCampaignData = true;\n }\n });\n const otherParams = [\n \"gclid\",\n // Google Ads\n \"fbclid\",\n // Facebook Ads\n \"msclkid\",\n // Microsoft Ads\n \"ttclid\"\n // TikTok Ads\n ];\n otherParams.forEach((param) => {\n const value = urlParams.get(param);\n if (value) {\n campaign[param] = value;\n hasCampaignData = true;\n }\n });\n return hasCampaignData ? { campaign } : {};\n }\n /**\n * 성능 정보 수집 (웹 전용)\n * @returns 성능 컨텍스트와 경고\n */\n collectPerformanceInfo() {\n if (!this.isWebEnvironment() || typeof window === \"undefined\" || !window.performance) {\n return { warnings: [\"Performance API not available\"] };\n }\n const performance = {};\n const warnings = [];\n try {\n const timing = window.performance.timing;\n const navigation = window.performance.navigation;\n if (timing) {\n performance.loadTime = timing.loadEventEnd - timing.navigationStart;\n performance.domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n performance.responseTime = timing.responseEnd - timing.requestStart;\n performance.renderTime = timing.loadEventEnd - timing.responseEnd;\n }\n if (navigation) {\n performance.navigationType = navigation.type;\n performance.redirectCount = navigation.redirectCount;\n }\n if (\"connection\" in navigator) {\n const connection = navigator.connection;\n performance.connectionType = connection.effectiveType;\n performance.downlink = connection.downlink;\n performance.rtt = connection.rtt;\n }\n return { performance, warnings };\n } catch (error) {\n warnings.push(`Failed to collect performance info: ${error.message}`);\n return { warnings };\n }\n }\n /**\n * 사용자 제공 컨텍스트와 자동 수집 컨텍스트 병합\n * @param autoContext - 자동 수집된 컨텍스트\n * @param userContext - 사용자 제공 컨텍스트\n * @returns 병합된 컨텍스트\n */\n mergeContext(autoContext, userContext = {}) {\n return {\n ...autoContext,\n ...userContext,\n // Merge nested objects\n device: { ...autoContext.device, ...userContext.device },\n app: { ...autoContext.app, ...userContext.app },\n page: { ...autoContext.page, ...userContext.page },\n campaign: { ...autoContext.campaign, ...userContext.campaign },\n performance: { ...autoContext.performance, ...userContext.performance }\n };\n }\n /**\n * 캐시된 컨텍스트 정보 초기화 (SPA 라우트 변경 시 유용)\n */\n clearCache() {\n this.cachedAppInfo = void 0;\n }\n /**\n * 환경 감지 헬퍼 메서드\n */\n /**\n * React Native 환경 확인\n * @returns React Native 환경 여부\n */\n isReactNativeEnvironment() {\n return typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\";\n }\n /**\n * 웹 환경 확인\n * @returns 웹 환경 여부\n */\n isWebEnvironment() {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\" && !this.isReactNativeEnvironment();\n }\n /**\n * 모바일 환경 확인\n * @returns 모바일 환경 여부\n */\n isMobileEnvironment() {\n if (this.isReactNativeEnvironment()) {\n return true;\n }\n if (this.isWebEnvironment() && typeof navigator !== \"undefined\") {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || typeof window !== \"undefined\" && window.innerWidth <= 768;\n }\n return false;\n }\n};\n\n// src/services/PluginService.ts\nvar PluginService = class {\n constructor(config, options = {}) {\n this.plugins = /* @__PURE__ */ new Map();\n this.eventHandlers = /* @__PURE__ */ new Map();\n this.pluginEventHandlers = /* @__PURE__ */ new Map();\n this.pluginStorage = /* @__PURE__ */ new Map();\n this.config = config;\n this.options = {\n maxExecutionTime: 5e3,\n // 5 seconds\n enableTimeout: true,\n errorHandling: \"lenient\",\n ...options\n };\n }\n /**\n * SDK track 함수 주입\n */\n setTrackFn(fn) {\n this.trackFn = fn;\n }\n /**\n * SDK identify 함수 주입\n */\n setIdentifyFn(fn) {\n this.identifyFn = fn;\n }\n /**\n * 플러그인 등록\n * @param plugin - 등록할 플러그인\n * @throws {PluginError} 등록 실패 시\n */\n async register(plugin) {\n this.validatePlugin(plugin);\n if (this.plugins.has(plugin.name)) {\n throw new PluginError(\n plugin.name,\n `Plugin '${plugin.name}' is already registered`,\n \"PLUGIN_ALREADY_REGISTERED\" /* PLUGIN_ALREADY_REGISTERED */\n );\n }\n try {\n const context = this.createPluginContext(plugin.name);\n if (plugin.initialize) {\n await this.executeWithTimeout(\n () => plugin.initialize(this.config, context),\n `Plugin '${plugin.name}' initialization`\n );\n }\n this.plugins.set(plugin.name, plugin);\n } catch (error) {\n throw new PluginError(\n plugin.name,\n `Failed to register plugin: ${error.message}`,\n \"PLUGIN_INITIALIZATION_FAILED\" /* PLUGIN_INITIALIZATION_FAILED */,\n { cause: error }\n );\n }\n }\n /**\n * 플러그인 등록 해제\n * @param name - 플러그인 이름\n * @returns 해제 성공 여부\n * @throws {VircleError} 정리 실패 시\n */\n async unregister(name) {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n return false;\n }\n let cleanupError;\n try {\n if (plugin.cleanup) {\n await this.executeWithTimeout(() => plugin.cleanup(), `Plugin '${name}' cleanup`);\n }\n } catch (error) {\n cleanupError = error;\n } finally {\n this.plugins.delete(name);\n this.pluginStorage.delete(name);\n this.removePluginEventHandlers(name);\n }\n if (cleanupError) {\n throw new VircleError(\n \"PLUGIN_ERROR\" /* PLUGIN_ERROR */,\n `Plugin cleanup failed for '${name}': ${cleanupError.message}`,\n { cause: cleanupError }\n );\n }\n return true;\n }\n /**\n * 플러그인 훅 실행\n * @param hook - 실행할 훅 타입\n * @param data - 훅에 전달할 데이터\n * @returns 처리된 데이터 또는 결과\n * @throws {PluginError} strict 모드에서 훅 실패 시\n */\n async executeHook(hook, data) {\n const results = [];\n const errors = [];\n const applicablePlugins = Array.from(this.plugins.values()).filter((plugin) => {\n return plugin.hooks && plugin.hooks[hook];\n });\n if (applicablePlugins.length === 0) {\n return data;\n }\n for (const plugin of applicablePlugins) {\n try {\n const context = this.createPluginContext(plugin.name);\n const handler = plugin.hooks[hook];\n const result = await this.executeWithTimeout(\n () => handler(data, context),\n `Plugin '${plugin.name}' ${hook} hook`\n );\n results.push(result);\n if (hook === \"beforeEventSend\" || hook === \"afterEventSend\") {\n data = result || data;\n }\n } catch (error) {\n const pluginError = new PluginError(\n plugin.name,\n `Hook '${hook}' failed: ${error.message}`,\n \"PLUGIN_HOOK_FAILED\" /* PLUGIN_HOOK_FAILED */,\n { cause: error }\n );\n errors.push(pluginError);\n if (this.options.errorHandling === \"strict\") {\n throw pluginError;\n }\n }\n }\n if (errors.length > 0 && this.options.errorHandling === \"lenient\") {\n return {\n results,\n errors,\n data: hook === \"beforeEventSend\" || hook === \"afterEventSend\" ? data : void 0\n };\n }\n if (hook === \"beforeEventSend\" || hook === \"afterEventSend\") {\n return data;\n }\n return results;\n }\n /**\n * 등록된 플러그인 조회\n * @param name - 플러그인 이름\n * @returns 플러그인 또는 undefined\n */\n getPlugin(name) {\n return this.plugins.get(name);\n }\n /**\n * 모든 등록된 플러그인 조회\n * @returns 플러그인 배열\n */\n getPlugins() {\n return Array.from(this.plugins.values());\n }\n /**\n * 플러그인 이름 리스트 조회\n * @returns 플러그인 이름 배열\n */\n getPluginNames() {\n return Array.from(this.plugins.keys());\n }\n /**\n * 플러그인 등록 여부 확인\n * @param name - 플러그인 이름\n * @returns 등록 여부\n */\n hasPlugin(name) {\n return this.plugins.has(name);\n }\n /**\n * 플러그인 개수 조회\n * @returns 등록된 플러그인 수\n */\n getPluginCount() {\n return this.plugins.size;\n }\n /**\n * 모든 플러그인 라이프사이클 이벤트 실행\n * @param lifecycle - 라이프사이클 타입\n * @param data - 전달할 데이터\n */\n async executeLifecycle(lifecycle, data) {\n const lifecycleHook = this.getLifecycleHook(lifecycle);\n if (lifecycleHook) {\n await this.executeHook(lifecycleHook, data);\n }\n }\n /**\n * 모든 플러그인 정리\n */\n async cleanup() {\n const pluginNames = Array.from(this.plugins.keys());\n const cleanupPromises = pluginNames.map((name) => this.unregister(name));\n await Promise.all(cleanupPromises);\n }\n /**\n * 플러그인 상태 조회\n * @returns 플러그인별 상태 정보\n */\n getPluginHealth() {\n const health = {};\n for (const [name, plugin] of this.plugins) {\n try {\n if (!plugin.name || !plugin.version) {\n health[name] = {\n status: \"error\",\n error: \"Missing required plugin properties\"\n };\n } else {\n health[name] = { status: \"healthy\" };\n }\n } catch (error) {\n health[name] = {\n status: \"error\",\n error: error.message\n };\n }\n }\n return health;\n }\n /**\n * 플러그인 구조 검증\n * @param plugin - 검증할 플러그인\n * @throws {PluginError} 검증 실패 시\n */\n validatePlugin(plugin) {\n if (!plugin.name) {\n throw new PluginError(\"\", \"Plugin must have a name\", \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */);\n }\n if (!plugin.version) {\n throw new PluginError(plugin.name, \"Plugin must have a version\", \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */);\n }\n if (!/^[a-zA-Z0-9_-]+$/.test(plugin.name)) {\n throw new PluginError(\n plugin.name,\n \"Plugin name must contain only letters, numbers, underscores, and hyphens\",\n \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */\n );\n }\n if (!/^\\d+\\.\\d+\\.\\d+/.test(plugin.version)) {\n throw new PluginError(\n plugin.name,\n \"Plugin version must be in semver format (x.y.z)\",\n \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */\n );\n }\n if (plugin.hooks) {\n const validHooks = [\n \"beforeEvent\",\n \"afterEvent\",\n \"beforeBatch\",\n \"afterBatch\",\n \"onError\",\n \"beforeStart\",\n \"afterStart\",\n \"beforeStop\",\n \"afterStop\",\n \"beforeEventSend\",\n \"afterEventSend\",\n \"onConfigChange\",\n \"onUserIdentify\",\n \"onSessionStart\",\n \"onSessionEnd\"\n ];\n for (const hook of Object.keys(plugin.hooks)) {\n if (!validHooks.includes(hook)) {\n throw new PluginError(\n plugin.name,\n `Invalid plugin hook: ${hook}`,\n \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */\n );\n }\n if (typeof plugin.hooks[hook] !== \"function\") {\n throw new PluginError(\n plugin.name,\n `Plugin hook '${hook}' must be a function`,\n \"PLUGIN_VALIDATION_FAILED\" /* PLUGIN_VALIDATION_FAILED */\n );\n }\n }\n }\n }\n /**\n * 플러그인 컨텍스트 생성\n * @param pluginName - 플러그인 이름\n * @returns 플러그인 컨텍스트\n */\n createPluginContext(pluginName) {\n const self = this;\n return {\n getConfig: () => ({ ...this.config }),\n on: (event, handler) => {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, /* @__PURE__ */ new Set());\n }\n this.eventHandlers.get(event).add(handler);\n if (!this.pluginEventHandlers.has(pluginName)) {\n this.pluginEventHandlers.set(pluginName, []);\n }\n this.pluginEventHandlers.get(pluginName).push({ event, handler });\n },\n off: (event, handler) => {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n }\n const tracked = this.pluginEventHandlers.get(pluginName);\n if (tracked) {\n const idx = tracked.findIndex((h) => h.event === event && h.handler === handler);\n if (idx !== -1) tracked.splice(idx, 1);\n }\n },\n emit: (event, data) => {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n if (this.config.debug) {\n console.error(`Error in event handler for '${event}':`, error);\n }\n }\n });\n }\n },\n use: (middleware) => {\n if (this.config.debug) {\n console.warn(\"Middleware registration is not yet implemented\");\n }\n },\n getPlugin: (name) => self.plugins.get(name),\n track: (eventName, properties) => {\n if (!self.trackFn) {\n if (this.config.debug) {\n console.warn(`[Plugin:${pluginName}] track() called but SDK track function not injected`);\n }\n return;\n }\n self.trackFn(eventName, properties).catch((error) => {\n console.error(`[Plugin:${pluginName}] track() failed:`, error);\n });\n },\n identify: (userId, traits) => {\n if (!self.identifyFn) {\n if (this.config.debug) {\n console.warn(`[Plugin:${pluginName}] identify() called but SDK identify function not injected`);\n }\n return;\n }\n self.identifyFn(userId, traits).catch((error) => {\n console.error(`[Plugin:${pluginName}] identify() failed:`, error);\n });\n },\n logger: {\n debug: (message, ...args) => {\n if (this.config.debug) {\n console.debug(`[Plugin:${pluginName}] ${message}`, ...args);\n }\n },\n info: (message, ...args) => {\n if (this.config.debug) {\n console.info(`[Plugin:${pluginName}] ${message}`, ...args);\n }\n },\n warn: (message, ...args) => {\n if (this.config.debug) {\n console.warn(`[Plugin:${pluginName}] ${message}`, ...args);\n }\n },\n error: (message, ...args) => {\n if (this.config.debug) {\n console.error(`[Plugin:${pluginName}] ${message}`, ...args);\n }\n }\n },\n storage: {\n get: async (key) => {\n if (!self.pluginStorage.has(pluginName)) {\n return void 0;\n }\n return self.pluginStorage.get(pluginName).get(key);\n },\n set: async (key, value) => {\n if (!self.pluginStorage.has(pluginName)) {\n self.pluginStorage.set(pluginName, /* @__PURE__ */ new Map());\n }\n self.pluginStorage.get(pluginName).set(key, value);\n },\n remove: async (key) => {\n const storage = self.pluginStorage.get(pluginName);\n if (storage) {\n storage.delete(key);\n }\n }\n }\n };\n }\n /**\n * 타임아웃 제한 함수 실행\n * @param fn - 실행할 함수\n * @param operation - 작업 설명\n * @returns 함수 실행 결과\n * @throws {Error} 타임아웃 발생 시\n */\n async executeWithTimeout(fn, operation) {\n if (!this.options.enableTimeout) {\n return await fn();\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`${operation} timed out after ${this.options.maxExecutionTime}ms`));\n }, this.options.maxExecutionTime);\n Promise.resolve(fn()).then((result) => {\n clearTimeout(timeout);\n resolve(result);\n }).catch((error) => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n }\n /**\n * 플러그인이 등록한 이벤트 핸들러 일괄 제거\n * @param pluginName - 플러그인 이름\n */\n removePluginEventHandlers(pluginName) {\n const tracked = this.pluginEventHandlers.get(pluginName);\n if (tracked) {\n for (const { event, handler } of tracked) {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n }\n }\n this.pluginEventHandlers.delete(pluginName);\n }\n }\n /**\n * 라이프사이클을 훅으로 매핑\n * @param lifecycle - 라이프사이클 타입\n * @returns 매핑된 훅 타입\n */\n getLifecycleHook(lifecycle) {\n const mapping = {\n \"config-changed\": \"onConfigChange\",\n \"user-identified\": \"onUserIdentify\",\n \"session-started\": \"onSessionStart\",\n \"session-ended\": \"onSessionEnd\"\n };\n return mapping[lifecycle];\n }\n};\n\n// src/services/StorageService.ts\nvar MemoryStorageAdapter = class {\n constructor(maxSize = 1e3) {\n this.store = /* @__PURE__ */ new Map();\n this.maxSize = maxSize;\n }\n async get(key) {\n const item = this.store.get(key);\n if (!item) return null;\n if (item.ttl && Date.now() > item.timestamp + item.ttl * 1e3) {\n this.store.delete(key);\n return null;\n }\n return item.value;\n }\n async set(key, value, ttl) {\n if (this.store.size >= this.maxSize && !this.store.has(key)) {\n const oldestKey = this.store.keys().next().value;\n if (oldestKey) {\n this.store.delete(oldestKey);\n }\n }\n this.store.set(key, {\n value,\n timestamp: Date.now(),\n ttl\n });\n }\n async remove(key) {\n return this.store.delete(key);\n }\n async clear() {\n this.store.clear();\n }\n async keys() {\n return Array.from(this.store.keys());\n }\n async size() {\n return this.store.size;\n }\n};\nvar LocalStorageAdapter = class {\n constructor(prefix = \"vircle_\") {\n this.prefix = prefix;\n if (typeof localStorage === \"undefined\") {\n throw new StorageError(\"localStorage is not available\", \"STORAGE_NOT_AVAILABLE\" /* STORAGE_NOT_AVAILABLE */);\n }\n }\n async get(key) {\n try {\n const item = localStorage.getItem(this.prefix + key);\n if (!item) return null;\n const parsed = JSON.parse(item);\n if (parsed.ttl && Date.now() > parsed.timestamp + parsed.ttl * 1e3) {\n await this.remove(key);\n return null;\n }\n return parsed.value;\n } catch (error) {\n throw new StorageError(`Failed to get item '${key}': ${error.message}`);\n }\n }\n async set(key, value, ttl) {\n try {\n const item = {\n value,\n timestamp: Date.now(),\n ttl\n };\n localStorage.setItem(this.prefix + key, JSON.stringify(item));\n } catch (error) {\n if (error.name === \"QuotaExceededError\") {\n throw new StorageError(\"Storage quota exceeded\", \"STORAGE_QUOTA_EXCEEDED\" /* STORAGE_QUOTA_EXCEEDED */);\n }\n throw new StorageError(`Failed to set item '${key}': ${error.message}`);\n }\n }\n async remove(key) {\n try {\n const fullKey = this.prefix + key;\n const existed = localStorage.getItem(fullKey) !== null;\n localStorage.removeItem(fullKey);\n return existed;\n } catch (error) {\n throw new StorageError(`Failed to remove item '${key}': ${error.message}`);\n }\n }\n async clear() {\n try {\n const keys = Object.keys(localStorage).filter((key) => key.startsWith(this.prefix));\n keys.forEach((key) => localStorage.removeItem(key));\n } catch (error) {\n throw new StorageError(`Failed to clear storage: ${error.message}`);\n }\n }\n async keys() {\n try {\n return Object.keys(localStorage).filter((key) => key.startsWith(this.prefix)).map((key) => key.substring(this.prefix.length));\n } catch (error) {\n throw new StorageError(`Failed to get keys: ${error.message}`);\n }\n }\n async size() {\n try {\n return Object.keys(localStorage).filter((key) => key.startsWith(this.prefix)).length;\n } catch (error) {\n throw new StorageError(`Failed to get size: ${error.message}`);\n }\n }\n};\nvar IndexedDBAdapter = class {\n constructor(dbName = \"vircle_db\") {\n this.dbVersion = 1;\n this.storeName = \"vircle_store\";\n this.db = null;\n this.dbName = dbName;\n if (typeof indexedDB === \"undefined\") {\n throw new StorageError(\"IndexedDB is not available\", \"STORAGE_NOT_AVAILABLE\" /* STORAGE_NOT_AVAILABLE */);\n }\n }\n async initDB() {\n if (this.db) return this.db;\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.dbVersion);\n request.onerror = () => {\n reject(new StorageError(\"Failed to open IndexedDB\", \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n this.db = request.result;\n resolve(this.db);\n };\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName, { keyPath: \"key\" });\n }\n };\n });\n }\n async get(key) {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const request = store.get(key);\n request.onerror = () => {\n reject(new StorageError(`Failed to get item '${key}'`, \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n const result = request.result;\n if (!result) {\n resolve(null);\n return;\n }\n const item = result.data;\n if (item.ttl && Date.now() > item.timestamp + item.ttl * 1e3) {\n this.remove(key);\n resolve(null);\n return;\n }\n resolve(item.value);\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to get item '${key}': ${error.message}`);\n }\n }\n async set(key, value, ttl) {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n const item = {\n value,\n timestamp: Date.now(),\n ttl\n };\n return new Promise((resolve, reject) => {\n const request = store.put({ key, data: item });\n request.onerror = () => {\n reject(new StorageError(`Failed to set item '${key}'`, \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n resolve();\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to set item '${key}': ${error.message}`);\n }\n }\n async remove(key) {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const getRequest = store.get(key);\n getRequest.onsuccess = () => {\n const existed = getRequest.result !== void 0;\n const deleteRequest = store.delete(key);\n deleteRequest.onerror = () => {\n reject(new StorageError(`Failed to remove item '${key}'`, \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n deleteRequest.onsuccess = () => {\n resolve(existed);\n };\n };\n getRequest.onerror = () => {\n reject(new StorageError(`Failed to check item '${key}'`, \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to remove item '${key}': ${error.message}`);\n }\n }\n async clear() {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const request = store.clear();\n request.onerror = () => {\n reject(new StorageError(\"Failed to clear storage\", \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n resolve();\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to clear storage: ${error.message}`);\n }\n }\n async keys() {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const request = store.getAllKeys();\n request.onerror = () => {\n reject(new StorageError(\"Failed to get keys\", \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to get keys: ${error.message}`);\n }\n }\n async size() {\n try {\n const db = await this.initDB();\n const transaction = db.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n return new Promise((resolve, reject) => {\n const request = store.count();\n request.onerror = () => {\n reject(new StorageError(\"Failed to get size\", \"STORAGE_ERROR\" /* STORAGE_ERROR */));\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n });\n } catch (error) {\n throw new StorageError(`Failed to get size: ${error.message}`);\n }\n }\n};\nvar StorageService = class {\n constructor(options = {}) {\n this.options = {\n type: \"memory\",\n maxSize: 10 * 1024 * 1024,\n // 10MB\n keyPrefix: \"vircle_\",\n ...options\n };\n this.adapter = options.adapter || this.createAdapter();\n }\n /**\n * 저장소에서 값 조회\n * @param key - 조회할 키\n * @returns 저장된 값 또는 null\n * @throws {StorageError} 조회 실패 시\n */\n async get(key) {\n try {\n return await this.adapter.get(key);\n } catch (error) {\n throw new StorageError(`Failed to get '${key}': ${error.message}`);\n }\n }\n /**\n * 저장소에 값 설정\n * @param key - 저장할 키\n * @param value - 저장할 값\n * @param ttl - TTL (초)\n * @throws {StorageError} 저장 실패 시\n */\n async set(key, value, ttl) {\n try {\n const finalTtl = ttl ?? this.options.ttl;\n await this.adapter.set(key, value, finalTtl);\n } catch (error) {\n throw new StorageError(`Failed to set '${key}': ${error.message}`);\n }\n }\n /**\n * 저장소에서 값 제거\n * @param key - 제거할 키\n * @returns 제거 성공 여부\n * @throws {StorageError} 제거 실패 시\n */\n async remove(key) {\n try {\n return await this.adapter.remove(key);\n } catch (error) {\n throw new StorageError(`Failed to remove '${key}': ${error.message}`);\n }\n }\n /**\n * 모든 값 초기화\n * @throws {StorageError} 초기화 실패 시\n */\n async clear() {\n try {\n await this.adapter.clear();\n } catch (error) {\n throw new StorageError(`Failed to clear storage: ${error.message}`);\n }\n }\n /**\n * 모든 키 조회\n * @returns 키 배열\n * @throws {StorageError} 조회 실패 시\n */\n async keys() {\n try {\n return await this.adapter.keys();\n } catch (error) {\n throw new StorageError(`Failed to get keys: ${error.message}`);\n }\n }\n /**\n * 저장소 크기 조회\n * @returns 저장된 항목 수\n * @throws {StorageError} 조회 실패 시\n */\n async size() {\n try {\n return await this.adapter.size();\n } catch (error) {\n throw new StorageError(`Failed to get size: ${error.message}`);\n }\n }\n /**\n * 키 존재 여부 확인\n * @param key - 확인할 키\n * @returns 키 존재 여부\n * @throws {StorageError} 확인 실패 시\n */\n async has(key) {\n try {\n const value = await this.adapter.get(key);\n return value !== null;\n } catch (error) {\n throw new StorageError(`Failed to check key '${key}': ${error.message}`);\n }\n }\n /**\n * 다중 값 조회\n * @param keys - 조회할 키 배열\n * @returns 키-값 매핑 객체\n */\n async getMultiple(keys) {\n const result = {};\n await Promise.all(\n keys.map(async (key) => {\n try {\n result[key] = await this.adapter.get(key);\n } catch (error) {\n result[key] = null;\n }\n })\n );\n return result;\n }\n /**\n * 다중 값 설정\n * @param items - 설정할 키-값 매핑\n * @param ttl - TTL (초)\n */\n async setMultiple(items, ttl) {\n await Promise.all(\n Object.entries(items).map(([key, value]) => this.adapter.set(key, value, ttl ?? this.options.ttl))\n );\n }\n /**\n * 타입에 따른 저장소 어댑터 생성\n * @returns 생성된 어댑터\n */\n createAdapter() {\n switch (this.options.type) {\n case \"localStorage\":\n return new LocalStorageAdapter(this.options.keyPrefix);\n case \"indexedDB\":\n return new IndexedDBAdapter(`${this.options.keyPrefix}db`);\n case \"memory\":\n default:\n return new MemoryStorageAdapter(this.options.maxSize || 1e3);\n }\n }\n /**\n * 저장소 사용 가능 테스트\n * @param type - 테스트할 저장소 타입\n * @returns 사용 가능 여부\n */\n static async testStorageAvailability(type) {\n try {\n switch (type) {\n case \"localStorage\":\n if (typeof localStorage === \"undefined\") return false;\n localStorage.setItem(\"vircle_test\", \"test\");\n localStorage.removeItem(\"vircle_test\");\n return true;\n case \"indexedDB\":\n if (typeof indexedDB === \"undefined\") return false;\n return true;\n case \"memory\":\n return true;\n default:\n return false;\n }\n } catch {\n return false;\n }\n }\n /**\n * 현재 환경에 따른 권장 저장소 타입 조회\n * @returns 권장 저장소 타입\n */\n static getRecommendedStorageType() {\n if (typeof window !== \"undefined\") {\n if (typeof indexedDB !== \"undefined\") return \"indexedDB\";\n if (typeof localStorage !== \"undefined\") return \"localStorage\";\n return \"memory\";\n }\n return \"memory\";\n }\n};\n\n// src/utils/SecurityUtils.ts\nfunction maskApiKey(apiKey) {\n if (!apiKey) return \"***\";\n const length = apiKey.length;\n if (length < 8) {\n return \"***\";\n }\n if (length <= 16) {\n return `${apiKey.substring(0, 2)}...${apiKey.substring(length - 2)}`;\n }\n return `${apiKey.substring(0, 4)}...${apiKey.substring(length - 4)}`;\n}\nfunction sanitizeConfig(config) {\n if (!config || typeof config !== \"object\") {\n return config;\n }\n const sanitized = { ...config };\n if (\"apiKey\" in sanitized) {\n sanitized.apiKey = maskApiKey(sanitized.apiKey);\n }\n if (sanitized.headers) {\n const headers = { ...sanitized.headers };\n Object.keys(headers).forEach((key) => {\n if (key.toLowerCase() === \"authorization\") {\n const value = headers[key];\n if (typeof value === \"string\") {\n if (value.startsWith(\"Bearer \")) {\n headers[key] = `Bearer ${maskApiKey(value.substring(7))}`;\n } else {\n headers[key] = maskApiKey(value);\n }\n }\n }\n });\n sanitized.headers = headers;\n }\n Object.keys(sanitized).forEach((key) => {\n if (typeof sanitized[key] === \"object\" && sanitized[key] !== null) {\n sanitized[key] = sanitizeConfig(sanitized[key]);\n }\n });\n return sanitized;\n}\nasync function createHmacSignature(payload, secret, cryptoAdapter) {\n if (cryptoAdapter && typeof cryptoAdapter.createHmacSignature === \"function\") {\n return cryptoAdapter.createHmacSignature(payload, secret);\n }\n if (typeof crypto !== \"undefined\" && crypto.subtle) {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(payload));\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n {\n name: \"HMAC\",\n hash: \"SHA-256\"\n },\n false,\n [\"sign\"]\n );\n const signature = await crypto.subtle.sign(\"HMAC\", key, data);\n return Array.from(new Uint8Array(signature)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n throw new Error(\"No crypto implementation available for HMAC signature\");\n}\nfunction validateApiKey(apiKey) {\n const warnings = [];\n if (!apiKey || typeof apiKey !== \"string\") {\n return {\n isValid: false,\n isTestKey: false,\n warnings: [\"API key is required\"]\n };\n }\n if (apiKey.length < 10) {\n warnings.push(\"API key appears to be too short\");\n }\n const testPatterns = [/^test/i, /^demo/i, /^sample/i, /^example/i];\n const isTestKey = testPatterns.some((pattern) => pattern.test(apiKey));\n if (isTestKey) {\n warnings.push(\"API key appears to be a test key\");\n }\n const invalidPatterns = [\n /^[0-9]+$/,\n // 숫자만\n /^[a-zA-Z]+$/,\n // 문자만\n /^(.)\\1+$/,\n // 반복 문자\n /password/i,\n /secret/i,\n /\\s/\n // 공백 포함\n ];\n const hasInvalidPattern = invalidPatterns.some((pattern) => pattern.test(apiKey));\n if (hasInvalidPattern) {\n warnings.push(\"API key format appears to be invalid\");\n }\n return {\n isValid: !hasInvalidPattern && apiKey.length >= 10,\n isTestKey,\n warnings\n };\n}\n\n// src/utils/PriorityQueue.ts\nvar PriorityQueue = class {\n constructor(maxSize) {\n this.items = [];\n this.maxSize = maxSize;\n }\n /**\n * 큐에 아이템 추가\n * @param data - 추가할 데이터\n * @param priority - 우선순위 (높을수록 우선)\n */\n enqueue(data, priority = 0) {\n const item = {\n data,\n priority,\n timestamp: Date.now()\n };\n const index = this.findInsertIndex(priority);\n this.items.splice(index, 0, item);\n if (this.maxSize && this.items.length > this.maxSize) {\n this.items.pop();\n }\n }\n /**\n * 최고 우선순위 아이템 제거 및 반환\n * @returns 최고 우선순위 아이템 또는 undefined\n */\n dequeue() {\n const item = this.items.shift();\n return item?.data;\n }\n /**\n * 특정 우선순위 이상의 아이템들 추출\n * @param minPriority - 최소 우선순위\n * @returns 추출된 아이템들\n */\n extractByPriority(minPriority) {\n const extracted = [];\n const remaining = [];\n for (const item of this.items) {\n if (item.priority >= minPriority) {\n extracted.push(item.data);\n } else {\n remaining.push(item);\n }\n }\n this.items = remaining;\n return extracted;\n }\n /**\n * 특정 개수만큼 아이템 추출\n * @param count - 추출할 개수\n * @returns 추출된 아이템들\n */\n extractBatch(count) {\n const extracted = [];\n for (let i = 0; i < count && this.items.length > 0; i++) {\n const item = this.items.shift();\n if (item) {\n extracted.push(item.data);\n }\n }\n return extracted;\n }\n /**\n * 특정 시간 이전의 아이템들 추출\n * @param maxAge - 최대 경과 시간 (밀리초)\n * @returns 추출된 아이템들\n */\n extractOldItems(maxAge) {\n const now = Date.now();\n const extracted = [];\n const remaining = [];\n for (const item of this.items) {\n if (now - item.timestamp > maxAge) {\n extracted.push(item.data);\n } else {\n remaining.push(item);\n }\n }\n this.items = remaining;\n return extracted;\n }\n /**\n * 큐의 첫 번째 아이템 확인 (제거하지 않음)\n * @returns 첫 번째 아이템 또는 undefined\n */\n peek() {\n return this.items[0]?.data;\n }\n /**\n * 큐 크기 반환\n * @returns 큐에 있는 아이템 개수\n */\n size() {\n return this.items.length;\n }\n /**\n * 큐가 비어있는지 확인\n * @returns 비어있으면 true\n */\n isEmpty() {\n return this.items.length === 0;\n }\n /**\n * 큐 비우기\n */\n clear() {\n this.items = [];\n }\n /**\n * 우선순위별 아이템 개수 통계\n * @returns 우선순위별 개수 맵\n */\n getStatsByPriority() {\n const stats = /* @__PURE__ */ new Map();\n for (const item of this.items) {\n const count = stats.get(item.priority) || 0;\n stats.set(item.priority, count + 1);\n }\n return stats;\n }\n /**\n * 이진 탐색으로 삽입 위치 찾기\n * @param priority - 우선순위\n * @returns 삽입 인덱스\n */\n findInsertIndex(priority) {\n let left = 0;\n let right = this.items.length;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (this.items[mid].priority >= priority) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n return left;\n }\n};\nvar DEFAULT_EVENT_PRIORITY = {\n // Critical events\n \"purchase\": 100 /* CRITICAL */,\n \"payment\": 100 /* CRITICAL */,\n \"error\": 100 /* CRITICAL */,\n \"crash\": 100 /* CRITICAL */,\n // High priority events\n \"identify\": 75 /* HIGH */,\n \"signup\": 75 /* HIGH */,\n \"login\": 75 /* HIGH */,\n \"logout\": 75 /* HIGH */,\n \"click\": 75 /* HIGH */,\n \"submit\": 75 /* HIGH */,\n // Normal events\n \"page_view\": 50 /* NORMAL */,\n \"screen_view\": 50 /* NORMAL */,\n \"scroll\": 50 /* NORMAL */,\n // Low priority events\n \"heartbeat\": 25 /* LOW */,\n \"session_extend\": 25 /* LOW */,\n // Background events\n \"background_sync\": 0 /* BACKGROUND */,\n \"cache_update\": 0 /* BACKGROUND */\n};\nfunction getEventPriority(eventName, customPriority) {\n const defaultPriority = DEFAULT_EVENT_PRIORITY[eventName.toLowerCase()];\n if (defaultPriority !== void 0) {\n return defaultPriority;\n }\n if (eventName.includes(\"error\") || eventName.includes(\"fail\")) {\n return 100 /* CRITICAL */;\n }\n if (eventName.includes(\"click\") || eventName.includes(\"tap\")) {\n return 75 /* HIGH */;\n }\n if (eventName.includes(\"view\") || eventName.includes(\"load\")) {\n return 50 /* NORMAL */;\n }\n return 50 /* NORMAL */;\n}\n\n// src/utils/CircuitBreaker.ts\nvar CircuitBreaker = class {\n constructor(options = {}) {\n this.state = \"CLOSED\" /* CLOSED */;\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = 0;\n this.halfOpenRetries = 0;\n this.requestVolume = [];\n this.options = {\n failureThreshold: 5,\n resetTimeout: 6e4,\n // 1분\n halfOpenRetries: 3,\n volumeThreshold: 10,\n errorThresholdPercentage: 50,\n onStateChange: () => {\n },\n ...options\n };\n }\n /**\n * 함수 실행을 Circuit Breaker로 보호\n * @param fn - 실행할 함수\n * @returns 함수 실행 결과\n * @throws Circuit이 Open 상태일 때 에러\n */\n async execute(fn) {\n if (this.isOpen()) {\n throw new Error(\n `Circuit breaker is OPEN. Next retry at ${new Date(this.getNextRetryTime()).toISOString()}`\n );\n }\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n /**\n * Circuit이 Open 상태인지 확인\n * @returns Open 상태 여부\n */\n isOpen() {\n if (this.state === \"OPEN\" /* OPEN */) {\n if (Date.now() >= this.getNextRetryTime()) {\n this.transitionTo(\"HALF_OPEN\" /* HALF_OPEN */);\n return false;\n }\n return true;\n }\n return false;\n }\n /**\n * 성공 처리\n */\n onSuccess() {\n this.recordRequest(true);\n this.successes++;\n switch (this.state) {\n case \"CLOSED\" /* CLOSED */:\n this.failures = 0;\n break;\n case \"HALF_OPEN\" /* HALF_OPEN */:\n if (this.successes >= this.options.halfOpenRetries) {\n this.transitionTo(\"CLOSED\" /* CLOSED */);\n }\n break;\n }\n }\n /**\n * 실패 처리\n */\n onFailure() {\n this.recordRequest(false);\n this.lastFailureTime = Date.now();\n switch (this.state) {\n case \"CLOSED\" /* CLOSED */:\n this.failures++;\n if (this.shouldOpen()) {\n this.transitionTo(\"OPEN\" /* OPEN */);\n }\n break;\n case \"HALF_OPEN\" /* HALF_OPEN */:\n this.transitionTo(\"OPEN\" /* OPEN */);\n break;\n }\n }\n /**\n * 상태 전환\n * @param newState - 새로운 상태\n */\n transitionTo(newState) {\n const oldState = this.state;\n this.state = newState;\n switch (newState) {\n case \"CLOSED\" /* CLOSED */:\n this.failures = 0;\n this.successes = 0;\n break;\n case \"OPEN\" /* OPEN */:\n this.halfOpenRetries = 0;\n break;\n case \"HALF_OPEN\" /* HALF_OPEN */:\n this.successes = 0;\n this.failures = 0;\n break;\n }\n if (oldState !== newState) {\n this.options.onStateChange(newState);\n }\n }\n /**\n * Circuit을 Open 상태로 전환해야 하는지 확인\n * @returns Open 전환 여부\n */\n shouldOpen() {\n if (this.failures >= this.options.failureThreshold) {\n return true;\n }\n const recentRequests = this.getRecentRequests();\n if (recentRequests.length >= this.options.volumeThreshold) {\n const errorRate = this.calculateErrorRate(recentRequests);\n return errorRate >= this.options.errorThresholdPercentage;\n }\n return false;\n }\n /**\n * 요청 기록\n * @param success - 성공 여부\n */\n recordRequest(success) {\n const now = Date.now();\n this.requestVolume.push({ timestamp: now, success });\n const cutoff = now - 5 * 60 * 1e3;\n this.requestVolume = this.requestVolume.filter((req) => req.timestamp > cutoff);\n }\n /**\n * 최근 요청 조회\n * @returns 최근 1분간의 요청들\n */\n getRecentRequests() {\n const cutoff = Date.now() - 60 * 1e3;\n return this.requestVolume.filter((req) => req.timestamp > cutoff);\n }\n /**\n * 에러율 계산\n * @param requests - 요청 배열\n * @returns 에러율 (%)\n */\n calculateErrorRate(requests) {\n if (requests.length === 0) return 0;\n const failures = requests.filter((req) => !req.success).length;\n return failures / requests.length * 100;\n }\n /**\n * 다음 재시도 시간 계산\n * @returns 다음 재시도 시간 (timestamp)\n */\n getNextRetryTime() {\n return this.lastFailureTime + this.options.resetTimeout;\n }\n /**\n * Circuit 상태 조회\n * @returns Circuit 통계\n */\n getStats() {\n const recentRequests = this.getRecentRequests();\n const errorRate = this.calculateErrorRate(recentRequests);\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime || void 0,\n nextRetryTime: this.state === \"OPEN\" /* OPEN */ ? this.getNextRetryTime() : void 0,\n errorRate\n };\n }\n /**\n * Circuit 수동 리셋\n */\n reset() {\n this.transitionTo(\"CLOSED\" /* CLOSED */);\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = 0;\n this.halfOpenRetries = 0;\n this.requestVolume = [];\n }\n /**\n * Circuit 수동 Open\n */\n trip() {\n this.transitionTo(\"OPEN\" /* OPEN */);\n this.lastFailureTime = Date.now();\n }\n};\nfunction calculateBackoffDelay(attempt, baseDelay = 1e3, maxDelay = 3e4) {\n const delay = Math.min(baseDelay * Math.pow(2, attempt - 1), maxDelay);\n const jitter = delay * 0.2 * (Math.random() * 2 - 1);\n return Math.round(delay + jitter);\n}\n\n// src/utils/EncryptionUtils.ts\nvar nodeCrypto;\nif (typeof window === \"undefined\" && typeof global !== \"undefined\") {\n try {\n nodeCrypto = __require(\"crypto\");\n } catch (e) {\n }\n}\nvar EncryptionUtils = class {\n // 128 bits\n /**\n * 안전한 Base64 인코딩\n * 큰 데이터에서 스택 오버플로우 방지를 위한 청크 단위 처리\n * @param buffer - 인코딩할 버퍼\n * @returns Base64 문자열\n */\n static safeBase64Encode(buffer) {\n if (typeof Buffer !== \"undefined\") {\n const buf = buffer instanceof ArrayBuffer ? Buffer.from(buffer) : Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n return buf.toString(\"base64\");\n } else {\n const uint8Array = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n const chunks = [];\n const chunkSize = 32768;\n for (let i = 0; i < uint8Array.length; i += chunkSize) {\n const chunk = uint8Array.subarray(i, i + chunkSize);\n chunks.push(String.fromCharCode.apply(null, Array.from(chunk)));\n }\n return btoa(chunks.join(\"\"));\n }\n }\n /**\n * 안전한 Base64 디코딩\n * @param base64 - 디코딩할 Base64 문자열\n * @returns 디코딩된 버퍼\n */\n static safeBase64Decode(base64) {\n if (typeof Buffer !== \"undefined\") {\n return new Uint8Array(Buffer.from(base64, \"base64\"));\n } else {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n }\n }\n /**\n * 텍스트를 암호화\n * @param text - 암호화할 텍스트\n * @param key - Base64 인코딩된 암호화 키\n * @returns 암호화된 데이터 (Base64)\n */\n static async encrypt(text, key) {\n try {\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n return this.encryptWebCrypto(text, key);\n }\n if (typeof global !== \"undefined\" && global.crypto) {\n return this.encryptNodeCrypto(text, key);\n }\n throw new Error(\"No crypto implementation available\");\n } catch (error) {\n throw new VircleError(\"ENCRYPTION_ERROR\" /* ENCRYPTION_ERROR */, \"Failed to encrypt data\", { cause: error });\n }\n }\n /**\n * Web Crypto API를 사용한 암호화\n */\n static async encryptWebCrypto(text, keyBase64) {\n const encoder = new TextEncoder();\n const data = encoder.encode(text);\n const keyData = this.safeBase64Decode(keyBase64);\n const cryptoKey = await crypto.subtle.importKey(\n \"raw\",\n keyData.buffer.slice(keyData.byteOffset, keyData.byteOffset + keyData.byteLength),\n { name: this.ALGORITHM, length: this.KEY_LENGTH },\n false,\n [\"encrypt\"]\n );\n const iv = crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));\n const encrypted = await crypto.subtle.encrypt({ name: this.ALGORITHM, iv }, cryptoKey, data);\n const result = new Uint8Array(iv.length + encrypted.byteLength);\n result.set(iv, 0);\n result.set(new Uint8Array(encrypted), iv.length);\n return this.safeBase64Encode(result);\n }\n /**\n * Node.js crypto를 사용한 암호화\n */\n static async encryptNodeCrypto(text, keyBase64) {\n const crypto2 = nodeCrypto;\n const key = Buffer.from(keyBase64, \"base64\");\n const iv = crypto2.randomBytes(this.IV_LENGTH);\n const cipher = crypto2.createCipheriv(\"aes-256-gcm\", key, iv);\n let encrypted = cipher.update(text, \"utf8\");\n encrypted = Buffer.concat([encrypted, cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([iv, encrypted, tag]).toString(\"base64\");\n }\n /**\n * AES 키 생성\n * @returns 생성된 AES 키\n */\n static async generateAESKey() {\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n return crypto.subtle.generateKey({ name: this.ALGORITHM, length: this.KEY_LENGTH }, true, [\n \"encrypt\",\n \"decrypt\"\n ]);\n } else if (nodeCrypto) {\n return nodeCrypto.randomBytes(32);\n } else {\n throw new Error(\"No crypto implementation available\");\n }\n }\n /**\n * RSA 공개키로 AES 키 암호화\n * @param aesKey - AES 키\n * @param publicKeyBase64 - Base64 인코딩된 RSA 공개키\n * @returns Base64 인코딩된 암호화된 AES 키\n */\n static async encryptAESKey(aesKey, publicKeyBase64) {\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n const publicKeyData = this.safeBase64Decode(publicKeyBase64);\n const publicKey = await crypto.subtle.importKey(\n \"spki\",\n publicKeyData.buffer.slice(\n publicKeyData.byteOffset,\n publicKeyData.byteOffset + publicKeyData.byteLength\n ),\n { name: \"RSA-OAEP\", hash: \"SHA-256\" },\n false,\n [\"encrypt\"]\n );\n const exportedKey = await crypto.subtle.exportKey(\"raw\", aesKey);\n const encryptedKey = await crypto.subtle.encrypt({ name: \"RSA-OAEP\" }, publicKey, exportedKey);\n return this.safeBase64Encode(new Uint8Array(encryptedKey));\n } else if (nodeCrypto) {\n const publicKey = nodeCrypto.createPublicKey({\n key: Buffer.from(publicKeyBase64, \"base64\"),\n format: \"der\",\n type: \"spki\"\n });\n const encryptedKey = nodeCrypto.publicEncrypt(\n {\n key: publicKey,\n oaepHash: \"sha256\",\n padding: nodeCrypto.constants.RSA_PKCS1_OAEP_PADDING\n },\n aesKey\n );\n return encryptedKey.toString(\"base64\");\n } else {\n throw new Error(\"No crypto implementation available\");\n }\n }\n /**\n * 전체 페이로드를 하이브리드 암호화\n * @param data - 암호화할 데이터\n * @param publicKeyBase64 - Base64 인코딩된 RSA 공개키\n * @returns 암호화된 페이로드\n */\n static async encryptPayload(data, publicKeyBase64) {\n try {\n const jsonStr = JSON.stringify(data);\n const aesKey = await this.generateAESKey();\n let encryptedData;\n let iv;\n let authTag;\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(jsonStr);\n const ivBuffer = crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));\n const encryptedBuffer = await crypto.subtle.encrypt(\n { name: this.ALGORITHM, iv: ivBuffer },\n aesKey,\n dataBuffer\n );\n const tagLengthBytes = 16;\n const dataLength = encryptedBuffer.byteLength - tagLengthBytes;\n const encryptedDataBuffer = encryptedBuffer.slice(0, dataLength);\n const authTagBuffer = encryptedBuffer.slice(dataLength);\n encryptedData = this.safeBase64Encode(new Uint8Array(encryptedDataBuffer));\n authTag = this.safeBase64Encode(new Uint8Array(authTagBuffer));\n iv = this.safeBase64Encode(ivBuffer);\n } else if (nodeCrypto) {\n const ivBuffer = nodeCrypto.randomBytes(this.IV_LENGTH);\n const cipher = nodeCrypto.createCipheriv(\"aes-256-gcm\", aesKey, ivBuffer);\n let encrypted = cipher.update(jsonStr, \"utf8\");\n encrypted = Buffer.concat([encrypted, cipher.final()]);\n authTag = cipher.getAuthTag();\n encryptedData = Buffer.concat([encrypted, authTag]).toString(\"base64\");\n iv = ivBuffer.toString(\"base64\");\n } else {\n throw new Error(\"No crypto implementation available\");\n }\n const encryptedKey = await this.encryptAESKey(aesKey, publicKeyBase64);\n return {\n data: encryptedData,\n key: encryptedKey,\n iv,\n authTag,\n metadata: {\n algorithm: this.ALGORITHM,\n keyAlgorithm: \"RSA-OAEP\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n }\n };\n } catch (error) {\n throw new VircleError(\"ENCRYPTION_ERROR\" /* ENCRYPTION_ERROR */, \"Failed to encrypt payload\", { cause: error });\n }\n }\n};\n// 하이브리드 암호화 구현 - AES-256-GCM으로 페이로드 암호화, RSA-OAEP로 AES 키 암호화\nEncryptionUtils.ALGORITHM = \"AES-GCM\";\nEncryptionUtils.KEY_LENGTH = 256;\nEncryptionUtils.IV_LENGTH = 12;\n// 96 bits (recommended for AES-GCM) - NIST 권장 사항\nEncryptionUtils.TAG_LENGTH = 16;\n\n// src/constants/index.ts\nvar STORAGE_KEYS = {\n USER: \"vircle_user\",\n SESSION: \"vircle_session\",\n EVENTS_QUEUE: \"vircle_events_queue\"\n};\nvar CACHE_TIMES = {\n DEFAULT_CONTEXT: 6e4,\n // 1분\n WEB_CONTEXT: 3e5,\n // 5분\n RN_CONTEXT: 3e4\n // 30초\n};\nvar getEnvVar = (key, defaultValue) => {\n if (typeof process !== \"undefined\" && process.env && typeof process.env === \"object\") {\n return process.env[key] || defaultValue;\n }\n return defaultValue;\n};\nvar ENCRYPTION_CONFIG = {\n // 폴백용 RSA 공개키 - 환경 변수로만 설정 가능\n // 보안상 소스 코드에 하드코딩하지 않음\n // RemoteConfigService를 통해 프로젝트별 키를 가져오는 것이 권장됨\n // 환경 변수 VIRCLE_RSA_PUBLIC_KEY와 VIRCLE_ALLOW_FALLBACK_KEY를 함께 설정해야 함\n PUBLIC_KEY: getEnvVar(\"VIRCLE_RSA_PUBLIC_KEY\", \"\")\n};\nvar API_ENDPOINTS = {\n development: \"https://dev-integration.vircle.co.kr/v1/track/events\",\n production: \"https://integration.vircle.co.kr/v1/track/events\"\n};\nvar CDN_ENDPOINTS = {\n development: \"https://dstatic.vircle.co.kr/sdk/v1/config\",\n production: \"https://static.vircle.co.kr/sdk/v1/config\"\n};\n\n// src/services/TransportService.ts\nvar TransportService = class {\n constructor(config, options = {}) {\n this.eventQueue = new PriorityQueue();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n this.isFlushingQueue = false;\n this.disposed = false;\n this.config = config;\n this.options = {\n timeout: 3e4,\n // 30 seconds\n retryAttempts: 3,\n retryDelay: 1e3,\n // 1 second\n batchSize: 50,\n enableBatching: true,\n enableCompression: false,\n ...options\n };\n this.cryptoAdapter = options.cryptoAdapter;\n this.circuitBreaker = new CircuitBreaker({\n failureThreshold: 5,\n resetTimeout: 6e4,\n // 1분\n errorThresholdPercentage: 50,\n onStateChange: (state) => {\n if (this.config.debug) {\n console.warn(`[TransportService] Circuit breaker state changed to: ${state}`);\n }\n }\n });\n this.setupAutoFlush();\n }\n /**\n * 자동 플러시 설정\n */\n setupAutoFlush() {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n this.flushTimer = setInterval(async () => {\n try {\n await this.flushPriorityQueue();\n } catch (error) {\n if (this.config.debug) {\n console.error(\"[TransportService] Auto-flush error:\", error);\n }\n }\n }, this.config.batch?.flushInterval || 1e4);\n }\n /**\n * 단일 이벤트 전송\n * @param event - 전송할 이벤트\n * @returns 전송 결과\n */\n async send(event) {\n if (this.disposed) {\n throw new VircleError(\"SERVICE_DISPOSED\" /* SERVICE_DISPOSED */, \"TransportService has been disposed\");\n }\n if (this.config.debug) {\n console.log(\"[TransportService] Received event:\", event.name);\n }\n const priority = getEventPriority(event.name);\n this.eventQueue.enqueue(event, priority);\n if (this.config.debug) {\n console.log(\n \"[TransportService] Event enqueued with priority:\",\n priority,\n \"Queue size:\",\n this.eventQueue.size()\n );\n }\n if (priority >= 100 /* CRITICAL */) {\n const result = await this.flushPriorityQueue();\n return result.results[0] || { success: true };\n }\n if (this.eventQueue.size() >= (this.options.batchSize || 50)) {\n const result = await this.flushPriorityQueue();\n return result.results[0] || { success: true };\n }\n if (this.config.debug || this.config.environment === \"development\") {\n if (this.config.debug) {\n console.log(\"[TransportService] Debug mode: flushing immediately\");\n }\n const result = await this.flushPriorityQueue();\n return result.results[0] || { success: true };\n }\n this.scheduleNextTickFlush();\n return { success: true };\n }\n /**\n * 다음 이벤트 루프 틱에 flush 스케줄.\n * 이미 스케줄된 flush가 있으면 중복 스케줄하지 않아 같은 틱의 이벤트를 배치로 묶는다.\n */\n scheduleNextTickFlush() {\n if (this.pendingFlushTimer) return;\n this.pendingFlushTimer = setTimeout(() => {\n this.pendingFlushTimer = void 0;\n this.flushPriorityQueue().catch(() => {\n });\n }, 0);\n }\n /**\n * 이벤트 배치 전송\n * @param events - 전송할 이벤트 배열\n * @returns 배치 전송 결과\n */\n async sendBatch(events) {\n if (this.disposed) {\n throw new VircleError(\"SERVICE_DISPOSED\" /* SERVICE_DISPOSED */, \"TransportService has been disposed\");\n }\n if (events.length === 0) {\n return {\n totalEvents: 0,\n successfulEvents: 0,\n failedEvents: 0,\n results: []\n };\n }\n for (const event of events) {\n const priority = getEventPriority(event.name);\n this.eventQueue.enqueue(event, priority);\n }\n return this.flushPriorityQueue();\n }\n /**\n * 우선순위 큐 플러시\n * @returns 전송 결과\n */\n async flushPriorityQueue() {\n if (this.isFlushingQueue) {\n if (this.config.debug) {\n console.log(\"[TransportService] Already flushing queue, skipping...\");\n }\n return {\n totalEvents: 0,\n successfulEvents: 0,\n failedEvents: 0,\n results: []\n };\n }\n if (this.eventQueue.isEmpty()) {\n return {\n totalEvents: 0,\n successfulEvents: 0,\n failedEvents: 0,\n results: []\n };\n }\n this.isFlushingQueue = true;\n try {\n const criticalEvents = this.eventQueue.extractByPriority(100 /* CRITICAL */);\n const highPriorityEvents = this.eventQueue.extractByPriority(75 /* HIGH */);\n const normalEvents = this.eventQueue.extractBatch(this.options.batchSize || 50);\n const results = [];\n let successfulEvents = 0;\n let failedEvents = 0;\n if (criticalEvents.length > 0) {\n const criticalResult = await this.executeBatchRequest(criticalEvents);\n results.push(...criticalResult.results);\n successfulEvents += criticalResult.successfulEvents;\n failedEvents += criticalResult.failedEvents;\n }\n if (highPriorityEvents.length > 0) {\n const highResult = await this.executeBatchRequest(highPriorityEvents);\n results.push(...highResult.results);\n successfulEvents += highResult.successfulEvents;\n failedEvents += highResult.failedEvents;\n }\n if (normalEvents.length > 0) {\n const normalResult = await this.executeBatchRequest(normalEvents);\n results.push(...normalResult.results);\n successfulEvents += normalResult.successfulEvents;\n failedEvents += normalResult.failedEvents;\n }\n return {\n totalEvents: results.length,\n successfulEvents,\n failedEvents,\n results\n };\n } finally {\n this.isFlushingQueue = false;\n }\n }\n /**\n * 요청 큐 처리\n */\n async processQueue() {\n if (this.isProcessingQueue || this.requestQueue.length === 0) {\n return;\n }\n this.isProcessingQueue = true;\n try {\n while (this.requestQueue.length > 0) {\n const batch = [];\n const batchEvents = [];\n let currentSize = 0;\n while (this.requestQueue.length > 0 && currentSize < this.options.batchSize) {\n const request = this.requestQueue.shift();\n const remainingCapacity = this.options.batchSize - currentSize;\n if (request.events.length <= remainingCapacity) {\n batch.push(request);\n batchEvents.push(...request.events);\n currentSize += request.events.length;\n } else {\n const partialEvents = request.events.slice(0, remainingCapacity);\n const remainingEvents = request.events.slice(remainingCapacity);\n batch.push({\n events: partialEvents,\n resolve: request.resolve,\n reject: request.reject\n });\n batchEvents.push(...partialEvents);\n currentSize += partialEvents.length;\n this.requestQueue.unshift({\n events: remainingEvents,\n resolve: request.resolve,\n reject: request.reject\n });\n break;\n }\n }\n try {\n const result = await this.executeBatchRequest(batchEvents);\n let eventIndex = 0;\n for (const request of batch) {\n const requestResults = result.results.slice(eventIndex, eventIndex + request.events.length);\n const requestResult = {\n totalEvents: request.events.length,\n successfulEvents: requestResults.filter((r) => r.success).length,\n failedEvents: requestResults.filter((r) => !r.success).length,\n results: requestResults\n };\n request.resolve(requestResult);\n eventIndex += request.events.length;\n }\n } catch (error) {\n for (const request of batch) {\n request.reject(error);\n }\n }\n }\n } finally {\n this.isProcessingQueue = false;\n }\n }\n /**\n * 지수 백오프 재시도로 배치 요청 실행\n * @param events - 전송할 이벤트 배열\n * @returns 배치 전송 결과\n * Enhanced retry logic with exponential backoff and jitter\n */\n async executeBatchRequest(events) {\n let lastError = null;\n if (this.config.debug) {\n console.log(`[Vircle SDK] executeBatchRequest start - events :`, events);\n }\n try {\n return await this.circuitBreaker.execute(async () => {\n for (let attempt = 0; attempt <= this.options.retryAttempts; attempt++) {\n try {\n const result = await this.makeHttpRequest(events);\n if (result.success) {\n return {\n totalEvents: events.length,\n successfulEvents: events.length,\n failedEvents: 0,\n results: events.map(() => result)\n };\n } else if (!result.retryable) {\n return {\n totalEvents: events.length,\n successfulEvents: 0,\n failedEvents: events.length,\n results: events.map(() => result)\n };\n }\n lastError = result.error || new Error(\"Unknown error\");\n } catch (error) {\n lastError = error;\n if (this.config.debug) {\n console.log(`[Vircle SDK] error : ${JSON.stringify(lastError)}`);\n }\n }\n if (attempt < this.options.retryAttempts) {\n const delay = calculateBackoffDelay(attempt + 1, this.options.retryDelay);\n if (this.config.debug) {\n console.log(\n `[Vircle SDK] Retry attempt ${attempt + 1}/${this.options.retryAttempts} after ${delay}ms delay`\n );\n }\n await this.delay(delay);\n }\n }\n const failureResult = {\n success: false,\n error: lastError || new Error(\"Max retry attempts exceeded\"),\n retryable: false\n };\n return {\n totalEvents: events.length,\n successfulEvents: 0,\n failedEvents: events.length,\n results: events.map(() => failureResult)\n };\n });\n } catch (error) {\n const circuitError = error;\n const failureResult = {\n success: false,\n error: circuitError,\n retryable: false\n };\n return {\n totalEvents: events.length,\n successfulEvents: 0,\n failedEvents: events.length,\n results: events.map(() => failureResult)\n };\n }\n }\n /**\n * HTTP 요청 실행\n * @param events - 전송할 이벤트 배열\n * @returns 전송 결과\n */\n async makeHttpRequest(events) {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] config:\", this.config);\n }\n const environment = this.config.environment || \"production\";\n const url = API_ENDPOINTS[environment];\n const timestamp = (/* @__PURE__ */ new Date()).toISOString();\n let payload = {\n payload: {\n events\n },\n timestamp\n };\n const headers = {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Vircle-SDK-TypeScript/1.0.0\",\n ...this.config.headers,\n ...this.options.headers\n };\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n headers[\"X-Vircle-Timestamp\"] = timestamp;\n }\n if (this.encryptionConfig?.enabled && this.encryptionConfig.publicKey) {\n try {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] start encryption - config: \", this.encryptionConfig);\n }\n let encryptedPayload;\n if (this.cryptoAdapter && typeof this.cryptoAdapter.encryptPayload === \"function\") {\n if (this.config.debug) {\n console.log(\n \"[makeHttpRequest] Using platform-specific crypto adapter:\",\n this.cryptoAdapter.constructor.name\n );\n console.log(\n \"[makeHttpRequest] Payload to encrypt:\",\n JSON.stringify(payload.payload).substring(0, 100) + \"...\"\n );\n console.log(\"[makeHttpRequest] Public key available:\", !!this.encryptionConfig.publicKey);\n console.log(\"[makeHttpRequest] Public key length:\", this.encryptionConfig.publicKey.length);\n }\n encryptedPayload = await this.cryptoAdapter.encryptPayload(\n payload.payload,\n this.encryptionConfig.publicKey\n );\n } else {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] Fall back to built-in EncryptionUtils\");\n }\n encryptedPayload = await EncryptionUtils.encryptPayload(\n payload.payload,\n this.encryptionConfig.publicKey\n );\n }\n payload = {\n encrypted: true,\n payload: encryptedPayload,\n timestamp\n };\n const signature = await createHmacSignature(payload, this.config.apiKey, this.cryptoAdapter);\n if (this.config.debug) {\n console.debug(\"[makeHttpRequest] signature:\", signature);\n }\n headers[\"X-Vircle-Signature\"] = signature;\n headers[\"X-Vircle-Encrypted\"] = \"true\";\n if (this.config.debug) {\n console.debug(\"[makeHttpRequest] headers:\", headers);\n }\n } catch (error) {\n const encryptionError = new NetworkError(\n \"Failed to encrypt payload. Aborting transmission for security.\",\n void 0,\n { cause: error }\n );\n if (this.config.debug) {\n console.error(\"[makeHttpRequest] Encryption failed:\", error);\n console.error(\"[makeHttpRequest] Error type:\", typeof error);\n console.error(\n \"[makeHttpRequest] Error name:\",\n error instanceof Error ? error.name : \"Not an Error instance\"\n );\n console.error(\n \"[makeHttpRequest] Error message:\",\n error instanceof Error ? error.message : String(error)\n );\n console.error(\n \"[makeHttpRequest] Error stack:\",\n error instanceof Error ? error.stack : \"No stack trace\"\n );\n console.error(\n \"[makeHttpRequest] Crypto adapter type:\",\n this.cryptoAdapter ? this.cryptoAdapter.constructor.name : \"No adapter\"\n );\n console.error(\n \"[makeHttpRequest] Public key preview:\",\n this.encryptionConfig.publicKey.substring(0, 50) + \"...\"\n );\n }\n return {\n success: false,\n error: encryptionError,\n retryable: false\n };\n }\n }\n let promiseResolved = false;\n let warningTimeout;\n let abortController;\n let abortTimeout;\n try {\n let signal;\n if (typeof AbortController !== \"undefined\") {\n abortController = new AbortController();\n signal = abortController.signal;\n abortTimeout = setTimeout(() => {\n abortController?.abort();\n }, this.options.timeout);\n }\n let requestBody;\n try {\n requestBody = JSON.stringify(payload);\n } catch (error) {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] Failed to stringify payload:\", error);\n }\n return {\n success: false,\n error: new NetworkError(\"Failed to serialize request payload\", void 0, {\n cause: error,\n context: {\n errorName: error instanceof Error ? error.name : \"Unknown\",\n isSerializationError: true\n }\n }),\n retryable: false\n // 직렬화 오류는 재시도해도 동일\n };\n }\n const request = {\n method: \"POST\",\n headers,\n body: requestBody,\n signal\n };\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] fetch - url:\", url);\n console.log(\"[makeHttpRequest] fetch - request:\", request);\n console.log(\"[makeHttpRequest] fetch - starting request...\");\n }\n warningTimeout = setTimeout(() => {\n if (!promiseResolved && this.config.debug) {\n console.log(\"[makeHttpRequest] fetch - Promise still pending after 10 seconds\");\n console.log(\n \"[makeHttpRequest] fetch - Possible causes: ATS policy, network proxy, or fetch polyfill issue\"\n );\n }\n }, 1e4);\n const response = await this.fetch(url, request);\n promiseResolved = true;\n if (warningTimeout) clearTimeout(warningTimeout);\n if (abortTimeout) clearTimeout(abortTimeout);\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] fetch - response received\");\n console.log(\"[makeHttpRequest] fetch - response status:\", response.status);\n console.log(\"[makeHttpRequest] fetch - response ok:\", response.ok);\n }\n let responseBody;\n try {\n const textPromise = response.text();\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error(\"Response body read timeout\")), 5e3);\n });\n responseBody = await Promise.race([textPromise, timeoutPromise]);\n } catch (error) {\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] Failed to read response body:\", error);\n }\n return {\n success: response.ok,\n statusCode: response.status,\n responseBody: null,\n retryable: this.isRetryableHttpStatus(response.status)\n };\n }\n let parsedBody = null;\n try {\n parsedBody = JSON.parse(responseBody);\n } catch {\n }\n if (response.ok) {\n return {\n success: true,\n statusCode: response.status,\n responseBody: parsedBody\n };\n } else {\n const error = new NetworkError(\n parsedBody?.message || `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n { context: { responseBody } }\n );\n return {\n success: false,\n statusCode: response.status,\n responseBody: parsedBody,\n error,\n retryable: this.isRetryableHttpStatus(response.status)\n };\n }\n } catch (error) {\n promiseResolved = true;\n if (warningTimeout) clearTimeout(warningTimeout);\n if (abortTimeout) clearTimeout(abortTimeout);\n if (this.config.debug) {\n console.log(\"[makeHttpRequest] Request failed:\", error);\n console.log(\"[makeHttpRequest] Error type:\", typeof error);\n console.log(\"[makeHttpRequest] Error name:\", error instanceof Error ? error.name : \"Unknown\");\n console.log(\"[makeHttpRequest] Error message:\", error instanceof Error ? error.message : String(error));\n console.log(\"[makeHttpRequest] Error stack:\", error instanceof Error ? error.stack : \"No stack\");\n }\n const errorMessage = error instanceof Error ? error.message : String(error);\n const isAbortError = error instanceof Error && error.name === \"AbortError\";\n const isTypeError = error instanceof Error && error.name === \"TypeError\";\n const isNetworkError = errorMessage.includes(\"Network request failed\") || errorMessage.includes(\"Failed to fetch\") || errorMessage.includes(\"Load failed\");\n const networkError = new NetworkError(\n isAbortError ? `Request timeout after ${this.options.timeout}ms` : `Network request failed: ${errorMessage}`,\n void 0,\n {\n cause: error,\n context: {\n errorName: error instanceof Error ? error.name : \"Unknown\",\n isAbortError,\n isTypeError,\n isNetworkError,\n timeout: this.options.timeout,\n url,\n environment: typeof window !== \"undefined\" ? \"browser\" : typeof global !== \"undefined\" ? \"node/react-native\" : \"unknown\"\n }\n }\n );\n return {\n success: false,\n error: networkError,\n retryable: !isAbortError && this.isRetryableError(error)\n };\n }\n }\n /**\n * fetch 구현 획듍\n * 브라우저/Node.js 환경 지원\n * @param url - 요청 URL\n * @param options - 요청 옵션\n * @returns Response 객체\n * @throws {NetworkError} fetch 구현 없을 시\n */\n async fetch(url, options) {\n if (typeof fetch !== \"undefined\") {\n if (this.config.debug) {\n console.log(\"[fetch] Using global fetch implementation\");\n }\n return fetch(url, options);\n }\n if (typeof window !== \"undefined\" && window.fetch) {\n if (this.config.debug) {\n console.log(\"[fetch] Using window.fetch implementation\");\n }\n return window.fetch(url, options);\n }\n if (typeof global !== \"undefined\") {\n try {\n const fetchModule = await import(\n /* webpackIgnore: true */\n 'node-fetch'\n );\n const nodeFetch = fetchModule.default || fetchModule;\n if (this.config.debug) {\n console.log(\"[fetch] Using node-fetch implementation\");\n }\n return nodeFetch(url, options);\n } catch {\n }\n }\n throw new NetworkError(\"No fetch implementation available\", void 0, {\n context: {\n environment: typeof window !== \"undefined\" ? \"browser\" : \"node\",\n hasFetch: typeof fetch !== \"undefined\",\n hasWindowFetch: typeof window !== \"undefined\" && typeof window.fetch !== \"undefined\"\n }\n });\n }\n /**\n * HTTP 상태 코드 재시도 가능 확인\n * @param status - HTTP 상태 코드\n * @returns 재시도 가능 여부\n */\n isRetryableHttpStatus(status) {\n return status >= 500 || status === 408 || status === 429;\n }\n /**\n * 에러 재시도 가능 확인\n * @param error - 확인할 에러\n * @returns 재시도 가능 여부\n */\n isRetryableError(error) {\n const retryableMessages = [\"timeout\", \"network\", \"connection\", \"econnreset\", \"enotfound\", \"econnrefused\"];\n const message = error.message.toLowerCase();\n return retryableMessages.some((keyword) => message.includes(keyword));\n }\n /**\n * 딜레이 유틸리티\n * @param ms - 대기 시간 (밀리초)\n * @returns Promise<void>\n */\n delay(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n /**\n * fetch + keepalive를 사용하여 이벤트 전송 (페이지 언로드 시 사용)\n * keepalive: true로 페이지 이탈 후에도 요청 완료 보장\n * Authorization 헤더를 포함하여 서버 인증 통과\n * 암호화는 비동기 API가 필요하므로 스킵\n * @param events - 전송할 이벤트 배열\n * @returns 전송 성공 여부\n */\n sendWithKeepalive(events) {\n if (typeof fetch === \"undefined\") {\n return false;\n }\n if (events.length === 0) {\n return true;\n }\n const environment = this.config.environment || \"production\";\n const url = API_ENDPOINTS[environment];\n const timestamp = (/* @__PURE__ */ new Date()).toISOString();\n const headers = {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Vircle-SDK-TypeScript/1.0.0\"\n };\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n headers[\"X-Vircle-Timestamp\"] = timestamp;\n }\n const payload = {\n payload: { events },\n timestamp\n };\n try {\n fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n keepalive: true\n }).catch(() => {\n });\n return true;\n } catch {\n return false;\n }\n }\n /**\n * fetch+keepalive로 큐의 대기 이벤트를 전송하고 큐를 비움\n * @returns 전송 성공 여부\n */\n flushWithKeepalive() {\n const events = this.eventQueue.extractBatch(this.eventQueue.size());\n if (events.length === 0) {\n return true;\n }\n return this.sendWithKeepalive(events);\n }\n /**\n * 큐 상태 조회\n * @returns 큐 크기와 처리 상태\n */\n getQueueStatus() {\n return {\n queueSize: this.requestQueue.length,\n isProcessing: this.isProcessingQueue\n };\n }\n /**\n * 큐 즉시 전송\n */\n async flush() {\n await this.flushPriorityQueue();\n if (this.requestQueue.length > 0) {\n await this.processQueue();\n }\n }\n /**\n * 큐 초기화\n */\n clearQueue() {\n this.eventQueue.clear();\n const clearError = new VircleError(\"CLEANUP_ERROR\" /* CLEANUP_ERROR */, \"Transport queue cleared during shutdown\");\n for (const request of this.requestQueue) {\n request.reject(clearError);\n }\n this.requestQueue = [];\n }\n /**\n * 설정 업데이트\n * @param config - 업데이트할 설정\n */\n updateConfig(config) {\n this.config = { ...this.config, ...config };\n }\n /**\n * 암호화 설정\n * @param encryptionConfig - 암호화 설정\n */\n setEncryptionConfig(encryptionConfig) {\n this.encryptionConfig = encryptionConfig;\n }\n /**\n * 전송 옵션 업데이트\n * @param options - 업데이트할 옵션\n */\n updateOptions(options) {\n this.options = { ...this.options, ...options };\n }\n /**\n * 서비스 리소스 정리\n * 메모리 누수 방지를 위한 정리 메서드\n */\n dispose() {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = void 0;\n }\n if (this.pendingFlushTimer) {\n clearTimeout(this.pendingFlushTimer);\n this.pendingFlushTimer = void 0;\n }\n this.clearQueue();\n this.circuitBreaker.reset();\n this.config = {};\n this.options = {};\n }\n /**\n * 서비스 폐기 상태 확인\n * @returns 폐기 여부\n */\n isDisposed() {\n return this.disposed;\n }\n};\n\n// src/validators/BaseValidator.ts\nvar BaseValidator = class {\n constructor() {\n this.rules = [];\n }\n /**\n * 검증 규칙 추가\n * @param rule - 추가할 검증 규칙\n * @returns this 인스턴스 (체이닝)\n */\n addRule(rule) {\n this.rules.push(rule);\n return this;\n }\n /**\n * 검증 규칙 제거\n * @param name - 제거할 규칙 이름\n * @returns this 인스턴스 (체이닝)\n */\n removeRule(name) {\n this.rules = this.rules.filter((rule) => rule.name !== name);\n return this;\n }\n /**\n * 모든 규칙에 대해 값 검증\n * @param value - 검증할 값\n * @returns 검증 결과\n */\n validate(value) {\n const errors = [];\n const warnings = [];\n for (const rule of this.rules) {\n try {\n const result = rule.validate(value);\n errors.push(...result.errors);\n warnings.push(...result.warnings);\n } catch (error) {\n errors.push(`Validation rule '${rule.name}' failed: ${error.message}`);\n }\n }\n return {\n isValid: errors.length === 0,\n errors,\n warnings\n };\n }\n /**\n * 공통 검증 유틸리티\n */\n /**\n * 필수 값 검증\n * @param value - 검증할 값\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateRequired(value, fieldName) {\n if (value === null || value === void 0 || value === \"\") {\n return {\n isValid: false,\n errors: [`${fieldName} is required`],\n warnings: []\n };\n }\n return { isValid: true, errors: [], warnings: [] };\n }\n /**\n * 문자열 길이 검증\n * @param value - 검증할 문자열\n * @param min - 최소 길이\n * @param max - 최대 길이\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateStringLength(value, min, max, fieldName = \"Field\") {\n const errors = [];\n if (typeof value !== \"string\") {\n errors.push(`${fieldName} must be a string`);\n } else {\n if (min !== void 0 && value.length < min) {\n errors.push(`${fieldName} must be at least ${min} characters long`);\n }\n if (max !== void 0 && value.length > max) {\n errors.push(`${fieldName} must be at most ${max} characters long`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings: [] };\n }\n /**\n * 숫자 범위 검증\n * @param value - 검증할 숫자\n * @param min - 최소값\n * @param max - 최대값\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateNumberRange(value, min, max, fieldName = \"Field\") {\n const errors = [];\n if (typeof value !== \"number\" || isNaN(value)) {\n errors.push(`${fieldName} must be a valid number`);\n } else {\n if (min !== void 0 && value < min) {\n errors.push(`${fieldName} must be at least ${min}`);\n }\n if (max !== void 0 && value > max) {\n errors.push(`${fieldName} must be at most ${max}`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings: [] };\n }\n /**\n * 열거형 값 검증\n * @param value - 검증할 값\n * @param enumObject - 열거형 객체\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateEnum(value, enumObject, fieldName = \"Field\") {\n const validValues = Object.values(enumObject);\n if (!validValues.includes(value)) {\n return {\n isValid: false,\n errors: [`${fieldName} must be one of: ${validValues.join(\", \")}`],\n warnings: []\n };\n }\n return { isValid: true, errors: [], warnings: [] };\n }\n /**\n * URL 형식 검증\n * @param value - 검증할 URL\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateUrl(value, fieldName = \"URL\") {\n try {\n new URL(value);\n return { isValid: true, errors: [], warnings: [] };\n } catch {\n return {\n isValid: false,\n errors: [`${fieldName} must be a valid URL`],\n warnings: []\n };\n }\n }\n /**\n * 이메일 형식 검증\n * @param value - 검증할 이메일\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateEmail(value, fieldName = \"Email\") {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return {\n isValid: false,\n errors: [`${fieldName} must be a valid email address`],\n warnings: []\n };\n }\n return { isValid: true, errors: [], warnings: [] };\n }\n /**\n * 객체 필수 속성 검증\n * @param obj - 검증할 객체\n * @param requiredProps - 필수 속성 배열\n * @param objectName - 객체 이름\n * @returns 검증 결과\n */\n validateRequiredProperties(obj, requiredProps, objectName = \"Object\") {\n const errors = [];\n if (typeof obj !== \"object\" || obj === null) {\n errors.push(`${objectName} must be an object`);\n } else {\n for (const prop of requiredProps) {\n if (!(prop in obj) || obj[prop] === null || obj[prop] === void 0) {\n errors.push(`${objectName}.${prop} is required`);\n }\n }\n }\n return { isValid: errors.length === 0, errors, warnings: [] };\n }\n /**\n * 배열 항목 검증\n * @param array - 검증할 배열\n * @param itemValidator - 항목 검증 함수\n * @param fieldName - 필드 이름\n * @returns 검증 결과\n */\n validateArray(array, itemValidator, fieldName = \"Array\") {\n const errors = [];\n const warnings = [];\n if (!Array.isArray(array)) {\n errors.push(`${fieldName} must be an array`);\n } else {\n array.forEach((item, index) => {\n const result = itemValidator(item, index);\n errors.push(...result.errors.map((error) => `${fieldName}[${index}]: ${error}`));\n warnings.push(...result.warnings.map((warning) => `${fieldName}[${index}]: ${warning}`));\n });\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 위험 콘텐츠 검사\n * @param value - 검사할 값\n * @param fieldName - 필드 이름\n * @returns 검증 결과 (경고 및 오류 포함)\n */\n checkSecurity(value, fieldName) {\n const warnings = [];\n const errors = [];\n if (typeof value === \"string\") {\n if (/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi.test(value)) {\n errors.push(`${fieldName} contains potentially dangerous script content`);\n }\n const suspiciousPatterns = [/javascript:/i, /data:text\\/html/i, /vbscript:/i, /on\\w+\\s*=/i];\n for (const pattern of suspiciousPatterns) {\n if (pattern.test(value)) {\n warnings.push(`${fieldName} contains potentially suspicious content`);\n break;\n }\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n};\n\n// src/validators/EventValidator.ts\nvar EventValidator = class extends BaseValidator {\n constructor(config = {}) {\n super();\n this.config = {\n maxEventNameLength: 100,\n maxPropertyKeyLength: 50,\n maxPropertyValueLength: 1e3,\n maxPropertiesCount: 100,\n maxEventSize: 100 * 1024,\n // 100KB\n allowedEventNamePattern: /^[a-zA-Z0-9_.-]+$/,\n forbiddenPropertyNames: [\"__proto__\", \"constructor\", \"prototype\"],\n enableSecurityChecks: true,\n ...config\n };\n this.setupValidationRules();\n }\n /**\n * 향상된 결과로 이벤트 검증\n * @param event - 검증할 이벤트\n * @returns 향상된 검증 결과\n */\n validate(event) {\n const result = super.validate(event);\n return {\n isValid: result.isValid,\n errors: result.errors,\n warnings: result.warnings\n };\n }\n /**\n * 검증 규칙 설정\n */\n setupValidationRules() {\n this.addRule({\n name: \"required_fields\",\n validate: (event) => this.validateRequiredFields(event)\n });\n this.addRule({\n name: \"event_name\",\n validate: (event) => this.validateEventName(event.name)\n });\n this.addRule({\n name: \"properties\",\n validate: (event) => this.validateProperties(event.properties)\n });\n this.addRule({\n name: \"context\",\n validate: (event) => this.validateContext(event.context)\n });\n this.addRule({\n name: \"user_id\",\n validate: (event) => this.validateUserId(event.userId)\n });\n this.addRule({\n name: \"session_id\",\n validate: (event) => this.validateSessionId(event.sessionId)\n });\n this.addRule({\n name: \"timestamp\",\n validate: (event) => this.validateTimestamp(event.timestamp)\n });\n this.addRule({\n name: \"event_size\",\n validate: (event) => this.validateEventSize(event)\n });\n if (this.config.enableSecurityChecks) {\n this.addRule({\n name: \"security\",\n validate: (event) => this.validateSecurity(event)\n });\n }\n }\n /**\n * 필수 필드 검증\n * @param event - 검증할 이벤트\n * @returns 검증 결과\n */\n validateRequiredFields(event) {\n const errors = [];\n if (!event.name) {\n errors.push(\"Event name is required\");\n }\n return { isValid: errors.length === 0, errors, warnings: [] };\n }\n /**\n * 이벤트 이름 검증\n * @param name - 검증할 이벤트 이름\n * @returns 검증 결과\n */\n validateEventName(name) {\n const errors = [];\n const warnings = [];\n if (!name) {\n return { isValid: true, errors, warnings };\n }\n if (name.length > this.config.maxEventNameLength) {\n errors.push(`Event name must not exceed ${this.config.maxEventNameLength} characters`);\n }\n if (!this.config.allowedEventNamePattern.test(name)) {\n errors.push(\n \"Event name contains invalid characters. Use only letters, numbers, underscores, dots, and hyphens\"\n );\n }\n const reservedNames = [\"error\", \"debug\", \"log\", \"warn\", \"info\"];\n if (reservedNames.includes(name.toLowerCase())) {\n warnings.push(`Event name '${name}' is reserved and may cause conflicts`);\n }\n if (name.includes(\" \")) {\n warnings.push(\"Event name contains spaces. Consider using underscores or camelCase\");\n }\n if (name !== name.toLowerCase() && name.includes(\"_\")) {\n warnings.push(\"Mixing camelCase and snake_case in event name is not recommended\");\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 이벤트 속성 검증\n * @param properties - 검증할 속성\n * @returns 검증 결과\n */\n validateProperties(properties) {\n const errors = [];\n const warnings = [];\n if (!properties) {\n return { isValid: true, errors, warnings };\n }\n if (typeof properties !== \"object\" || Array.isArray(properties)) {\n errors.push(\"Properties must be an object\");\n return { isValid: false, errors, warnings };\n }\n const propertyKeys = Object.keys(properties);\n if (propertyKeys.length > this.config.maxPropertiesCount) {\n errors.push(`Too many properties. Maximum allowed: ${this.config.maxPropertiesCount}`);\n }\n for (const key of propertyKeys) {\n const value = properties[key];\n if (key.length > this.config.maxPropertyKeyLength) {\n errors.push(`Property key '${key}' exceeds maximum length of ${this.config.maxPropertyKeyLength}`);\n }\n if (this.config.forbiddenPropertyNames.includes(key)) {\n errors.push(`Property name '${key}' is forbidden`);\n }\n if (key.startsWith(\"_\") && !key.startsWith(\"_vircle_\")) {\n warnings.push(`Property '${key}' starts with underscore. This may conflict with internal properties`);\n }\n const valueValidation = this.validatePropertyValue(value, key);\n errors.push(...valueValidation.errors);\n warnings.push(...valueValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 속성 값 검증\n * @param value - 검증할 값\n * @param key - 속성 키\n * @returns 검증 결과\n */\n validatePropertyValue(value, key) {\n const errors = [];\n const warnings = [];\n if (value === null || value === void 0) {\n warnings.push(`Property '${key}' has null/undefined value`);\n return { isValid: true, errors, warnings };\n }\n const valueType = typeof value;\n const allowedTypes = [\"string\", \"number\", \"boolean\", \"object\"];\n if (!allowedTypes.includes(valueType)) {\n errors.push(`Property '${key}' has unsupported type '${valueType}'`);\n return { isValid: false, errors, warnings };\n }\n if (valueType === \"string\") {\n if (value.length > this.config.maxPropertyValueLength) {\n errors.push(`Property '${key}' value exceeds maximum length of ${this.config.maxPropertyValueLength}`);\n }\n if (this.config.enableSecurityChecks) {\n const securityCheck = this.checkSecurity(value, `Property '${key}'`);\n errors.push(...securityCheck.errors);\n warnings.push(...securityCheck.warnings);\n }\n }\n if (valueType === \"number\") {\n if (!Number.isFinite(value)) {\n errors.push(`Property '${key}' has invalid number value (Infinity/NaN)`);\n }\n }\n if (valueType === \"object\" && value !== null) {\n if (Array.isArray(value)) {\n if (value.length > 100) {\n warnings.push(`Property '${key}' array is very large (${value.length} items)`);\n }\n } else {\n const nestedValidation = this.validateProperties(value);\n errors.push(...nestedValidation.errors.map((error) => `${key}.${error}`));\n warnings.push(...nestedValidation.warnings.map((warning) => `${key}.${warning}`));\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 컨텍스트 검증\n * @param context - 검증할 컨텍스트\n * @returns 검증 결과\n */\n validateContext(context) {\n if (!context) {\n return { isValid: true, errors: [], warnings: [] };\n }\n return this.validateProperties(context);\n }\n /**\n * 사용자 ID 검증\n * @param userId - 검증할 사용자 ID\n * @returns 검증 결과\n */\n validateUserId(userId) {\n if (!userId) {\n return { isValid: true, errors: [], warnings: [] };\n }\n return this.validateStringLength(userId, 1, 255, \"User ID\");\n }\n /**\n * 세션 ID 검증\n * @param sessionId - 검증할 세션 ID\n * @returns 검증 결과\n */\n validateSessionId(sessionId) {\n if (!sessionId) {\n return { isValid: true, errors: [], warnings: [] };\n }\n return this.validateStringLength(sessionId, 1, 255, \"Session ID\");\n }\n /**\n * 타임스탬프 검증\n * @param timestamp - 검증할 타임스탬프\n * @returns 검증 결과\n */\n validateTimestamp(timestamp) {\n const errors = [];\n const warnings = [];\n if (!timestamp) {\n return { isValid: true, errors, warnings };\n }\n let date;\n if (timestamp instanceof Date) {\n date = timestamp;\n } else if (typeof timestamp === \"string\") {\n date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n errors.push(\"Invalid timestamp format\");\n return { isValid: false, errors, warnings };\n }\n } else {\n errors.push(\"Timestamp must be a Date object or ISO string\");\n return { isValid: false, errors, warnings };\n }\n const now = /* @__PURE__ */ new Date();\n const oneYearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate());\n const oneHourFromNow = new Date(now.getTime() + 60 * 60 * 1e3);\n if (date < oneYearAgo) {\n warnings.push(\"Timestamp is more than a year old\");\n }\n if (date > oneHourFromNow) {\n warnings.push(\"Timestamp is in the future\");\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 이벤트 크기 검증\n * @param event - 검증할 이벤트\n * @returns 검증 결과\n */\n validateEventSize(event) {\n try {\n const eventString = JSON.stringify(event);\n const eventSize = new Blob([eventString]).size;\n if (eventSize > this.config.maxEventSize) {\n return {\n isValid: false,\n errors: [\n `Event size (${eventSize} bytes) exceeds maximum allowed size (${this.config.maxEventSize} bytes)`\n ],\n warnings: []\n };\n }\n const warnings = [];\n if (eventSize > this.config.maxEventSize * 0.8) {\n warnings.push(`Event size (${eventSize} bytes) is approaching the maximum limit`);\n }\n return { isValid: true, errors: [], warnings };\n } catch (error) {\n return {\n isValid: false,\n errors: [`Failed to calculate event size: ${error.message}`],\n warnings: []\n };\n }\n }\n /**\n * 보안 검증\n * @param event - 검증할 이벤트\n * @returns 검증 결과\n */\n validateSecurity(event) {\n const errors = [];\n const warnings = [];\n const nameCheck = this.checkSecurity(event.name, \"Event name\");\n errors.push(...nameCheck.errors);\n warnings.push(...nameCheck.warnings);\n if (event.userId) {\n const userIdCheck = this.checkSecurity(event.userId, \"User ID\");\n errors.push(...userIdCheck.errors);\n warnings.push(...userIdCheck.warnings);\n }\n if (event.sessionId) {\n const sessionIdCheck = this.checkSecurity(event.sessionId, \"Session ID\");\n errors.push(...sessionIdCheck.errors);\n warnings.push(...sessionIdCheck.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n};\n\n// src/validators/ConfigValidator.ts\nvar ConfigValidator = class extends BaseValidator {\n constructor(options = {}) {\n super();\n this.options = {\n requireApiKey: true,\n allowedEnvironments: [\"development\", \"production\"],\n maxBatchSize: 1e3,\n maxQueueSize: 1e4,\n maxRetryAttempts: 10,\n ...options\n };\n this.setupValidationRules();\n }\n /**\n * 향상된 결과로 설정 검증\n * @param config - 검증할 설정\n * @returns 향상된 검증 결과\n */\n validate(config) {\n const result = super.validate(config);\n return {\n isValid: result.isValid,\n errors: result.errors,\n warnings: result.warnings\n };\n }\n /**\n * 검증 규칙 설정\n */\n setupValidationRules() {\n this.addRule({\n name: \"api_key\",\n validate: (config) => this.validateApiKey(config.apiKey, config)\n });\n this.addRule({\n name: \"environment\",\n validate: (config) => this.validateEnvironment(config.environment)\n });\n this.addRule({\n name: \"batch_config\",\n validate: (config) => this.validateBatchConfig(config.batch)\n });\n this.addRule({\n name: \"queue_config\",\n validate: (config) => this.validateQueueConfig(config.queue)\n });\n this.addRule({\n name: \"retry_config\",\n validate: (config) => this.validateRetryConfig(config.retry)\n });\n this.addRule({\n name: \"transport_config\",\n validate: (config) => this.validateTransportConfig(config.transport)\n });\n this.addRule({\n name: \"storage_config\",\n validate: (config) => this.validateStorageConfig(config.storage)\n });\n this.addRule({\n name: \"plugin_config\",\n validate: (config) => this.validatePluginConfig(config.plugins)\n });\n this.addRule({\n name: \"auto_collect_config\",\n validate: (config) => this.validateAutoCollectConfig(config.autoCollect)\n });\n this.addRule({\n name: \"privacy_config\",\n validate: (config) => this.validatePrivacyConfig(config.privacy)\n });\n this.addRule({\n name: \"headers\",\n validate: (config) => this.validateHeaders(config.headers)\n });\n }\n /**\n * API 키 검증\n * @param apiKey - 검증할 API 키\n * @param config - 전체 설정 객체\n * @returns 검증 결과\n */\n validateApiKey(apiKey, config) {\n const errors = [];\n const warnings = [];\n if (this.options.requireApiKey) {\n if (!apiKey) {\n errors.push(\"API key is required\");\n return { isValid: false, errors, warnings };\n }\n }\n if (apiKey) {\n if (apiKey.length < 10) {\n errors.push(\"API key seems too short (minimum 10 characters)\");\n }\n if (apiKey.length > 500) {\n errors.push(\"API key seems too long (maximum 500 characters)\");\n }\n if (!/^[a-zA-Z0-9_.-]+$/.test(apiKey)) {\n warnings.push(\"API key contains unusual characters\");\n }\n const apiKeyValidation = validateApiKey(apiKey);\n if (!apiKeyValidation.isValid) {\n errors.push(\"Invalid API key format\");\n }\n if (apiKeyValidation.isTestKey) {\n warnings.push(\"Test API key detected - ensure you use a production key in production\");\n }\n warnings.push(...apiKeyValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 환경 검증\n * @param environment - 검증할 환경\n * @returns 검증 결과\n */\n validateEnvironment(environment) {\n if (!environment) {\n return { isValid: true, errors: [], warnings: [] };\n }\n return this.validateEnum(\n environment,\n this.options.allowedEnvironments.reduce((obj, env) => ({ ...obj, [env]: env }), {}),\n \"Environment\"\n );\n }\n /**\n * 배치 설정 검증\n * @param batch - 검증할 배치 설정\n * @returns 검증 결과\n */\n validateBatchConfig(batch) {\n const errors = [];\n const warnings = [];\n if (!batch) {\n return { isValid: true, errors, warnings };\n }\n if (typeof batch !== \"object\") {\n errors.push(\"Batch configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (batch.size !== void 0) {\n const sizeValidation = this.validateNumberRange(batch.size, 1, this.options.maxBatchSize, \"Batch size\");\n errors.push(...sizeValidation.errors);\n warnings.push(...sizeValidation.warnings);\n if (batch.size > 100) {\n warnings.push(\"Large batch sizes may impact performance\");\n }\n }\n if (batch.timeout !== void 0) {\n const timeoutValidation = this.validateNumberRange(batch.timeout, 100, 3e5, \"Batch timeout\");\n errors.push(...timeoutValidation.errors);\n warnings.push(...timeoutValidation.warnings);\n if (batch.timeout < 1e3) {\n warnings.push(\"Very short batch timeout may cause frequent network requests\");\n }\n }\n if (batch.maxBytes !== void 0) {\n const maxBytesValidation = this.validateNumberRange(\n batch.maxBytes,\n 1024,\n 50 * 1024 * 1024,\n \"Batch max bytes\"\n );\n errors.push(...maxBytesValidation.errors);\n warnings.push(...maxBytesValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 큐 설정 검증\n * @param queue - 검증할 큐 설정\n * @returns 검증 결과\n */\n validateQueueConfig(queue) {\n const errors = [];\n const warnings = [];\n if (!queue) {\n return { isValid: true, errors, warnings };\n }\n if (typeof queue !== \"object\") {\n errors.push(\"Queue configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (queue.maxSize !== void 0) {\n const sizeValidation = this.validateNumberRange(\n queue.maxSize,\n 10,\n this.options.maxQueueSize,\n \"Queue max size\"\n );\n errors.push(...sizeValidation.errors);\n warnings.push(...sizeValidation.warnings);\n if (queue.maxSize > 5e3) {\n warnings.push(\"Large queue sizes may consume significant memory\");\n }\n }\n if (queue.workers !== void 0) {\n const workersValidation = this.validateNumberRange(queue.workers, 1, 10, \"Queue workers\");\n errors.push(...workersValidation.errors);\n warnings.push(...workersValidation.warnings);\n }\n if (queue.strategy !== void 0) {\n const validStrategies = { fifo: \"fifo\", lifo: \"lifo\", priority: \"priority\" };\n const strategyValidation = this.validateEnum(queue.strategy, validStrategies, \"Queue strategy\");\n errors.push(...strategyValidation.errors);\n warnings.push(...strategyValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 재시도 설정 검증\n * @param retry - 검증할 재시도 설정\n * @returns 검증 결과\n */\n validateRetryConfig(retry) {\n const errors = [];\n const warnings = [];\n if (!retry) {\n return { isValid: true, errors, warnings };\n }\n if (typeof retry !== \"object\") {\n errors.push(\"Retry configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (retry.maxAttempts !== void 0) {\n const attemptsValidation = this.validateNumberRange(\n retry.maxAttempts,\n 0,\n this.options.maxRetryAttempts,\n \"Max retry attempts\"\n );\n errors.push(...attemptsValidation.errors);\n warnings.push(...attemptsValidation.warnings);\n if (retry.maxAttempts > 5) {\n warnings.push(\"High retry attempts may delay error reporting\");\n }\n }\n if (retry.initialDelay !== void 0) {\n const delayValidation = this.validateNumberRange(retry.initialDelay, 10, 6e4, \"Initial retry delay\");\n errors.push(...delayValidation.errors);\n warnings.push(...delayValidation.warnings);\n }\n if (retry.maxDelay !== void 0) {\n const maxDelayValidation = this.validateNumberRange(retry.maxDelay, 100, 36e5, \"Max retry delay\");\n errors.push(...maxDelayValidation.errors);\n warnings.push(...maxDelayValidation.warnings);\n }\n if (retry.multiplier !== void 0) {\n const multiplierValidation = this.validateNumberRange(retry.multiplier, 1, 10, \"Retry multiplier\");\n errors.push(...multiplierValidation.errors);\n warnings.push(...multiplierValidation.warnings);\n }\n if (retry.initialDelay && retry.maxDelay && retry.initialDelay >= retry.maxDelay) {\n errors.push(\"Initial retry delay must be less than max retry delay\");\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 전송 설정 검증\n * @param transport - 검증할 전송 설정\n * @returns 검증 결과\n */\n validateTransportConfig(transport) {\n const errors = [];\n const warnings = [];\n if (!transport) {\n return { isValid: true, errors, warnings };\n }\n if (typeof transport !== \"object\") {\n errors.push(\"Transport configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (transport.timeout !== void 0) {\n const timeoutValidation = this.validateNumberRange(transport.timeout, 1e3, 3e5, \"Transport timeout\");\n errors.push(...timeoutValidation.errors);\n warnings.push(...timeoutValidation.warnings);\n }\n if (transport.connectionTimeout !== void 0) {\n const connTimeoutValidation = this.validateNumberRange(\n transport.connectionTimeout,\n 1e3,\n 6e4,\n \"Connection timeout\"\n );\n errors.push(...connTimeoutValidation.errors);\n warnings.push(...connTimeoutValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 저장소 설정 검증\n * @param storage - 검증할 저장소 설정\n * @returns 검증 결과\n */\n validateStorageConfig(storage) {\n const errors = [];\n const warnings = [];\n if (!storage) {\n return { isValid: true, errors, warnings };\n }\n if (typeof storage !== \"object\") {\n errors.push(\"Storage configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n if (storage.type !== void 0) {\n const validTypes = { memory: \"memory\", localStorage: \"localStorage\", indexedDB: \"indexedDB\", file: \"file\" };\n const typeValidation = this.validateEnum(storage.type, validTypes, \"Storage type\");\n errors.push(...typeValidation.errors);\n warnings.push(...typeValidation.warnings);\n }\n if (storage.maxSize !== void 0) {\n const sizeValidation = this.validateNumberRange(\n storage.maxSize,\n 1024,\n 1024 * 1024 * 1024,\n \"Storage max size\"\n );\n errors.push(...sizeValidation.errors);\n warnings.push(...sizeValidation.warnings);\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 플러그인 설정 검증\n * @param plugins - 검증할 플러그인 배열\n * @returns 검증 결과\n */\n validatePluginConfig(plugins) {\n const errors = [];\n const warnings = [];\n if (!plugins) {\n return { isValid: true, errors, warnings };\n }\n if (!Array.isArray(plugins)) {\n errors.push(\"Plugins configuration must be an array\");\n return { isValid: false, errors, warnings };\n }\n const pluginNames = /* @__PURE__ */ new Set();\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (typeof plugin !== \"object\" || !plugin) {\n errors.push(`Plugin at index ${i} must be an object`);\n continue;\n }\n if (!plugin.name) {\n errors.push(`Plugin at index ${i} must have a name`);\n continue;\n }\n if (pluginNames.has(plugin.name)) {\n errors.push(`Duplicate plugin name: ${plugin.name}`);\n } else {\n pluginNames.add(plugin.name);\n }\n if (typeof plugin.name !== \"string\" || plugin.name.length === 0) {\n errors.push(`Plugin at index ${i} must have a valid name`);\n }\n if (plugin.version !== void 0 && typeof plugin.version !== \"string\") {\n errors.push(`Plugin '${plugin.name}' version must be a string`);\n }\n if (plugin.initialize !== void 0 && typeof plugin.initialize !== \"function\") {\n errors.push(`Plugin '${plugin.name}' initialize must be a function`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 자동 수집 설정 검증\n * @param autoCollect - 검증할 자동 수집 설정\n * @returns 검증 결과\n */\n validateAutoCollectConfig(autoCollect) {\n const errors = [];\n const warnings = [];\n if (!autoCollect) {\n return { isValid: true, errors, warnings };\n }\n if (typeof autoCollect !== \"object\") {\n errors.push(\"Auto-collect configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n const booleanProps = [\"device\", \"app\", \"page\", \"userAgent\", \"referrer\", \"campaign\", \"performance\"];\n for (const prop of booleanProps) {\n if (autoCollect[prop] !== void 0 && typeof autoCollect[prop] !== \"boolean\") {\n errors.push(`Auto-collect ${prop} must be a boolean`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * 개인정보 보호 설정 검증\n * @param privacy - 검증할 개인정보 보호 설정\n * @returns 검증 결과\n */\n validatePrivacyConfig(privacy) {\n const errors = [];\n const warnings = [];\n if (!privacy) {\n return { isValid: true, errors, warnings };\n }\n if (typeof privacy !== \"object\") {\n errors.push(\"Privacy configuration must be an object\");\n return { isValid: false, errors, warnings };\n }\n const booleanProps = [\n \"respectDoNotTrack\",\n \"anonymizeIP\",\n \"requireCookieConsent\",\n \"gdprCompliant\",\n \"requireOptIn\"\n ];\n for (const prop of booleanProps) {\n if (privacy[prop] !== void 0 && typeof privacy[prop] !== \"boolean\") {\n errors.push(`Privacy ${prop} must be a boolean`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n /**\n * HTTP 헤더 검증\n * @param headers - 검증할 헤더 맵\n * @returns 검증 결과\n */\n validateHeaders(headers) {\n const errors = [];\n const warnings = [];\n if (!headers) {\n return { isValid: true, errors, warnings };\n }\n if (typeof headers !== \"object\") {\n errors.push(\"Headers must be an object\");\n return { isValid: false, errors, warnings };\n }\n for (const [key, value] of Object.entries(headers)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n errors.push(`Header '${key}' must have string key and value`);\n }\n if (!/^[a-zA-Z0-9-_]+$/.test(key)) {\n errors.push(`Invalid header name format: ${key}`);\n }\n const sensitiveHeaders = [\"authorization\", \"cookie\", \"set-cookie\"];\n if (sensitiveHeaders.includes(key.toLowerCase())) {\n warnings.push(`Setting sensitive header '${key}' may have security implications`);\n }\n }\n return { isValid: errors.length === 0, errors, warnings };\n }\n};\n\n// src/utils/EventUtils.ts\nfunction normalizeEventName(name) {\n return name.trim();\n}\nfunction mergeEventProperties(base = {}, override = {}) {\n const merged = {};\n for (const [key, value] of Object.entries(base)) {\n merged[key] = cloneValue(value);\n }\n for (const [key, value] of Object.entries(override)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value) && typeof merged[key] === \"object\" && merged[key] !== null && !Array.isArray(merged[key])) {\n merged[key] = mergeEventProperties(merged[key], value);\n } else {\n merged[key] = cloneValue(value);\n }\n }\n return merged;\n}\nfunction mergeEventContext(base = {}, override = {}) {\n const merged = {};\n for (const [key, value] of Object.entries(base)) {\n merged[key] = cloneValue(value);\n }\n for (const [key, value] of Object.entries(override)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value) && typeof merged[key] === \"object\" && merged[key] !== null && !Array.isArray(merged[key])) {\n merged[key] = mergeEventProperties(merged[key], value);\n } else {\n merged[key] = cloneValue(value);\n }\n }\n return merged;\n}\nfunction cloneValue(value, seen = /* @__PURE__ */ new WeakSet()) {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n if (value instanceof Date) {\n return new Date(value);\n }\n if (Array.isArray(value)) {\n seen.add(value);\n const result = value.map((item) => cloneValue(item, seen));\n seen.delete(value);\n return result;\n }\n if (typeof value === \"object\") {\n seen.add(value);\n const result = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = cloneValue(val, seen);\n }\n seen.delete(value);\n return result;\n }\n return value;\n}\nfunction normalizeTimestamp(timestamp) {\n if (!timestamp) {\n return (/* @__PURE__ */ new Date()).toISOString();\n }\n if (timestamp instanceof Date) {\n return timestamp.toISOString();\n }\n if (typeof timestamp === \"string\") {\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n return (/* @__PURE__ */ new Date()).toISOString();\n }\n return date.toISOString();\n }\n if (typeof timestamp === \"number\") {\n return new Date(timestamp).toISOString();\n }\n return (/* @__PURE__ */ new Date()).toISOString();\n}\n\n// src/utils/ContextCache.ts\nvar ContextCache = class {\n constructor(options = {}) {\n this.cache = /* @__PURE__ */ new Map();\n this.pendingCollectors = /* @__PURE__ */ new Map();\n this.options = {\n cacheTime: options.cacheTime ?? 6e4,\n getCacheKey: options.getCacheKey ?? (() => \"default\")\n };\n }\n /**\n * 캐시된 컨텍스트 조회 또는 새로 생성\n * @param collector - 컨텍스트를 수집하는 비동기 함수\n * @returns 캐시된 또는 새로 수집된 컨텍스트\n */\n async getOrCollect(collector) {\n const key = this.options.getCacheKey();\n const cached = this.cache.get(key);\n const now = Date.now();\n if (cached && now - cached.timestamp < this.options.cacheTime) {\n return cached.context;\n }\n const pending = this.pendingCollectors.get(key);\n if (pending) {\n return pending;\n }\n const collectPromise = collector();\n this.pendingCollectors.set(key, collectPromise);\n try {\n const context = await collectPromise;\n this.cache.set(key, {\n context,\n timestamp: now\n });\n return context;\n } catch (error) {\n if (cached) {\n console.warn(\"[ContextCache] Collection failed, returning stale cache:\", error);\n return cached.context;\n }\n throw error;\n } finally {\n this.pendingCollectors.delete(key);\n }\n }\n /**\n * 특정 키의 캐시 무효화\n * @param key - 캐시 키 (없으면 현재 키 사용)\n */\n invalidate(key) {\n const targetKey = key ?? this.options.getCacheKey();\n this.cache.delete(targetKey);\n }\n /**\n * 모든 캐시 제거\n */\n clear() {\n this.cache.clear();\n }\n /**\n * 캐시 상태 조회\n * @returns 캐시 정보\n */\n getStats() {\n return {\n size: this.cache.size,\n keys: Array.from(this.cache.keys())\n };\n }\n /**\n * 캐시 만료 시간 업데이트\n * @param cacheTime - 새로운 캐시 시간 (밀리초)\n */\n setCacheTime(cacheTime) {\n this.options.cacheTime = cacheTime;\n }\n /**\n * 만료된 캐시 항목 정리\n */\n cleanup() {\n const now = Date.now();\n for (const [key, cached] of this.cache.entries()) {\n if (now - cached.timestamp >= this.options.cacheTime) {\n this.cache.delete(key);\n }\n }\n }\n};\n\n// src/utils/PerformanceUtils.ts\nvar IdleScheduler = class {\n};\nvar WebIdleScheduler = class extends IdleScheduler {\n constructor() {\n super(...arguments);\n this.handles = /* @__PURE__ */ new Set();\n }\n schedule(callback, options) {\n const timeout = options?.timeout ?? 3e3;\n if (typeof window !== \"undefined\" && \"requestIdleCallback\" in window) {\n const handle = window.requestIdleCallback(\n async (deadline) => {\n this.handles.delete(handle);\n try {\n await callback();\n } catch (error) {\n console.error(\"[WebIdleScheduler] Callback error:\", error);\n }\n },\n { timeout }\n );\n this.handles.add(handle);\n return handle;\n } else {\n const handle = setTimeout(async () => {\n this.handles.delete(handle);\n try {\n await callback();\n } catch (error) {\n console.error(\"[WebIdleScheduler] Callback error:\", error);\n }\n }, 0);\n this.handles.add(handle);\n return handle;\n }\n }\n cancel(handle) {\n if (typeof window !== \"undefined\" && \"cancelIdleCallback\" in window) {\n window.cancelIdleCallback(handle);\n } else {\n clearTimeout(handle);\n }\n this.handles.delete(handle);\n }\n cancelAll() {\n for (const handle of this.handles) {\n this.cancel(handle);\n }\n this.handles.clear();\n }\n};\nvar DefaultIdleScheduler = class extends IdleScheduler {\n constructor() {\n super(...arguments);\n this.handles = /* @__PURE__ */ new Map();\n this.nextId = 0;\n }\n schedule(callback, options) {\n const id = this.nextId++;\n const timeout = setTimeout(async () => {\n this.handles.delete(id);\n try {\n await callback();\n } catch (error) {\n console.error(\"[DefaultIdleScheduler] Callback error:\", error);\n }\n }, 0);\n this.handles.set(id, timeout);\n return id;\n }\n cancel(handle) {\n const timeout = this.handles.get(handle);\n if (timeout) {\n clearTimeout(timeout);\n this.handles.delete(handle);\n }\n }\n cancelAll() {\n for (const timeout of this.handles.values()) {\n clearTimeout(timeout);\n }\n this.handles.clear();\n }\n};\nvar TaskScheduler = class {\n constructor(scheduler, maxQueueSize = 1e3) {\n this.queue = [];\n this.isProcessing = false;\n this.scheduler = scheduler;\n this.maxQueueSize = maxQueueSize;\n }\n /**\n * 작업을 큐에 추가\n * @param task - 실행할 작업\n * @param priority - 우선순위 (높을수록 먼저 실행)\n * @param options - IdleScheduler 옵션\n */\n enqueue(task, priority = 0, options) {\n this.queue.push({\n task,\n priority,\n timestamp: Date.now()\n });\n this.queue.sort((a, b) => b.priority - a.priority);\n while (this.queue.length > this.maxQueueSize) {\n this.queue.pop();\n }\n if (!this.isProcessing) {\n this.scheduleProcessing(options);\n }\n }\n /**\n * 큐 처리 예약\n * @param options - IdleScheduler 옵션\n */\n scheduleProcessing(options) {\n if (this.handle) {\n this.scheduler.cancel(this.handle);\n }\n this.handle = this.scheduler.schedule(async () => {\n await this.processQueue();\n }, options);\n }\n /**\n * 큐 처리\n */\n async processQueue() {\n if (this.isProcessing || this.queue.length === 0) {\n return;\n }\n this.isProcessing = true;\n try {\n while (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item) {\n try {\n await item.task();\n } catch (error) {\n console.error(\"[TaskScheduler] Task error:\", error);\n }\n }\n }\n } finally {\n this.isProcessing = false;\n this.handle = void 0;\n }\n }\n /**\n * 모든 대기 중인 작업 취소\n */\n clear() {\n this.queue = [];\n if (this.handle) {\n this.scheduler.cancel(this.handle);\n this.handle = void 0;\n }\n this.isProcessing = false;\n }\n /**\n * 큐 상태 조회\n */\n getStats() {\n return {\n queueSize: this.queue.length,\n isProcessing: this.isProcessing\n };\n }\n};\nfunction createIdleScheduler() {\n if (typeof window !== \"undefined\") {\n return new WebIdleScheduler();\n }\n return new DefaultIdleScheduler();\n}\n\n// src/utils/environment.ts\nfunction hasProcess() {\n return typeof process !== \"undefined\" && process && typeof process === \"object\";\n}\nfunction getEnv(key, defaultValue = \"\") {\n if (hasProcess() && process.env && typeof process.env === \"object\") {\n return process.env[key] || defaultValue;\n }\n return defaultValue;\n}\n\n// src/services/RemoteConfigService.ts\nvar STORAGE_CACHE_PREFIX = \"__vircle_config_\";\nvar RemoteConfigService = class _RemoteConfigService {\n constructor() {\n this.configCache = /* @__PURE__ */ new Map();\n this.configPromises = /* @__PURE__ */ new Map();\n // 메모리 캐시 시간 (5분)\n this.CACHE_DURATION = 5 * 60 * 1e3;\n this.cacheTimestamps = /* @__PURE__ */ new Map();\n }\n static getInstance() {\n if (!_RemoteConfigService.instance) {\n _RemoteConfigService.instance = new _RemoteConfigService();\n }\n return _RemoteConfigService.instance;\n }\n /**\n * API 키를 기반으로 프로젝트 설정을 가져옵니다.\n * MPA에서 매 페이지 로드마다 CDN 요청을 방지하기 위해\n * 메모리 캐시 → localStorage 캐시 → CDN 순으로 조회한다.\n */\n async getProjectConfig(apiKey, environment = \"production\") {\n const memoryCached = this.getCachedConfig(apiKey);\n if (memoryCached) {\n return memoryCached;\n }\n const storageCached = this.getStorageCachedConfig(apiKey);\n if (storageCached) {\n this.setCachedConfig(apiKey, storageCached);\n return storageCached;\n }\n const existingPromise = this.configPromises.get(apiKey);\n if (existingPromise) {\n return existingPromise;\n }\n const configPromise = this.fetchConfig(apiKey, environment);\n this.configPromises.set(apiKey, configPromise);\n try {\n const config = await configPromise;\n this.setCachedConfig(apiKey, config);\n this.setStorageCachedConfig(apiKey, config);\n this.configPromises.delete(apiKey);\n return config;\n } catch (error) {\n this.configPromises.delete(apiKey);\n throw error;\n }\n }\n /**\n * 설정을 가져오는 메인 로직\n */\n async fetchConfig(apiKey, environment) {\n const projectId = this.extractProjectId(apiKey);\n try {\n return await this.fetchFromCDN(projectId, apiKey, environment);\n } catch (cdnError) {\n throw new VircleError(\n \"REMOTE_CONFIG_FETCH_FAILED\" /* REMOTE_CONFIG_FETCH_FAILED */,\n `Failed to fetch configuration for project ${projectId}. Please ensure the project is properly configured.`,\n {\n context: {\n projectId,\n cdnError: cdnError instanceof Error ? cdnError.message : String(cdnError),\n environment\n }\n }\n );\n }\n }\n /**\n * CDN에서 설정 가져오기\n */\n async fetchFromCDN(projectId, apiKey, environment) {\n const cdnUrl = getEnv(\"VIRCLE_CONFIG_CDN_URL\") || CDN_ENDPOINTS[environment];\n const url = `${cdnUrl}/${projectId}/config.json`;\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n },\n // 브라우저 캐시 활용\n cache: \"default\",\n // CORS\n mode: \"cors\"\n });\n if (!response.ok) {\n throw new Error(`CDN returned ${response.status}`);\n }\n const config = await response.json();\n return this.validateConfig(config, environment);\n }\n /**\n * API 키에서 프로젝트 ID 추출\n * 형식: pk_{projectId}_{randomString}\n */\n extractProjectId(apiKey) {\n const match = apiKey.match(/^pk_([^_]+)_/);\n if (match && match[1]) {\n return match[1];\n }\n return this.hashApiKey(apiKey).substring(0, 8);\n }\n /**\n * API 키를 해시하여 프로젝트 ID 생성\n */\n hashApiKey(apiKey) {\n let hash = 0;\n for (let i = 0; i < apiKey.length; i++) {\n const char = apiKey.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n }\n /**\n * 설정 유효성 검증\n */\n validateConfig(config, requestedEnvironment) {\n if (!config || typeof config !== \"object\") {\n throw new VircleError(\"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */, \"Invalid project configuration format\");\n }\n if (!config.projectId) {\n throw new VircleError(\"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */, \"Project ID is required\");\n }\n if (!config.environment) {\n throw new VircleError(\n \"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */,\n \"Environment field is required in project configuration\"\n );\n }\n if (config.environment !== \"development\" && config.environment !== \"production\") {\n throw new VircleError(\n \"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */,\n `Invalid environment value: ${config.environment}. Must be 'development' or 'production'`\n );\n }\n if (config.environment !== requestedEnvironment) {\n throw new VircleError(\n \"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */,\n `Environment mismatch: requested '${requestedEnvironment}' but config is for '${config.environment}'`\n );\n }\n if (config.publicKey && !this.isValidPublicKey(config.publicKey)) {\n throw new VircleError(\"INVALID_CONFIGURATION\" /* INVALID_CONFIGURATION */, \"Invalid public key format\");\n }\n return {\n projectId: config.projectId,\n environment: config.environment,\n publicKey: config.publicKey,\n features: {\n encryption: config.features?.encryption ?? false,\n compression: config.features?.compression ?? true,\n batching: config.features?.batching ?? true\n },\n settings: config.settings\n };\n }\n /**\n * 공개키 형식 검증\n */\n isValidPublicKey(publicKey) {\n try {\n if (typeof atob !== \"undefined\") {\n atob(publicKey);\n } else {\n Buffer.from(publicKey, \"base64\");\n }\n return publicKey.length > 100;\n } catch {\n return false;\n }\n }\n /**\n * 기본 설정 반환\n */\n getDefaultConfig(projectId) {\n return {\n projectId,\n environment: \"production\",\n features: {\n encryption: false,\n compression: true,\n batching: true\n }\n };\n }\n /**\n * 캐시된 설정 가져오기\n */\n getCachedConfig(apiKey) {\n const cached = this.configCache.get(apiKey);\n const timestamp = this.cacheTimestamps.get(apiKey);\n if (cached && timestamp) {\n const age = Date.now() - timestamp;\n if (age < this.CACHE_DURATION) {\n return cached;\n }\n }\n return null;\n }\n /**\n * 설정 캐시에 저장\n */\n setCachedConfig(apiKey, config) {\n this.configCache.set(apiKey, config);\n this.cacheTimestamps.set(apiKey, Date.now());\n }\n /**\n * localStorage에서 캐시된 설정 조회\n * MPA에서 페이지 전환 시 CDN 요청 없이 즉시 초기화할 수 있도록 한다.\n */\n getStorageCachedConfig(apiKey) {\n try {\n if (typeof localStorage === \"undefined\") return null;\n const raw = localStorage.getItem(STORAGE_CACHE_PREFIX + apiKey);\n if (!raw) return null;\n const { config, timestamp } = JSON.parse(raw);\n if (Date.now() - timestamp < this.CACHE_DURATION) {\n return config;\n }\n localStorage.removeItem(STORAGE_CACHE_PREFIX + apiKey);\n } catch {\n }\n return null;\n }\n /**\n * localStorage에 설정 캐시 저장\n */\n setStorageCachedConfig(apiKey, config) {\n try {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n STORAGE_CACHE_PREFIX + apiKey,\n JSON.stringify({ config, timestamp: Date.now() })\n );\n } catch {\n }\n }\n /**\n * 캐시 초기화\n */\n clearCache() {\n try {\n if (typeof localStorage !== \"undefined\") {\n const keysToRemove = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_CACHE_PREFIX)) {\n keysToRemove.push(key);\n }\n }\n for (const key of keysToRemove) {\n localStorage.removeItem(key);\n }\n }\n } catch {\n }\n this.configCache.clear();\n this.configPromises.clear();\n this.cacheTimestamps.clear();\n }\n};\n\n// src/VircleCore.ts\nvar _VircleCore = class _VircleCore {\n constructor(config, options = {}) {\n this.isInitialized = false;\n this.globalContext = {};\n this.globalProperties = {};\n this.lastSessionPersistTime = 0;\n this.config = { ...config };\n this.options = {\n enableValidation: true,\n enableAutoContext: true,\n enablePlugins: true,\n pluginTimeout: 5e3,\n storageType: \"memory\",\n debug: false,\n ...options\n };\n this.configService = new ConfigService(this.config);\n this.contextService = new ContextService(this.config);\n this.pluginService = new PluginService(this.config, {\n maxExecutionTime: this.options.pluginTimeout\n });\n this.pluginService.setTrackFn(\n (eventName, properties) => this.track(eventName, properties)\n );\n this.pluginService.setIdentifyFn(\n (userId, traits) => this.identify(userId, traits)\n );\n this.storageService = new StorageService({\n type: this.options.storageType,\n adapter: this.options.storageAdapter\n });\n this.transportService = new TransportService(this.config, {\n cryptoAdapter: this.options.cryptoAdapter\n });\n this.remoteConfigService = RemoteConfigService.getInstance();\n this.eventService = new EventService(this.config, {\n contextService: this.contextService,\n pluginService: this.options.enablePlugins ? this.pluginService : void 0,\n storageService: this.storageService,\n transportService: this.transportService\n });\n if (this.options.enableValidation) {\n this.eventValidator = new EventValidator();\n this.configValidator = new ConfigValidator();\n }\n this.contextCache = new ContextCache({\n cacheTime: this.options.contextCacheTime || 6e4\n });\n const idleScheduler = this.options.idleScheduler || createIdleScheduler();\n this.taskScheduler = new TaskScheduler(idleScheduler);\n }\n /**\n * SDK 초기화\n * @throws {VircleError} 초기화 실패 시 에러 발생\n */\n async initialize() {\n if (this.isInitialized) {\n return;\n }\n try {\n await this.validateConfiguration();\n try {\n const remoteConfig = await this.remoteConfigService.getProjectConfig(\n this.config.apiKey,\n this.config.environment || \"production\"\n );\n if (this.options.debug) {\n console.log(\"[VircleCore] Remote config loaded:\", {\n projectId: remoteConfig.projectId,\n environment: remoteConfig.environment,\n features: remoteConfig.features\n });\n }\n if (this.options.enableEncryption && remoteConfig.publicKey) {\n this.transportService.setEncryptionConfig({\n enabled: true,\n publicKey: remoteConfig.publicKey\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Applied remote encryption config\");\n }\n } else if (remoteConfig.features.encryption) {\n console.warn(\"[VircleCore] Remote config has encryption enabled but no public key provided\");\n if (getEnv(\"VIRCLE_ALLOW_FALLBACK_KEY\", \"false\") === \"true\" && ENCRYPTION_CONFIG.PUBLIC_KEY) {\n this.transportService.setEncryptionConfig({\n enabled: true,\n publicKey: ENCRYPTION_CONFIG.PUBLIC_KEY\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Using fallback encryption key\");\n }\n } else {\n this.options.enableEncryption = false;\n console.warn(\"[VircleCore] Encryption disabled - no valid public key available\");\n }\n }\n if (remoteConfig.settings) {\n if (remoteConfig.settings.batchSize && !this.config.batch) {\n this.config.batch = { size: remoteConfig.settings.batchSize };\n } else if (remoteConfig.settings.batchSize && this.config.batch) {\n this.config.batch.size = remoteConfig.settings.batchSize;\n }\n if (remoteConfig.settings.flushInterval && !this.config.batch) {\n this.config.batch = { flushInterval: remoteConfig.settings.flushInterval };\n } else if (remoteConfig.settings.flushInterval && this.config.batch) {\n this.config.batch.flushInterval = remoteConfig.settings.flushInterval;\n }\n if (remoteConfig.settings.maxRetries && !this.config.retry) {\n this.config.retry = { maxAttempts: remoteConfig.settings.maxRetries };\n } else if (remoteConfig.settings.maxRetries && this.config.retry) {\n this.config.retry.maxAttempts = remoteConfig.settings.maxRetries;\n }\n this.configService.updateConfig(this.config);\n this.transportService.updateConfig(this.config);\n }\n } catch (configError) {\n if (this.options.debug) {\n console.log(\"[VircleCore] Failed to load remote config, using defaults\", configError);\n }\n if (getEnv(\"VIRCLE_ALLOW_FALLBACK_KEY\", \"false\") === \"true\" && ENCRYPTION_CONFIG.PUBLIC_KEY) {\n this.transportService.setEncryptionConfig({\n enabled: true,\n publicKey: ENCRYPTION_CONFIG.PUBLIC_KEY\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Using fallback encryption key after config fetch failure\");\n }\n } else {\n this.options.enableEncryption = false;\n console.warn(\"[VircleCore] Encryption disabled - remote config failed and no fallback key\");\n }\n }\n await this.loadPersistedUser();\n await this.restoreOrCreateSession();\n this.isInitialized = true;\n if (this.options.enablePlugins && this.config.plugins) {\n await this.initializePlugins();\n }\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"session-started\", {\n sessionId: this.sessionId,\n user: this.currentUser\n });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Initialized successfully\", {\n config: sanitizeConfig(this.config),\n // API 키 마스킹\n sessionId: this.sessionId\n });\n }\n } catch (error) {\n throw new VircleError(\n \"SDK_INITIALIZATION_FAILED\" /* SDK_INITIALIZATION_FAILED */,\n `Failed to initialize Vircle SDK: ${error.message}`,\n { cause: error }\n );\n }\n }\n /**\n * 이벤트 추적\n * @param name - 이벤트 이름\n * @param properties - 이벤트 속성\n * @param context - 이벤트 컨텍스트\n * @throws {ValidationError} 이벤트 검증 실패 시\n * @throws {VircleError} 이벤트 추적 실패 시\n */\n async track(name, properties, context) {\n this.ensureInitialized();\n try {\n const event = {\n name: normalizeEventName(name),\n properties: mergeEventProperties(\n this.globalProperties,\n mergeEventProperties(\n properties || {},\n this.currentUser?.anonymousId ? { _vuid: this.currentUser.anonymousId } : {}\n )\n ),\n context: mergeEventContext(this.globalContext, context),\n userId: this.currentUser?.id,\n anonymousId: this.currentUser?.anonymousId,\n sessionId: this.sessionId,\n timestamp: normalizeTimestamp()\n };\n if (this.eventValidator) {\n const validation = this.eventValidator.validate(event);\n if (!validation.isValid) {\n throw new ValidationError(\"Event validation failed\", validation.errors);\n }\n if (this.options.debug && validation.warnings.length > 0) {\n console.warn(\"[VircleCore] Event validation warnings:\", validation.warnings);\n }\n }\n await this.eventService.track(event);\n this.persistSession().catch(() => {\n });\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Track error:\", error);\n }\n throw new VircleError(\"EVENT_TRACKING_FAILED\" /* EVENT_TRACKING_FAILED */, `Failed to track event \"${name}\"`, {\n cause: error\n });\n }\n }\n /**\n * 다중 이벤트 일괄 추적\n * @param events - 추적할 이벤트 배열\n * @throws {ValidationError} 이벤트 검증 실패 시\n * @throws {VircleError} 배치 처리 실패 시\n */\n async trackBatch(events) {\n this.ensureInitialized();\n try {\n const vircleEvents = events.map((event) => ({\n name: normalizeEventName(event.name),\n properties: mergeEventProperties(\n this.globalProperties,\n mergeEventProperties(\n event.properties || {},\n this.currentUser?.anonymousId ? { _vuid: this.currentUser.anonymousId } : {}\n )\n ),\n context: mergeEventContext(this.globalContext, event.context),\n userId: event.userId || this.currentUser?.id,\n anonymousId: this.currentUser?.anonymousId,\n sessionId: event.sessionId || this.sessionId,\n timestamp: normalizeTimestamp(event.timestamp)\n }));\n if (this.eventValidator) {\n for (const event of vircleEvents) {\n const validation = this.eventValidator.validate(event);\n if (!validation.isValid) {\n throw new ValidationError(`Event validation failed for \"${event.name}\"`, validation.errors);\n }\n }\n }\n for (const event of vircleEvents) {\n await this.eventService.track(event);\n }\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] TrackBatch error:\", error);\n }\n throw new VircleError(\"BATCH_PROCESSING_FAILED\" /* BATCH_PROCESSING_FAILED */, \"Failed to track batch events\", {\n cause: error\n });\n }\n }\n /**\n * 이벤트 빌더 생성\n * @param name - 초기 이벤트 이름 (선택사항)\n * @returns EventBuilder 인스턴스\n */\n createEvent(name) {\n this.ensureInitialized();\n return this.eventService.createEvent(name);\n }\n /**\n * 사용자 식별\n * @param userId - 사용자 ID\n * @param traits - 사용자 속성\n * @throws {VircleError} 사용자 식별 실패 시\n */\n async identify(userId, traits) {\n this.ensureInitialized();\n try {\n if (this.options.debug) {\n console.log(\"[VircleCore] Creating user with factory...\");\n }\n const user = VircleUserFactory.create(userId, traits || {}, this.currentUser?.anonymousId);\n if (this.options.debug) {\n console.log(\"[VircleCore] User created successfully:\", user);\n }\n this.currentUser = user;\n if (this.options.debug) {\n console.log(\"[VircleCore] Persisting user to storage...\");\n }\n try {\n await this.storageService.set(STORAGE_KEYS.USER, user);\n if (this.options.debug) {\n console.log(\"[VircleCore] User persisted successfully\");\n }\n } catch (storageError) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Failed to persist user:\", storageError);\n }\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Sending identify event for user:\", userId);\n }\n try {\n await this.track(\"identify\", {\n userId,\n ...traits\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Identify event tracked successfully\");\n }\n } catch (trackError) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Failed to track identify event:\", trackError);\n console.error(\n \"[VircleCore] Track error stack:\",\n trackError instanceof Error ? trackError.stack : \"No stack\"\n );\n }\n throw trackError;\n }\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"user-identified\", {\n user,\n sessionId: this.sessionId\n });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] User identified:\", { userId, traits });\n }\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Identify error:\", error);\n }\n throw new VircleError(\"USER_IDENTIFICATION_FAILED\" /* USER_IDENTIFICATION_FAILED */, `Failed to identify user \"${userId}\"`, {\n cause: error\n });\n }\n }\n /**\n * 현재 사용자의 anonymousId 반환\n * 크로스 도메인 어트리뷰션에서 _vuid 파라미터 값으로 사용.\n * user_idx 대신 anonymousId를 전달하여 실제 사용자 ID 노출을 방지한다.\n */\n getAnonymousId() {\n return this.currentUser?.anonymousId;\n }\n /**\n * anonymousId를 외부 값으로 교체 (크로스 도메인 어트리뷰션용)\n * URL _vuid 파라미터 등으로 전달받은 값을 SDK의 anonymousId로 설정한다.\n * @param anonymousId - 외부에서 전달받은 anonymousId\n */\n setAnonymousId(anonymousId) {\n if (!this.currentUser) return;\n this.currentUser = { ...this.currentUser, anonymousId };\n this.storageService.set(STORAGE_KEYS.USER, this.currentUser).catch(() => {\n });\n if (this.options.debug) {\n console.log(\"[VircleCore] Anonymous ID overridden:\", anonymousId);\n }\n }\n /**\n * 세션 ID 설정\n * @param sessionId - 새 세션 ID\n */\n setSessionId(sessionId) {\n this.sessionId = sessionId;\n if (this.options.debug) {\n console.log(\"[VircleCore] Session ID updated:\", sessionId);\n }\n }\n /**\n * 전역 컨텍스트 설정\n * @param context - 추가할 컨텍스트\n */\n setContext(context) {\n this.globalContext = mergeEventContext(this.globalContext, context);\n if (this.options.debug) {\n console.log(\"[VircleCore] Global context updated:\", this.globalContext);\n }\n }\n /**\n * 전역 컨텍스트 초기화\n */\n clearContext() {\n this.globalContext = {};\n if (this.options.debug) {\n console.log(\"[VircleCore] Global context cleared\");\n }\n }\n /**\n * 전역 속성 설정 — 모든 track()/trackBatch() 호출 시 properties에 자동 병합\n * @param properties - 추가할 속성\n */\n setGlobalProperties(properties) {\n this.globalProperties = mergeEventProperties(this.globalProperties, properties);\n if (this.options.debug) {\n console.log(\"[VircleCore] Global properties updated:\", this.globalProperties);\n }\n }\n /**\n * 전역 속성 초기화\n */\n clearGlobalProperties() {\n this.globalProperties = {};\n if (this.options.debug) {\n console.log(\"[VircleCore] Global properties cleared\");\n }\n }\n /**\n * 플러그인 등록\n * @param plugin - 등록할 플러그인\n * @throws {VircleError} 플러그인 비활성화 상태 시\n */\n async registerPlugin(plugin) {\n this.ensureInitialized();\n if (!this.options.enablePlugins) {\n throw new VircleError(\"PLUGIN_NOT_ENABLED\" /* PLUGIN_NOT_ENABLED */, \"Plugins are not enabled in SDK configuration\");\n }\n await this.pluginService.register(plugin);\n if (this.options.debug) {\n console.log(\"[VircleCore] Plugin registered:\", plugin.name);\n }\n }\n /**\n * 플러그인 등록 해제\n * @param name - 플러그인 이름\n * @returns 등록 해제 성공 여부\n */\n async unregisterPlugin(name) {\n this.ensureInitialized();\n if (!this.options.enablePlugins) {\n return false;\n }\n const result = await this.pluginService.unregister(name);\n if (this.options.debug && result) {\n console.log(\"[VircleCore] Plugin unregistered:\", name);\n }\n return result;\n }\n /**\n * 설정 업데이트\n * @param newConfig - 새 설정 값\n * @throws {ValidationError} 설정 검증 실패 시\n * @throws {VircleError} 설정 업데이트 실패 시\n */\n async updateConfig(newConfig) {\n this.ensureInitialized();\n try {\n const mergedConfig = { ...this.config, ...newConfig };\n if (this.configValidator) {\n const validation = this.configValidator.validate(mergedConfig);\n if (!validation.isValid) {\n throw new ValidationError(\"Configuration validation failed\", validation.errors);\n }\n }\n this.config = mergedConfig;\n this.configService.updateConfig(this.config);\n this.transportService.updateConfig(this.config);\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"config-changed\", {\n config: this.config\n });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Configuration updated:\", newConfig);\n }\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Config update error:\", error);\n }\n if (error instanceof VircleError) {\n throw error;\n }\n throw new VircleError(\"CONFIG_UPDATE_FAILED\" /* CONFIG_UPDATE_FAILED */, \"Failed to update configuration\", {\n cause: error\n });\n }\n }\n /**\n * 대기중인 이벤트 즉시 전송\n * @param timeoutMs - 타임아웃 시간 (밀리초)\n * @throws {Error} 타임아웃 발생 시\n */\n async flush(timeoutMs) {\n this.ensureInitialized();\n if (timeoutMs) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error(\"Flush timeout\")), timeoutMs);\n });\n await Promise.race([this.transportService.flush(), timeoutPromise]);\n } else {\n await this.transportService.flush();\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Events flushed\");\n }\n }\n /**\n * SDK 상태 초기화\n * @throws {Error} 초기화 실패 시\n */\n async reset() {\n this.ensureInitialized();\n try {\n this.currentUser = void 0;\n this.sessionId = this.generateSessionId();\n this.globalContext = {};\n this.globalProperties = {};\n await this.persistSession(true);\n await this.storageService.clear();\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"session-ended\");\n await this.pluginService.executeLifecycle(\"session-started\", {\n sessionId: this.sessionId\n });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] SDK reset completed\");\n }\n } catch (error) {\n if (this.options.debug) {\n console.error(\"[VircleCore] Reset error:\", error);\n }\n throw error;\n }\n }\n /**\n * SDK 상태 조회\n * @returns SDK 상태 정보\n */\n getStatus() {\n return {\n isInitialized: this.isInitialized,\n sessionId: this.sessionId,\n userId: this.currentUser?.id,\n pluginCount: this.options.enablePlugins ? this.pluginService.getPluginCount() : 0,\n queueSize: this.transportService.getQueueStatus().queueSize\n };\n }\n /**\n * SDK 런타임 메트릭 조회\n * @returns 현재 큐 상태 및 처리 상태\n */\n getMetrics() {\n const transportStatus = this.transportService.getQueueStatus();\n return {\n queueSize: transportStatus.queueSize,\n isProcessing: transportStatus.isProcessing\n };\n }\n /**\n * SDK 리소스 정리\n * @throws {VircleError} 정리 과정에서 에러 발생 시\n */\n async cleanup() {\n if (!this.isInitialized) {\n return;\n }\n const errors = [];\n try {\n await this.flush();\n } catch (error) {\n errors.push(\n new VircleError(\"FLUSH_FAILED\" /* FLUSH_FAILED */, \"Failed to flush events during cleanup\", {\n cause: error\n })\n );\n }\n try {\n if (this.options.enablePlugins) {\n await this.pluginService.executeLifecycle(\"session-ended\");\n await this.pluginService.cleanup();\n }\n } catch (error) {\n errors.push(\n new VircleError(\"PLUGIN_ERROR\" /* PLUGIN_ERROR */, \"Failed to cleanup plugins\", { cause: error })\n );\n }\n this.transportService.clearQueue();\n try {\n this.eventService.dispose();\n const services = [this.storageService, this.contextService, this.transportService, this.pluginService];\n for (const service of services) {\n if (service && \"dispose\" in service && typeof service.dispose === \"function\") {\n try {\n service.dispose();\n } catch (error) {\n console.warn(\"[VircleCore] Error disposing service:\", error);\n }\n }\n }\n this.taskScheduler.clear();\n this.contextCache.clear();\n } catch (error) {\n errors.push(\n new VircleError(\"CLEANUP_ERROR\" /* CLEANUP_ERROR */, \"Failed to dispose services\", { cause: error })\n );\n }\n this.currentUser = void 0;\n this.sessionId = void 0;\n this.globalContext = {};\n this.globalProperties = {};\n this.isInitialized = false;\n if (errors.length > 0) {\n const errorMessage = `Cleanup completed with ${errors.length} error(s): ${errors.map((e) => e.message).join(\"; \")}`;\n if (this.options.debug) {\n console.error(\"[VircleCore] \" + errorMessage, errors);\n }\n throw new VircleError(\"CLEANUP_ERROR\" /* CLEANUP_ERROR */, errorMessage, { context: { errors } });\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Cleanup completed successfully\");\n }\n }\n /**\n * Private 메서드\n */\n /**\n * SDK 초기화 상태 확인\n * @throws {VircleError} SDK 미초기화 상태 시\n */\n ensureInitialized() {\n if (!this.isInitialized) {\n throw new VircleError(\n \"SDK_NOT_INITIALIZED\" /* SDK_NOT_INITIALIZED */,\n \"Vircle SDK must be initialized before use. Call initialize() first.\"\n );\n }\n }\n /**\n * SDK 설정 검증\n * @throws {ConfigurationError} 설정 검증 실패 시\n */\n async validateConfiguration() {\n if (!this.configValidator) {\n return;\n }\n const validation = this.configValidator.validate(this.config);\n if (!validation.isValid) {\n throw new ConfigurationError(\"Invalid SDK configuration\", { context: { errors: validation.errors } });\n }\n if (this.options.debug && validation.warnings.length > 0) {\n console.warn(\"[VircleCore] Configuration warnings:\", validation.warnings);\n }\n }\n /**\n * 플러그인 초기화\n */\n async initializePlugins() {\n if (!this.config.plugins || !this.options.enablePlugins) {\n return;\n }\n const errors = [];\n for (const plugin of this.config.plugins) {\n try {\n await this.pluginService.register(plugin);\n if (this.options.debug) {\n console.log(`[VircleCore] Plugin auto-loaded: ${plugin.name}`);\n }\n } catch (error) {\n errors.push(error);\n if (this.options.debug) {\n console.warn(`[VircleCore] Failed to auto-load plugin '${plugin.name}':`, error);\n }\n }\n }\n if (errors.length > 0 && this.options.debug) {\n console.warn(`[VircleCore] Plugin initialization completed with ${errors.length} error(s)`);\n }\n }\n /**\n * 저장된 사용자 정보 로드\n */\n async loadPersistedUser() {\n try {\n const user = await this.storageService.get(STORAGE_KEYS.USER);\n if (user) {\n this.currentUser = user;\n if (this.options.debug) {\n console.log(\"[VircleCore] Loaded persisted user:\", user.id);\n }\n return;\n }\n } catch (error) {\n if (this.options.debug) {\n console.warn(\"[VircleCore] Failed to load persisted user:\", error);\n }\n }\n const anonymousUser = VircleUserFactory.create(\"\", {});\n this.currentUser = anonymousUser;\n try {\n await this.storageService.set(STORAGE_KEYS.USER, anonymousUser);\n } catch (error) {\n if (this.options.debug) {\n console.warn(\"[VircleCore] Failed to persist anonymous user:\", error);\n }\n }\n if (this.options.debug) {\n console.log(\"[VircleCore] Created anonymous user:\", anonymousUser.anonymousId);\n }\n }\n /**\n * 스토리지에서 세션을 복원하거나 새로 생성\n * MPA(멀티페이지 앱)에서 페이지 이동 시 세션 연속성을 보장한다.\n * localStorage에 세션 데이터를 저장하고, 30분 비활동 시 새 세션을 생성한다.\n */\n async restoreOrCreateSession() {\n try {\n const sessionData = await this.storageService.get(STORAGE_KEYS.SESSION);\n if (sessionData) {\n const elapsed = Date.now() - sessionData.lastActivity;\n if (elapsed < _VircleCore.SESSION_TIMEOUT_MS) {\n this.sessionId = sessionData.id;\n await this.persistSession(true);\n return;\n }\n }\n } catch {\n }\n this.sessionId = this.generateSessionId();\n await this.persistSession(true);\n }\n /**\n * 세션 데이터를 스토리지에 저장 (throttle 적용)\n * track() 호출마다 스토리지 쓰기를 방지하기 위해 10초 throttle 적용.\n * force=true는 세션 생성/복원 시 즉시 저장이 필요한 경우 사용.\n */\n async persistSession(force = false) {\n if (!this.sessionId) return;\n const now = Date.now();\n if (!force && now - this.lastSessionPersistTime < _VircleCore.SESSION_PERSIST_THROTTLE_MS) {\n return;\n }\n try {\n await this.storageService.set(STORAGE_KEYS.SESSION, {\n id: this.sessionId,\n lastActivity: now\n });\n this.lastSessionPersistTime = now;\n } catch {\n }\n }\n /**\n * 세션 ID 생성\n * @returns 새로운 세션 ID\n */\n generateSessionId() {\n return `sess_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n }\n};\n/** 세션 비활동 타임아웃: 30분 */\n_VircleCore.SESSION_TIMEOUT_MS = 30 * 60 * 1e3;\n/** 세션 갱신 throttle 간격: 10초 */\n_VircleCore.SESSION_PERSIST_THROTTLE_MS = 1e4;\nvar VircleCore = _VircleCore;\n\n// src/utils/RNIdleScheduler.ts\nvar RNIdleScheduler = class extends IdleScheduler {\n constructor() {\n super();\n this.handles = /* @__PURE__ */ new Map();\n this.nextId = 0;\n try {\n if (typeof global !== \"undefined\" && global.__fbBatchedBridge) {\n const RN = __require(\"react-native\");\n this.interactionManager = RN.InteractionManager;\n }\n } catch (e) {\n }\n }\n schedule(callback, options) {\n const id = this.nextId++;\n if (this.interactionManager) {\n let timeoutId;\n const handle = this.interactionManager.runAfterInteractions(async () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n this.handles.delete(id);\n try {\n await callback();\n } catch (error) {\n console.error(\"[RNIdleScheduler] Callback error:\", error);\n }\n });\n this.handles.set(id, handle);\n if (options?.timeout) {\n timeoutId = setTimeout(() => {\n if (this.handles.has(id)) {\n this.cancel(id);\n Promise.resolve(callback()).catch((error) => {\n console.error(\"[RNIdleScheduler] Timeout callback error:\", error);\n });\n }\n }, options.timeout);\n }\n } else {\n const timeout = setTimeout(async () => {\n this.handles.delete(id);\n try {\n await callback();\n } catch (error) {\n console.error(\"[RNIdleScheduler] Callback error:\", error);\n }\n }, 0);\n this.handles.set(id, timeout);\n }\n return id;\n }\n cancel(handle) {\n const item = this.handles.get(handle);\n if (item) {\n if (\"cancel\" in item) {\n item.cancel();\n } else {\n clearTimeout(item);\n }\n this.handles.delete(handle);\n }\n }\n cancelAll() {\n for (const [handle] of this.handles) {\n this.cancel(handle);\n }\n this.handles.clear();\n }\n};\n\nexport { CACHE_TIMES, ConfigurationError, ContextCache, ErrorCode, IdleScheduler, NetworkError, RNIdleScheduler, TaskScheduler, ValidationError, VircleCore, VircleError, WebIdleScheduler };\n//# sourceMappingURL=index.mjs.map\n//# sourceMappingURL=index.mjs.map",null,null,null,null,null,null,"// Browser polyfill for node-fetch\n// Simply export the global fetch API\nexport default typeof fetch !== 'undefined'\n ? fetch\n : () => {\n throw new Error('Fetch API is not available');\n };\n\nexport const Headers = window.Headers;\nexport const Request = window.Request;\nexport const Response = window.Response;\n",null],"names":["__require","x","require","Proxy","get","a","b","apply","this","arguments","Error","VircleUserFactory","create","userId","traits","anonymousId","now","Date","toISOString","id","generateAnonymousId","preferences","getDefaultPreferences","createdAt","updatedAt","Math","random","toString","substr","language","navigator","length","split","e","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","theme","notifications","email","push","sms","privacy","analytics","marketing","functional","ERROR_METADATA","UNKNOWN_ERROR","code","severity","category","retryable","userMessage","INITIALIZATION_ERROR","MISSING_API_KEY","troubleshooting","NETWORK_ERROR","REQUEST_TIMEOUT","VALIDATION_ERROR","EVENT_TOO_LARGE","STORAGE_UNAVAILABLE","PLUGIN_NOT_FOUND","FEATURE_NOT_SUPPORTED","CONSENT_REQUIRED","ENCRYPTION_ERROR","VircleError","_VircleError","constructor","message","options","defaultMetadata","super","name","timestamp","context","requestId","sessionId","cause","metadata","captureStackTrace","toJSON","stack","getUserMessage","getTroubleshooting","shouldRetry","fromHttpError","status","httpStatus","fromError","error","ConfigurationError","ValidationError","validationErrors","NetworkError","responseBody","PluginError","pluginName","StorageError","EventService","config","disposed","autoEnrich","enableValidation","maxEventSize","contextService","pluginService","storageService","transportService","track","event","processedEvent","processEvent","executeHook","debug","console","log","send","warn","createEvent","EventBuilderImpl","enrichEvent","eventSize","calculateEventSize","enriched","contextResult","collectAutoContext","mergeContext","contextError","onNonCriticalError","autoContext","userContext","Blob","JSON","stringify","size","dispose","isDisposed","eventService","properties","property","key","value","device","app","page","campaign","custom","build","ConfigService","getConfig","updateConfig","newConfig","set","ContextService","warnings","errors","autoCollect","deviceResult","collectDeviceInfo","appResult","collectAppInfo","isWebEnvironment","pageResult","collectPageInfo","userAgent","userAgentResult","collectUserAgent","referrer","referrerResult","collectReferrer","campaignResult","collectCampaignInfo","performance","performanceResult","collectPerformanceInfo","cachedDeviceInfo","isReactNativeEnvironment","type","includes","browser","chromeMatch","match","browserVersion","firefoxMatch","safariMatch","os","winMatch","osVersion","macMatch","replace","isMobileEnvironment","screen","screenResolution","width","height","window","innerWidth","innerHeight","viewport","cachedAppInfo","document","title","url","location","href","path","pathname","search","hash","metaTags","querySelectorAll","forEach","meta","getAttribute","content","Object","keys","urlParams","URLSearchParams","hasCampaignData","param","timing","navigation","loadTime","loadEventEnd","navigationStart","domReadyTime","domContentLoadedEventEnd","responseTime","responseEnd","requestStart","renderTime","navigationType","redirectCount","connection","connectionType","effectiveType","downlink","rtt","clearCache","product","test","PluginService","plugins","Map","eventHandlers","pluginEventHandlers","pluginStorage","maxExecutionTime","enableTimeout","errorHandling","setTrackFn","fn","trackFn","setIdentifyFn","identifyFn","register","plugin","validatePlugin","has","createPluginContext","initialize","executeWithTimeout","unregister","cleanupError","cleanup","delete","removePluginEventHandlers","hook","data","results","applicablePlugins","Array","from","values","filter","hooks","handler","result","pluginError","getPlugin","getPlugins","getPluginNames","hasPlugin","getPluginCount","executeLifecycle","lifecycle","lifecycleHook","getLifecycleHook","cleanupPromises","map","Promise","all","getPluginHealth","health","version","validHooks","self","on","Set","add","off","handlers","tracked","idx","findIndex","h","splice","emit","use","middleware","eventName","catch","identify","logger","args","info","storage","async","remove","operation","resolve","reject","timeout","setTimeout","then","clearTimeout","MemoryStorageAdapter","maxSize","store","item","ttl","oldestKey","next","clear","LocalStorageAdapter","prefix","localStorage","getItem","parsed","parse","setItem","fullKey","existed","removeItem","startsWith","substring","IndexedDBAdapter","dbName","dbVersion","storeName","db","indexedDB","initDB","request","open","onerror","onsuccess","onupgradeneeded","objectStoreNames","contains","createObjectStore","keyPath","transaction","objectStore","put","getRequest","deleteRequest","getAllKeys","count","StorageService","keyPrefix","adapter","createAdapter","finalTtl","getMultiple","setMultiple","items","entries","testStorageAvailability","getRecommendedStorageType","maskApiKey","apiKey","sanitizeConfig","sanitized","headers","toLowerCase","PriorityQueue","enqueue","priority","index","findInsertIndex","pop","dequeue","shift","extractByPriority","minPriority","extracted","remaining","extractBatch","i","extractOldItems","maxAge","peek","isEmpty","getStatsByPriority","stats","left","right","mid","floor","DEFAULT_EVENT_PRIORITY","purchase","payment","crash","signup","login","logout","click","submit","page_view","screen_view","scroll","heartbeat","session_extend","background_sync","cache_update","getEventPriority","customPriority","defaultPriority","nodeCrypto","CircuitBreaker","state","failures","successes","lastFailureTime","halfOpenRetries","requestVolume","failureThreshold","resetTimeout","volumeThreshold","errorThresholdPercentage","onStateChange","execute","isOpen","getNextRetryTime","onSuccess","onFailure","transitionTo","recordRequest","shouldOpen","newState","oldState","recentRequests","getRecentRequests","calculateErrorRate","success","cutoff","req","requests","getStats","errorRate","nextRetryTime","reset","trip","calculateBackoffDelay","attempt","baseDelay","maxDelay","delay","min","pow","jitter","round","global","EncryptionUtils","safeBase64Encode","buffer","Buffer","ArrayBuffer","byteOffset","byteLength","uint8Array","Uint8Array","chunks","chunkSize","chunk","subarray","String","fromCharCode","btoa","join","safeBase64Decode","base64","binaryString","atob","bytes","charCodeAt","encrypt","text","crypto","subtle","encryptWebCrypto","encryptNodeCrypto","keyBase64","TextEncoder","encode","keyData","cryptoKey","importKey","slice","ALGORITHM","KEY_LENGTH","iv","getRandomValues","IV_LENGTH","encrypted","crypto2","randomBytes","cipher","createCipheriv","update","concat","final","tag","getAuthTag","generateAESKey","generateKey","encryptAESKey","aesKey","publicKeyBase64","publicKeyData","publicKey","exportedKey","exportKey","encryptedKey","createPublicKey","format","publicEncrypt","oaepHash","padding","constants","RSA_PKCS1_OAEP_PADDING","encryptPayload","jsonStr","encryptedData","authTag","dataBuffer","ivBuffer","encryptedBuffer","tagLengthBytes","dataLength","encryptedDataBuffer","authTagBuffer","algorithm","keyAlgorithm","TAG_LENGTH","defaultValue","STORAGE_KEYS","ENCRYPTION_CONFIG","PUBLIC_KEY","API_ENDPOINTS","development","production","CDN_ENDPOINTS","TransportService","eventQueue","requestQueue","isProcessingQueue","isFlushingQueue","retryAttempts","retryDelay","batchSize","enableBatching","enableCompression","cryptoAdapter","circuitBreaker","setupAutoFlush","flushTimer","clearInterval","setInterval","flushPriorityQueue","batch","flushInterval","environment","scheduleNextTickFlush","pendingFlushTimer","sendBatch","events","totalEvents","successfulEvents","failedEvents","criticalEvents","highPriorityEvents","normalEvents","criticalResult","executeBatchRequest","highResult","normalResult","processQueue","batchEvents","currentSize","remainingCapacity","partialEvents","remainingEvents","unshift","eventIndex","requestResults","requestResult","r","lastError","makeHttpRequest","failureResult","payload","encryptionConfig","enabled","encryptedPayload","signature","secret","createHmacSignature","encoder","sign","padStart","encryptionError","warningTimeout","abortController","abortTimeout","promiseResolved","signal","requestBody","AbortController","abort","errorName","isSerializationError","method","body","response","fetch","ok","textPromise","timeoutPromise","_","race","statusCode","isRetryableHttpStatus","parsedBody","statusText","errorMessage","isAbortError","isTypeError","isNetworkError","isRetryableError","fetchModule","nodeFetch$1","nodeFetch","default","hasFetch","hasWindowFetch","some","keyword","ms","sendWithKeepalive","keepalive","flushWithKeepalive","getQueueStatus","queueSize","isProcessing","flush","clearQueue","clearError","setEncryptionConfig","updateOptions","BaseValidator","rules","addRule","rule","removeRule","validate","isValid","validateRequired","fieldName","validateStringLength","max","validateNumberRange","isNaN","validateEnum","enumObject","validValues","validateUrl","URL","validateEmail","validateRequiredProperties","obj","requiredProps","objectName","prop","validateArray","array","itemValidator","isArray","warning","checkSecurity","suspiciousPatterns","pattern","EventValidator","maxEventNameLength","maxPropertyKeyLength","maxPropertyValueLength","maxPropertiesCount","allowedEventNamePattern","forbiddenPropertyNames","enableSecurityChecks","setupValidationRules","validateRequiredFields","validateEventName","validateProperties","validateContext","validateUserId","validateSessionId","validateTimestamp","validateEventSize","validateSecurity","propertyKeys","valueValidation","validatePropertyValue","valueType","securityCheck","Number","isFinite","nestedValidation","date","getTime","oneYearAgo","getFullYear","getMonth","getDate","oneHourFromNow","eventString","nameCheck","userIdCheck","sessionIdCheck","ConfigValidator","requireApiKey","allowedEnvironments","maxBatchSize","maxQueueSize","maxRetryAttempts","validateApiKey","validateEnvironment","validateBatchConfig","validateQueueConfig","queue","validateRetryConfig","retry","validateTransportConfig","transport","validateStorageConfig","validatePluginConfig","validateAutoCollectConfig","validatePrivacyConfig","validateHeaders","apiKeyValidation","isTestKey","hasInvalidPattern","reduce","env","sizeValidation","timeoutValidation","maxBytes","maxBytesValidation","workers","workersValidation","strategy","validStrategies","fifo","lifo","strategyValidation","maxAttempts","attemptsValidation","initialDelay","delayValidation","maxDelayValidation","multiplier","multiplierValidation","connectionTimeout","connTimeoutValidation","validTypes","memory","file","typeValidation","pluginNames","booleanProps","normalizeEventName","trim","mergeEventProperties","base","override","merged","cloneValue","mergeEventContext","seen","WeakSet","val","normalizeTimestamp","ContextCache","cache","pendingCollectors","cacheTime","getCacheKey","getOrCollect","collector","cached","pending","collectPromise","invalidate","targetKey","setCacheTime","IdleScheduler","WebIdleScheduler","handles","schedule","callback","handle","requestIdleCallback","deadline","cancel","cancelIdleCallback","cancelAll","DefaultIdleScheduler","nextId","TaskScheduler","scheduler","task","sort","scheduleProcessing","getEnv","STORAGE_CACHE_PREFIX","RemoteConfigService","_RemoteConfigService","configCache","configPromises","CACHE_DURATION","cacheTimestamps","getInstance","instance","getProjectConfig","memoryCached","getCachedConfig","storageCached","getStorageCachedConfig","setCachedConfig","existingPromise","configPromise","fetchConfig","setStorageCachedConfig","projectId","extractProjectId","fetchFromCDN","cdnError","Accept","mode","json","validateConfig","hashApiKey","abs","requestedEnvironment","isValidPublicKey","features","encryption","compression","batching","settings","getDefaultConfig","raw","keysToRemove","_VircleCore","isInitialized","globalContext","globalProperties","lastSessionPersistTime","enableAutoContext","enablePlugins","pluginTimeout","storageType","configService","storageAdapter","remoteConfigService","eventValidator","configValidator","contextCache","contextCacheTime","idleScheduler","taskScheduler","validateConfiguration","remoteConfig","enableEncryption","maxRetries","configError","loadPersistedUser","restoreOrCreateSession","initializePlugins","user","currentUser","ensureInitialized","_vuid","validation","persistSession","trackBatch","vircleEvents","storageError","trackError","getAnonymousId","setAnonymousId","setSessionId","setContext","clearContext","setGlobalProperties","clearGlobalProperties","registerPlugin","unregisterPlugin","mergedConfig","timeoutMs","generateSessionId","getStatus","pluginCount","getMetrics","transportStatus","services","service","anonymousUser","sessionData","lastActivity","SESSION_TIMEOUT_MS","force","SESSION_PERSIST_THROTTLE_MS","VircleCore","WebContextCollector","collect","collectDeviceContext","collectPageContext","collectAppContext","collectCustomContext","collectCampaignContext","ua","platform","getDeviceType","getOS","getOSVersion","getBrowser","getBrowserVersion","getAppName","getAppVersion","getEnvironment","cookieEnabled","doNotTrack","nav","saveData","perf","usedJSHeapSize","totalJSHeapSize","jsHeapSizeLimit","undefined","params","allKeys","CAMPAIGN_PARAMS_MAP","hasUrlCampaign","sessionStorage","STORAGE_PREFIX","hasParams","paramKey","contextKey","stored","appNameMeta","querySelector","ogSiteName","versionMeta","hostname","utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","msclkid","ttclid","VircleWebError","details","VircleStorageError","isAvailable","checkAvailability","testKey","getKey","getFullKey","serialized","clearOldItems","retryError","parseError","prefixedKeys","deleteCount","setWithTimestamp","initPromise","isClosed","init","openDB","target","createIndex","unique","openCursor","keysToDelete","cursor","continue","deletePromises","resolveDelete","rejectDelete","percentage","primaryKey","close","StorageFactory","createAuto","createAsync","createAutoAsync","isIndexedDBAvailableAsync","isIndexedDBAvailable","deleteDatabase","onblocked","isLocalStorageAvailable","WebExtendedCryptoAdapter","available","initCrypto","globalThis","generateUUID","randomUUID","hex","c","arrayBufferToHex","step","dataBytes","tagLength","encryptedBytes","ciphertext","rawAesKey","rsaPublicKey","importRsaPublicKey","arrayBufferToBase64","cleanedKey","base64ToArrayBuffer","binary","Headers","Request","Response","storagePrefix","pageViewTracked","lastActivityTime","webConfig","webOptions","flushOnUnload","contextCollector","sessionTimeout","applyUrlVuid","setupAutoTracking","trackPageViews","trackPageView","vuid","pageContext","mergedContext","getCachedContext","unloadHandler","addEventListener","visibilityChangeHandler","visibilityState","checkSessionTimeout","trackErrors","setupErrorTracking","trackClicks","setupClickTracking","trackForms","setupFormTracking","singlePageApp","setupSPATracking","errorHandler","source","filename","line","lineno","column","colno","unhandledRejectionHandler","reason","promise","clickHandler","shouldTrackElement","extractElementProperties","submitHandler","form","form_id","form_name","form_action","action","form_method","originalPushState","history","pushState","originalReplaceState","replaceState","wrappedPush","handleRouteChange","__vircle_wrapped","wrappedReplace","popstateHandler","elapsed","newSessionId","previous_session_duration","element","hasAttribute","parent","parentElement","tagName","tag_name","element_id","element_class","className","element_href","element_text","textContent","dataAttributes","attributes","attr","data_attributes","removeEventListener","getCurrentUrl","isOnline","onLine"],"mappings":"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"}
|