Skip to content

Commit 5c0d97a

Browse files
Fix: Browser Freezes When Using P2P with Shaka Player on Long Live Streams (#454)
* ci: update Node.js and pnpm setup to use LTS versions in workflows * ci: remove redundant step from PR workflow * build: update deps to latest versions * ci: update Node.js setup to use LTS version and pnpm to latest * ci: remove working-directory in PR check workflow * style: remove extra blank space * fix: browser freezes when using shaka on long live streams * refactor: segment index handling with eviction count * Revert "refactor: segment index handling with eviction count" This reverts commit 7d42b14. * Revert "fix: browser freezes when using shaka on long live streams" This reverts commit 02af012. * refactor: enhance segment reference retrieval in manifest parser * Update comments --------- Co-authored-by: Andriy Lysnevych <andriy.lysnevych@novage.com.ua>
1 parent b117bb4 commit 5c0d97a

File tree

1 file changed

+33
-5
lines changed

1 file changed

+33
-5
lines changed

packages/p2p-media-loader-shaka/src/manifest-parser-decorator.ts

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class ManifestParserDecorator implements shaka.extern.ManifestParser {
1414
private player?: shaka.Player;
1515

1616
constructor(
17-
shaka: Readonly<Shaka>,
17+
private readonly shaka: Readonly<Shaka>,
1818
private readonly originalManifestParser: shaka.extern.ManifestParser,
1919
) {
2020
this.isHls = this.originalManifestParser instanceof shaka.hls.HlsParser;
@@ -136,7 +136,14 @@ export class ManifestParserDecorator implements shaka.extern.ManifestParser {
136136

137137
segmentIndex.get = originalGet;
138138
try {
139-
const references = [...segmentIndex];
139+
const references = getReferencesArray(
140+
segmentIndex as unknown as Record<string, unknown>,
141+
this.shaka,
142+
);
143+
if (!references) {
144+
throw new Error("Segment references not found");
145+
}
146+
140147
const firstItemReference = references[0];
141148
const lastItemReference = references[references.length - 1];
142149

@@ -154,10 +161,9 @@ export class ManifestParserDecorator implements shaka.extern.ManifestParser {
154161
stream.isSegmentIndexAlreadyRead = true;
155162
this.debug(`Stream ${stream.id} is updated`);
156163
} catch {
157-
// This catch is intentionally left blank.
158-
// [...segmentIndex] throws an error when segmentIndex inner array is empty
164+
// Ignore an error when segmentIndex inner array is empty
159165
} finally {
160-
// do not set custom get again is segment index is already read and stream is VOD
166+
// Do not set custom get again if the segment index is already read and the stream is VOD
161167
if (
162168
!stream.isSegmentIndexAlreadyRead ||
163169
!!this.player?.isLive() ||
@@ -262,6 +268,28 @@ export class DashManifestParser extends ManifestParserDecorator {
262268
}
263269
}
264270

271+
function getReferencesArray(
272+
obj: Record<string, unknown>,
273+
shaka: Shaka,
274+
): shaka.media.SegmentReference[] | null {
275+
for (const key in obj) {
276+
if (
277+
Array.isArray(obj[key]) &&
278+
obj[key].length > 0 &&
279+
obj[key][0] instanceof shaka.media.SegmentReference
280+
) {
281+
return obj[key] as shaka.media.SegmentReference[];
282+
} else if (typeof obj[key] === "object") {
283+
const references = getReferencesArray(
284+
obj[key] as Record<string, unknown>,
285+
shaka,
286+
);
287+
if (references) return references;
288+
}
289+
}
290+
return null;
291+
}
292+
265293
function getMapPropertiesFromObject(object: Record<string, unknown>) {
266294
return Object.values(object).filter(
267295
(property): property is Map<unknown, unknown> => property instanceof Map,

0 commit comments

Comments
 (0)