unified-video-framework 1.4.157 → 1.4.159
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/package.json +12 -2
- package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.d.ts +18 -0
- package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +1 -0
- package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.js +117 -0
- package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.js.map +1 -0
- package/packages/core/dist/analytics/core/AnalyticsProvider.d.ts +18 -0
- package/packages/core/dist/analytics/core/AnalyticsProvider.d.ts.map +1 -0
- package/packages/core/dist/analytics/core/AnalyticsProvider.js +99 -0
- package/packages/core/dist/analytics/core/AnalyticsProvider.js.map +1 -0
- package/packages/core/dist/analytics/core/DynamicAnalyticsManager.d.ts +20 -0
- package/packages/core/dist/analytics/core/DynamicAnalyticsManager.d.ts.map +1 -0
- package/packages/core/dist/analytics/core/DynamicAnalyticsManager.js +161 -0
- package/packages/core/dist/analytics/core/DynamicAnalyticsManager.js.map +1 -0
- package/packages/core/dist/analytics/core/EventBatcher.d.ts +32 -0
- package/packages/core/dist/analytics/core/EventBatcher.d.ts.map +1 -0
- package/packages/core/dist/analytics/core/EventBatcher.js +98 -0
- package/packages/core/dist/analytics/core/EventBatcher.js.map +1 -0
- package/packages/core/dist/analytics/core/PlayerAnalytics.d.ts +19 -0
- package/packages/core/dist/analytics/core/PlayerAnalytics.d.ts.map +1 -0
- package/packages/core/dist/analytics/core/PlayerAnalytics.js +80 -0
- package/packages/core/dist/analytics/core/PlayerAnalytics.js.map +1 -0
- package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.d.ts +32 -0
- package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.d.ts.map +1 -0
- package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.js +220 -0
- package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.js.map +1 -0
- package/packages/core/dist/analytics/index.d.ts +13 -0
- package/packages/core/dist/analytics/index.d.ts.map +1 -0
- package/packages/core/dist/analytics/index.js +13 -0
- package/packages/core/dist/analytics/index.js.map +1 -0
- package/packages/core/dist/analytics/types/AnalyticsTypes.d.ts +239 -0
- package/packages/core/dist/analytics/types/AnalyticsTypes.d.ts.map +1 -0
- package/packages/core/dist/analytics/types/AnalyticsTypes.js +8 -0
- package/packages/core/dist/analytics/types/AnalyticsTypes.js.map +1 -0
- package/packages/core/dist/analytics/utils/DeviceDetection.d.ts +27 -0
- package/packages/core/dist/analytics/utils/DeviceDetection.d.ts.map +1 -0
- package/packages/core/dist/analytics/utils/DeviceDetection.js +184 -0
- package/packages/core/dist/analytics/utils/DeviceDetection.js.map +1 -0
- package/packages/core/dist/chapter-manager.d.ts +39 -0
- package/packages/core/dist/index.d.ts +1 -0
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +1 -0
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/src/analytics/README.md +902 -0
- package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.ts +156 -0
- package/packages/core/src/analytics/core/AnalyticsProvider.ts +169 -0
- package/packages/core/src/analytics/core/DynamicAnalyticsManager.ts +199 -0
- package/packages/core/src/analytics/core/EventBatcher.ts +160 -0
- package/packages/core/src/analytics/core/PlayerAnalytics.ts +147 -0
- package/packages/core/src/analytics/index.ts +51 -0
- package/packages/core/src/analytics/types/AnalyticsTypes.ts +315 -0
- package/packages/core/src/analytics/utils/DeviceDetection.ts +220 -0
- package/packages/core/src/index.ts +3 -0
- package/packages/ios/README.md +84 -0
- package/packages/web/dist/WebPlayer.d.ts +6 -0
- package/packages/web/dist/WebPlayer.d.ts.map +1 -1
- package/packages/web/dist/WebPlayer.js +273 -67
- package/packages/web/dist/WebPlayer.js.map +1 -1
- package/packages/web/dist/epg/EPGController.d.ts +78 -0
- package/packages/web/dist/epg/EPGController.d.ts.map +1 -0
- package/packages/web/dist/epg/EPGController.js +476 -0
- package/packages/web/dist/epg/EPGController.js.map +1 -0
- package/packages/web/src/WebPlayer.ts +336 -85
- package/src/analytics/README.md +902 -0
- package/src/analytics/adapters/PlayerAnalyticsAdapter.ts +572 -0
- package/src/analytics/core/DynamicAnalyticsManager.ts +526 -0
- package/src/analytics/examples/DynamicAnalyticsExample.ts +324 -0
- package/src/analytics/index.ts +60 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlayerAnalytics - Main Analytics Class
|
|
3
|
+
* Simplified analytics interface for easy integration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { DynamicAnalyticsManager } from './DynamicAnalyticsManager';
|
|
7
|
+
import {
|
|
8
|
+
DynamicAnalyticsConfig,
|
|
9
|
+
AnalyticsProviderType,
|
|
10
|
+
PlayerAnalyticsConfig,
|
|
11
|
+
VideoInfo,
|
|
12
|
+
PlayerState
|
|
13
|
+
} from '../types/AnalyticsTypes';
|
|
14
|
+
|
|
15
|
+
export class PlayerAnalytics {
|
|
16
|
+
private analyticsManager: DynamicAnalyticsManager;
|
|
17
|
+
private currentSessionId: string | null = null;
|
|
18
|
+
|
|
19
|
+
constructor(config: DynamicAnalyticsConfig) {
|
|
20
|
+
this.analyticsManager = new DynamicAnalyticsManager(config);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Initialize analytics
|
|
25
|
+
*/
|
|
26
|
+
async initialize(): Promise<void> {
|
|
27
|
+
return this.analyticsManager.initialize();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Start a new analytics session
|
|
32
|
+
*/
|
|
33
|
+
startSession(videoInfo: VideoInfo, userInfo: any = {}): string {
|
|
34
|
+
this.currentSessionId = this.analyticsManager.startSession(videoInfo, userInfo);
|
|
35
|
+
return this.currentSessionId;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* End the current analytics session
|
|
40
|
+
*/
|
|
41
|
+
async endSession(): Promise<void> {
|
|
42
|
+
if (this.currentSessionId) {
|
|
43
|
+
await this.analyticsManager.endSession();
|
|
44
|
+
this.currentSessionId = null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Track a player event
|
|
50
|
+
*/
|
|
51
|
+
trackEvent(eventType: string, playerState?: PlayerState, customData?: any): void {
|
|
52
|
+
this.analyticsManager.trackEvent(eventType, playerState, customData);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Track a custom event
|
|
57
|
+
*/
|
|
58
|
+
trackCustomEvent(eventType: string, data: any): void {
|
|
59
|
+
this.analyticsManager.trackCustomEvent(eventType, data);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get current session ID
|
|
64
|
+
*/
|
|
65
|
+
getSessionId(): string | null {
|
|
66
|
+
return this.currentSessionId;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Check if analytics is enabled
|
|
71
|
+
*/
|
|
72
|
+
isEnabled(): boolean {
|
|
73
|
+
return this.analyticsManager.isEnabled();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Add a provider at runtime
|
|
78
|
+
*/
|
|
79
|
+
addProvider(name: string, type: AnalyticsProviderType, config: any): void {
|
|
80
|
+
this.analyticsManager.addProvider(name, type, config);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Remove a provider
|
|
85
|
+
*/
|
|
86
|
+
async removeProvider(name: string): Promise<void> {
|
|
87
|
+
return this.analyticsManager.removeProvider(name);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Toggle a provider
|
|
92
|
+
*/
|
|
93
|
+
toggleProvider(name: string, enabled: boolean): void {
|
|
94
|
+
this.analyticsManager.toggleProvider(name, enabled);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Destroy analytics and cleanup
|
|
99
|
+
*/
|
|
100
|
+
async destroy(): Promise<void> {
|
|
101
|
+
if (this.currentSessionId) {
|
|
102
|
+
await this.endSession();
|
|
103
|
+
}
|
|
104
|
+
return this.analyticsManager.destroy();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Helper function to create a basic PlayerAnalytics instance
|
|
110
|
+
*/
|
|
111
|
+
export function createPlayerAnalytics(
|
|
112
|
+
baseUrl: string,
|
|
113
|
+
apiKey: string,
|
|
114
|
+
playerId: string,
|
|
115
|
+
options: Partial<PlayerAnalyticsConfig> = {}
|
|
116
|
+
): PlayerAnalytics {
|
|
117
|
+
const config: DynamicAnalyticsConfig = {
|
|
118
|
+
enabled: true,
|
|
119
|
+
providers: [
|
|
120
|
+
{
|
|
121
|
+
name: 'player-analytics',
|
|
122
|
+
type: AnalyticsProviderType.PLAYER_ANALYTICS,
|
|
123
|
+
enabled: true,
|
|
124
|
+
priority: 1,
|
|
125
|
+
config: {
|
|
126
|
+
baseUrl,
|
|
127
|
+
apiKey,
|
|
128
|
+
playerId,
|
|
129
|
+
heartbeatInterval: options.heartbeatInterval || 10,
|
|
130
|
+
batchSize: options.batchSize || 10,
|
|
131
|
+
flushInterval: options.flushInterval || 30,
|
|
132
|
+
enableOfflineStorage: options.enableOfflineStorage !== false,
|
|
133
|
+
maxRetries: options.maxRetries || 3,
|
|
134
|
+
retryDelay: options.retryDelay || 1000,
|
|
135
|
+
...options
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
globalSettings: {
|
|
140
|
+
enableConsoleLogging: false,
|
|
141
|
+
enableErrorReporting: true,
|
|
142
|
+
sessionTimeout: 60
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
return new PlayerAnalytics(config);
|
|
147
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Video Player Analytics - Main module exports
|
|
3
|
+
* Comprehensive analytics tracking for video players with dynamic provider support
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { DynamicAnalyticsConfig } from './types/AnalyticsTypes';
|
|
7
|
+
import { DynamicAnalyticsManager } from './core/DynamicAnalyticsManager';
|
|
8
|
+
|
|
9
|
+
// Main analytics manager
|
|
10
|
+
export { DynamicAnalyticsManager } from './core/DynamicAnalyticsManager';
|
|
11
|
+
|
|
12
|
+
// Core classes
|
|
13
|
+
export { PlayerAnalytics, createPlayerAnalytics } from './core/PlayerAnalytics';
|
|
14
|
+
export { EventBatcher, createEventBatcher } from './core/EventBatcher';
|
|
15
|
+
export {
|
|
16
|
+
AnalyticsProvider,
|
|
17
|
+
createAnalyticsProvider,
|
|
18
|
+
getDefaultAnalyticsConfig,
|
|
19
|
+
createPlayerAnalyticsProviderConfig,
|
|
20
|
+
validateAnalyticsConfig,
|
|
21
|
+
mergeAnalyticsConfigs
|
|
22
|
+
} from './core/AnalyticsProvider';
|
|
23
|
+
|
|
24
|
+
// Analytics Adapters
|
|
25
|
+
export { PlayerAnalyticsAdapter } from './adapters/PlayerAnalyticsAdapter';
|
|
26
|
+
|
|
27
|
+
// All types
|
|
28
|
+
export * from './types/AnalyticsTypes';
|
|
29
|
+
|
|
30
|
+
// Utilities
|
|
31
|
+
export { DeviceDetection, deviceDetection } from './utils/DeviceDetection';
|
|
32
|
+
|
|
33
|
+
// Factory function for easy setup
|
|
34
|
+
export function createDynamicAnalyticsManager(config: DynamicAnalyticsConfig): DynamicAnalyticsManager {
|
|
35
|
+
return new DynamicAnalyticsManager(config);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Re-export commonly used types and enums for convenience
|
|
39
|
+
export { AnalyticsProviderType } from './types/AnalyticsTypes';
|
|
40
|
+
export type {
|
|
41
|
+
DynamicAnalyticsConfig,
|
|
42
|
+
PlayerAnalyticsConfig,
|
|
43
|
+
AnalyticsEventData,
|
|
44
|
+
VideoInfo,
|
|
45
|
+
PlayerState,
|
|
46
|
+
DeviceInfo,
|
|
47
|
+
EngagementData,
|
|
48
|
+
PlayerSessionInfo,
|
|
49
|
+
AnalyticsEventType,
|
|
50
|
+
BaseAnalyticsProvider
|
|
51
|
+
} from './types/AnalyticsTypes';
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Types and Interfaces
|
|
3
|
+
* Core type definitions for the analytics system
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Base Analytics Configuration
|
|
7
|
+
export interface AnalyticsConfig {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
providers: AnalyticsProviderConfig[];
|
|
10
|
+
globalSettings?: GlobalAnalyticsSettings;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface DynamicAnalyticsConfig extends AnalyticsConfig {
|
|
14
|
+
providers: DynamicProviderConfig[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface GlobalAnalyticsSettings {
|
|
18
|
+
enableConsoleLogging?: boolean;
|
|
19
|
+
enableErrorReporting?: boolean;
|
|
20
|
+
sessionTimeout?: number; // in minutes
|
|
21
|
+
defaultBatchSize?: number;
|
|
22
|
+
defaultFlushInterval?: number; // in seconds
|
|
23
|
+
retryAttempts?: number;
|
|
24
|
+
retryDelay?: number; // in milliseconds
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Provider Configuration
|
|
28
|
+
export interface AnalyticsProviderConfig {
|
|
29
|
+
name: string;
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
config: any;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface DynamicProviderConfig extends AnalyticsProviderConfig {
|
|
35
|
+
type: AnalyticsProviderType;
|
|
36
|
+
priority?: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export enum AnalyticsProviderType {
|
|
40
|
+
PLAYER_ANALYTICS = 'player-analytics',
|
|
41
|
+
GOOGLE_ANALYTICS = 'google-analytics',
|
|
42
|
+
ADOBE_ANALYTICS = 'adobe-analytics',
|
|
43
|
+
CUSTOM = 'custom'
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Player Analytics Specific Configuration
|
|
47
|
+
export interface PlayerAnalyticsConfig {
|
|
48
|
+
baseUrl: string;
|
|
49
|
+
apiKey: string;
|
|
50
|
+
playerId: string;
|
|
51
|
+
tenantId?: string;
|
|
52
|
+
heartbeatInterval?: number; // in seconds
|
|
53
|
+
batchSize?: number;
|
|
54
|
+
flushInterval?: number; // in seconds
|
|
55
|
+
enableOfflineStorage?: boolean;
|
|
56
|
+
maxRetries?: number;
|
|
57
|
+
retryDelay?: number; // in milliseconds
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Event Data Structures
|
|
61
|
+
export interface AnalyticsEventData {
|
|
62
|
+
eventType: string;
|
|
63
|
+
timestamp: number;
|
|
64
|
+
currentTime?: number;
|
|
65
|
+
video?: VideoInfo;
|
|
66
|
+
device?: DeviceInfo;
|
|
67
|
+
player?: PlayerState;
|
|
68
|
+
network?: NetworkInfo;
|
|
69
|
+
engagement?: EngagementData;
|
|
70
|
+
custom?: Record<string, any>;
|
|
71
|
+
metadata?: EventMetadata;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface EventMetadata {
|
|
75
|
+
sessionId: string;
|
|
76
|
+
playerId: string;
|
|
77
|
+
userId?: string;
|
|
78
|
+
customData?: Record<string, any>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Video Information
|
|
82
|
+
export interface VideoInfo {
|
|
83
|
+
id: string;
|
|
84
|
+
title?: string;
|
|
85
|
+
type: 'video' | 'audio' | 'livestream';
|
|
86
|
+
duration?: number; // in seconds
|
|
87
|
+
url?: string;
|
|
88
|
+
quality?: string;
|
|
89
|
+
bitrate?: number;
|
|
90
|
+
codec?: string;
|
|
91
|
+
format?: string;
|
|
92
|
+
thumbnail?: string;
|
|
93
|
+
description?: string;
|
|
94
|
+
tags?: string[];
|
|
95
|
+
chapter?: ChapterInfo;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface ChapterInfo {
|
|
99
|
+
id: string;
|
|
100
|
+
title: string;
|
|
101
|
+
startTime: number;
|
|
102
|
+
endTime: number;
|
|
103
|
+
thumbnail?: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Device Information
|
|
107
|
+
export interface DeviceInfo {
|
|
108
|
+
deviceType: 'mobile' | 'tablet' | 'desktop' | 'smart_tv' | 'tv';
|
|
109
|
+
os: string;
|
|
110
|
+
osVersion?: string;
|
|
111
|
+
browser?: string;
|
|
112
|
+
browserVersion?: string;
|
|
113
|
+
screen: {
|
|
114
|
+
width: number;
|
|
115
|
+
height: number;
|
|
116
|
+
orientation?: 'portrait' | 'landscape';
|
|
117
|
+
};
|
|
118
|
+
userAgent?: string;
|
|
119
|
+
language?: string;
|
|
120
|
+
timezone?: string;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Player State
|
|
124
|
+
export interface PlayerState {
|
|
125
|
+
currentTime: number;
|
|
126
|
+
duration: number;
|
|
127
|
+
volume: number;
|
|
128
|
+
muted: boolean;
|
|
129
|
+
playbackRate: number;
|
|
130
|
+
buffered?: TimeRanges | null;
|
|
131
|
+
quality?: string;
|
|
132
|
+
isFullscreen?: boolean;
|
|
133
|
+
isPip?: boolean; // Picture-in-Picture
|
|
134
|
+
isLive?: boolean;
|
|
135
|
+
seekableRange?: {
|
|
136
|
+
start: number;
|
|
137
|
+
end: number;
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Network Information
|
|
142
|
+
export interface NetworkInfo {
|
|
143
|
+
connectionType?: string;
|
|
144
|
+
effectiveType?: string;
|
|
145
|
+
downlink?: number; // Mbps
|
|
146
|
+
rtt?: number; // milliseconds
|
|
147
|
+
online: boolean;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Engagement Metrics
|
|
151
|
+
export interface EngagementData {
|
|
152
|
+
watchTime: number; // Total watch time in seconds
|
|
153
|
+
uniqueWatchTime: number; // Unique content watched (no replays)
|
|
154
|
+
completionPercentage: number; // 0-100
|
|
155
|
+
seekCount: number;
|
|
156
|
+
qualityChangeCount: number;
|
|
157
|
+
fullscreenCount: number;
|
|
158
|
+
bufferingTime: number; // Total buffering time in seconds
|
|
159
|
+
bufferingEvents: number; // Number of buffering events
|
|
160
|
+
averageBitrate?: number;
|
|
161
|
+
startupTime?: number; // Time to first frame
|
|
162
|
+
rebufferCount: number;
|
|
163
|
+
errorCount: number;
|
|
164
|
+
interactionCount: number; // User interactions (play/pause/seek)
|
|
165
|
+
socialShares?: number;
|
|
166
|
+
likes?: number;
|
|
167
|
+
comments?: number;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Session Information
|
|
171
|
+
export interface PlayerSessionInfo {
|
|
172
|
+
sessionId: string;
|
|
173
|
+
playerId: string;
|
|
174
|
+
startTime: number;
|
|
175
|
+
endTime?: number;
|
|
176
|
+
userId?: string;
|
|
177
|
+
userType?: string;
|
|
178
|
+
customData?: Record<string, any>;
|
|
179
|
+
initialVideo?: VideoInfo;
|
|
180
|
+
totalVideos?: number;
|
|
181
|
+
totalWatchTime?: number;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Event Types
|
|
185
|
+
export type AnalyticsEventType =
|
|
186
|
+
| 'session_start'
|
|
187
|
+
| 'session_end'
|
|
188
|
+
| 'video_load'
|
|
189
|
+
| 'video_start'
|
|
190
|
+
| 'play'
|
|
191
|
+
| 'pause'
|
|
192
|
+
| 'resume'
|
|
193
|
+
| 'ended'
|
|
194
|
+
| 'seeking'
|
|
195
|
+
| 'seeked'
|
|
196
|
+
| 'waiting'
|
|
197
|
+
| 'stalled'
|
|
198
|
+
| 'canplay'
|
|
199
|
+
| 'timeupdate'
|
|
200
|
+
| 'heartbeat'
|
|
201
|
+
| 'qualitychange'
|
|
202
|
+
| 'volumechange'
|
|
203
|
+
| 'fullscreenchange'
|
|
204
|
+
| 'ratechange'
|
|
205
|
+
| 'resize'
|
|
206
|
+
| 'enterpictureinpicture'
|
|
207
|
+
| 'leavepictureinpicture'
|
|
208
|
+
| 'error'
|
|
209
|
+
| 'custom';
|
|
210
|
+
|
|
211
|
+
// Error Information
|
|
212
|
+
export interface AnalyticsError {
|
|
213
|
+
code: string | number;
|
|
214
|
+
message: string;
|
|
215
|
+
stack?: string;
|
|
216
|
+
fatal?: boolean;
|
|
217
|
+
context?: Record<string, any>;
|
|
218
|
+
timestamp: number;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Batch Configuration
|
|
222
|
+
export interface BatchConfig {
|
|
223
|
+
maxSize: number;
|
|
224
|
+
flushInterval: number; // in milliseconds
|
|
225
|
+
maxWaitTime: number; // in milliseconds
|
|
226
|
+
retryAttempts: number;
|
|
227
|
+
retryDelay: number; // in milliseconds
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// API Request/Response Types
|
|
231
|
+
export interface AnalyticsRequest {
|
|
232
|
+
session: PlayerSessionInfo;
|
|
233
|
+
events: AnalyticsEventData[];
|
|
234
|
+
timestamp: number;
|
|
235
|
+
batchId?: string;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface AnalyticsResponse {
|
|
239
|
+
success: boolean;
|
|
240
|
+
message?: string;
|
|
241
|
+
errors?: string[];
|
|
242
|
+
batchId?: string;
|
|
243
|
+
processedCount?: number;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Provider Factory Types
|
|
247
|
+
export interface ProviderFactory<T = any> {
|
|
248
|
+
(config: T): BaseAnalyticsProvider;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export interface CustomProviderConfig {
|
|
252
|
+
factory: ProviderFactory;
|
|
253
|
+
[key: string]: any;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Base Provider Interface
|
|
257
|
+
export interface BaseAnalyticsProvider {
|
|
258
|
+
name: string;
|
|
259
|
+
enabled: boolean;
|
|
260
|
+
initialize(): Promise<void>;
|
|
261
|
+
trackEvent(event: AnalyticsEventData): Promise<void>;
|
|
262
|
+
startSession(sessionInfo: PlayerSessionInfo): Promise<string>;
|
|
263
|
+
endSession(): Promise<void>;
|
|
264
|
+
flush(): Promise<void>;
|
|
265
|
+
destroy(): Promise<void>;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Utility Types
|
|
269
|
+
export type DeepPartial<T> = {
|
|
270
|
+
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
export type EventHandler = (event: AnalyticsEventData) => void;
|
|
274
|
+
export type ErrorHandler = (error: AnalyticsError) => void;
|
|
275
|
+
export type SessionHandler = (sessionInfo: PlayerSessionInfo) => void;
|
|
276
|
+
|
|
277
|
+
// Storage Types
|
|
278
|
+
export interface StorageItem {
|
|
279
|
+
id: string;
|
|
280
|
+
data: AnalyticsEventData;
|
|
281
|
+
timestamp: number;
|
|
282
|
+
attempts: number;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export interface StorageConfig {
|
|
286
|
+
maxItems: number;
|
|
287
|
+
maxAge: number; // in milliseconds
|
|
288
|
+
storageKey: string;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Device Detection Types
|
|
292
|
+
export interface DeviceDetectionResult {
|
|
293
|
+
deviceType: DeviceInfo['deviceType'];
|
|
294
|
+
os: string;
|
|
295
|
+
osVersion?: string;
|
|
296
|
+
browser?: string;
|
|
297
|
+
browserVersion?: string;
|
|
298
|
+
screen: DeviceInfo['screen'];
|
|
299
|
+
userAgent: string;
|
|
300
|
+
isMobile: boolean;
|
|
301
|
+
isTablet: boolean;
|
|
302
|
+
isDesktop: boolean;
|
|
303
|
+
isSmartTV: boolean;
|
|
304
|
+
isTizen: boolean;
|
|
305
|
+
isWebOS: boolean;
|
|
306
|
+
isRoku: boolean;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export interface NetworkDetectionResult {
|
|
310
|
+
connectionType?: string;
|
|
311
|
+
effectiveType?: string;
|
|
312
|
+
downlink?: number;
|
|
313
|
+
rtt?: number;
|
|
314
|
+
online: boolean;
|
|
315
|
+
}
|