@dolby-optiview/ads-sdk 1.1.0 → 1.1.1
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/ai/reference/error-codes.md +10 -1
- package/ai/reference/knowledge-base.md +127 -12
- package/package.json +3 -3
|
@@ -25,6 +25,8 @@ of the public contract and are never renamed.
|
|
|
25
25
|
| `DA-ANVATO-CUE-OBSERVED` | break | info | ptsSource: 'anvatoCue' — an Anvato break-signaling (type=cue) frame was observed in the stream; context carries the cue's pts, the media time it landed at, whether the tracker recorded it, and the raw payload — so a manifest-PTS vs in-stream-PTS misalignment is observable in the field. |
|
|
26
26
|
| `DA-ANVATO-CUE-SEGMENT-ANCHORED` | break | warn | ptsSource: 'anvatoCue' — an Anvato emsg cue arrived without a ptsOffset from the adapter, so its break is scheduled at the cue's carrying segment start, which can be up to one segment early. Emitted once per session; context: pts, mediaTime. |
|
|
27
27
|
| `DA-ANVATO-CUE-OFFSET-REJECTED` | break | warn | ptsSource: 'anvatoCue' — the adapter's ptsOffset placed an Anvato cue outside its carrying segment's window (more than 0.1s before or 15s after the cue startTime), so the cue's startTime is used instead. Emitted once per cue pts; context: pts, startTime, ptsOffset, mappedTime. |
|
|
28
|
+
| `DA-ANVATO-CUE-END-MATCHED` | break | info | ptsSource: 'anvatoCue' — the active break's Anvato type=cue_end was observed and its length on the stream clock (cue_end pts minus the break start pts) is within 2s of the break duration. Emitted once per break; context: breakId, mediaTime (where the player reported the cue_end), lengthSec, durationSec. |
|
|
29
|
+
| `DA-ANVATO-CUE-END-REJECTED` | break | warn | ptsSource: 'anvatoCue' — an Anvato type=cue_end was observed for the active break but its stream-clock length differs from the break duration by more than 2s, so it is ignored and the resume keeps its computed target. Emitted once per break; context: breakId, mediaTime, lengthSec, durationSec. |
|
|
28
30
|
| `DA-PRELOAD-FAILED` | preload | warn | Ad preload failed; the asset will be loaded on demand at break start. |
|
|
29
31
|
| `DA-PRELOAD-MODE-RESOLVED` | preload | info | The configured ad preload mode was resolved for this session; context carries both the configured and the resolved mode. |
|
|
30
32
|
| `DA-PRELOAD-PATH` | preload | info | The preload path actually taken for a break's ad (parallel buffer / detached prefetch / none) and the creative container (stream vs progressive). |
|
|
@@ -103,8 +105,15 @@ of the public contract and are never renamed.
|
|
|
103
105
|
| `DA-LIVE-START-PUSHBACK-LANDED` | playback | info | Measured initial-live seek landing. Context includes the requested target and targetDurationSec, landed, errorSec, liveEdgeAtLanding, landedOffsetSec and landedOffsetTargetDurations. A timeout or failed seek reports landed=null, never an inferred success. |
|
|
104
106
|
| `DA-RESUME-SEEK` | playback | info | Content was resume-seeked to the resolved post-break position (insertion type policy). |
|
|
105
107
|
| `DA-RESUME-UNADDRESSABLE` | playback | warn | A break played through the content player (picture-in-picture), so content came back on a reloaded source whose timeline has its own origin, and that source published neither a program-date-time nor a seekable range to re-address the resume point against. Content stays where the reload left it — near the live edge — rather than being seeked to a position that does not exist on the new timeline. Context carries breakId, target (the position on the pre-borrow timeline) and offset. |
|
|
106
|
-
| `DA-RESUME-LANDED` | playback | info | Where the post-break resume-seek actually landed, measured on the seeked event rather than inferred: context carries breakId, target (the position requested), landed and errorSec (landed - target; negative means the player settled EARLIER than asked). landed is null with a reason when no seeked event arrived, which is normal for a seek to the position the playhead already holds. Report-only: the SDK does not correct the position. |
|
|
108
|
+
| `DA-RESUME-LANDED` | playback | info | Where the post-break resume-seek actually landed, measured on the seeked event rather than inferred: context carries breakId, target (the position requested), landed and errorSec (landed - target; negative means the player settled EARLIER than asked). errorSec only says whether the SEEK did what it was asked: when the live-window clamp moved the seek, policyTarget is the resume point before the clamp and policyErrorSec (landed - policyTarget) is how far the viewer really is from it. landed is null with a reason when no seeked event arrived, which is normal for a seek to the position the playhead already holds. Report-only: the SDK does not correct the position. |
|
|
109
|
+
| `DA-RESUME-PREPARED` | playback | info | Android, live break that resumes at its end — the paused content was parked exactly on the resume point before the hand-back, so the hand-back only plays (DA-RESUME-SEEK then reports prepared=true and issues no seek). Context carries breakId, target, source (cue_end when the stream's matched type=cue_end was known, else cue+duration) leadMs (how long before the expected hand-back it was parked) and refresh (true when content parked long before the hand-back was seeked onto the same point again, 4.5s before it). A later cue_end parks content again. |
|
|
107
110
|
| `DA-RESUME-PREPOSITIONED` | playback | info | The break resumed without a seek: content was moved onto its resume position DURING the break, so the transition needed no jump. Context carries breakId, target, prepositionedTo, landed, shortfallSec and exact. exact=true means it reached the policy target. exact=false means the live window never published those frames, so content was moved as close as exists — the viewer lands short, but arrives already in place rather than via a visible seek at the cut. |
|
|
111
|
+
| `DA-RESUME-PTS-MAP` | playback | info | ptsSource: 'anvatoCue', iOS/tvOS and web — the live resume point was mapped onto currentTime through the stream's own clock: the Anvato type=beacon tags delivered since the run-up's last seek give the currentTime ↔ stream-clock offset, and the resume point (the matched cue_end, else the cue plus the break duration) is converted with it. Reported when a mapping is first available after a seek and whenever the mapped target moves by 0.1s or more. Context carries breakId, target, landingStreamSec, landingSource (cue_end or cue+duration), offsetSec, beacons (beacons averaged), generation (how often the mapping started over since the session began), currentTime, and computedTarget with deltaSec (target - computedTarget) when a currentTime-based target exists. |
|
|
112
|
+
| `DA-RESUME-PTS-REMAP` | playback | warn | ptsSource: 'anvatoCue', iOS/tvOS and web — a stream beacon disagreed with the currentTime ↔ stream-clock mapping by more than 0.2s, so the player re-anchored currentTime (a variant switch or a buffer restart); the mapping starts over from that beacon and the resume point is mapped again. Reported during the resume run-up and after the hand-back. Context carries breakId, fromOffsetSec, toOffsetSec, deltaSec, currentTime and stage (run-up or after-hand-back). |
|
|
113
|
+
| `DA-RESUME-PTS-CORRECTED` | playback | info | ptsSource: 'anvatoCue', iOS/tvOS and web — once per break at the hand-back, on a stream that carries Anvato beacons: whether the stream clock placed the live resume point, and by how much it moved it. applied=true: streamClockTarget is the resume point mapped through the beacons, correctionSec is streamClockTarget - computedTarget (the currentTime target, cue plus duration), and currentTimeShiftSec is how far the same stream instant moved in currentTime between the pause and the hand-back (negative: it now sits earlier), null when no beacon mapped the stream before the pause. Context also carries breakId, landingSource (cue_end or cue+duration), landingStreamSec, offsetSec, beacons, remaps (DA-RESUME-PTS-REMAP during the break) and cueEndTarget when a cue_end was matched. applied=false with a reason means no beacon arrived after the run-up's last seek, so the cue_end or currentTime target applied. |
|
|
114
|
+
| `DA-RESUME-PTS-LANDED` | playback | info | ptsSource: 'anvatoCue', iOS/tvOS and web — where a stream-clock resume landed, measured on the stream's own clock from the beacons delivered after the hand-back: landedStreamSec is the position content resumed from (resumedAt, the seek landing or the playhead at a seek-free hand-back) converted with that mapping, and errorSec is landedStreamSec - landingStreamSec (negative: content resumed before the stream's resume point, so slate is shown). Context carries breakId, landingStreamSec, landingSource, resumedAt, sinceHandBackSec and, when measured, landedStreamSec, errorSec, offsetSec and beacons; reason when no beacon arrived within 15s. Report-only: the SDK does not correct the position from it. |
|
|
115
|
+
| `DA-RESUME-CUE-END` | playback | info | ptsSource: 'anvatoCue', iOS/tvOS, web and Android — the stream's matched type=cue_end replaced the computed resume target: the slate under the ad ends there, not at cue plus the advertised duration (150.206s for a 150s break on NFL Channel), and the player can remap its timeline while content is held, so the cue_end is reported in the current mapping. Context carries breakId, computedTarget, cueEndTarget, deltaSec (cueEndTarget - computedTarget), stage (hold, playing or hand-back; Android: always hand-back) and corrected (whether an in-buffer correction seek ran). Only a policy that resumes at the break end is replaced; otherwise applied=false and only the delta is reported. |
|
|
116
|
+
| `DA-RESUME-CUE-END-LATE` | playback | info | ptsSource: 'anvatoCue', iOS/tvOS and Android — the break's type=cue_end was matched only after the hand-back. When it is more than 1s ahead of the playhead and buffered, content is seeked forward to it once (corrected=true); content is never seeked backward. Context carries breakId, cueEndTarget, currentTime, deltaSec (cueEndTarget - currentTime) and corrected. |
|
|
108
117
|
| `DA-RESUME-CATCHUP` | playback | info | Content began playing behind the ad to reach its resume point. Context carries breakId, startPos, target, remainingAdSec, publishedEnd and clampedStart — clampedStart true means the stream had not published the ideal start position, so playback began late and the alignment loop must make up the difference (the zero-live-headroom case). Its ABSENCE on a live break that resumed short means catch-up never ran at all, which is a different fault from it running and falling short. |
|
|
109
118
|
| `DA-RESUME-TARGET-CLAMPED` | playback | warn | The computed resume position sat outside the held live window and was clamped to the nearest end of it; context carries breakId, requested, clamped, shortfallSec and bound — 'end' when the target is ahead of the published edge, 'start' when it is behind the live window start (already evicted) — applied only when the gap is at most half the held window, otherwise DA-RESUME-START-CLAMP-SKIPPED is emitted instead. Distinct from DA-RESUME-OFFSET-CLAMPED, which shortens the OFFSET to the ad seconds actually played. |
|
|
110
119
|
| `DA-RESUME-START-CLAMP-SKIPPED` | playback | info | The resume target sat behind the element's live seekable start by more than half the held window, which cannot be DVR eviction (the element's seekable range disagrees with the adapter timeline); the target was left unchanged and the engine resolved the seek itself. Context carries breakId, requested, seekableStart, behindSec, windowSec and maxBehindSec. |
|
|
@@ -158,6 +158,18 @@ difference — expected for a viewer riding the live edge. The end-of-break code
|
|
|
158
158
|
then carries `alignCorrections` and `alignCorrectionsMs`: shrinking values mean
|
|
159
159
|
the loop converged; similar-magnitude ones mean it chased without settling.
|
|
160
160
|
|
|
161
|
+
## DA-RESUME-PREPARED
|
|
162
|
+
|
|
163
|
+
**Cause:** Informational (Android, a live break that resumes at its end). The
|
|
164
|
+
paused content was parked exactly on its resume point before the hand-back, so
|
|
165
|
+
the hand-back only plays (`context`: `breakId`, `target`, `source` — `cue_end`
|
|
166
|
+
or `cue+duration` — `leadMs` before the expected hand-back, and `refresh`: content
|
|
167
|
+
parked long before the hand-back is seeked onto the same point again 4.5 s before
|
|
168
|
+
it); the following
|
|
169
|
+
`DA-RESUME-SEEK` reports `prepared: true` and issues no seek. **Fix:** None. A
|
|
170
|
+
`DA-RESUME-SEEK` with `prepared: false` on such a break means the resume point
|
|
171
|
+
was not known or published early enough, so the hand-back paid for a seek.
|
|
172
|
+
|
|
161
173
|
## DA-RESUME-PREPOSITIONED
|
|
162
174
|
|
|
163
175
|
**Cause:** Informational. Content was moved onto its resume position _while the
|
|
@@ -179,17 +191,22 @@ has no headroom and cannot be returned to the exact frame they left.
|
|
|
179
191
|
|
|
180
192
|
**Cause:** Informational. Reports where the post-break resume-seek actually
|
|
181
193
|
landed, measured on the `seeked` event rather than inferred from a later
|
|
182
|
-
sample (`context` carries `breakId`, `target`, `landed`, `errorSec
|
|
183
|
-
`errorSec` is `landed - target
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
194
|
+
sample (`context` carries `breakId`, `target`, `landed`, `errorSec`, and
|
|
195
|
+
`policyTarget` / `policyErrorSec`). `errorSec` is `landed - target`: it only
|
|
196
|
+
says whether the **seek** did what it was asked, so a **negative** value means
|
|
197
|
+
the player settled closer to the live edge than the SDK asked for.
|
|
198
|
+
`policyTarget` is the resume point before the live-window clamp, and
|
|
199
|
+
`policyErrorSec` (`landed - policyTarget`) is how far the viewer really is from
|
|
200
|
+
it. **Fix:** None on its own — it is a measurement. A consistent negative
|
|
201
|
+
`errorSec` on live means the engine is overriding the seek with its own minimum
|
|
202
|
+
live offset. An `errorSec` near zero alongside `DA-RESUME-TARGET-CLAMPED` does
|
|
203
|
+
**not** mean the resume was on target: read `policyErrorSec`, which is the
|
|
204
|
+
seconds of the ad window (slate, on an SGAI feed) the viewer still sees —
|
|
205
|
+
typically a viewer riding the live edge with no headroom. Both values are in
|
|
206
|
+
the player's `currentTime`, so they cannot reveal a timeline remap. `landed:
|
|
207
|
+
null` with a `reason` is normal rather than a fault — a seek to the position
|
|
208
|
+
the playhead already holds fires no `seeked` event on several engines. The SDK
|
|
209
|
+
never corrects the landing position.
|
|
193
210
|
|
|
194
211
|
## DA-LIVE-START-PUSHBACK
|
|
195
212
|
|
|
@@ -498,7 +515,10 @@ early. Content then resumes the same amount early, showing the end of the slate.
|
|
|
498
515
|
Emitted once per session; `context` carries `pts` and the `mediaTime` used.
|
|
499
516
|
**Fix:** Use an adapter that supplies `ptsOffset` (THEOplayer web and Android,
|
|
500
517
|
Shaka). A custom adapter sets `ptsOffset` on emsg cues to
|
|
501
|
-
`Period@start - presentationTimeOffset / timescale` from the MPD
|
|
518
|
+
`Period@start - presentationTimeOffset / timescale` from the MPD, or, as the
|
|
519
|
+
THEOplayer Android adapter does, measures it from the stream's Anvato beacons
|
|
520
|
+
(`type=beacon&pts=…`): the median of `startTime - pts` over the beacons that
|
|
521
|
+
agree. On Android the first few seconds of a source have no beacon clock yet.
|
|
502
522
|
|
|
503
523
|
## DA-ANVATO-CUE-OFFSET-REJECTED
|
|
504
524
|
|
|
@@ -510,6 +530,101 @@ SDK ignored it and used the segment-start `startTime`. `context` carries `pts`,
|
|
|
510
530
|
player time for media time `t` must be `t + ptsOffset`. A multi-Period MPD or a
|
|
511
531
|
player that counts time from `availabilityStartTime` can produce a wrong offset.
|
|
512
532
|
|
|
533
|
+
## DA-ANVATO-CUE-END-MATCHED
|
|
534
|
+
|
|
535
|
+
**Cause:** Informational (`ptsSource: 'anvatoCue'`). The stream's own end of the
|
|
536
|
+
active break (Anvato `type=cue_end`) was observed, and its length on the stream
|
|
537
|
+
clock is within 2s of the break duration. `context` carries `breakId`,
|
|
538
|
+
`mediaTime` (where the player reported it), `lengthSec` and `durationSec`.
|
|
539
|
+
**Fix:** None needed. On iOS/tvOS and Android this marker is the live resume point.
|
|
540
|
+
|
|
541
|
+
## DA-ANVATO-CUE-END-REJECTED
|
|
542
|
+
|
|
543
|
+
**Cause:** Warning (`ptsSource: 'anvatoCue'`). A `type=cue_end` was observed for
|
|
544
|
+
the active break, but its stream-clock length differs from the break duration by
|
|
545
|
+
more than 2s, so it is ignored and the computed resume point is kept.
|
|
546
|
+
**Fix:** Compare `context.lengthSec` with `context.durationSec` and check that
|
|
547
|
+
the manifest duration matches what the broadcaster signals for that break.
|
|
548
|
+
|
|
549
|
+
## DA-RESUME-CUE-END
|
|
550
|
+
|
|
551
|
+
**Cause:** Informational (iOS/tvOS, web and Android, `ptsSource: 'anvatoCue'`).
|
|
552
|
+
The matched `cue_end` replaced the computed live resume target. The slate under
|
|
553
|
+
the ad ends there, not at the cue plus the advertised duration (150.206s for a
|
|
554
|
+
150s break on NFL Channel), and the player can move its timeline while content
|
|
555
|
+
is held behind the ad, so the `cue_end` is reported in the current mapping.
|
|
556
|
+
`context` carries `breakId`, `computedTarget`, `cueEndTarget`, `deltaSec`,
|
|
557
|
+
`stage` (`hold`, `playing` or `hand-back`; Android always `hand-back`), `applied`
|
|
558
|
+
and `corrected`. **Fix:** None needed. A `deltaSec` of a fraction of a second is
|
|
559
|
+
the splice segment at the break end; a large one means the marker prevented a
|
|
560
|
+
resume inside the slate. `applied: false` means the resume policy (early
|
|
561
|
+
return, `insertion`, or a `resumeOffset` different from the duration) keeps its
|
|
562
|
+
own target.
|
|
563
|
+
|
|
564
|
+
## DA-RESUME-CUE-END-LATE
|
|
565
|
+
|
|
566
|
+
**Cause:** Informational (iOS/tvOS and Android, `ptsSource: 'anvatoCue'`). The
|
|
567
|
+
`cue_end` arrived only after content was handed back. `corrected: true` means
|
|
568
|
+
content was more than 1s short and buffered, and was moved forward onto it;
|
|
569
|
+
content is never moved backward. `context` carries `breakId`, `cueEndTarget`,
|
|
570
|
+
`currentTime`, `deltaSec` and `corrected`. **Fix:** None for a single break.
|
|
571
|
+
Frequent late arrivals with `AVPlayer` suggest the metadata look-ahead is not
|
|
572
|
+
delivering; on Android, the Media3 adapter delivers markers at presentation only,
|
|
573
|
+
so it always arrives late there.
|
|
574
|
+
|
|
575
|
+
## DA-RESUME-PTS-MAP
|
|
576
|
+
|
|
577
|
+
**Cause:** Informational (iOS/tvOS and web, `ptsSource: 'anvatoCue'`). The live resume
|
|
578
|
+
point was placed through the stream's own clock: the Anvato `type=beacon` tags
|
|
579
|
+
delivered since the run-up's last seek give the currentTime offset, and the
|
|
580
|
+
resume point (`landingSource`: the matched `cue_end`, else `cue+duration`) is
|
|
581
|
+
converted with it. `context` carries `breakId`, `target`, `landingStreamSec`,
|
|
582
|
+
`landingSource`, `offsetSec`, `beacons`, `generation` (how often the mapping
|
|
583
|
+
started over), `currentTime`, and
|
|
584
|
+
`computedTarget` with `deltaSec`. **Fix:** None needed. A large `deltaSec` is
|
|
585
|
+
the player's timeline having moved during the break, which this mapping
|
|
586
|
+
corrects. A stream without beacons never reports it and keeps the currentTime
|
|
587
|
+
resume.
|
|
588
|
+
|
|
589
|
+
## DA-RESUME-PTS-REMAP
|
|
590
|
+
|
|
591
|
+
**Cause:** Warning (iOS/tvOS and web, `ptsSource: 'anvatoCue'`). A beacon showed the
|
|
592
|
+
player re-anchored currentTime against the stream clock by more than 0.2s,
|
|
593
|
+
typically at a variant switch or a buffer restart. The mapping starts over from
|
|
594
|
+
that beacon. `context` carries `breakId`, `fromOffsetSec`, `toOffsetSec`,
|
|
595
|
+
`deltaSec`, `currentTime` and `stage` (`run-up` or `after-hand-back`).
|
|
596
|
+
**Fix:** None during the run-up: the resume point is mapped again from the next
|
|
597
|
+
beacons. Frequent remaps after the hand-back point to the engine re-anchoring
|
|
598
|
+
content on its own.
|
|
599
|
+
|
|
600
|
+
## DA-RESUME-PTS-CORRECTED
|
|
601
|
+
|
|
602
|
+
**Cause:** Informational (iOS/tvOS and web, `ptsSource: 'anvatoCue'`). Once per break
|
|
603
|
+
at the hand-back, on a stream with Anvato beacons: whether the stream clock
|
|
604
|
+
placed the resume point (`applied`) and by how much. `correctionSec` is the
|
|
605
|
+
stream-clock target minus the currentTime target (`computedTarget`, cue plus
|
|
606
|
+
duration); `currentTimeShiftSec` is how far the same stream instant moved in
|
|
607
|
+
currentTime during the break (negative: it now sits earlier). `context` also
|
|
608
|
+
carries `breakId`, `streamClockTarget`, `landingSource`, `landingStreamSec`,
|
|
609
|
+
`offsetSec`, `beacons`, `remaps` and `cueEndTarget`. **Fix:** None needed. A
|
|
610
|
+
large `currentTimeShiftSec` is a player timeline re-anchor the stream clock
|
|
611
|
+
corrected. `applied: false` with a `reason` means no beacon arrived after the
|
|
612
|
+
run-up's last seek; frequent occurrences point at beacons not reaching the
|
|
613
|
+
player.
|
|
614
|
+
|
|
615
|
+
## DA-RESUME-PTS-LANDED
|
|
616
|
+
|
|
617
|
+
**Cause:** Informational (iOS/tvOS and web, `ptsSource: 'anvatoCue'`). Where a
|
|
618
|
+
stream-clock resume landed, on the stream's own clock, measured from the beacons
|
|
619
|
+
after the hand-back. `errorSec` is `landedStreamSec - landingStreamSec`:
|
|
620
|
+
negative means content resumed before the stream's resume point (that much
|
|
621
|
+
slate shown), positive means content was skipped. `context` carries `breakId`,
|
|
622
|
+
`landingStreamSec`, `landingSource`, `resumedAt`, `sinceHandBackSec` and, when
|
|
623
|
+
measured, `landedStreamSec`, `errorSec`, `offsetSec` and `beacons`; `reason`
|
|
624
|
+
when no beacon arrived within 15s. **Fix:** None for a single break. Unlike
|
|
625
|
+
`DA-RESUME-LANDED` it is not measured in currentTime, so a timeline remap
|
|
626
|
+
cannot hide in it.
|
|
627
|
+
|
|
513
628
|
## DA-PRELOAD-FAILED
|
|
514
629
|
|
|
515
630
|
**Cause:** Preloading the next ad failed; the asset will load on demand at break
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dolby-optiview/ads-sdk",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "OptiView Ads SDK entry package - OptiViewAds with a default HLS.js ad player (native fallback)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
},
|
|
45
45
|
"sideEffects": false,
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@dolby-optiview/ads-sdk-adapter-hlsjs": "^1.1.
|
|
48
|
-
"@dolby-optiview/ads-sdk-core": "^1.1.
|
|
47
|
+
"@dolby-optiview/ads-sdk-adapter-hlsjs": "^1.1.1",
|
|
48
|
+
"@dolby-optiview/ads-sdk-core": "^1.1.1"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"hls.js": "^1.0.0"
|