@adstage/react-native-sdk 1.0.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.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +327 -0
  3. package/adstage-react-native.podspec +24 -0
  4. package/android/build.gradle +66 -0
  5. package/android/src/main/AndroidManifest.xml +4 -0
  6. package/android/src/main/java/io/nbase/adstage/reactnative/AdStageModule.kt +701 -0
  7. package/android/src/main/java/io/nbase/adstage/reactnative/AdStagePackage.kt +24 -0
  8. package/ios/AdStageModule.m +70 -0
  9. package/ios/AdStageModule.swift +457 -0
  10. package/lib/commonjs/AdStage.js +213 -0
  11. package/lib/commonjs/AdStage.js.map +1 -0
  12. package/lib/commonjs/deeplink/AdStageDeepLink.js +235 -0
  13. package/lib/commonjs/deeplink/AdStageDeepLink.js.map +1 -0
  14. package/lib/commonjs/event/AdStageEvent.js +689 -0
  15. package/lib/commonjs/event/AdStageEvent.js.map +1 -0
  16. package/lib/commonjs/index.js +34 -0
  17. package/lib/commonjs/index.js.map +1 -0
  18. package/lib/commonjs/promotion/AdStagePromotion.js +158 -0
  19. package/lib/commonjs/promotion/AdStagePromotion.js.map +1 -0
  20. package/lib/commonjs/types.js +2 -0
  21. package/lib/commonjs/types.js.map +1 -0
  22. package/lib/module/AdStage.js +206 -0
  23. package/lib/module/AdStage.js.map +1 -0
  24. package/lib/module/deeplink/AdStageDeepLink.js +228 -0
  25. package/lib/module/deeplink/AdStageDeepLink.js.map +1 -0
  26. package/lib/module/event/AdStageEvent.js +682 -0
  27. package/lib/module/event/AdStageEvent.js.map +1 -0
  28. package/lib/module/index.js +15 -0
  29. package/lib/module/index.js.map +1 -0
  30. package/lib/module/promotion/AdStagePromotion.js +151 -0
  31. package/lib/module/promotion/AdStagePromotion.js.map +1 -0
  32. package/lib/module/types.js +2 -0
  33. package/lib/module/types.js.map +1 -0
  34. package/lib/typescript/src/AdStage.d.ts +124 -0
  35. package/lib/typescript/src/AdStage.d.ts.map +1 -0
  36. package/lib/typescript/src/deeplink/AdStageDeepLink.d.ts +154 -0
  37. package/lib/typescript/src/deeplink/AdStageDeepLink.d.ts.map +1 -0
  38. package/lib/typescript/src/event/AdStageEvent.d.ts +426 -0
  39. package/lib/typescript/src/event/AdStageEvent.d.ts.map +1 -0
  40. package/lib/typescript/src/index.d.ts +13 -0
  41. package/lib/typescript/src/index.d.ts.map +1 -0
  42. package/lib/typescript/src/promotion/AdStagePromotion.d.ts +98 -0
  43. package/lib/typescript/src/promotion/AdStagePromotion.d.ts.map +1 -0
  44. package/lib/typescript/src/types.d.ts +305 -0
  45. package/lib/typescript/src/types.d.ts.map +1 -0
  46. package/package.json +105 -0
  47. package/src/AdStage.ts +212 -0
  48. package/src/deeplink/AdStageDeepLink.ts +246 -0
  49. package/src/event/AdStageEvent.ts +844 -0
  50. package/src/index.ts +48 -0
  51. package/src/promotion/AdStagePromotion.ts +162 -0
  52. package/src/types.ts +392 -0
