@livepeer-frameworks/player-core 0.1.0 → 0.1.2

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 (294) hide show
  1. package/README.md +11 -9
  2. package/dist/cjs/core/ABRController.js +456 -0
  3. package/dist/cjs/core/ABRController.js.map +1 -0
  4. package/dist/cjs/core/CodecUtils.js +195 -0
  5. package/dist/cjs/core/CodecUtils.js.map +1 -0
  6. package/dist/cjs/core/ErrorClassifier.js +410 -0
  7. package/dist/cjs/core/ErrorClassifier.js.map +1 -0
  8. package/dist/cjs/core/EventEmitter.js +108 -0
  9. package/dist/cjs/core/EventEmitter.js.map +1 -0
  10. package/dist/cjs/core/GatewayClient.js +342 -0
  11. package/dist/cjs/core/GatewayClient.js.map +1 -0
  12. package/dist/cjs/core/InteractionController.js +606 -0
  13. package/dist/cjs/core/InteractionController.js.map +1 -0
  14. package/dist/cjs/core/LiveDurationProxy.js +186 -0
  15. package/dist/cjs/core/LiveDurationProxy.js.map +1 -0
  16. package/dist/cjs/core/MetaTrackManager.js +624 -0
  17. package/dist/cjs/core/MetaTrackManager.js.map +1 -0
  18. package/dist/cjs/core/MistReporter.js +449 -0
  19. package/dist/cjs/core/MistReporter.js.map +1 -0
  20. package/dist/cjs/core/MistSignaling.js +264 -0
  21. package/dist/cjs/core/MistSignaling.js.map +1 -0
  22. package/dist/cjs/core/PlayerController.js +2658 -0
  23. package/dist/cjs/core/PlayerController.js.map +1 -0
  24. package/dist/cjs/core/PlayerInterface.js +269 -0
  25. package/dist/cjs/core/PlayerInterface.js.map +1 -0
  26. package/dist/cjs/core/PlayerManager.js +806 -0
  27. package/dist/cjs/core/PlayerManager.js.map +1 -0
  28. package/dist/cjs/core/PlayerRegistry.js +270 -0
  29. package/dist/cjs/core/PlayerRegistry.js.map +1 -0
  30. package/dist/cjs/core/QualityMonitor.js +474 -0
  31. package/dist/cjs/core/QualityMonitor.js.map +1 -0
  32. package/dist/cjs/core/SeekingUtils.js +292 -0
  33. package/dist/cjs/core/SeekingUtils.js.map +1 -0
  34. package/dist/cjs/core/StreamStateClient.js +381 -0
  35. package/dist/cjs/core/StreamStateClient.js.map +1 -0
  36. package/dist/cjs/core/SubtitleManager.js +227 -0
  37. package/dist/cjs/core/SubtitleManager.js.map +1 -0
  38. package/dist/cjs/core/TelemetryReporter.js +258 -0
  39. package/dist/cjs/core/TelemetryReporter.js.map +1 -0
  40. package/dist/cjs/core/TimeFormat.js +176 -0
  41. package/dist/cjs/core/TimeFormat.js.map +1 -0
  42. package/dist/cjs/core/TimerManager.js +176 -0
  43. package/dist/cjs/core/TimerManager.js.map +1 -0
  44. package/dist/cjs/core/UrlUtils.js +160 -0
  45. package/dist/cjs/core/UrlUtils.js.map +1 -0
  46. package/dist/cjs/core/detector.js +293 -0
  47. package/dist/cjs/core/detector.js.map +1 -0
  48. package/dist/cjs/core/scorer.js +443 -0
  49. package/dist/cjs/core/scorer.js.map +1 -0
  50. package/dist/cjs/index.js +121 -20134
  51. package/dist/cjs/index.js.map +1 -1
  52. package/dist/cjs/lib/utils.js +11 -0
  53. package/dist/cjs/lib/utils.js.map +1 -0
  54. package/dist/cjs/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js +6 -0
  55. package/dist/cjs/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
  56. package/dist/cjs/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js +3042 -0
  57. package/dist/cjs/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  58. package/dist/cjs/players/DashJsPlayer.js +638 -0
  59. package/dist/cjs/players/DashJsPlayer.js.map +1 -0
  60. package/dist/cjs/players/HlsJsPlayer.js +482 -0
  61. package/dist/cjs/players/HlsJsPlayer.js.map +1 -0
  62. package/dist/cjs/players/MewsWsPlayer/SourceBufferManager.js +522 -0
  63. package/dist/cjs/players/MewsWsPlayer/SourceBufferManager.js.map +1 -0
  64. package/dist/cjs/players/MewsWsPlayer/WebSocketManager.js +215 -0
  65. package/dist/cjs/players/MewsWsPlayer/WebSocketManager.js.map +1 -0
  66. package/dist/cjs/players/MewsWsPlayer/index.js +987 -0
  67. package/dist/cjs/players/MewsWsPlayer/index.js.map +1 -0
  68. package/dist/cjs/players/MistPlayer.js +185 -0
  69. package/dist/cjs/players/MistPlayer.js.map +1 -0
  70. package/dist/cjs/players/MistWebRTCPlayer/index.js +635 -0
  71. package/dist/cjs/players/MistWebRTCPlayer/index.js.map +1 -0
  72. package/dist/cjs/players/NativePlayer.js +762 -0
  73. package/dist/cjs/players/NativePlayer.js.map +1 -0
  74. package/dist/cjs/players/VideoJsPlayer.js +585 -0
  75. package/dist/cjs/players/VideoJsPlayer.js.map +1 -0
  76. package/dist/cjs/players/WebCodecsPlayer/JitterBuffer.js +236 -0
  77. package/dist/cjs/players/WebCodecsPlayer/JitterBuffer.js.map +1 -0
  78. package/dist/cjs/players/WebCodecsPlayer/LatencyProfiles.js +143 -0
  79. package/dist/cjs/players/WebCodecsPlayer/LatencyProfiles.js.map +1 -0
  80. package/dist/cjs/players/WebCodecsPlayer/RawChunkParser.js +96 -0
  81. package/dist/cjs/players/WebCodecsPlayer/RawChunkParser.js.map +1 -0
  82. package/dist/cjs/players/WebCodecsPlayer/SyncController.js +359 -0
  83. package/dist/cjs/players/WebCodecsPlayer/SyncController.js.map +1 -0
  84. package/dist/cjs/players/WebCodecsPlayer/WebSocketController.js +460 -0
  85. package/dist/cjs/players/WebCodecsPlayer/WebSocketController.js.map +1 -0
  86. package/dist/cjs/players/WebCodecsPlayer/index.js +1467 -0
  87. package/dist/cjs/players/WebCodecsPlayer/index.js.map +1 -0
  88. package/dist/cjs/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js +320 -0
  89. package/dist/cjs/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js.map +1 -0
  90. package/dist/cjs/styles/index.js +57 -0
  91. package/dist/cjs/styles/index.js.map +1 -0
  92. package/dist/cjs/vanilla/FrameWorksPlayer.js +269 -0
  93. package/dist/cjs/vanilla/FrameWorksPlayer.js.map +1 -0
  94. package/dist/cjs/vanilla.js +11 -0
  95. package/dist/cjs/vanilla.js.map +1 -0
  96. package/dist/esm/core/ABRController.js +454 -0
  97. package/dist/esm/core/ABRController.js.map +1 -0
  98. package/dist/esm/core/CodecUtils.js +193 -0
  99. package/dist/esm/core/CodecUtils.js.map +1 -0
  100. package/dist/esm/core/ErrorClassifier.js +408 -0
  101. package/dist/esm/core/ErrorClassifier.js.map +1 -0
  102. package/dist/esm/core/EventEmitter.js +106 -0
  103. package/dist/esm/core/EventEmitter.js.map +1 -0
  104. package/dist/esm/core/GatewayClient.js +340 -0
  105. package/dist/esm/core/GatewayClient.js.map +1 -0
  106. package/dist/esm/core/InteractionController.js +604 -0
  107. package/dist/esm/core/InteractionController.js.map +1 -0
  108. package/dist/esm/core/LiveDurationProxy.js +184 -0
  109. package/dist/esm/core/LiveDurationProxy.js.map +1 -0
  110. package/dist/esm/core/MetaTrackManager.js +622 -0
  111. package/dist/esm/core/MetaTrackManager.js.map +1 -0
  112. package/dist/esm/core/MistReporter.js +447 -0
  113. package/dist/esm/core/MistReporter.js.map +1 -0
  114. package/dist/esm/core/MistSignaling.js +262 -0
  115. package/dist/esm/core/MistSignaling.js.map +1 -0
  116. package/dist/esm/core/PlayerController.js +2651 -0
  117. package/dist/esm/core/PlayerController.js.map +1 -0
  118. package/dist/esm/core/PlayerInterface.js +267 -0
  119. package/dist/esm/core/PlayerInterface.js.map +1 -0
  120. package/dist/esm/core/PlayerManager.js +804 -0
  121. package/dist/esm/core/PlayerManager.js.map +1 -0
  122. package/dist/esm/core/PlayerRegistry.js +264 -0
  123. package/dist/esm/core/PlayerRegistry.js.map +1 -0
  124. package/dist/esm/core/QualityMonitor.js +471 -0
  125. package/dist/esm/core/QualityMonitor.js.map +1 -0
  126. package/dist/esm/core/SeekingUtils.js +280 -0
  127. package/dist/esm/core/SeekingUtils.js.map +1 -0
  128. package/dist/esm/core/StreamStateClient.js +379 -0
  129. package/dist/esm/core/StreamStateClient.js.map +1 -0
  130. package/dist/esm/core/SubtitleManager.js +225 -0
  131. package/dist/esm/core/SubtitleManager.js.map +1 -0
  132. package/dist/esm/core/TelemetryReporter.js +256 -0
  133. package/dist/esm/core/TelemetryReporter.js.map +1 -0
  134. package/dist/esm/core/TimeFormat.js +169 -0
  135. package/dist/esm/core/TimeFormat.js.map +1 -0
  136. package/dist/esm/core/TimerManager.js +174 -0
  137. package/dist/esm/core/TimerManager.js.map +1 -0
  138. package/dist/esm/core/UrlUtils.js +151 -0
  139. package/dist/esm/core/UrlUtils.js.map +1 -0
  140. package/dist/esm/core/detector.js +279 -0
  141. package/dist/esm/core/detector.js.map +1 -0
  142. package/dist/esm/core/scorer.js +422 -0
  143. package/dist/esm/core/scorer.js.map +1 -0
  144. package/dist/esm/index.js +26 -20043
  145. package/dist/esm/index.js.map +1 -1
  146. package/dist/esm/lib/utils.js +9 -0
  147. package/dist/esm/lib/utils.js.map +1 -0
  148. package/dist/esm/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js +4 -0
  149. package/dist/esm/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
  150. package/dist/esm/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js +3036 -0
  151. package/dist/esm/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  152. package/dist/esm/players/DashJsPlayer.js +636 -0
  153. package/dist/esm/players/DashJsPlayer.js.map +1 -0
  154. package/dist/esm/players/HlsJsPlayer.js +480 -0
  155. package/dist/esm/players/HlsJsPlayer.js.map +1 -0
  156. package/dist/esm/players/MewsWsPlayer/SourceBufferManager.js +520 -0
  157. package/dist/esm/players/MewsWsPlayer/SourceBufferManager.js.map +1 -0
  158. package/dist/esm/players/MewsWsPlayer/WebSocketManager.js +213 -0
  159. package/dist/esm/players/MewsWsPlayer/WebSocketManager.js.map +1 -0
  160. package/dist/esm/players/MewsWsPlayer/index.js +985 -0
  161. package/dist/esm/players/MewsWsPlayer/index.js.map +1 -0
  162. package/dist/esm/players/MistPlayer.js +183 -0
  163. package/dist/esm/players/MistPlayer.js.map +1 -0
  164. package/dist/esm/players/MistWebRTCPlayer/index.js +633 -0
  165. package/dist/esm/players/MistWebRTCPlayer/index.js.map +1 -0
  166. package/dist/esm/players/NativePlayer.js +759 -0
  167. package/dist/esm/players/NativePlayer.js.map +1 -0
  168. package/dist/esm/players/VideoJsPlayer.js +583 -0
  169. package/dist/esm/players/VideoJsPlayer.js.map +1 -0
  170. package/dist/esm/players/WebCodecsPlayer/JitterBuffer.js +233 -0
  171. package/dist/esm/players/WebCodecsPlayer/JitterBuffer.js.map +1 -0
  172. package/dist/esm/players/WebCodecsPlayer/LatencyProfiles.js +134 -0
  173. package/dist/esm/players/WebCodecsPlayer/LatencyProfiles.js.map +1 -0
  174. package/dist/esm/players/WebCodecsPlayer/RawChunkParser.js +91 -0
  175. package/dist/esm/players/WebCodecsPlayer/RawChunkParser.js.map +1 -0
  176. package/dist/esm/players/WebCodecsPlayer/SyncController.js +357 -0
  177. package/dist/esm/players/WebCodecsPlayer/SyncController.js.map +1 -0
  178. package/dist/esm/players/WebCodecsPlayer/WebSocketController.js +458 -0
  179. package/dist/esm/players/WebCodecsPlayer/WebSocketController.js.map +1 -0
  180. package/dist/esm/players/WebCodecsPlayer/index.js +1458 -0
  181. package/dist/esm/players/WebCodecsPlayer/index.js.map +1 -0
  182. package/dist/esm/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js +315 -0
  183. package/dist/esm/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js.map +1 -0
  184. package/dist/esm/styles/index.js +54 -0
  185. package/dist/esm/styles/index.js.map +1 -0
  186. package/dist/esm/vanilla/FrameWorksPlayer.js +264 -0
  187. package/dist/esm/vanilla/FrameWorksPlayer.js.map +1 -0
  188. package/dist/esm/vanilla.js +2 -0
  189. package/dist/esm/vanilla.js.map +1 -0
  190. package/dist/player.css +185 -42
  191. package/dist/types/core/ABRController.d.ts +4 -4
  192. package/dist/types/core/CodecUtils.d.ts +1 -1
  193. package/dist/types/core/ErrorClassifier.d.ts +77 -0
  194. package/dist/types/core/GatewayClient.d.ts +4 -4
  195. package/dist/types/core/MetaTrackManager.d.ts +2 -2
  196. package/dist/types/core/MistReporter.d.ts +3 -3
  197. package/dist/types/core/MistSignaling.d.ts +12 -12
  198. package/dist/types/core/PlayerController.d.ts +19 -14
  199. package/dist/types/core/PlayerInterface.d.ts +100 -2
  200. package/dist/types/core/PlayerManager.d.ts +36 -9
  201. package/dist/types/core/PlayerRegistry.d.ts +11 -11
  202. package/dist/types/core/QualityMonitor.d.ts +2 -2
  203. package/dist/types/core/SeekingUtils.d.ts +2 -2
  204. package/dist/types/core/StreamStateClient.d.ts +2 -2
  205. package/dist/types/core/TelemetryReporter.d.ts +1 -1
  206. package/dist/types/core/TimerManager.d.ts +1 -1
  207. package/dist/types/core/detector.d.ts +1 -1
  208. package/dist/types/core/index.d.ts +44 -44
  209. package/dist/types/core/scorer.d.ts +1 -1
  210. package/dist/types/core/selector.d.ts +2 -2
  211. package/dist/types/index.d.ts +35 -34
  212. package/dist/types/players/DashJsPlayer.d.ts +3 -3
  213. package/dist/types/players/HlsJsPlayer.d.ts +3 -3
  214. package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +1 -1
  215. package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +1 -1
  216. package/dist/types/players/MewsWsPlayer/index.d.ts +2 -2
  217. package/dist/types/players/MewsWsPlayer/types.d.ts +15 -15
  218. package/dist/types/players/MistPlayer.d.ts +2 -2
  219. package/dist/types/players/MistWebRTCPlayer/index.d.ts +3 -3
  220. package/dist/types/players/NativePlayer.d.ts +3 -3
  221. package/dist/types/players/VideoJsPlayer.d.ts +3 -3
  222. package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +3 -3
  223. package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +1 -1
  224. package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +2 -2
  225. package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +2 -2
  226. package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +3 -3
  227. package/dist/types/players/WebCodecsPlayer/index.d.ts +9 -9
  228. package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +1 -1
  229. package/dist/types/players/WebCodecsPlayer/types.d.ts +49 -49
  230. package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +31 -31
  231. package/dist/types/players/index.d.ts +5 -8
  232. package/dist/types/types.d.ts +15 -15
  233. package/dist/types/vanilla/FrameWorksPlayer.d.ts +2 -2
  234. package/dist/types/vanilla/index.d.ts +4 -4
  235. package/dist/workers/decoder.worker.js +129 -122
  236. package/dist/workers/decoder.worker.js.map +1 -1
  237. package/package.json +31 -15
  238. package/src/core/ABRController.ts +38 -36
  239. package/src/core/CodecUtils.ts +49 -46
  240. package/src/core/Disposable.ts +4 -4
  241. package/src/core/ErrorClassifier.ts +499 -0
  242. package/src/core/EventEmitter.ts +1 -1
  243. package/src/core/GatewayClient.ts +41 -39
  244. package/src/core/InteractionController.ts +89 -82
  245. package/src/core/LiveDurationProxy.ts +14 -15
  246. package/src/core/MetaTrackManager.ts +73 -65
  247. package/src/core/MistReporter.ts +72 -45
  248. package/src/core/MistSignaling.ts +59 -56
  249. package/src/core/PlayerController.ts +542 -384
  250. package/src/core/PlayerInterface.ts +192 -59
  251. package/src/core/PlayerManager.ts +354 -164
  252. package/src/core/PlayerRegistry.ts +238 -87
  253. package/src/core/QualityMonitor.ts +38 -31
  254. package/src/core/ScreenWakeLockManager.ts +8 -9
  255. package/src/core/SeekingUtils.ts +31 -22
  256. package/src/core/StreamStateClient.ts +74 -68
  257. package/src/core/SubtitleManager.ts +24 -22
  258. package/src/core/TelemetryReporter.ts +38 -32
  259. package/src/core/TimeFormat.ts +13 -17
  260. package/src/core/TimerManager.ts +24 -8
  261. package/src/core/UrlUtils.ts +20 -17
  262. package/src/core/detector.ts +44 -44
  263. package/src/core/index.ts +57 -48
  264. package/src/core/scorer.ts +136 -141
  265. package/src/core/selector.ts +2 -6
  266. package/src/global.d.ts +1 -1
  267. package/src/index.ts +56 -36
  268. package/src/players/DashJsPlayer.ts +164 -115
  269. package/src/players/HlsJsPlayer.ts +132 -78
  270. package/src/players/MewsWsPlayer/SourceBufferManager.ts +41 -36
  271. package/src/players/MewsWsPlayer/WebSocketManager.ts +9 -9
  272. package/src/players/MewsWsPlayer/index.ts +192 -152
  273. package/src/players/MewsWsPlayer/types.ts +21 -21
  274. package/src/players/MistPlayer.ts +45 -26
  275. package/src/players/MistWebRTCPlayer/index.ts +175 -129
  276. package/src/players/NativePlayer.ts +203 -143
  277. package/src/players/VideoJsPlayer.ts +170 -118
  278. package/src/players/WebCodecsPlayer/JitterBuffer.ts +6 -7
  279. package/src/players/WebCodecsPlayer/LatencyProfiles.ts +43 -43
  280. package/src/players/WebCodecsPlayer/RawChunkParser.ts +10 -10
  281. package/src/players/WebCodecsPlayer/SyncController.ts +45 -53
  282. package/src/players/WebCodecsPlayer/WebSocketController.ts +66 -68
  283. package/src/players/WebCodecsPlayer/index.ts +265 -223
  284. package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +12 -17
  285. package/src/players/WebCodecsPlayer/types.ts +56 -56
  286. package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +238 -182
  287. package/src/players/WebCodecsPlayer/worker/types.ts +31 -31
  288. package/src/players/index.ts +5 -16
  289. package/src/styles/animations.css +2 -1
  290. package/src/styles/player.css +185 -42
  291. package/src/styles/tailwind.css +473 -159
  292. package/src/types.ts +43 -43
  293. package/src/vanilla/FrameWorksPlayer.ts +26 -14
  294. package/src/vanilla/index.ts +4 -4
