unified-video-framework 1.4.430 → 1.4.431
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 +27 -326
- package/package.json +1 -1
- package/packages/core/dist/BasePlayer.d.ts.map +1 -1
- package/packages/core/dist/BasePlayer.js +7 -0
- package/packages/core/dist/BasePlayer.js.map +1 -1
- package/packages/core/dist/VideoPlayerFactory.d.ts.map +1 -1
- package/packages/core/dist/VideoPlayerFactory.js +9 -7
- package/packages/core/dist/VideoPlayerFactory.js.map +1 -1
- package/packages/core/dist/index.d.ts +1 -1
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +1 -1
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/telemetry/TelemetryManager.d.ts +1 -0
- package/packages/core/dist/telemetry/TelemetryManager.d.ts.map +1 -1
- package/packages/core/dist/telemetry/TelemetryManager.js +18 -10
- package/packages/core/dist/telemetry/TelemetryManager.js.map +1 -1
- package/packages/core/dist/version.d.ts +2 -0
- package/packages/core/dist/version.d.ts.map +1 -0
- package/packages/core/dist/version.js +2 -0
- package/packages/core/dist/version.js.map +1 -0
- package/packages/core/src/BasePlayer.ts +16 -7
- package/packages/core/src/VideoPlayerFactory.ts +12 -10
- package/packages/core/src/index.ts +1 -1
- package/packages/core/src/telemetry/TelemetryManager.ts +26 -11
- package/packages/core/src/version.ts +1 -0
package/README.md
CHANGED
|
@@ -1,336 +1,37 @@
|
|
|
1
|
-
# Unified Video Player
|
|
2
|
-
<!--
|
|
3
|
-
A comprehensive cross-platform video player framework that provides a unified API for building video applications across all major platforms.
|
|
1
|
+
# Unified Video Player SDK for OTT, Web
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
**A production-ready, cross-platform video player framework to build OTT, FAST, VOD, and Live Streaming applications using a single unified API.**
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
- **Web**: All modern browsers
|
|
9
|
-
- **Smart TVs**:
|
|
10
|
-
- Samsung Tizen (using Enact)
|
|
11
|
-
- LG webOS (using Enact)
|
|
12
|
-
- **Streaming Devices**:
|
|
13
|
-
- Roku
|
|
14
|
-
- Android TV
|
|
15
|
-
- Apple TV
|
|
16
|
-
- **Desktop**: Windows, macOS, Linux (via web)
|
|
5
|
+
Built and maintained by **Flicknexs**, trusted by teams building video platforms across Web, Mobile Streaming Devices.
|
|
17
6
|
|
|
18
|
-
|
|
7
|
+
🔗 **Official Website**: https://flicknexs.com
|
|
8
|
+
📘 **Docs & Examples**: https://flicknexs.com/video-player-sdk?utm_source=npm&utm_medium=referral&utm_campaign=unified_video_framework
|
|
9
|
+
💻 **GitHub Repository**: https://github.com/flicknexs/unified-video-framework
|
|
19
10
|
|
|
20
|
-
|
|
21
|
-
- **DRM Support**: FairPlay, Widevine, PlayReady
|
|
22
|
-
- **Adaptive Streaming**: HLS, DASH support
|
|
23
|
-
- **Analytics**: Built-in analytics integration
|
|
24
|
-
- **Offline Playback**: Download and play offline
|
|
25
|
-
- **Casting**: Chromecast and AirPlay support
|
|
26
|
-
- **Picture-in-Picture**: Supported platforms
|
|
27
|
-
- **4K/8K & HDR**: High-quality video support
|
|
28
|
-
- **Subtitles & Multiple Audio Tracks**
|
|
29
|
-
- **Ad Integration**: Pre-roll, mid-roll, post-roll ads
|
|
30
|
-
- **Remote Control**: Full TV remote support
|
|
31
|
-
|
|
32
|
-
## 📦 Installation
|
|
33
|
-
|
|
34
|
-
### Using npm
|
|
35
|
-
```bash
|
|
36
|
-
npm install unified-video-framework
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Using yarn
|
|
40
|
-
```bash
|
|
41
|
-
yarn add unified-video-framework
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Using pnpm
|
|
45
|
-
```bash
|
|
46
|
-
pnpm add unified-video-framework
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### From GitHub (latest development version)
|
|
50
|
-
```bash
|
|
51
|
-
npm install github:flicknexs/unified-video-framework
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Using npm link (for development)
|
|
55
|
-
```bash
|
|
56
|
-
# In the framework directory
|
|
57
|
-
npm link
|
|
58
|
-
|
|
59
|
-
# In your project
|
|
60
|
-
npm link unified-video-framework
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
📖 **For detailed installation instructions and troubleshooting, see [INSTALLATION.md](./INSTALLATION.md)**
|
|
64
|
-
|
|
65
|
-
## 🚀 Quick Start
|
|
66
|
-
|
|
67
|
-
### Basic Usage
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
import { UnifiedVideoPlayer } from '@flicknexs/unified-video-framework';
|
|
71
|
-
|
|
72
|
-
function App() {
|
|
73
|
-
return (
|
|
74
|
-
<UnifiedVideoPlayer
|
|
75
|
-
source={{
|
|
76
|
-
url: 'https://example.com/video.m3u8',
|
|
77
|
-
type: 'application/x-mpegURL'
|
|
78
|
-
}}
|
|
79
|
-
config={{
|
|
80
|
-
autoPlay: true,
|
|
81
|
-
controls: true
|
|
82
|
-
}}
|
|
83
|
-
onReady={() => console.log('Player ready')}
|
|
84
|
-
onError={(error) => console.error('Player error:', error)}
|
|
85
|
-
/>
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### With DRM
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
import { UnifiedVideoPlayer, DRMType } from '@flicknexs/unified-video-framework';
|
|
94
|
-
|
|
95
|
-
function SecureVideoApp() {
|
|
96
|
-
return (
|
|
97
|
-
<UnifiedVideoPlayer
|
|
98
|
-
source={{
|
|
99
|
-
url: 'https://example.com/encrypted-video.mpd',
|
|
100
|
-
type: 'application/dash+xml',
|
|
101
|
-
drm: {
|
|
102
|
-
type: DRMType.WIDEVINE,
|
|
103
|
-
licenseUrl: 'https://license.example.com/widevine',
|
|
104
|
-
headers: {
|
|
105
|
-
'X-Auth-Token': 'your-auth-token'
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}}
|
|
109
|
-
config={{
|
|
110
|
-
autoPlay: false,
|
|
111
|
-
adaptiveBitrate: {
|
|
112
|
-
autoLevelEnabled: true,
|
|
113
|
-
startLevel: -1
|
|
114
|
-
}
|
|
115
|
-
}}
|
|
116
|
-
/>
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## 🏗️ Framework Architecture
|
|
122
|
-
|
|
123
|
-
```
|
|
124
|
-
┌────────────────────────────────────────────────┐
|
|
125
|
-
│ Application Layer (Your App) │
|
|
126
|
-
├────────────────────────────────────────────────┤
|
|
127
|
-
│ Unified Video Framework API (TypeScript) │
|
|
128
|
-
├────────────────────────────────────────────────┤
|
|
129
|
-
│ Platform Bridge Layer │
|
|
130
|
-
├──────┬──────┬──────────┬──────┬──────────┬────┤
|
|
131
|
-
│ iOS │Android│ Enact │ Roku │ Web │Win │
|
|
132
|
-
│Native│Native │(Tizen/LG)│Bridge│ Browser │UWP │
|
|
133
|
-
└──────┴──────┴──────────┴──────┴──────────┴────┘
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## 📱 Platform-Specific Setup
|
|
137
|
-
|
|
138
|
-
### iOS
|
|
139
|
-
```bash
|
|
140
|
-
cd ios && pod install
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### Android
|
|
144
|
-
Add to `android/app/build.gradle`:
|
|
145
|
-
```gradle
|
|
146
|
-
dependencies {
|
|
147
|
-
implementation 'com.google.android.exoplayer:exoplayer:2.18.0'
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Samsung Tizen TV
|
|
152
|
-
```bash
|
|
153
|
-
npm run build:tizen
|
|
154
|
-
tizen install -n dist/tizen/app.wgt
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### LG webOS TV
|
|
158
|
-
```bash
|
|
159
|
-
npm run build:webos
|
|
160
|
-
ares-install dist/webos/app.ipk
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Roku
|
|
164
|
-
```bash
|
|
165
|
-
npm run build:roku
|
|
166
|
-
# Upload via Roku Developer Dashboard
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
## 🛠️ Development
|
|
170
|
-
|
|
171
|
-
### Setup
|
|
172
|
-
```bash
|
|
173
|
-
# Install dependencies
|
|
174
|
-
npm install
|
|
175
|
-
|
|
176
|
-
# Bootstrap monorepo
|
|
177
|
-
npm run bootstrap
|
|
178
|
-
|
|
179
|
-
# Build all packages
|
|
180
|
-
npm run build
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Running Examples
|
|
184
|
-
```bash
|
|
185
|
-
# Run mobile demo
|
|
186
|
-
cd apps/mobile-demo
|
|
187
|
-
npm run ios
|
|
188
|
-
# or
|
|
189
|
-
npm run android
|
|
190
|
-
|
|
191
|
-
# Run TV demo
|
|
192
|
-
cd apps/tv-demo
|
|
193
|
-
npm run serve
|
|
194
|
-
|
|
195
|
-
# Run web demo
|
|
196
|
-
cd apps/web-demo
|
|
197
|
-
npm start
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
## 📖 API Documentation
|
|
201
|
-
|
|
202
|
-
### VideoPlayer Methods
|
|
203
|
-
|
|
204
|
-
| Method | Description | Returns |
|
|
205
|
-
|--------|-------------|---------|
|
|
206
|
-
| `load(source)` | Load a video source | `Promise<void>` |
|
|
207
|
-
| `play()` | Start playback | `Promise<void>` |
|
|
208
|
-
| `pause()` | Pause playback | `void` |
|
|
209
|
-
| `seek(time)` | Seek to position | `void` |
|
|
210
|
-
| `setVolume(level)` | Set volume (0-1) | `void` |
|
|
211
|
-
| `setQuality(quality)` | Set video quality | `void` |
|
|
212
|
-
| `setSubtitle(track)` | Set subtitle track | `void` |
|
|
213
|
-
| `destroy()` | Clean up player | `void` |
|
|
214
|
-
|
|
215
|
-
### Events
|
|
216
|
-
|
|
217
|
-
| Event | Description | Payload |
|
|
218
|
-
|-------|-------------|---------|
|
|
219
|
-
| `ready` | Player initialized | - |
|
|
220
|
-
| `play` | Playback started | - |
|
|
221
|
-
| `pause` | Playback paused | - |
|
|
222
|
-
| `ended` | Playback ended | - |
|
|
223
|
-
| `error` | Error occurred | `{error: Error}` |
|
|
224
|
-
| `timeupdate` | Position updated | `{currentTime: number}` |
|
|
225
|
-
| `progress` | Buffer progress | `{buffered: number}` |
|
|
226
|
-
| `qualitychange` | Quality changed | `{quality: Quality}` |
|
|
227
|
-
|
|
228
|
-
## 🎮 Remote Control Support
|
|
229
|
-
|
|
230
|
-
The framework automatically handles remote control inputs on TV platforms:
|
|
231
|
-
|
|
232
|
-
- **Play/Pause**: Media play/pause keys
|
|
233
|
-
- **Seek**: Left/Right arrow keys
|
|
234
|
-
- **Volume**: Up/Down arrow keys
|
|
235
|
-
- **Back**: Return/Back button
|
|
236
|
-
- **Select**: OK/Enter button
|
|
237
|
-
|
|
238
|
-
## 📊 Analytics Integration
|
|
239
|
-
|
|
240
|
-
```typescript
|
|
241
|
-
import { GoogleAnalytics, MixPanel } from '@flicknexs/analytics';
|
|
242
|
-
|
|
243
|
-
<UnifiedVideoPlayer
|
|
244
|
-
source={videoSource}
|
|
245
|
-
config={{
|
|
246
|
-
analytics: {
|
|
247
|
-
enabled: true,
|
|
248
|
-
providers: [
|
|
249
|
-
new GoogleAnalytics({ trackingId: 'UA-XXXXX' }),
|
|
250
|
-
new MixPanel({ token: 'your-token' })
|
|
251
|
-
]
|
|
252
|
-
}
|
|
253
|
-
}}
|
|
254
|
-
/>
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
## 🔒 DRM Configuration
|
|
258
|
-
|
|
259
|
-
### FairPlay (iOS/Apple TV)
|
|
260
|
-
```typescript
|
|
261
|
-
{
|
|
262
|
-
type: DRMType.FAIRPLAY,
|
|
263
|
-
certificateUrl: 'https://example.com/certificate',
|
|
264
|
-
licenseUrl: 'https://example.com/license'
|
|
265
|
-
}
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
### Widevine (Android/Chrome/Smart TVs)
|
|
269
|
-
```typescript
|
|
270
|
-
{
|
|
271
|
-
type: DRMType.WIDEVINE,
|
|
272
|
-
licenseUrl: 'https://example.com/widevine/license'
|
|
273
|
-
}
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### PlayReady (Windows/Xbox/Smart TVs)
|
|
277
|
-
```typescript
|
|
278
|
-
{
|
|
279
|
-
type: DRMType.PLAYREADY,
|
|
280
|
-
licenseUrl: 'https://example.com/playready/license'
|
|
281
|
-
}
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
## 🧪 Testing
|
|
285
|
-
|
|
286
|
-
```bash
|
|
287
|
-
# Run unit tests
|
|
288
|
-
npm test
|
|
289
|
-
|
|
290
|
-
# Run E2E tests
|
|
291
|
-
npm run test:e2e
|
|
292
|
-
|
|
293
|
-
# Platform-specific tests
|
|
294
|
-
npm run test:ios
|
|
295
|
-
npm run test:android
|
|
296
|
-
npm run test:tizen
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
## 📈 Performance Optimization
|
|
300
|
-
|
|
301
|
-
- **Lazy Loading**: Platform-specific code is loaded on demand
|
|
302
|
-
- **Code Splitting**: Automatic code splitting for web builds
|
|
303
|
-
- **Memory Management**: Automatic cleanup and resource management
|
|
304
|
-
- **Adaptive Bitrate**: Automatic quality adjustment based on network
|
|
305
|
-
|
|
306
|
-
## 💳 Paywall Rentals (Stripe, Pesapal, Google Pay)
|
|
307
|
-
|
|
308
|
-
- For per-video rentals (no subscriptions), follow our step-by-step implementation guide:
|
|
309
|
-
- See PAYWALL_RENTAL_FLOW.md: [PAYWALL_RENTAL_FLOW.md](./PAYWALL_RENTAL_FLOW.md)
|
|
310
|
-
- Documentation index: [docs/](./docs/README.md)
|
|
311
|
-
|
|
312
|
-
## 🤝 Contributing
|
|
313
|
-
|
|
314
|
-
Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct and the process for submitting pull requests.
|
|
315
|
-
|
|
316
|
-
## 📄 License
|
|
317
|
-
|
|
318
|
-
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
11
|
+
---
|
|
319
12
|
|
|
320
|
-
##
|
|
13
|
+
## Why Unified Video Framework?
|
|
321
14
|
|
|
322
|
-
|
|
323
|
-
- **Issues**: [GitHub Issues](https://github.com/flicknexs/unified-video-framework/issues)
|
|
324
|
-
- **Discord**: [Join our Discord](https://discord.gg/example)
|
|
325
|
-
- **Email**: support@example.com
|
|
15
|
+
Most video teams struggle with maintaining **separate players for Web, Mobile **. Flicknexs Unified Video Framework eliminates this complexity by providing **one SDK that works everywhere**.
|
|
326
16
|
|
|
327
|
-
|
|
17
|
+
### ✅ Supported Platforms
|
|
18
|
+
- **Web** (all modern browsers)
|
|
19
|
+
- **iOS & Android** (Native / React Native) (On Progress)
|
|
20
|
+
- **Smart TVs** (Samsung Tizen, LG webOS) (On Progress)
|
|
21
|
+
- **Streaming Devices** (Roku, Android TV, Apple TV) (On Progress)
|
|
328
22
|
|
|
329
|
-
|
|
330
|
-
-
|
|
331
|
-
-
|
|
332
|
-
-
|
|
23
|
+
### ✅ Built for OTT & Streaming Use Cases
|
|
24
|
+
- Video on Demand (VOD)
|
|
25
|
+
- Live Streaming
|
|
26
|
+
- FAST Channels
|
|
27
|
+
- Rentals & Pay-Per-View
|
|
28
|
+
- Subscription platforms
|
|
333
29
|
|
|
334
30
|
---
|
|
335
|
-
|
|
336
|
-
|
|
31
|
+
|
|
32
|
+
### Powered by Flicknexs
|
|
33
|
+
```js
|
|
34
|
+
/**
|
|
35
|
+
* Powered by Flicknexs Unified Video Framework
|
|
36
|
+
* https://flicknexs.com/video-player-sdk
|
|
37
|
+
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unified-video-framework",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.431",
|
|
4
4
|
"description": "Cross-platform video player framework supporting iOS, Android, Web, Smart TVs (Samsung/LG), Roku, and more",
|
|
5
5
|
"main": "packages/core/dist/index.js",
|
|
6
6
|
"types": "packages/core/dist/index.d.ts",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasePlayer.d.ts","sourceRoot":"","sources":["../src/BasePlayer.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,OAAO,EACP,aAAa,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"BasePlayer.d.ts","sourceRoot":"","sources":["../src/BasePlayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from './utils/EventEmitter';
|
|
2
|
+
import { TelemetryManager } from './telemetry/TelemetryManager';
|
|
3
|
+
import { VERSION } from './version';
|
|
2
4
|
export class BasePlayer {
|
|
3
5
|
constructor() {
|
|
4
6
|
this.container = null;
|
|
@@ -53,6 +55,11 @@ export class BasePlayer {
|
|
|
53
55
|
this.config = { ...this.getDefaultConfig(), ...config };
|
|
54
56
|
this.state.volume = this.config.volume || 1.0;
|
|
55
57
|
this.state.isMuted = this.config.muted || false;
|
|
58
|
+
try {
|
|
59
|
+
TelemetryManager.getInstance().initialize('web', VERSION);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
}
|
|
56
63
|
await this.setupPlayer();
|
|
57
64
|
}
|
|
58
65
|
async play() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasePlayer.js","sourceRoot":"","sources":["../src/BasePlayer.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"BasePlayer.js","sourceRoot":"","sources":["../src/BasePlayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlayerFactory.d.ts","sourceRoot":"","sources":["../src/VideoPlayerFactory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,KAAK,GACL,SAAS,GACT,OAAO,GACP,OAAO,GACP,MAAM,GACN,WAAW,GACX,SAAS,GACT,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"VideoPlayerFactory.d.ts","sourceRoot":"","sources":["../src/VideoPlayerFactory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,KAAK,GACL,SAAS,GACT,OAAO,GACP,OAAO,GACP,MAAM,GACN,WAAW,GACX,SAAS,GACT,SAAS,CAAC;AAKd,qBAAa,kBAAkB;WAIhB,MAAM,CACjB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,GAAG,EACrC,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,CAAC;IA8ExB,MAAM,CAAC,cAAc,IAAI,QAAQ;WAkDpB,wBAAwB,CACnC,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,GAAG,EACrC,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,CAAC;CAIzB"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
import { TelemetryManager } from './telemetry/TelemetryManager';
|
|
2
|
+
import { VERSION } from './version';
|
|
1
3
|
export class VideoPlayerFactory {
|
|
2
4
|
static async create(platform, container, config) {
|
|
5
|
+
try {
|
|
6
|
+
TelemetryManager.getInstance().initialize(platform, VERSION);
|
|
7
|
+
}
|
|
8
|
+
catch (telemetryError) {
|
|
9
|
+
console.warn('Telemetry init failed', telemetryError);
|
|
10
|
+
}
|
|
3
11
|
switch (platform) {
|
|
4
12
|
case 'web':
|
|
13
|
+
case 'windows':
|
|
5
14
|
try {
|
|
6
15
|
const WebModule = await eval('import("@unified-video/web")');
|
|
7
16
|
if (WebModule?.WebPlayer) {
|
|
8
17
|
const player = new WebModule.WebPlayer();
|
|
9
18
|
await player.initialize(container, config);
|
|
10
|
-
try {
|
|
11
|
-
const { TelemetryManager } = await import('./telemetry/TelemetryManager');
|
|
12
|
-
const { VERSION } = await import('./index');
|
|
13
|
-
TelemetryManager.getInstance().initialize('web', VERSION);
|
|
14
|
-
}
|
|
15
|
-
catch (telemetryError) {
|
|
16
|
-
}
|
|
17
19
|
return player;
|
|
18
20
|
}
|
|
19
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlayerFactory.js","sourceRoot":"","sources":["../src/VideoPlayerFactory.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,kBAAkB;IAI7B,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,QAAkB,EAClB,SAAqC,EACrC,MAAqB;
|
|
1
|
+
{"version":3,"file":"VideoPlayerFactory.js","sourceRoot":"","sources":["../src/VideoPlayerFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,5 @@ export type { ChapterManagerEvents } from './chapter-manager';
|
|
|
8
8
|
export * as Analytics from './analytics';
|
|
9
9
|
export { TelemetryManager } from './telemetry/TelemetryManager';
|
|
10
10
|
export type { TelemetryData } from './telemetry/TelemetryManager';
|
|
11
|
-
export
|
|
11
|
+
export { VERSION } from './version';
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -5,5 +5,5 @@ export { EventEmitter } from './utils/EventEmitter';
|
|
|
5
5
|
export { ChapterManager } from './chapter-manager';
|
|
6
6
|
export * as Analytics from './analytics';
|
|
7
7
|
export { TelemetryManager } from './telemetry/TelemetryManager';
|
|
8
|
-
export
|
|
8
|
+
export { VERSION } from './version';
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIhE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIhE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -10,6 +10,7 @@ export interface TelemetryData {
|
|
|
10
10
|
export declare class TelemetryManager {
|
|
11
11
|
private static instance;
|
|
12
12
|
private readonly endpoint;
|
|
13
|
+
private initialized;
|
|
13
14
|
private constructor();
|
|
14
15
|
static getInstance(): TelemetryManager;
|
|
15
16
|
initialize(platform: Platform, version: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TelemetryManager.d.ts","sourceRoot":"","sources":["../../src/telemetry/TelemetryManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiD;
|
|
1
|
+
{"version":3,"file":"TelemetryManager.d.ts","sourceRoot":"","sources":["../../src/telemetry/TelemetryManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiD;IAC1E,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAOhC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBpE,OAAO,CAAC,WAAW;YAWL,QAAQ;IAmCtB,IAAI,IAAI,IAAI;CAGf"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export class TelemetryManager {
|
|
2
2
|
constructor() {
|
|
3
3
|
this.endpoint = 'https://videonexs-player.flicknexs.com/ping';
|
|
4
|
+
this.initialized = false;
|
|
4
5
|
}
|
|
5
6
|
static getInstance() {
|
|
6
7
|
if (!TelemetryManager.instance) {
|
|
@@ -9,10 +10,10 @@ export class TelemetryManager {
|
|
|
9
10
|
return TelemetryManager.instance;
|
|
10
11
|
}
|
|
11
12
|
async initialize(platform, version) {
|
|
12
|
-
|
|
13
|
-
if (domain.includes('flicknexs.com')) {
|
|
13
|
+
if (this.initialized)
|
|
14
14
|
return;
|
|
15
|
-
|
|
15
|
+
this.initialized = true;
|
|
16
|
+
console.log(`[Telemetry] Initializing for ${platform} v${version}`);
|
|
16
17
|
const data = this.collectData(platform, version);
|
|
17
18
|
await this.sendPing(data);
|
|
18
19
|
}
|
|
@@ -29,14 +30,9 @@ export class TelemetryManager {
|
|
|
29
30
|
async sendPing(data) {
|
|
30
31
|
try {
|
|
31
32
|
const body = JSON.stringify(data);
|
|
32
|
-
|
|
33
|
-
const blob = new Blob([body], { type: 'application/json' });
|
|
34
|
-
const success = navigator.sendBeacon(this.endpoint, blob);
|
|
35
|
-
if (success)
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
33
|
+
console.log('[Telemetry] Sending ping...', data);
|
|
38
34
|
if (typeof fetch !== 'undefined') {
|
|
39
|
-
await fetch(this.endpoint, {
|
|
35
|
+
const response = await fetch(this.endpoint, {
|
|
40
36
|
method: 'POST',
|
|
41
37
|
mode: 'cors',
|
|
42
38
|
headers: {
|
|
@@ -44,9 +40,21 @@ export class TelemetryManager {
|
|
|
44
40
|
},
|
|
45
41
|
body
|
|
46
42
|
});
|
|
43
|
+
if (response.ok) {
|
|
44
|
+
console.log('[Telemetry] Ping sent successfully');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.warn(`[Telemetry] Ping failed with status: ${response.status}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (typeof navigator !== 'undefined' && navigator.sendBeacon) {
|
|
52
|
+
const blob = new Blob([body], { type: 'application/json' });
|
|
53
|
+
navigator.sendBeacon(this.endpoint, blob);
|
|
47
54
|
}
|
|
48
55
|
}
|
|
49
56
|
catch (e) {
|
|
57
|
+
console.error('[Telemetry] Error sending ping:', e);
|
|
50
58
|
}
|
|
51
59
|
}
|
|
52
60
|
stop() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TelemetryManager.js","sourceRoot":"","sources":["../../src/telemetry/TelemetryManager.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,gBAAgB;
|
|
1
|
+
{"version":3,"file":"TelemetryManager.js","sourceRoot":"","sources":["../../src/telemetry/TelemetryManager.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,gBAAgB;IAKzB;QAHiB,aAAQ,GAAG,6CAA6C,CAAC;QAClE,gBAAW,GAAG,KAAK,CAAC;IAEJ,CAAC;IAEzB,MAAM,CAAC,WAAW;QACd,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;YAC5B,gBAAgB,CAAC,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;SACtD;QACD,OAAO,gBAAgB,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAkB,EAAE,OAAe;QAChD,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAWxB,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAEO,WAAW,CAAC,QAAkB,EAAE,OAAe;QACnD,OAAO;YACH,MAAM,EAAE,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa;YAChF,QAAQ;YACR,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SAChF,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAmB;QACtC,IAAI;YACA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAElC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC;YAGjD,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;gBAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;oBACxC,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACL,cAAc,EAAE,kBAAkB;qBACrC;oBACD,IAAI;iBACP,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE,EAAE;oBACb,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;oBAClD,OAAO;iBACV;qBAAM;oBACH,OAAO,CAAC,IAAI,CAAC,wCAAwC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;iBAC3E;aACJ;YAGD,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,UAAU,EAAE;gBAC1D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC5D,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;aAC7C;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;SACvD;IACL,CAAC;IAED,IAAI;IAEJ,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC"}
|
|
@@ -2,17 +2,19 @@
|
|
|
2
2
|
* Abstract base player class that provides common functionality
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
IVideoPlayer,
|
|
7
|
-
VideoSource,
|
|
8
|
-
PlayerConfig,
|
|
9
|
-
PlayerState,
|
|
5
|
+
import {
|
|
6
|
+
IVideoPlayer,
|
|
7
|
+
VideoSource,
|
|
8
|
+
PlayerConfig,
|
|
9
|
+
PlayerState,
|
|
10
10
|
PlayerError,
|
|
11
11
|
Quality,
|
|
12
|
-
SubtitleTrack
|
|
12
|
+
SubtitleTrack
|
|
13
13
|
} from './interfaces/IVideoPlayer';
|
|
14
14
|
import { PlayerEvent } from './interfaces';
|
|
15
15
|
import { EventEmitter } from './utils/EventEmitter';
|
|
16
|
+
import { TelemetryManager } from './telemetry/TelemetryManager';
|
|
17
|
+
import { VERSION } from './version';
|
|
16
18
|
|
|
17
19
|
export abstract class BasePlayer implements IVideoPlayer {
|
|
18
20
|
protected container: HTMLElement | null = null;
|
|
@@ -76,6 +78,13 @@ export abstract class BasePlayer implements IVideoPlayer {
|
|
|
76
78
|
this.state.volume = this.config.volume || 1.0;
|
|
77
79
|
this.state.isMuted = this.config.muted || false;
|
|
78
80
|
|
|
81
|
+
// Safety net: ensure telemetry is initialized even if factory was bypassed
|
|
82
|
+
try {
|
|
83
|
+
TelemetryManager.getInstance().initialize('web', VERSION);
|
|
84
|
+
} catch (e) {
|
|
85
|
+
// Ignore
|
|
86
|
+
}
|
|
87
|
+
|
|
79
88
|
await this.setupPlayer();
|
|
80
89
|
}
|
|
81
90
|
|
|
@@ -227,7 +236,7 @@ export abstract class BasePlayer implements IVideoPlayer {
|
|
|
227
236
|
this.state.isError = true;
|
|
228
237
|
this.state.isPlaying = false;
|
|
229
238
|
this.emit('onError', error);
|
|
230
|
-
|
|
239
|
+
|
|
231
240
|
if (this.config.debug) {
|
|
232
241
|
console.error('[VideoPlayer Error]', error);
|
|
233
242
|
}
|
|
@@ -15,6 +15,9 @@ export type Platform =
|
|
|
15
15
|
| 'appletv'
|
|
16
16
|
| 'windows';
|
|
17
17
|
|
|
18
|
+
import { TelemetryManager } from './telemetry/TelemetryManager';
|
|
19
|
+
import { VERSION } from './version';
|
|
20
|
+
|
|
18
21
|
export class VideoPlayerFactory {
|
|
19
22
|
/**
|
|
20
23
|
* Create a video player instance for the specified platform
|
|
@@ -27,24 +30,23 @@ export class VideoPlayerFactory {
|
|
|
27
30
|
// Dynamic imports will be resolved at runtime
|
|
28
31
|
// This allows the factory to work even if not all platform packages are installed
|
|
29
32
|
|
|
33
|
+
// Initialize telemetry tracking for all platforms
|
|
34
|
+
try {
|
|
35
|
+
TelemetryManager.getInstance().initialize(platform, VERSION);
|
|
36
|
+
} catch (telemetryError) {
|
|
37
|
+
// Silently fail telemetry to not affect player
|
|
38
|
+
console.warn('Telemetry init failed', telemetryError);
|
|
39
|
+
}
|
|
40
|
+
|
|
30
41
|
switch (platform) {
|
|
31
42
|
case 'web':
|
|
43
|
+
case 'windows': // Fallback windows to web
|
|
32
44
|
// Dynamic imports will be resolved at runtime when the package is available
|
|
33
45
|
try {
|
|
34
46
|
const WebModule = await (eval('import("@unified-video/web")') as Promise<any>);
|
|
35
47
|
if (WebModule?.WebPlayer) {
|
|
36
48
|
const player = new WebModule.WebPlayer();
|
|
37
49
|
await player.initialize(container, config);
|
|
38
|
-
|
|
39
|
-
// Initialize telemetry tracking
|
|
40
|
-
try {
|
|
41
|
-
const { TelemetryManager } = await import('./telemetry/TelemetryManager');
|
|
42
|
-
const { VERSION } = await import('./index');
|
|
43
|
-
TelemetryManager.getInstance().initialize('web', VERSION);
|
|
44
|
-
} catch (telemetryError) {
|
|
45
|
-
// Silently fail telemetry to not affect player
|
|
46
|
-
}
|
|
47
|
-
|
|
48
50
|
return player;
|
|
49
51
|
}
|
|
50
52
|
} catch (e) {
|
|
@@ -16,6 +16,7 @@ export interface TelemetryData {
|
|
|
16
16
|
export class TelemetryManager {
|
|
17
17
|
private static instance: TelemetryManager;
|
|
18
18
|
private readonly endpoint = 'https://videonexs-player.flicknexs.com/ping';
|
|
19
|
+
private initialized = false;
|
|
19
20
|
|
|
20
21
|
private constructor() { }
|
|
21
22
|
|
|
@@ -27,13 +28,19 @@ export class TelemetryManager {
|
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
async initialize(platform: Platform, version: string): Promise<void> {
|
|
30
|
-
|
|
31
|
+
if (this.initialized) return;
|
|
32
|
+
this.initialized = true;
|
|
31
33
|
|
|
32
|
-
//
|
|
34
|
+
// const domain = typeof window !== 'undefined' ? window.location.hostname : 'node-server';
|
|
35
|
+
|
|
36
|
+
// Temporary: disable filter to verify connectivity on ALL domains
|
|
37
|
+
/*
|
|
33
38
|
if (domain.includes('flicknexs.com')) {
|
|
34
39
|
return;
|
|
35
40
|
}
|
|
41
|
+
*/
|
|
36
42
|
|
|
43
|
+
console.log(`[Telemetry] Initializing for ${platform} v${version}`);
|
|
37
44
|
const data = this.collectData(platform, version);
|
|
38
45
|
await this.sendPing(data);
|
|
39
46
|
}
|
|
@@ -53,16 +60,11 @@ export class TelemetryManager {
|
|
|
53
60
|
try {
|
|
54
61
|
const body = JSON.stringify(data);
|
|
55
62
|
|
|
56
|
-
|
|
57
|
-
if (typeof navigator !== 'undefined' && navigator.sendBeacon) {
|
|
58
|
-
const blob = new Blob([body], { type: 'application/json' });
|
|
59
|
-
const success = navigator.sendBeacon(this.endpoint, blob);
|
|
60
|
-
if (success) return;
|
|
61
|
-
}
|
|
63
|
+
console.log('[Telemetry] Sending ping...', data);
|
|
62
64
|
|
|
63
|
-
//
|
|
65
|
+
// Use fetch for reliable delivery during init
|
|
64
66
|
if (typeof fetch !== 'undefined') {
|
|
65
|
-
await fetch(this.endpoint, {
|
|
67
|
+
const response = await fetch(this.endpoint, {
|
|
66
68
|
method: 'POST',
|
|
67
69
|
mode: 'cors',
|
|
68
70
|
headers: {
|
|
@@ -70,9 +72,22 @@ export class TelemetryManager {
|
|
|
70
72
|
},
|
|
71
73
|
body
|
|
72
74
|
});
|
|
75
|
+
|
|
76
|
+
if (response.ok) {
|
|
77
|
+
console.log('[Telemetry] Ping sent successfully');
|
|
78
|
+
return;
|
|
79
|
+
} else {
|
|
80
|
+
console.warn(`[Telemetry] Ping failed with status: ${response.status}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Fallback to sendBeacon if fetch fails or is unavailable
|
|
85
|
+
if (typeof navigator !== 'undefined' && navigator.sendBeacon) {
|
|
86
|
+
const blob = new Blob([body], { type: 'application/json' });
|
|
87
|
+
navigator.sendBeacon(this.endpoint, blob);
|
|
73
88
|
}
|
|
74
89
|
} catch (e) {
|
|
75
|
-
|
|
90
|
+
console.error('[Telemetry] Error sending ping:', e);
|
|
76
91
|
}
|
|
77
92
|
}
|
|
78
93
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const VERSION = '1.4.431';
|