@@ -0,0 +1,305 @@
1
+ /**
2
+ * AdStage SDK 타입 정의
3
+ *
4
+ * Android/iOS 네이티브 SDK와 동일한 타입 구조를 제공합니다.
5
+ *
6
+ * @since 3.0.0
7
+ */
8
+ /**
9
+ * AdStage SDK 초기화 설정
10
+ */
11
+ export interface AdStageConfig {
12
+ /** API 인증 키 (필수) */
13
+ apiKey: string;
14
+ /** 서버 URL (선택, 기본값: https://api.adstage.app) */
15
+ serverUrl?: string;
16
+ }
17
+ /**
18
+ * 딥링크 소스 타입
19
+ */
20
+ export type DeepLinkSource = 'realtime' | 'install' | 'unknown';
21
+ /**
22
+ * 딥링크 데이터
23
+ */
24
+ export interface DeepLinkData {
25
+ /** 딥링크 ID (서버 발급) */
26
+ linkId: string;
27
+ /** Short Path (예: "SDGWNBB") */
28
+ shortPath: string;
29
+ /** 딥링크 파라미터 */
30
+ parameters: Record<string, string>;
31
+ /** 딥링크 소스 */
32
+ source: DeepLinkSource;
33
+ /** 이벤트 타입 (OPEN, INSTALL) */
34
+ eventType: string;
35
+ /** 타임스탬프 (Unity 호환) */
36
+ timestamp?: string;
37
+ }
38
+ /**
39
+ * 딥링크 리스너
40
+ */
41
+ export type DeepLinkListener = (data: DeepLinkData) => void;
42
+ /**
43
+ * 플랫폼별 리다이렉트 설정
44
+ */
45
+ export interface PlatformConfig {
46
+ /** 앱 스토어 URL */
47
+ storeUrl?: string;
48
+ /** 앱 커스텀 스킴 */
49
+ appScheme?: string;
50
+ /** 웹 폴백 URL */
51
+ webUrl?: string;
52
+ /** 패키지명 (Android) / 번들 ID (iOS) */
53
+ packageName?: string;
54
+ /** App Store ID (iOS) */
55
+ appStoreId?: string;
56
+ }
57
+ /**
58
+ * 리다이렉트 설정
59
+ */
60
+ export interface RedirectConfig {
61
+ /** 리다이렉트 타입: STORE, APP, WEB */
62
+ type: 'STORE' | 'APP' | 'WEB';
63
+ /** Android 플랫폼 설정 */
64
+ android?: PlatformConfig;
65
+ /** iOS 플랫폼 설정 */
66
+ ios?: PlatformConfig;
67
+ /** 데스크톱 설정 */
68
+ desktop?: {
69
+ webUrl?: string;
70
+ };
71
+ }
72
+ /**
73
+ * 딥링크 생성 요청
74
+ */
75
+ export interface CreateDeepLinkRequest {
76
+ /** 딥링크 이름 (필수) */
77
+ name: string;
78
+ /** 딥링크 설명 */
79
+ description?: string;
80
+ /** Short Path 커스텀 */
81
+ shortPath?: string;
82
+ /** 채널 */
83
+ channel?: string;
84
+ /** 서브 채널 */
85
+ subChannel?: string;
86
+ /** 캠페인 */
87
+ campaign?: string;
88
+ /** 광고 그룹 */
89
+ adGroup?: string;
90
+ /** 광고 크리에이티브 */
91
+ creative?: string;
92
+ /** 콘텐츠 (Unity 호환) */
93
+ content?: string;
94
+ /** 키워드 */
95
+ keyword?: string;
96
+ /** 리다이렉트 설정 */
97
+ redirectConfig?: RedirectConfig;
98
+ /** 커스텀 파라미터 */
99
+ parameters?: Record<string, string>;
100
+ }
101
+ /**
102
+ * 딥링크 생성 응답
103
+ */
104
+ export interface CreateDeepLinkResponse {
105
+ /** 생성된 Short URL */
106
+ shortUrl: string;
107
+ /** Short Path */
108
+ shortPath: string;
109
+ /** 딥링크 ID */
110
+ linkId: string;
111
+ }
112
+ /**
113
+ * 프로모션 조회 파라미터
114
+ */
115
+ export interface PromotionListParams {
116
+ /** 배너 타입: NATIVE, INTERSTITIAL, REWARDED_VIDEO, POPUP */
117
+ bannerType?: string;
118
+ /** 타겟 사용자 필터 */
119
+ targetAudience?: string;
120
+ /** 디바이스 타입: LOW_END, MID_END, HIGH_END */
121
+ deviceType?: string;
122
+ /** 지역: KR, JP, US, SEA, EU, GLOBAL */
123
+ region?: string;
124
+ /** 조회 개수 제한 */
125
+ limit?: number;
126
+ /** 상태: ACTIVE, PENDING, PAUSED, ENDED */
127
+ status?: string;
128
+ /** 파트너(광고주) 필터 */
129
+ partner?: string;
130
+ /** 주요 관심사 */
131
+ primaryInterest?: string;
132
+ /** 주요 연령대: 13-17, 18-24, 25-34, 35-44, 45+ */
133
+ primaryAgeGroup?: string;
134
+ /** 게임 장르 선호도 */
135
+ gameGenrePreference?: string;
136
+ /** 플레이어 지출 티어: F2P, DOLPHIN, WHALE */
137
+ playerSpendingTier?: string;
138
+ /** 플레이 시간 패턴 */
139
+ playTimePattern?: string;
140
+ }
141
+ /**
142
+ * 프로모션 딥링크 정보
143
+ */
144
+ export interface PromotionDeepLink {
145
+ id: string;
146
+ name: string;
147
+ description: string;
148
+ shortPath: string;
149
+ linkType: string;
150
+ channel: string;
151
+ subChannel: string;
152
+ campaign: string;
153
+ content: string;
154
+ keyword: string;
155
+ status: string;
156
+ }
157
+ /**
158
+ * 프로모션 데이터
159
+ */
160
+ export interface Promotion {
161
+ /** 프로모션 ID */
162
+ id: string;
163
+ /** 파트너(광고주) 이름 */
164
+ partner: string;
165
+ /** 앱 이름 */
166
+ appName: string;
167
+ /** 배너 이미지 URL */
168
+ bannerUrl: string;
169
+ /** 배너 타입 */
170
+ bannerType: string;
171
+ /** 앱 설명 */
172
+ appDescription: string;
173
+ /** 딥링크 정보 */
174
+ deeplink: PromotionDeepLink;
175
+ /** 스토어 URL */
176
+ storeUrls?: {
177
+ android?: string;
178
+ ios?: string;
179
+ };
180
+ }
181
+ /**
182
+ * 프로모션 리스트 응답
183
+ */
184
+ export interface PromotionListResponse {
185
+ /** 전체 개수 */
186
+ totalItems: number;
187
+ /** 프로모션 목록 */
188
+ promotions: Promotion[];
189
+ }
190
+ /**
191
+ * 프로모션 클릭 결과
192
+ */
193
+ export interface PromotionClickResult {
194
+ /** 성공 여부 */
195
+ success: boolean;
196
+ /** 이동한 스토어 URL */
197
+ storeUrl?: string;
198
+ /** 에러 메시지 */
199
+ error?: string;
200
+ }
201
+ /**
202
+ * 사용자 속성
203
+ */
204
+ export interface UserAttributes {
205
+ /** 성별: male, female, other */
206
+ gender?: string;
207
+ /** 국가 코드: KR, US, JP 등 */
208
+ country?: string;
209
+ /** 도시 */
210
+ city?: string;
211
+ /** 나이 */
212
+ age?: string;
213
+ /** 언어: ko-KR, en-US 등 */
214
+ language?: string;
215
+ }
216
+ /**
217
+ * 이벤트 파라미터 (자유 형식)
218
+ */
219
+ export type TrackEventParams = Record<string, unknown>;
220
+ /**
221
+ * 이벤트 전송 결과
222
+ */
223
+ export interface TrackEventResult {
224
+ /** 성공 여부 */
225
+ success: boolean;
226
+ /** 이벤트 ID */
227
+ eventId?: string;
228
+ /** 에러 메시지 */
229
+ error?: string;
230
+ }
231
+ /**
232
+ * 회원가입 방법
233
+ */
234
+ export type SignUpMethod = 'email' | 'google' | 'apple' | 'facebook' | 'kakao' | 'naver' | 'twitter' | 'line' | 'guest';
235
+ /**
236
+ * 결제 방법
237
+ */
238
+ export type PaymentMethod = 'credit_card' | 'debit_card' | 'paypal' | 'google_pay' | 'apple_pay' | 'samsung_pay' | 'kakao_pay' | 'naver_pay' | 'toss' | 'bank_transfer' | 'virtual_account' | 'carrier_billing' | 'gift_card' | 'cryptocurrency' | 'other';
239
+ /**
240
+ * 이커머스 아이템
241
+ */
242
+ export interface EcommerceItem {
243
+ itemId: string;
244
+ itemName: string;
245
+ price?: number;
246
+ quantity?: number;
247
+ itemCategory?: string;
248
+ itemBrand?: string;
249
+ }
250
+ /**
251
+ * 광고 플랫폼 타입
252
+ */
253
+ export type AdPlatform = 'admob' | 'applovin' | 'ironsource' | 'unity_ads' | 'facebook' | 'vungle' | 'chartboost' | 'mopub' | 'other';
254
+ /**
255
+ * 광고 포맷 타입
256
+ */
257
+ export type AdFormat = 'banner' | 'interstitial' | 'rewarded' | 'rewarded_interstitial' | 'native' | 'app_open' | 'other';
258
+ /**
259
+ * 게임 서버 정보 (Unity 문서 기준)
260
+ */
261
+ export interface GameServerInfo {
262
+ /** 서버 ID (Unity: contentId) */
263
+ contentId?: string;
264
+ /** 서버 타입 (Unity: contentType) - 예: 'pvp', 'pve' */
265
+ contentType?: string;
266
+ /** 서버 이름 (Unity: itemName) */
267
+ itemName?: string;
268
+ }
269
+ /**
270
+ * 패치 정보 (Unity 문서 기준)
271
+ */
272
+ export interface PatchInfo {
273
+ /** 패치 ID (Unity: contentId) - 예: 'PATCH_2.1.0' */
274
+ contentId?: string;
275
+ /** 패치 타입 (Unity: contentType) - 예: 'update', 'hotfix' */
276
+ contentType?: string;
277
+ }
278
+ /**
279
+ * 금융 거래 정보
280
+ */
281
+ export interface StockTransactionInfo {
282
+ itemId?: string;
283
+ itemName?: string;
284
+ quantity?: number;
285
+ price?: number;
286
+ value?: number;
287
+ currency?: string;
288
+ }
289
+ /**
290
+ * 계좌 개설 정보
291
+ */
292
+ export interface AccountOpenInfo {
293
+ contentType?: string;
294
+ contentId?: string;
295
+ method?: string;
296
+ }
297
+ /**
298
+ * 카드 신청 정보
299
+ */
300
+ export interface CardApplicationInfo {
301
+ contentType?: string;
302
+ itemName?: string;
303
+ itemId?: string;
304
+ }
305
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,105 @@
1
+ {
2
+ "name": "@adstage/react-native-sdk",
3
+ "version": "1.0.0",
4
+ "description": "AdStage SDK for React Native - 광고 어트리뷰션, 딥링크, 인앱 이벤트 트래킹",
5
+ "main": "lib/commonjs/index",
6
+ "module": "lib/module/index",
7
+ "types": "lib/typescript/src/index.d.ts",
8
+ "react-native": "src/index",
9
+ "source": "src/index",
10
+ "files": [
11
+ "src",
12
+ "lib",
13
+ "android",
14
+ "ios",
15
+ "*.podspec",
16
+ "!ios/build",
17
+ "!android/build",
18
+ "!android/gradle",
19
+ "!android/gradlew",
20
+ "!android/gradlew.bat",
21
+ "!android/local.properties",
22
+ "!**/__tests__",
23
+ "!**/__fixtures__",
24
+ "!**/__mocks__",
25
+ "!**/.*"
26
+ ],
27
+ "scripts": {
28
+ "test": "jest",
29
+ "typecheck": "tsc --noEmit",
30
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
31
+ "clean": "del-cli lib",
32
+ "prepare": "bob build"
33
+ },
34
+ "keywords": [
35
+ "react-native",
36
+ "ios",
37
+ "android",
38
+ "adstage",
39
+ "attribution",
40
+ "deeplink",
41
+ "promotion",
42
+ "analytics"
43
+ ],
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/nbase-io/NBase-SDK-ReactNative.git"
47
+ },
48
+ "author": "NBase <support@nbase.io>",
49
+ "license": "MIT",
50
+ "bugs": {
51
+ "url": "https://github.com/nbase-io/NBase-SDK-ReactNative/issues"
52
+ },
53
+ "homepage": "https://github.com/nbase-io/NBase-SDK-ReactNative#readme",
54
+ "publishConfig": {
55
+ "registry": "https://registry.npmjs.org/"
56
+ },
57
+ "devDependencies": {
58
+ "@react-native/eslint-config": "^0.73.0",
59
+ "@types/jest": "^29.5.0",
60
+ "@types/react": "^18.2.0",
61
+ "del-cli": "^5.0.0",
62
+ "eslint": "^8.50.0",
63
+ "eslint-config-prettier": "^9.0.0",
64
+ "eslint-plugin-prettier": "^5.0.0",
65
+ "jest": "^29.7.0",
66
+ "prettier": "^3.0.0",
67
+ "react": "18.2.0",
68
+ "react-native": "0.73.0",
69
+ "react-native-builder-bob": "^0.23.0",
70
+ "typescript": "^5.2.0"
71
+ },
72
+ "peerDependencies": {
73
+ "react": ">=17.0.0",
74
+ "react-native": ">=0.70.0"
75
+ },
76
+ "engines": {
77
+ "node": ">=18.0.0"
78
+ },
79
+ "jest": {
80
+ "preset": "react-native",
81
+ "modulePathIgnorePatterns": [
82
+ "<rootDir>/lib/"
83
+ ]
84
+ },
85
+ "prettier": {
86
+ "singleQuote": true,
87
+ "tabWidth": 2,
88
+ "trailingComma": "es5",
89
+ "useTabs": false
90
+ },
91
+ "react-native-builder-bob": {
92
+ "source": "src",
93
+ "output": "lib",
94
+ "targets": [
95
+ "commonjs",
96
+ "module",
97
+ [
98
+ "typescript",
99
+ {
100
+ "project": "tsconfig.build.json"
101
+ }
102
+ ]
103
+ ]
104
+ }
105
+ }
package/src/AdStage.ts ADDED
@@ -0,0 +1,212 @@
1
+ /**
2
+ * AdStage SDK 메인 클래스
3
+ *
4
+ * React Native용 AdStage SDK의 통합 진입점입니다.
5
+ * Android/iOS 네이티브 SDK(AdStage, AdStageManager)와 동일한 API를 제공합니다.
6
+ *
7
+ * @since 3.0.0
8
+ */
9
+
10
+ import { NativeModules, Platform } from 'react-native';
11
+ import { AdStageDeepLink } from './deeplink/AdStageDeepLink';
12
+ import { AdStagePromotion } from './promotion/AdStagePromotion';
13
+ import { AdStageEvent } from './event/AdStageEvent';
14
+ import type { AdStageConfig, UserAttributes } from './types';
15
+
16
+ const { AdStageModule } = NativeModules;
17
+
18
+ /**
19
+ * AdStage SDK
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // 초기화
24
+ * await AdStage.initialize({
25
+ * apiKey: 'your-api-key',
26
+ * serverUrl: 'https://api.adstage.app'
27
+ * });
28
+ *
29
+ * // 딥링크 리스너 설정
30
+ * AdStage.deepLink.setListener((data) => {
31
+ * console.log('딥링크 수신:', data.shortPath);
32
+ * });
33
+ *
34
+ * // 프로모션 조회
35
+ * const promotions = await AdStage.promotion.getList({ bannerType: 'NATIVE' });
36
+ *
37
+ * // 이벤트 전송
38
+ * await AdStage.event.trackPurchase({
39
+ * value: 29.99,
40
+ * currency: 'USD',
41
+ * transactionId: 'TX_123'
42
+ * });
43
+ * ```
44
+ */
45
+ export class AdStage {
46
+ // ============================================
47
+ // Static Properties
48
+ // ============================================
49
+
50
+ private static _isInitialized = false;
51
+ private static _config: AdStageConfig | null = null;
52
+
53
+ // ============================================
54
+ // Sub-modules
55
+ // ============================================
56
+
57
+ /** 딥링크 관련 기능 */
58
+ static readonly deepLink = AdStageDeepLink;
59
+
60
+ /** 프로모션 관련 기능 */
61
+ static readonly promotion = AdStagePromotion;
62
+
63
+ /** 이벤트 트래킹 관련 기능 */
64
+ static readonly event = AdStageEvent;
65
+
66
+ // ============================================
67
+ // Initialization
68
+ // ============================================
69
+
70
+ /**
71
+ * AdStage SDK 초기화
72
+ *
73
+ * 앱 시작 시 가장 먼저 호출해야 합니다.
74
+ *
75
+ * @param config - SDK 설정
76
+ * @throws SDK 초기화 실패 시 에러
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * await AdStage.initialize({
81
+ * apiKey: 'your-api-key',
82
+ * serverUrl: 'https://your-server.com' // 선택사항, 없으면 네이티브 SDK 기본값 사용
83
+ * });
84
+ * ```
85
+ */
86
+ static async initialize(config: AdStageConfig): Promise<void> {
87
+ if (!config.apiKey) {
88
+ throw new Error('AdStage: apiKey is required');
89
+ }
90
+
91
+ if (this._isInitialized) {
92
+ console.warn('AdStage: SDK is already initialized');
93
+ return;
94
+ }
95
+
96
+ if (!AdStageModule) {
97
+ throw new Error('AdStage: Native module is not available');
98
+ }
99
+
100
+ // serverUrl이 없으면 빈 문자열 전달 - 네이티브 SDK에서 기본값 사용
101
+ const serverUrl = config.serverUrl ?? '';
102
+
103
+ await AdStageModule.initialize(config.apiKey, serverUrl);
104
+
105
+ this._config = config;
106
+ this._isInitialized = true;
107
+
108
+ console.log(`AdStage: SDK initialized (${Platform.OS})`);
109
+ }
110
+
111
+ /**
112
+ * SDK 초기화 여부 확인
113
+ *
114
+ * @returns 초기화되었으면 true
115
+ */
116
+ static isInitialized(): boolean {
117
+ return this._isInitialized;
118
+ }
119
+
120
+ /**
121
+ * SDK 버전 조회
122
+ *
123
+ * @returns SDK 버전 문자열
124
+ */
125
+ static async getVersion(): Promise<string> {
126
+ if (!AdStageModule) {
127
+ return '3.0.0';
128
+ }
129
+ return AdStageModule.getVersion();
130
+ }
131
+
132
+ // ============================================
133
+ // User Attributes
134
+ // ============================================
135
+
136
+ /**
137
+ * 전역 사용자 속성 설정
138
+ *
139
+ * 설정된 사용자 속성은 이후 모든 이벤트에 자동으로 포함됩니다.
140
+ *
141
+ * @param attributes - 사용자 속성
142
+ *
143
+ * @example
144
+ * ```typescript
145
+ * AdStage.setUserAttributes({
146
+ * gender: 'female',
147
+ * country: 'KR',
148
+ * city: 'Seoul',
149
+ * age: '28',
150
+ * language: 'ko-KR'
151
+ * });
152
+ * ```
153
+ */
154
+ static async setUserAttributes(attributes: UserAttributes): Promise<void> {
155
+ if (!AdStageModule) {
156
+ throw new Error('AdStage: Native module is not available');
157
+ }
158
+ await AdStageModule.setUserAttributes(attributes);
159
+ }
160
+
161
+ /**
162
+ * 전역 사용자 속성 조회
163
+ *
164
+ * @returns 설정된 사용자 속성 또는 null
165
+ */
166
+ static async getUserAttributes(): Promise<UserAttributes | null> {
167
+ if (!AdStageModule) {
168
+ return null;
169
+ }
170
+ return AdStageModule.getUserAttributes();
171
+ }
172
+
173
+ /**
174
+ * 전역 사용자 속성 초기화
175
+ *
176
+ * @example
177
+ * ```typescript
178
+ * // 로그아웃 시
179
+ * await AdStage.clearUserAttributes();
180
+ * ```
181
+ */
182
+ static async clearUserAttributes(): Promise<void> {
183
+ if (!AdStageModule) {
184
+ return;
185
+ }
186
+ await AdStageModule.clearUserAttributes();
187
+ }
188
+
189
+ // ============================================
190
+ // Internal
191
+ // ============================================
192
+
193
+ /**
194
+ * 초기화 상태 검증
195
+ * @internal
196
+ */
197
+ static ensureInitialized(): void {
198
+ if (!this._isInitialized) {
199
+ throw new Error(
200
+ 'AdStage: SDK is not initialized. Call AdStage.initialize() first.'
201
+ );
202
+ }
203
+ }
204
+
205
+ /**
206
+ * 현재 설정 조회
207
+ * @internal
208
+ */
209
+ static getConfig(): AdStageConfig | null {
210
+ return this._config;
211
+ }
212
+ }