@@ -0,0 +1,215 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * WebSocket Manager for MEWS Player
5
+ *
6
+ * Handles WebSocket connection, reconnection with exponential backoff,
7
+ * message sending, and typed message listeners.
8
+ *
9
+ * Ported from reference: mews.js:387-883
10
+ */
11
+ class WebSocketManager {
12
+ constructor(options) {
13
+ this.ws = null;
14
+ this.reconnectAttempts = 0;
15
+ this.reconnectTimer = null;
16
+ this.wasConnected = false;
17
+ this.isDestroyed = false;
18
+ // Track pending retry timers so they can be cancelled on destroy
19
+ this.pendingRetryTimers = new Set();
20
+ // Message listener registry (ported from mews.js:440-451)
21
+ // Allows multiple listeners per message type for proper seek/play sequencing
22
+ this.listeners = {};
23
+ this.url = options.url;
24
+ this.maxReconnectAttempts = options.maxReconnectAttempts ?? 5;
25
+ this.onMessage = options.onMessage;
26
+ this.onOpen = options.onOpen;
27
+ this.onClose = options.onClose;
28
+ this.onError = options.onError;
29
+ }
30
+ connect() {
31
+ if (this.isDestroyed)
32
+ return;
33
+ // Protocol mismatch check (non-fatal warning)
34
+ try {
35
+ const pageProto = window.location.protocol.replace(/^http/, "ws");
36
+ const srcProto = new URL(this.url, window.location.href).protocol;
37
+ if (pageProto !== srcProto) {
38
+ this.onError(`Protocol mismatch ${pageProto} vs ${srcProto}`);
39
+ }
40
+ }
41
+ catch { }
42
+ const ws = new WebSocket(this.url);
43
+ ws.binaryType = "arraybuffer";
44
+ this.ws = ws;
45
+ ws.onopen = () => {
46
+ this.wasConnected = true;
47
+ this.reconnectAttempts = 0;
48
+ this.clearReconnectTimer();
49
+ this.onOpen();
50
+ };
51
+ ws.onmessage = (e) => {
52
+ this.onMessage(e.data);
53
+ };
54
+ ws.onerror = () => {
55
+ this.onError("WebSocket error");
56
+ };
57
+ ws.onclose = () => {
58
+ if (this.isDestroyed)
59
+ return;
60
+ if (this.wasConnected && this.reconnectAttempts < this.maxReconnectAttempts) {
61
+ const backoff = Math.min(5000, 500 * Math.pow(2, this.reconnectAttempts));
62
+ this.reconnectAttempts++;
63
+ this.reconnectTimer = setTimeout(() => {
64
+ if (!this.isDestroyed) {
65
+ this.connect();
66
+ }
67
+ }, backoff);
68
+ }
69
+ else {
70
+ this.onClose();
71
+ this.onError("WebSocket closed");
72
+ }
73
+ };
74
+ }
75
+ /**
76
+ * Send a command with retry logic (3.3.6).
77
+ * If not connected, will retry up to 5 times with 500ms delay.
78
+ * If connection is closing/closed, will attempt reconnect then retry.
79
+ */
80
+ send(cmd, retry = 0) {
81
+ const MAX_RETRIES = 5;
82
+ const RETRY_DELAY = 500;
83
+ // Early exit if destroyed - don't schedule any retries
84
+ if (this.isDestroyed)
85
+ return false;
86
+ if (retry > MAX_RETRIES) {
87
+ this.onError("Too many send retries");
88
+ return false;
89
+ }
90
+ const scheduleRetry = (delay) => {
91
+ const timer = setTimeout(() => {
92
+ this.pendingRetryTimers.delete(timer);
93
+ if (!this.isDestroyed) {
94
+ this.send(cmd, retry + 1);
95
+ }
96
+ }, delay);
97
+ this.pendingRetryTimers.add(timer);
98
+ };
99
+ if (!this.ws) {
100
+ // No socket at all, try to connect and retry
101
+ if (!this.isDestroyed && retry < MAX_RETRIES) {
102
+ scheduleRetry(RETRY_DELAY);
103
+ }
104
+ return false;
105
+ }
106
+ if (this.ws.readyState < WebSocket.OPEN) {
107
+ // Still connecting, wait and retry (if not destroyed)
108
+ if (!this.isDestroyed && retry < MAX_RETRIES) {
109
+ scheduleRetry(RETRY_DELAY);
110
+ }
111
+ return false;
112
+ }
113
+ if (this.ws.readyState >= WebSocket.CLOSING) {
114
+ // Closing or closed, trigger reconnect and retry
115
+ if (!this.isDestroyed && retry < MAX_RETRIES) {
116
+ this.connect();
117
+ scheduleRetry(RETRY_DELAY * 2);
118
+ }
119
+ return false;
120
+ }
121
+ try {
122
+ this.ws.send(JSON.stringify(cmd));
123
+ return true;
124
+ }
125
+ catch {
126
+ return false;
127
+ }
128
+ }
129
+ clearReconnectTimer() {
130
+ if (this.reconnectTimer) {
131
+ clearTimeout(this.reconnectTimer);
132
+ this.reconnectTimer = null;
133
+ }
134
+ }
135
+ destroy() {
136
+ console.debug("[WebSocketManager] destroy() called");
137
+ this.isDestroyed = true;
138
+ this.clearReconnectTimer();
139
+ // Cancel ALL pending retry timers to prevent any scheduled sends
140
+ for (const timer of this.pendingRetryTimers) {
141
+ clearTimeout(timer);
142
+ }
143
+ this.pendingRetryTimers.clear();
144
+ // Clear all listeners to prevent memory leaks
145
+ this.listeners = {};
146
+ if (this.ws) {
147
+ try {
148
+ this.ws.close();
149
+ }
150
+ catch { }
151
+ this.ws = null;
152
+ }
153
+ console.debug("[WebSocketManager] destroy() completed");
154
+ }
155
+ isConnected() {
156
+ return this.ws?.readyState === WebSocket.OPEN;
157
+ }
158
+ /**
159
+ * Add a listener for a specific message type.
160
+ * Ported from mews.js:441-444
161
+ *
162
+ * @param type - Message type to listen for (e.g., 'on_time', 'codec_data', 'seek')
163
+ * @param callback - Function to call when message is received
164
+ */
165
+ addListener(type, callback) {
166
+ if (!(type in this.listeners)) {
167
+ this.listeners[type] = [];
168
+ }
169
+ this.listeners[type].push(callback);
170
+ }
171
+ /**
172
+ * Remove a listener for a specific message type.
173
+ * Ported from mews.js:445-450
174
+ *
175
+ * @param type - Message type
176
+ * @param callback - The exact callback function to remove
177
+ * @returns true if listener was found and removed
178
+ */
179
+ removeListener(type, callback) {
180
+ if (!(type in this.listeners)) {
181
+ return false;
182
+ }
183
+ const index = this.listeners[type].indexOf(callback);
184
+ if (index < 0) {
185
+ return false;
186
+ }
187
+ this.listeners[type].splice(index, 1);
188
+ return true;
189
+ }
190
+ /**
191
+ * Notify all listeners for a given message type.
192
+ * Called internally when a JSON message is received.
193
+ * Ported from mews.js:795-799
194
+ *
195
+ * @param msg - Parsed message object
196
+ */
197
+ notifyListeners(msg) {
198
+ if (msg.type in this.listeners) {
199
+ // Iterate backwards in case listeners remove themselves
200
+ const callbacks = this.listeners[msg.type];
201
+ for (let i = callbacks.length - 1; i >= 0; i--) {
202
+ try {
203
+ callbacks[i](msg);
204
+ }
205
+ catch (e) {
206
+ // Don't let one listener crash others
207
+ console.error("MEWS listener error:", e);
208
+ }
209
+ }
210
+ }
211
+ }
212
+ }
213
+
214
+ exports.WebSocketManager = WebSocketManager;
215
+ //# sourceMappingURL=WebSocketManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketManager.js","sources":["../../../../../src/players/MewsWsPlayer/WebSocketManager.ts"],"sourcesContent":["/**\n * WebSocket Manager for MEWS Player\n *\n * Handles WebSocket connection, reconnection with exponential backoff,\n * message sending, and typed message listeners.\n *\n * Ported from reference: mews.js:387-883\n */\n\nimport type { WebSocketManagerOptions, MewsMessage, MewsMessageListener } from \"./types\";\n\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private url: string;\n private maxReconnectAttempts: number;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private wasConnected = false;\n private isDestroyed = false;\n\n // Track pending retry timers so they can be cancelled on destroy\n private pendingRetryTimers: Set<ReturnType<typeof setTimeout>> = new Set();\n\n // Message listener registry (ported from mews.js:440-451)\n // Allows multiple listeners per message type for proper seek/play sequencing\n private listeners: Record<string, MewsMessageListener[]> = {};\n\n private onMessage: (data: ArrayBuffer | string) => void;\n private onOpen: () => void;\n private onClose: () => void;\n private onError: (message: string) => void;\n\n constructor(options: WebSocketManagerOptions) {\n this.url = options.url;\n this.maxReconnectAttempts = options.maxReconnectAttempts ?? 5;\n this.onMessage = options.onMessage;\n this.onOpen = options.onOpen;\n this.onClose = options.onClose;\n this.onError = options.onError;\n }\n\n connect(): void {\n if (this.isDestroyed) return;\n\n // Protocol mismatch check (non-fatal warning)\n try {\n const pageProto = window.location.protocol.replace(/^http/, \"ws\");\n const srcProto = new URL(this.url, window.location.href).protocol;\n if (pageProto !== srcProto) {\n this.onError(`Protocol mismatch ${pageProto} vs ${srcProto}`);\n }\n } catch {}\n\n const ws = new WebSocket(this.url);\n ws.binaryType = \"arraybuffer\";\n this.ws = ws;\n\n ws.onopen = () => {\n this.wasConnected = true;\n this.reconnectAttempts = 0;\n this.clearReconnectTimer();\n this.onOpen();\n };\n\n ws.onmessage = (e: MessageEvent<ArrayBuffer | string>) => {\n this.onMessage(e.data);\n };\n\n ws.onerror = () => {\n this.onError(\"WebSocket error\");\n };\n\n ws.onclose = () => {\n if (this.isDestroyed) return;\n\n if (this.wasConnected && this.reconnectAttempts < this.maxReconnectAttempts) {\n const backoff = Math.min(5000, 500 * Math.pow(2, this.reconnectAttempts));\n this.reconnectAttempts++;\n this.reconnectTimer = setTimeout(() => {\n if (!this.isDestroyed) {\n this.connect();\n }\n }, backoff);\n } else {\n this.onClose();\n this.onError(\"WebSocket closed\");\n }\n };\n }\n\n /**\n * Send a command with retry logic (3.3.6).\n * If not connected, will retry up to 5 times with 500ms delay.\n * If connection is closing/closed, will attempt reconnect then retry.\n */\n send(cmd: object, retry = 0): boolean {\n const MAX_RETRIES = 5;\n const RETRY_DELAY = 500;\n\n // Early exit if destroyed - don't schedule any retries\n if (this.isDestroyed) return false;\n\n if (retry > MAX_RETRIES) {\n this.onError(\"Too many send retries\");\n return false;\n }\n\n const scheduleRetry = (delay: number) => {\n const timer = setTimeout(() => {\n this.pendingRetryTimers.delete(timer);\n if (!this.isDestroyed) {\n this.send(cmd, retry + 1);\n }\n }, delay);\n this.pendingRetryTimers.add(timer);\n };\n\n if (!this.ws) {\n // No socket at all, try to connect and retry\n if (!this.isDestroyed && retry < MAX_RETRIES) {\n scheduleRetry(RETRY_DELAY);\n }\n return false;\n }\n\n if (this.ws.readyState < WebSocket.OPEN) {\n // Still connecting, wait and retry (if not destroyed)\n if (!this.isDestroyed && retry < MAX_RETRIES) {\n scheduleRetry(RETRY_DELAY);\n }\n return false;\n }\n\n if (this.ws.readyState >= WebSocket.CLOSING) {\n // Closing or closed, trigger reconnect and retry\n if (!this.isDestroyed && retry < MAX_RETRIES) {\n this.connect();\n scheduleRetry(RETRY_DELAY * 2);\n }\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(cmd));\n return true;\n } catch {\n return false;\n }\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n destroy(): void {\n console.debug(\"[WebSocketManager] destroy() called\");\n this.isDestroyed = true;\n this.clearReconnectTimer();\n\n // Cancel ALL pending retry timers to prevent any scheduled sends\n for (const timer of this.pendingRetryTimers) {\n clearTimeout(timer);\n }\n this.pendingRetryTimers.clear();\n\n // Clear all listeners to prevent memory leaks\n this.listeners = {};\n\n if (this.ws) {\n try {\n this.ws.close();\n } catch {}\n this.ws = null;\n }\n console.debug(\"[WebSocketManager] destroy() completed\");\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Add a listener for a specific message type.\n * Ported from mews.js:441-444\n *\n * @param type - Message type to listen for (e.g., 'on_time', 'codec_data', 'seek')\n * @param callback - Function to call when message is received\n */\n addListener(type: string, callback: MewsMessageListener): void {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n this.listeners[type].push(callback);\n }\n\n /**\n * Remove a listener for a specific message type.\n * Ported from mews.js:445-450\n *\n * @param type - Message type\n * @param callback - The exact callback function to remove\n * @returns true if listener was found and removed\n */\n removeListener(type: string, callback: MewsMessageListener): boolean {\n if (!(type in this.listeners)) {\n return false;\n }\n const index = this.listeners[type].indexOf(callback);\n if (index < 0) {\n return false;\n }\n this.listeners[type].splice(index, 1);\n return true;\n }\n\n /**\n * Notify all listeners for a given message type.\n * Called internally when a JSON message is received.\n * Ported from mews.js:795-799\n *\n * @param msg - Parsed message object\n */\n notifyListeners(msg: MewsMessage): void {\n if (msg.type in this.listeners) {\n // Iterate backwards in case listeners remove themselves\n const callbacks = this.listeners[msg.type];\n for (let i = callbacks.length - 1; i >= 0; i--) {\n try {\n callbacks[i](msg);\n } catch (e) {\n // Don't let one listener crash others\n console.error(\"MEWS listener error:\", e);\n }\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}