From 958135e6d2726b1fb07e3094a3f87cbfbdd8b9ba Mon Sep 17 00:00:00 2001 From: 4gray Date: Sat, 13 Jun 2026 12:49:58 +0200 Subject: [PATCH] fix(xtream): avoid pwa data source bootstrap cycle --- .../src/lib/data-sources/index.spec.ts | 30 +++++++++++++++++++ .../data-sources/pwa-xtream-data-source.ts | 7 +++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/libs/portal/xtream/data-access/src/lib/data-sources/index.spec.ts b/libs/portal/xtream/data-access/src/lib/data-sources/index.spec.ts index 09226800f..17e49c604 100644 --- a/libs/portal/xtream/data-access/src/lib/data-sources/index.spec.ts +++ b/libs/portal/xtream/data-access/src/lib/data-sources/index.spec.ts @@ -2,8 +2,10 @@ import { TestBed } from '@angular/core/testing'; import { PLAYLIST_DELETE_CLEANUP, PlaylistDeleteCleanup, + PlaylistsService, RuntimeCapabilitiesService, } from '@iptvnator/services'; +import { XtreamApiService } from '../services/xtream-api.service'; import { ElectronXtreamDataSource, PwaXtreamDataSource, @@ -65,6 +67,34 @@ describe('provideXtreamDataSource', () => { expect(TestBed.inject(XTREAM_DATA_SOURCE)).toBe(pwaSource); }); + it('does not resolve playlist metadata services while constructing the PWA data source', () => { + runtime = { + supportsXtreamSqliteDataSource: false, + }; + + TestBed.configureTestingModule({ + providers: [ + ...provideXtreamDataSource(), + { + provide: RuntimeCapabilitiesService, + useValue: runtime, + }, + { + provide: XtreamApiService, + useValue: {}, + }, + { + provide: PlaylistsService, + useFactory: () => { + throw new Error('PlaylistsService should be lazy'); + }, + }, + ], + }); + + expect(() => TestBed.inject(XTREAM_DATA_SOURCE)).not.toThrow(); + }); + it('skips browser sidecar cleanup for SQLite-backed Xtream storage', async () => { configure(true); const [cleanup] = TestBed.inject( diff --git a/libs/portal/xtream/data-access/src/lib/data-sources/pwa-xtream-data-source.ts b/libs/portal/xtream/data-access/src/lib/data-sources/pwa-xtream-data-source.ts index 0570ce2db..2a3eb8525 100644 --- a/libs/portal/xtream/data-access/src/lib/data-sources/pwa-xtream-data-source.ts +++ b/libs/portal/xtream/data-access/src/lib/data-sources/pwa-xtream-data-source.ts @@ -1,4 +1,4 @@ -import { inject, Injectable } from '@angular/core'; +import { inject, Injectable, Injector } from '@angular/core'; import { Playlist, PlaybackPositionData, @@ -79,7 +79,7 @@ type StoredXtreamPlaylistData = Omit & { @Injectable({ providedIn: 'root' }) export class PwaXtreamDataSource implements IXtreamDataSource { private readonly apiService = inject(XtreamApiService); - private readonly playlistsService = inject(PlaylistsService); + private readonly injector = inject(Injector); private readonly logger = createLogger('PwaXtreamDataSource'); private readonly contentTypes = ['live', 'movie', 'series'] as const; @@ -171,8 +171,9 @@ export class PwaXtreamDataSource implements IXtreamDataSource { playlistId: string ): Promise { try { + const playlistsService = this.injector.get(PlaylistsService); const playlist = await firstValueFrom( - this.playlistsService.getPlaylistById(playlistId) + playlistsService.getPlaylistById(playlistId) ); const xtreamPlaylist = this.toXtreamPlaylistData(playlist);