@vircle/sdk-web 0.2.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 +598 -0
- package/dist/index.d.ts +701 -0
- package/dist/index.esm.js +1472 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +1488 -0
- package/dist/index.js.map +1 -0
- package/dist/vircle-web-sdk.min.js +2 -0
- package/dist/vircle-web-sdk.min.js.map +1 -0
- package/dist/vircle-web-sdk.standalone.esm.js +2 -0
- package/dist/vircle-web-sdk.standalone.esm.js.map +1 -0
- package/package.json +80 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,701 @@
|
|
|
1
|
+
import { VircleCore, VircleConfig, VircleCoreOptions, EventContext, DeviceContext, PageContext, AppContext, StorageAdapter } from '@vircle/sdk-core-ts';
|
|
2
|
+
export { AppContext, DeviceContext, EventContext, PageContext, StorageAdapter, UserProperties, VircleConfig } from '@vircle/sdk-core-ts';
|
|
3
|
+
|
|
4
|
+
interface VircleWebConfig extends VircleConfig {
|
|
5
|
+
/**
|
|
6
|
+
* 자동 페이지뷰 추적 활성화
|
|
7
|
+
*/
|
|
8
|
+
trackPageViews?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 자동 클릭 추적 활성화
|
|
11
|
+
*/
|
|
12
|
+
trackClicks?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* 자동 폼 제출 추적 활성화
|
|
15
|
+
*/
|
|
16
|
+
trackForms?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 자동 에러 추적 활성화
|
|
19
|
+
*/
|
|
20
|
+
trackErrors?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 싱글 페이지 앱 모드
|
|
23
|
+
*/
|
|
24
|
+
singlePageApp?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 커스텀 스토리지 키 접두사
|
|
27
|
+
*/
|
|
28
|
+
storagePrefix?: string;
|
|
29
|
+
}
|
|
30
|
+
interface VircleWebOptions extends Partial<VircleCoreOptions> {
|
|
31
|
+
/**
|
|
32
|
+
* 페이지 언로드 시 이벤트 플러시
|
|
33
|
+
*/
|
|
34
|
+
flushOnUnload?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* 컨텍스트 캐싱 시간 (ms)
|
|
37
|
+
*/
|
|
38
|
+
contextCacheTime?: number;
|
|
39
|
+
/**
|
|
40
|
+
* 성능 측정 활성화
|
|
41
|
+
*/
|
|
42
|
+
enablePerformance?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Web 플랫폼용 Vircle SDK
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const vircle = new VircleWeb({
|
|
50
|
+
* apiKey: 'your-api-key',
|
|
51
|
+
* trackPageViews: true,
|
|
52
|
+
* trackErrors: true
|
|
53
|
+
* })
|
|
54
|
+
*
|
|
55
|
+
* await vircle.initialize()
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
declare class VircleWeb extends VircleCore {
|
|
59
|
+
private contextCollector;
|
|
60
|
+
private webConfig;
|
|
61
|
+
private webOptions;
|
|
62
|
+
private performanceTracker?;
|
|
63
|
+
private pageViewTracked;
|
|
64
|
+
private errorHandler?;
|
|
65
|
+
private unhandledRejectionHandler?;
|
|
66
|
+
private clickHandler?;
|
|
67
|
+
private submitHandler?;
|
|
68
|
+
private popstateHandler?;
|
|
69
|
+
private unloadHandler?;
|
|
70
|
+
constructor(config: VircleWebConfig, options?: VircleWebOptions);
|
|
71
|
+
/**
|
|
72
|
+
* SDK 초기화 및 자동 추적 설정
|
|
73
|
+
*
|
|
74
|
+
* @description
|
|
75
|
+
* SDK를 초기화하고 설정에 따라 자동 추적 기능을 활성화합니다.
|
|
76
|
+
* 페이지뷰, 에러, 클릭, 폼 제출 등의 자동 추적을 설정할 수 있습니다.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const vircle = new VircleWeb({
|
|
81
|
+
* apiKey: 'your-api-key',
|
|
82
|
+
* trackPageViews: true,
|
|
83
|
+
* trackErrors: true
|
|
84
|
+
* })
|
|
85
|
+
*
|
|
86
|
+
* await vircle.initialize()
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* @throws {VircleInitializationError} 초기화 실패 시
|
|
90
|
+
* @returns {Promise<void>}
|
|
91
|
+
*/
|
|
92
|
+
initialize(): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* 페이지뷰 추적
|
|
95
|
+
*
|
|
96
|
+
* @description
|
|
97
|
+
* 현재 페이지의 방문을 추적합니다. URL, 제목, 리퍼러 등의 정보를 자동으로 수집합니다.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // 기본 페이지뷰 추적
|
|
102
|
+
* await vircle.trackPageView()
|
|
103
|
+
*
|
|
104
|
+
* // 추가 속성과 함께 추적
|
|
105
|
+
* await vircle.trackPageView({
|
|
106
|
+
* category: 'blog',
|
|
107
|
+
* author: 'john.doe'
|
|
108
|
+
* })
|
|
109
|
+
* ```
|
|
110
|
+
*
|
|
111
|
+
* @param {Record<string, unknown>} [properties] - 추가 속성
|
|
112
|
+
* @param {EventContext} [context] - 추가 컨텍스트
|
|
113
|
+
* @returns {Promise<void>}
|
|
114
|
+
*/
|
|
115
|
+
trackPageView(properties?: Record<string, unknown>, context?: EventContext): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* 웹 환경에 최적화된 이벤트 추적
|
|
118
|
+
* AIDEV-NOTE: 이제 코어의 TaskScheduler를 사용하여 requestIdleCallback 기반의
|
|
119
|
+
* 일관된 성능 최적화 구현
|
|
120
|
+
*/
|
|
121
|
+
track<TProperties extends Record<string, unknown> = Record<string, unknown>>(name: string, properties?: TProperties, context?: EventContext): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* 캐시된 컨텍스트 반환 또는 새로 수집
|
|
124
|
+
*
|
|
125
|
+
* @description
|
|
126
|
+
* 컨텍스트 정보를 캐시에서 가져오거나 새로 수집합니다.
|
|
127
|
+
* 성능 최적화를 위해 캐싱을 사용하며, 중복 수집을 방지합니다.
|
|
128
|
+
*
|
|
129
|
+
* @private
|
|
130
|
+
* @returns {Promise<EventContext>} 이벤트 컨텍스트
|
|
131
|
+
*
|
|
132
|
+
* AIDEV-NOTE: 컨텍스트 수집은 DOM 접근이 많아 비용이 높으므로
|
|
133
|
+
* 캐싱을 통해 성능을 최적화. 중복 수집 방지를 위한 Promise 재사용 구현
|
|
134
|
+
*/
|
|
135
|
+
private getCachedContext;
|
|
136
|
+
/**
|
|
137
|
+
* 자동 추적 설정
|
|
138
|
+
*
|
|
139
|
+
* @description
|
|
140
|
+
* 설정에 따라 다양한 자동 추적 기능을 활성화합니다.
|
|
141
|
+
* 페이지 언로드 시 플러시, 에러 추적, 클릭 추적, 폼 제출 추적, SPA 라우팅 추적 등을 설정합니다.
|
|
142
|
+
*
|
|
143
|
+
* @private
|
|
144
|
+
*/
|
|
145
|
+
private setupAutoTracking;
|
|
146
|
+
/**
|
|
147
|
+
* 에러 추적 설정
|
|
148
|
+
*
|
|
149
|
+
* @description
|
|
150
|
+
* JavaScript 에러와 처리되지 않은 Promise rejection을 자동으로 추적합니다.
|
|
151
|
+
* 에러 메시지, 파일 위치, 스택 트레이스 등의 정보를 수집합니다.
|
|
152
|
+
*
|
|
153
|
+
* @private
|
|
154
|
+
*/
|
|
155
|
+
private setupErrorTracking;
|
|
156
|
+
/**
|
|
157
|
+
* 클릭 추적 설정
|
|
158
|
+
*
|
|
159
|
+
* @description
|
|
160
|
+
* 사용자의 클릭 이벤트를 자동으로 추적합니다.
|
|
161
|
+
* 링크, 버튼, 입력 필드 등의 의미 있는 요소들의 클릭을 감지합니다.
|
|
162
|
+
* data-vircle-ignore 속성이 있는 요소는 추적에서 제외됩니다.
|
|
163
|
+
*
|
|
164
|
+
* @private
|
|
165
|
+
*/
|
|
166
|
+
private setupClickTracking;
|
|
167
|
+
/**
|
|
168
|
+
* 폼 제출 추적 설정
|
|
169
|
+
*
|
|
170
|
+
* @description
|
|
171
|
+
* HTML 폼의 제출 이벤트를 자동으로 추적합니다.
|
|
172
|
+
* 폼 ID, 이름, action URL, 메서드 등의 정보를 수집합니다.
|
|
173
|
+
*
|
|
174
|
+
* @private
|
|
175
|
+
*/
|
|
176
|
+
private setupFormTracking;
|
|
177
|
+
/**
|
|
178
|
+
* SPA 라우팅 추적 설정
|
|
179
|
+
*
|
|
180
|
+
* @description
|
|
181
|
+
* 싱글 페이지 애플리케이션(SPA)의 라우팅 변경을 감지하고 추적합니다.
|
|
182
|
+
* History API의 pushState, replaceState를 래핑하고 popstate 이벤트를 수신하여
|
|
183
|
+
* 클라이언트 사이드 라우팅 변경을 감지합니다.
|
|
184
|
+
*
|
|
185
|
+
* @private
|
|
186
|
+
*/
|
|
187
|
+
private setupSPATracking;
|
|
188
|
+
/**
|
|
189
|
+
* 라우트 변경 처리
|
|
190
|
+
*
|
|
191
|
+
* @description
|
|
192
|
+
* SPA에서 라우트가 변경될 때 호출되는 핸들러입니다.
|
|
193
|
+
* 컨텍스트 캐시를 무효화하고 새로운 페이지뷰를 추적합니다.
|
|
194
|
+
*
|
|
195
|
+
* @private
|
|
196
|
+
*/
|
|
197
|
+
private handleRouteChange;
|
|
198
|
+
/**
|
|
199
|
+
* 요소가 추적 대상인지 확인
|
|
200
|
+
*
|
|
201
|
+
* @description
|
|
202
|
+
* HTML 요소가 자동 추적 대상인지 판단합니다.
|
|
203
|
+
* data-vircle-ignore 속성이 있거나 부모 요소에 해당 속성이 있으면 false를 반환합니다.
|
|
204
|
+
*
|
|
205
|
+
* @param {HTMLElement} element - 확인할 HTML 요소
|
|
206
|
+
* @returns {boolean} 추적 대상 여부
|
|
207
|
+
* @private
|
|
208
|
+
*/
|
|
209
|
+
private shouldTrackElement;
|
|
210
|
+
/**
|
|
211
|
+
* 요소에서 속성 추출
|
|
212
|
+
*
|
|
213
|
+
* @description
|
|
214
|
+
* HTML 요소에서 추적에 필요한 속성을 추출합니다.
|
|
215
|
+
* 태그 이름, ID, 클래스, href, 텍스트 내용 등을 수집합니다.
|
|
216
|
+
*
|
|
217
|
+
* @param {HTMLElement} element - 속성을 추출할 HTML 요소
|
|
218
|
+
* @returns {Record<string, unknown>} 추출된 속성 객체
|
|
219
|
+
* @private
|
|
220
|
+
*/
|
|
221
|
+
private extractElementProperties;
|
|
222
|
+
/**
|
|
223
|
+
* SDK 리소스 정리
|
|
224
|
+
*
|
|
225
|
+
* @description
|
|
226
|
+
* SDK가 사용하는 모든 리소스를 정리합니다.
|
|
227
|
+
* 이벤트 리스너 제거, 성능 추적 중지, 대기 중인 이벤트 전송 등을 수행합니다.
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```typescript
|
|
231
|
+
* // 앱 종료 시 정리
|
|
232
|
+
* window.addEventListener('beforeunload', async () => {
|
|
233
|
+
* await vircle.cleanup()
|
|
234
|
+
* })
|
|
235
|
+
* ```
|
|
236
|
+
*
|
|
237
|
+
* @throws {Error} 정리 중 오류 발생 시
|
|
238
|
+
* @returns {Promise<void>}
|
|
239
|
+
*/
|
|
240
|
+
cleanup(): Promise<void>;
|
|
241
|
+
/**
|
|
242
|
+
* 현재 페이지 URL 반환
|
|
243
|
+
*
|
|
244
|
+
* @description
|
|
245
|
+
* 현재 브라우저의 전체 URL을 반환합니다.
|
|
246
|
+
*
|
|
247
|
+
* @example
|
|
248
|
+
* ```typescript
|
|
249
|
+
* const url = vircle.getCurrentUrl()
|
|
250
|
+
* console.log(url) // https://example.com/path?query=value
|
|
251
|
+
* ```
|
|
252
|
+
*
|
|
253
|
+
* @returns {string} 현재 페이지의 전체 URL
|
|
254
|
+
*/
|
|
255
|
+
getCurrentUrl(): string;
|
|
256
|
+
/**
|
|
257
|
+
* 네트워크 연결 상태 확인
|
|
258
|
+
*
|
|
259
|
+
* @description
|
|
260
|
+
* 브라우저의 온라인/오프라인 상태를 확인합니다.
|
|
261
|
+
* Navigator.onLine API를 사용하여 네트워크 연결 상태를 반환합니다.
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* ```typescript
|
|
265
|
+
* if (vircle.isOnline()) {
|
|
266
|
+
* // 온라인 상태에서만 실행할 코드
|
|
267
|
+
* await vircle.flush()
|
|
268
|
+
* }
|
|
269
|
+
* ```
|
|
270
|
+
*
|
|
271
|
+
* @returns {boolean} 온라인 상태 여부
|
|
272
|
+
*/
|
|
273
|
+
isOnline(): boolean;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* 웹 브라우저 환경 정보 수집기
|
|
278
|
+
*/
|
|
279
|
+
declare class WebContextCollector {
|
|
280
|
+
/**
|
|
281
|
+
* 전체 컨텍스트 수집
|
|
282
|
+
* @returns 수집된 컨텍스트
|
|
283
|
+
*/
|
|
284
|
+
collect(): Promise<EventContext>;
|
|
285
|
+
/**
|
|
286
|
+
* 디바이스 정보 수집
|
|
287
|
+
*/
|
|
288
|
+
collectDeviceContext(): Promise<DeviceContext>;
|
|
289
|
+
/**
|
|
290
|
+
* 페이지 정보 수집
|
|
291
|
+
*/
|
|
292
|
+
collectPageContext(): Promise<PageContext>;
|
|
293
|
+
/**
|
|
294
|
+
* 앱 정보 수집
|
|
295
|
+
*/
|
|
296
|
+
collectAppContext(): Promise<AppContext>;
|
|
297
|
+
/**
|
|
298
|
+
* 커스텀 컨텍스트 수집
|
|
299
|
+
*/
|
|
300
|
+
private collectCustomContext;
|
|
301
|
+
/**
|
|
302
|
+
* 디바이스 타입 판별
|
|
303
|
+
*/
|
|
304
|
+
private getDeviceType;
|
|
305
|
+
/**
|
|
306
|
+
* OS 판별
|
|
307
|
+
*/
|
|
308
|
+
private getOS;
|
|
309
|
+
/**
|
|
310
|
+
* OS 버전 추출
|
|
311
|
+
*/
|
|
312
|
+
private getOSVersion;
|
|
313
|
+
/**
|
|
314
|
+
* 브라우저 판별
|
|
315
|
+
*/
|
|
316
|
+
private getBrowser;
|
|
317
|
+
/**
|
|
318
|
+
* 브라우저 버전 추출
|
|
319
|
+
*/
|
|
320
|
+
private getBrowserVersion;
|
|
321
|
+
/**
|
|
322
|
+
* UTM 캠페인 파라미터 추출
|
|
323
|
+
*/
|
|
324
|
+
private extractCampaignParams;
|
|
325
|
+
/**
|
|
326
|
+
* 앱 이름 가져오기 (meta 태그에서)
|
|
327
|
+
*/
|
|
328
|
+
private getAppName;
|
|
329
|
+
/**
|
|
330
|
+
* 앱 버전 가져오기 (meta 태그에서)
|
|
331
|
+
*/
|
|
332
|
+
private getAppVersion;
|
|
333
|
+
/**
|
|
334
|
+
* 환경 판별
|
|
335
|
+
*/
|
|
336
|
+
private getEnvironment;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* 브라우저 LocalStorage를 사용하는 스토리지 어댑터
|
|
341
|
+
*
|
|
342
|
+
* @description
|
|
343
|
+
* 브라우저의 LocalStorage API를 활용하여 데이터를 영구 저장합니다.
|
|
344
|
+
* LocalStorage를 사용할 수 없는 환경에서는 자동으로 대체 스토리지로 폴백합니다.
|
|
345
|
+
* 용량 초과 시 자동으로 오래된 항목을 정리하는 LRU 방식을 지원합니다.
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* ```typescript
|
|
349
|
+
* const storage = new LocalStorageAdapter('vircle_')
|
|
350
|
+
* await storage.set('user_id', '12345')
|
|
351
|
+
* const userId = await storage.get('user_id')
|
|
352
|
+
* ```
|
|
353
|
+
*/
|
|
354
|
+
declare class LocalStorageAdapter implements StorageAdapter {
|
|
355
|
+
private prefix;
|
|
356
|
+
private isAvailable;
|
|
357
|
+
constructor(prefix?: string);
|
|
358
|
+
/**
|
|
359
|
+
* LocalStorage 사용 가능 여부 확인
|
|
360
|
+
*
|
|
361
|
+
* @description
|
|
362
|
+
* LocalStorage API의 사용 가능 여부를 테스트합니다.
|
|
363
|
+
* 개인정보 보호 모드나 보안 제한으로 인해 LocalStorage가 비활성화된 경우를 감지합니다.
|
|
364
|
+
*
|
|
365
|
+
* @private
|
|
366
|
+
* @returns {boolean} LocalStorage 사용 가능 여부
|
|
367
|
+
*/
|
|
368
|
+
private checkAvailability;
|
|
369
|
+
/**
|
|
370
|
+
* 키에 접두사 추가
|
|
371
|
+
*
|
|
372
|
+
* @description
|
|
373
|
+
* 키에 접두사를 추가하여 다른 애플리케이션과의 충돌을 방지합니다.
|
|
374
|
+
*
|
|
375
|
+
* @param {string} key - 원본 키
|
|
376
|
+
* @returns {string} 접두사가 추가된 키
|
|
377
|
+
* @private
|
|
378
|
+
*/
|
|
379
|
+
private getKey;
|
|
380
|
+
/**
|
|
381
|
+
* 값 저장
|
|
382
|
+
*
|
|
383
|
+
* @description
|
|
384
|
+
* LocalStorage에 값을 저장합니다. 자동으로 타임스탬프를 추가하여 LRU 정리를 지원합니다.
|
|
385
|
+
* 용량 초과 시 자동으로 오래된 항목을 정리한 후 재시도합니다.
|
|
386
|
+
*
|
|
387
|
+
* @example
|
|
388
|
+
* ```typescript
|
|
389
|
+
* await storage.set('preferences', { theme: 'dark', lang: 'ko' })
|
|
390
|
+
* ```
|
|
391
|
+
*
|
|
392
|
+
* @template T - 저장할 값의 타입
|
|
393
|
+
* @param {string} key - 키
|
|
394
|
+
* @param {T} value - 저장할 값
|
|
395
|
+
* @throws {VircleStorageError} 저장 실패 시
|
|
396
|
+
* @returns {Promise<void>}
|
|
397
|
+
*/
|
|
398
|
+
set<T = unknown>(key: string, value: T): Promise<void>;
|
|
399
|
+
/**
|
|
400
|
+
* 값 가져오기
|
|
401
|
+
*
|
|
402
|
+
* @description
|
|
403
|
+
* LocalStorage에서 값을 가져옵니다. 이전 버전과의 호환성을 지원합니다.
|
|
404
|
+
*
|
|
405
|
+
* @example
|
|
406
|
+
* ```typescript
|
|
407
|
+
* const preferences = await storage.get<{ theme: string }>('preferences')
|
|
408
|
+
* if (preferences) {
|
|
409
|
+
* console.log(preferences.theme)
|
|
410
|
+
* }
|
|
411
|
+
* ```
|
|
412
|
+
*
|
|
413
|
+
* @template T - 반환할 값의 타입
|
|
414
|
+
* @param {string} key - 키
|
|
415
|
+
* @returns {Promise<T | null>} 저장된 값 또는 null
|
|
416
|
+
*/
|
|
417
|
+
get<T = unknown>(key: string): Promise<T | null>;
|
|
418
|
+
/**
|
|
419
|
+
* 값 삭제
|
|
420
|
+
*
|
|
421
|
+
* @description
|
|
422
|
+
* LocalStorage에서 특정 키의 값을 삭제합니다.
|
|
423
|
+
*
|
|
424
|
+
* @example
|
|
425
|
+
* ```typescript
|
|
426
|
+
* const removed = await storage.remove('old_data')
|
|
427
|
+
* console.log(removed ? '삭제 성공' : '키가 존재하지 않음')
|
|
428
|
+
* ```
|
|
429
|
+
*
|
|
430
|
+
* @param {string} key - 키
|
|
431
|
+
* @returns {Promise<boolean>} 삭제 성공 여부
|
|
432
|
+
*/
|
|
433
|
+
remove(key: string): Promise<boolean>;
|
|
434
|
+
/**
|
|
435
|
+
* 모든 값 삭제
|
|
436
|
+
*
|
|
437
|
+
* @description
|
|
438
|
+
* 현재 접두사로 시작하는 모든 키의 값을 LocalStorage에서 삭제합니다.
|
|
439
|
+
* 성능 최적화를 위해 모든 키를 한 번에 가져와서 필터링합니다.
|
|
440
|
+
*
|
|
441
|
+
* @example
|
|
442
|
+
* ```typescript
|
|
443
|
+
* await storage.clear()
|
|
444
|
+
* console.log('모든 데이터 삭제 완료')
|
|
445
|
+
* ```
|
|
446
|
+
*
|
|
447
|
+
* @returns {Promise<void>}
|
|
448
|
+
*/
|
|
449
|
+
clear(): Promise<void>;
|
|
450
|
+
/**
|
|
451
|
+
* 키 존재 여부 확인
|
|
452
|
+
*
|
|
453
|
+
* @description
|
|
454
|
+
* LocalStorage에 특정 키가 존재하는지 확인합니다.
|
|
455
|
+
*
|
|
456
|
+
* @example
|
|
457
|
+
* ```typescript
|
|
458
|
+
* if (await storage.has('user_preferences')) {
|
|
459
|
+
* const prefs = await storage.get('user_preferences')
|
|
460
|
+
* }
|
|
461
|
+
* ```
|
|
462
|
+
*
|
|
463
|
+
* @param {string} key - 키
|
|
464
|
+
* @returns {Promise<boolean>} 존재 여부
|
|
465
|
+
*/
|
|
466
|
+
has(key: string): Promise<boolean>;
|
|
467
|
+
/**
|
|
468
|
+
* 저장된 항목 수
|
|
469
|
+
*
|
|
470
|
+
* @description
|
|
471
|
+
* 현재 접두사로 저장된 모든 항목의 개수를 반환합니다.
|
|
472
|
+
*
|
|
473
|
+
* @example
|
|
474
|
+
* ```typescript
|
|
475
|
+
* const count = await storage.size()
|
|
476
|
+
* console.log(`저장된 항목 수: ${count}`)
|
|
477
|
+
* ```
|
|
478
|
+
*
|
|
479
|
+
* @returns {Promise<number>} 항목 수
|
|
480
|
+
*/
|
|
481
|
+
size(): Promise<number>;
|
|
482
|
+
/**
|
|
483
|
+
* 모든 키 반환
|
|
484
|
+
*
|
|
485
|
+
* @description
|
|
486
|
+
* 현재 접두사로 저장된 모든 키를 배열로 반환합니다.
|
|
487
|
+
* 접두사는 제거된 원본 키를 반환합니다.
|
|
488
|
+
*
|
|
489
|
+
* @example
|
|
490
|
+
* ```typescript
|
|
491
|
+
* const allKeys = await storage.keys()
|
|
492
|
+
* for (const key of allKeys) {
|
|
493
|
+
* console.log(`Key: ${key}`)
|
|
494
|
+
* }
|
|
495
|
+
* ```
|
|
496
|
+
*
|
|
497
|
+
* @returns {Promise<string[]>} 키 배열
|
|
498
|
+
*/
|
|
499
|
+
keys(): Promise<string[]>;
|
|
500
|
+
/**
|
|
501
|
+
* 오래된 항목 정리 (LRU 방식)
|
|
502
|
+
*
|
|
503
|
+
* @description
|
|
504
|
+
* LocalStorage 용량이 부족할 때 가장 오래된 항목들을 삭제합니다.
|
|
505
|
+
* 타임스탬프를 기준으로 오래된 순으로 정렬하여 하위 20%를 삭제합니다.
|
|
506
|
+
*
|
|
507
|
+
* @private
|
|
508
|
+
* @returns {Promise<void>}
|
|
509
|
+
*/
|
|
510
|
+
private clearOldItems;
|
|
511
|
+
/**
|
|
512
|
+
* 타임스탬프와 함께 저장 (LRU 지원)
|
|
513
|
+
*
|
|
514
|
+
* @deprecated set 메서드가 이미 타임스탬프를 포함합니다
|
|
515
|
+
* @param {string} key - 키
|
|
516
|
+
* @param {T} value - 저장할 값
|
|
517
|
+
* @returns {Promise<void>}
|
|
518
|
+
*/
|
|
519
|
+
setWithTimestamp<T = unknown>(key: string, value: T): Promise<void>;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* 웹 성능 측정 및 추적
|
|
524
|
+
*/
|
|
525
|
+
declare class WebPerformanceTracker {
|
|
526
|
+
private observer?;
|
|
527
|
+
private marks;
|
|
528
|
+
/**
|
|
529
|
+
* 성능 추적 시작
|
|
530
|
+
*/
|
|
531
|
+
startTracking(): void;
|
|
532
|
+
/**
|
|
533
|
+
* 성능 추적 중지
|
|
534
|
+
*/
|
|
535
|
+
stopTracking(): void;
|
|
536
|
+
/**
|
|
537
|
+
* Performance API 지원 여부 확인
|
|
538
|
+
*/
|
|
539
|
+
private isSupported;
|
|
540
|
+
/**
|
|
541
|
+
* Long Task 감지
|
|
542
|
+
*/
|
|
543
|
+
private observeLongTasks;
|
|
544
|
+
/**
|
|
545
|
+
* Layout Shift 감지
|
|
546
|
+
*/
|
|
547
|
+
private observeLayoutShifts;
|
|
548
|
+
/**
|
|
549
|
+
* Largest Contentful Paint 감지
|
|
550
|
+
*/
|
|
551
|
+
private observeLCP;
|
|
552
|
+
/**
|
|
553
|
+
* First Input Delay 감지
|
|
554
|
+
*/
|
|
555
|
+
private observeFID;
|
|
556
|
+
/**
|
|
557
|
+
* 커스텀 성능 마크 시작
|
|
558
|
+
* @param name - 마크 이름
|
|
559
|
+
*/
|
|
560
|
+
mark(name: string): void;
|
|
561
|
+
/**
|
|
562
|
+
* 커스텀 성능 측정
|
|
563
|
+
* @param name - 마크 이름
|
|
564
|
+
* @returns 측정된 시간 (ms)
|
|
565
|
+
*/
|
|
566
|
+
measure(name: string): number | null;
|
|
567
|
+
/**
|
|
568
|
+
* 페이지 로드 메트릭 가져오기
|
|
569
|
+
*/
|
|
570
|
+
getLoadMetrics(): Record<string, number>;
|
|
571
|
+
/**
|
|
572
|
+
* 리소스 타이밍 데이터 가져오기
|
|
573
|
+
*/
|
|
574
|
+
getResourceTimings(): Array<{
|
|
575
|
+
name: string;
|
|
576
|
+
type: string;
|
|
577
|
+
duration: number;
|
|
578
|
+
size: number;
|
|
579
|
+
}>;
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* 함수 실행 시간 측정 데코레이터
|
|
583
|
+
*/
|
|
584
|
+
declare function measurePerformance(target: unknown, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor;
|
|
585
|
+
/**
|
|
586
|
+
* 디바운스 유틸리티
|
|
587
|
+
* @param func - 디바운스할 함수
|
|
588
|
+
* @param wait - 대기 시간 (ms)
|
|
589
|
+
* @returns 디바운스된 함수
|
|
590
|
+
*/
|
|
591
|
+
declare function debounce<T extends (...args: unknown[]) => unknown>(func: T, wait: number): (...args: Parameters<T>) => void;
|
|
592
|
+
/**
|
|
593
|
+
* 쓰로틀 유틸리티
|
|
594
|
+
* @param func - 쓰로틀할 함수
|
|
595
|
+
* @param limit - 제한 시간 (ms)
|
|
596
|
+
* @returns 쓰로틀된 함수
|
|
597
|
+
*/
|
|
598
|
+
declare function throttle<T extends (...args: unknown[]) => unknown>(func: T, limit: number): (...args: Parameters<T>) => void;
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Vircle Web SDK 전용 에러 클래스
|
|
602
|
+
*
|
|
603
|
+
* @description
|
|
604
|
+
* Vircle Web SDK에서 발생하는 모든 에러의 기본 클래스입니다.
|
|
605
|
+
* 에러 코드와 상세 정보를 포함하여 디버깅을 용이하게 합니다.
|
|
606
|
+
*
|
|
607
|
+
* @example
|
|
608
|
+
* ```typescript
|
|
609
|
+
* throw new VircleWebError(
|
|
610
|
+
* 'API 키가 유효하지 않습니다',
|
|
611
|
+
* 'INVALID_API_KEY',
|
|
612
|
+
* { apiKey: 'xxx...xxx' }
|
|
613
|
+
* )
|
|
614
|
+
* ```
|
|
615
|
+
*/
|
|
616
|
+
declare class VircleWebError extends Error {
|
|
617
|
+
readonly code: string;
|
|
618
|
+
readonly details?: Record<string, any> | undefined;
|
|
619
|
+
constructor(message: string, code: string, details?: Record<string, any> | undefined);
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* 설정 관련 에러
|
|
623
|
+
*
|
|
624
|
+
* @description
|
|
625
|
+
* SDK 설정에 문제가 있을 때 발생하는 에러입니다.
|
|
626
|
+
* API 키 누락, 잘못된 설정 값 등의 경우에 사용됩니다.
|
|
627
|
+
*
|
|
628
|
+
* @example
|
|
629
|
+
* ```typescript
|
|
630
|
+
* if (!config.apiKey) {
|
|
631
|
+
* throw new VircleConfigError('API 키가 필수입니다')
|
|
632
|
+
* }
|
|
633
|
+
* ```
|
|
634
|
+
*/
|
|
635
|
+
declare class VircleConfigError extends VircleWebError {
|
|
636
|
+
constructor(message: string, details?: Record<string, any>);
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* 초기화 관련 에러
|
|
640
|
+
*
|
|
641
|
+
* @description
|
|
642
|
+
* SDK 초기화 과정에서 발생하는 에러입니다.
|
|
643
|
+
* 브라우저 호환성, 필수 API 지원 여부 등을 확인할 때 사용됩니다.
|
|
644
|
+
*
|
|
645
|
+
* @example
|
|
646
|
+
* ```typescript
|
|
647
|
+
* if (!window.Promise) {
|
|
648
|
+
* throw new VircleInitializationError(
|
|
649
|
+
* 'Promise API를 지원하지 않는 브라우저입니다'
|
|
650
|
+
* )
|
|
651
|
+
* }
|
|
652
|
+
* ```
|
|
653
|
+
*/
|
|
654
|
+
declare class VircleInitializationError extends VircleWebError {
|
|
655
|
+
constructor(message: string, details?: Record<string, any>);
|
|
656
|
+
}
|
|
657
|
+
/**
|
|
658
|
+
* 스토리지 관련 에러
|
|
659
|
+
*
|
|
660
|
+
* @description
|
|
661
|
+
* LocalStorage 접근 실패, 용량 초과, 직렬화 오류 등
|
|
662
|
+
* 스토리지 작업 중 발생하는 에러입니다.
|
|
663
|
+
*
|
|
664
|
+
* @example
|
|
665
|
+
* ```typescript
|
|
666
|
+
* try {
|
|
667
|
+
* localStorage.setItem(key, value)
|
|
668
|
+
* } catch (error) {
|
|
669
|
+
* throw new VircleStorageError(
|
|
670
|
+
* 'LocalStorage 용량 초과',
|
|
671
|
+
* { key, size: value.length }
|
|
672
|
+
* )
|
|
673
|
+
* }
|
|
674
|
+
* ```
|
|
675
|
+
*/
|
|
676
|
+
declare class VircleStorageError extends VircleWebError {
|
|
677
|
+
constructor(message: string, details?: Record<string, any>);
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* 브라우저 호환성 에러
|
|
681
|
+
*
|
|
682
|
+
* @description
|
|
683
|
+
* 현재 브라우저가 SDK에 필요한 기능을 지원하지 않을 때 발생하는 에러입니다.
|
|
684
|
+
* 필수 API 또는 기능이 누락된 경우에 사용됩니다.
|
|
685
|
+
*
|
|
686
|
+
* @example
|
|
687
|
+
* ```typescript
|
|
688
|
+
* if (!window.fetch) {
|
|
689
|
+
* throw new VircleBrowserCompatibilityError(
|
|
690
|
+
* 'Fetch API를 지원하지 않는 브라우저입니다',
|
|
691
|
+
* { userAgent: navigator.userAgent }
|
|
692
|
+
* )
|
|
693
|
+
* }
|
|
694
|
+
* ```
|
|
695
|
+
*/
|
|
696
|
+
declare class VircleBrowserCompatibilityError extends VircleWebError {
|
|
697
|
+
constructor(message: string, details?: Record<string, any>);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
export { LocalStorageAdapter, VircleBrowserCompatibilityError, VircleConfigError, VircleInitializationError, VircleStorageError, VircleWeb, VircleWebError, WebContextCollector, WebPerformanceTracker, debounce, VircleWeb as default, measurePerformance, throttle };
|
|
701
|
+
export type { VircleWebConfig, VircleWebOptions };
|