@adstage/web-sdk
Version:
AdStage Web SDK - Production-ready marketing platform SDK with React Provider support for seamless integration
211 lines (177 loc) • 5.13 kB
text/typescript
/**
* AdStage SDK - Events 모듈
* 이벤트 추적 시스템
*/
import { AdStageConfig, BaseModule } from '../../types/config';
import { endpoints } from '../../constants/endpoints';
import { ApiHeaders } from '../../utils/api-headers';
import { getSDKVersion } from '../../utils/version';
import { EventDeviceCollector } from '../../managers/events/event-device-collector';
import { EventUserCollector } from '../../managers/events/event-user-collector';
import { EventSessionManager } from '../../managers/events/event-session-manager';
import type { UserProperties, EventProperties } from '../../types/events';
export type { EventProperties, UserProperties };
export class EventsModule implements BaseModule {
private _isReady = false;
private _config: AdStageConfig | null = null;
/**
* Events 모듈 초기화 (동기)
*/
init(config: AdStageConfig): void {
this._config = config;
this._isReady = true;
if (config.debug) {
console.log('📊 Events module initialized');
}
}
/**
* 모듈 준비 상태 확인
*/
isReady(): boolean {
return this._isReady;
}
/**
* 모듈 설정 반환
*/
getConfig(): AdStageConfig | null {
return this._config;
}
/**
* 사용자 ID 설정
*/
setUserId(userId: string): void {
EventSessionManager.setUserId(userId);
if (this._config?.debug) {
console.log('👤 User ID set:', userId);
}
}
/**
* 현재 사용자 ID 반환
*/
getUserId(): string | undefined {
return EventSessionManager.getUserId();
}
/**
* 사용자 속성 설정
*/
setUserProperties(properties: UserProperties): void {
EventUserCollector.setUserProperties(properties);
if (this._config?.debug) {
console.log('👤 User properties set:', properties);
}
}
/**
* 현재 사용자 속성 반환
*/
getUserProperties(): any {
return EventUserCollector.getCurrentUserProperties();
}
/**
* 디바이스 정보 설정
*/
setDeviceInfo(deviceInfo: Partial<{
category: 'mobile' | 'desktop' | 'tablet' | 'other';
platform: string;
model: string;
appVersion: string;
osVersion: string;
}>): void {
EventDeviceCollector.setDeviceInfo(deviceInfo);
if (this._config?.debug) {
console.log('📱 Device info set:', deviceInfo);
}
}
/**
* 개별 디바이스 속성 설정
*/
setDeviceProperty(key: 'category' | 'platform' | 'model' | 'appVersion' | 'osVersion', value: string): void {
EventDeviceCollector.setDeviceProperty(key, value);
if (this._config?.debug) {
console.log('📱 Device property set:', key, value);
}
}
/**
* 사용자 제공 디바이스 정보 초기화
*/
clearDeviceInfo(): void {
EventDeviceCollector.clearDeviceInfo();
if (this._config?.debug) {
console.log('📱 User provided device info cleared');
}
}
/**
* 현재 사용자가 설정한 디바이스 정보 반환
*/
getUserDeviceInfo(): any {
return EventDeviceCollector.getUserDeviceInfo();
}
/**
* 현재 디바이스 정보 반환
*/
getDeviceInfo(): any {
return EventDeviceCollector.getDeviceInfo();
}
/**
* 현재 사용자 정보 반환
*/
getUserInfo(): any {
return EventUserCollector.getUserInfo();
}
/**
* 현재 사용자 속성 반환 (별칭)
*/
getCurrentUserProperties(): any {
return EventUserCollector.getCurrentUserProperties();
}
/**
* 이벤트 추적
* @param eventName 이벤트 이름
* @param properties 이벤트 속성
*/
async track(eventName: string, properties?: EventProperties): Promise<void> {
if (!this._isReady) {
console.warn('Events module not initialized. Call AdStage.init() first.');
return;
}
if (!this._config?.apiKey) {
console.warn('API key not configured for event tracking.');
return;
}
try {
const eventData = {
eventName,
userId: EventSessionManager.getUserId(),
sessionId: EventSessionManager.getSessionId(),
sdkVersion: getSDKVersion(),
device: EventDeviceCollector.getDeviceInfo(),
user: EventUserCollector.getUserInfo(),
params: properties || {}
};
await this.sendEventToServer(eventData);
if (this._config.debug) {
console.log('✅ Event tracked:', eventName, properties);
}
} catch (error) {
console.error('❌ Failed to track event:', error);
if (this._config.debug) {
console.error('Event data:', { eventName, properties });
}
}
}
/**
* 서버에 이벤트 전송
*/
private async sendEventToServer(eventData: any): Promise<void> {
const response = await fetch(endpoints.events.track(), {
method: 'POST',
headers: {
...ApiHeaders.create(this._config!.apiKey),
'Content-Type': 'application/json'
},
body: JSON.stringify(eventData)
});
if (!response.ok) {
throw new Error(`Event tracking failed: ${response.status} ${response.statusText}`);
}
}
}