@oddin-gg/havik-player 2.16.3 → 2.16.5

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/docs/API.md CHANGED
@@ -1115,6 +1115,18 @@ play DRM. The built-in error card still offers Retry (it re-resolves and re-atta
1115
1115
  which can recover a transient license failure); an unsupported device will simply fail
1116
1116
  the same way again.
1117
1117
 
1118
+ One license `403` is handled before it reaches you: when the signed license URL the
1119
+ player holds carries an `exp` that has already passed. The `licenseRefreshMs` timer
1120
+ could not run because the tab was hidden long enough for the browser to freeze it, or
1121
+ the machine slept, so the next license request after refocus goes out with a stale
1122
+ signature and the server rejects it. That is the signature's lifetime, not an
1123
+ entitlement decision, so the player re-resolves and re-attaches once on its own (the
1124
+ same path as Retry), emitting the `FORBIDDEN` error as a `warning` instead of ending
1125
+ the session. A second `403` before a key is usable on the fresh URL is fatal as usual.
1126
+ The check is made on the viewer's clock and covers Widevine (hls.js) only: a device
1127
+ clock more than ~10 minutes slow still sees the plain fatal `FORBIDDEN`, and FairPlay
1128
+ (Safari) keeps its existing fatal path.
1129
+
1118
1130
  ```ts
1119
1131
  import { PlaybackError } from '@oddin-gg/havik-player';
1120
1132
  try {
package/embed/index.html CHANGED
@@ -28,7 +28,7 @@
28
28
  beacons endpoint can be derived and QoE analytics is silently off.
29
29
  `analytics` is honoured from the injected config only, never the query.
30
30
  -->
31
- <script src="https://cdn.jsdelivr.net/npm/@oddin-gg/havik-player@2.16.3/dist/havik-player.global.js" integrity="sha384-W2+heG4rUFFDjEtZhecaS++NHDHR5NyWUPv37LZdD9aWIEbyRiYFoUAqMjBIKJcV" crossorigin="anonymous"></script>
31
+ <script src="https://cdn.jsdelivr.net/npm/@oddin-gg/havik-player@2.16.5/dist/havik-player.global.js" integrity="sha384-SRvsbTOrE/wt0jWSx8K2zJPfMs/b/gAlXVXO1Sp9pCBtvYq8SZODzx54ZbCUrZdq" crossorigin="anonymous"></script>
32
32
  <script>
33
33
  HavikPlayer.bootEmbed();
34
34
  </script>
@@ -12,7 +12,7 @@
12
12
  shipped in each npm release is pinned to that release with Subresource
13
13
  Integrity, injected at publish time (scripts/inject-sri.mjs). In
14
14
  production, always use a pinned + SRI'd tag like the released copy. -->
15
- <script src="https://cdn.jsdelivr.net/npm/@oddin-gg/havik-player@2.16.3/dist/havik-player.global.js" integrity="sha384-W2+heG4rUFFDjEtZhecaS++NHDHR5NyWUPv37LZdD9aWIEbyRiYFoUAqMjBIKJcV" crossorigin="anonymous"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/@oddin-gg/havik-player@2.16.5/dist/havik-player.global.js" integrity="sha384-SRvsbTOrE/wt0jWSx8K2zJPfMs/b/gAlXVXO1Sp9pCBtvYq8SZODzx54ZbCUrZdq" crossorigin="anonymous"></script>
16
16
  <script>
17
17
  (async () => {
18
18
  const player = await HavikPlayer.createPlayer({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oddin-gg/havik-player",
3
- "version": "2.16.3",
3
+ "version": "2.16.5",
4
4
  "description": "Havik HTML5 player SDK — LL-HLS + DRM playback for Oddin live streams (managed, bring-your-own-player, and iframe-embed modes).",
5
5
  "type": "module",
6
6
  "sideEffects": false,