@vkontakte/videoplayer-core 2.0.174-dev.a50406f6b.0 → 2.0.174

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/videoplayer-core",
3
- "version": "2.0.174-dev.a50406f6b.0",
3
+ "version": "2.0.174",
4
4
  "author": "vk.ru",
5
5
  "description": "Videoplayer core library based on the vk.ru platform",
6
6
  "homepage": "https://vk.ru",
@@ -42,6 +42,6 @@
42
42
  "**/*.d.ts"
43
43
  ],
44
44
  "dependencies": {
45
- "@vkontakte/videoplayer-shared": "1.0.103-dev.a50406f6b.0"
45
+ "@vkontakte/videoplayer-shared": "1.0.103"
46
46
  }
47
47
  }
@@ -84,6 +84,7 @@ export declare class BufferManager {
84
84
  switchTo: ReturnType<typeof abortable<[Representation["id"], boolean | undefined], void>>;
85
85
  switchToOld: ReturnType<typeof abortable<[Representation["id"], boolean | undefined], void>>;
86
86
  warmUpMediaSource(): void;
87
+ private releaseStrandedSegment;
87
88
  abort(): Promise<boolean>;
88
89
  maintain(currentPosition?: Milliseconds | undefined): void;
89
90
  get lastDataObtainedTimestamp(): number;
@@ -27,6 +27,7 @@ export interface IParams {
27
27
  useUrlCacheMechanism?: boolean;
28
28
  measureNonSegmentRequests?: boolean;
29
29
  measureFastSamples?: boolean;
30
+ cacheHitTtfbMaxMs?: Milliseconds;
30
31
  preloadFirstSegment?: boolean;
31
32
  maxQualityForFirstSegmentPreload?: ExactVideoQuality;
32
33
  }
@@ -76,13 +77,14 @@ export declare class Fetcher {
76
77
  private useUrlCacheMechanism;
77
78
  private measureNonSegmentRequests;
78
79
  private measureFastSamples;
80
+ private cacheHitTtfbMaxMs;
79
81
  private preloadFirstSegment;
80
82
  private maxQualityForFirstSegmentPreload;
81
83
  private startupPhase;
82
84
  private performanceObserver;
83
85
  private pendingConnectionMetrics;
84
86
  private handleExtendedNetworkErrorsSet;
85
- constructor({ throughputEstimator, requestQuic, tracer, compatibilityMode, useEnableSubtitlesParam, handleExtendedNetworkErrorsSet, useUrlCacheMechanism, measureNonSegmentRequests, measureFastSamples, preloadFirstSegment, maxQualityForFirstSegmentPreload }: IParams);
87
+ constructor({ throughputEstimator, requestQuic, tracer, compatibilityMode, useEnableSubtitlesParam, handleExtendedNetworkErrorsSet, useUrlCacheMechanism, measureNonSegmentRequests, measureFastSamples, cacheHitTtfbMaxMs, preloadFirstSegment, maxQualityForFirstSegmentPreload }: IParams);
86
88
  private onHeadersReceived;
87
89
  private setupPerformanceObserver;
88
90
  private processPerformanceResourceTiming;
@@ -1,4 +1,5 @@
1
1
  import type { Byte, IError, ISubject, Milliseconds } from "@vkontakte/videoplayer-shared";
2
+ import type { ITuningConfig } from "../../../utils/tuningConfig";
2
3
  declare class SourceBufferTaskQueue {
3
4
  bufferFull$: ISubject<Byte>;
4
5
  error$: ISubject<IError>;
@@ -7,7 +8,8 @@ declare class SourceBufferTaskQueue {
7
8
  private currentTask;
8
9
  private destroyed;
9
10
  private abortRequested;
10
- constructor(buffer: SourceBuffer);
11
+ private readonly tuning;
12
+ constructor(buffer: SourceBuffer, tuning: ITuningConfig);
11
13
  append(data: BufferSource, signal?: AbortSignal): Promise<boolean>;
12
14
  remove(from: Milliseconds, to: Milliseconds, signal?: AbortSignal): Promise<boolean>;
13
15
  abort(init?: BufferSource): Promise<boolean>;
@@ -27,6 +27,7 @@ export interface IParams {
27
27
  useUrlCacheMechanism?: boolean;
28
28
  measureNonSegmentRequests?: boolean;
29
29
  measureFastSamples?: boolean;
30
+ cacheHitTtfbMaxMs?: Milliseconds;
30
31
  preloadFirstSegment?: boolean;
31
32
  maxQualityForFirstSegmentPreload?: ExactVideoQuality;
32
33
  }
@@ -75,13 +76,14 @@ export declare class Fetcher {
75
76
  private useUrlCacheMechanism;
76
77
  private measureNonSegmentRequests;
77
78
  private measureFastSamples;
79
+ private cacheHitTtfbMaxMs;
78
80
  private preloadFirstSegment;
79
81
  private maxQualityForFirstSegmentPreload;
80
82
  private startupPhase;
81
83
  private performanceObserver;
82
84
  private pendingConnectionMetrics;
83
85
  private handleExtendedNetworkErrorsSet;
84
- constructor({ throughputEstimator, requestQuic, tracer, compatibilityMode, useEnableSubtitlesParam, handleExtendedNetworkErrorsSet, useUrlCacheMechanism, measureNonSegmentRequests, measureFastSamples, preloadFirstSegment, maxQualityForFirstSegmentPreload }: IParams);
86
+ constructor({ throughputEstimator, requestQuic, tracer, compatibilityMode, useEnableSubtitlesParam, handleExtendedNetworkErrorsSet, useUrlCacheMechanism, measureNonSegmentRequests, measureFastSamples, cacheHitTtfbMaxMs, preloadFirstSegment, maxQualityForFirstSegmentPreload }: IParams);
85
87
  private onHeadersReceived;
86
88
  private setupPerformanceObserver;
87
89
  private processResourceTiming;
@@ -43,6 +43,13 @@ export type ITuningConfig = {
43
43
  smallSampleMinDuration: Milliseconds;
44
44
  cacheThresholdSize: Milliseconds;
45
45
  /**
46
+ * UVP-11541: верхняя граница порога, ниже которого ответ считается кэш-хитом по TTFB.
47
+ * Без неё порог растёт вместе с rtt и после деградации сети объявляет кэшем любой быстрый
48
+ * сетевой ответ — оценка застывает навсегда. Замер на CDN: кэш отвечает за 0.5–1.2 мс,
49
+ * сеть не быстрее 45 мс, так что коридор широкий.
50
+ */
51
+ cacheHitTtfbMaxMs: Milliseconds;
52
+ /**
46
53
  * Фичафлаг UVP-10855: лечит залипание throughput на быстрых соединениях.
47
54
  *
48
55
  * Проблема: на быстром соединении крупный сегмент реально скачивается за ≤ cacheThresholdSize
@@ -270,6 +277,23 @@ export type ITuningConfig = {
270
277
  * Включать поэтапно, начиная с процента трафика, для A/B по метрикам утечек и восстановления.
271
278
  */
272
279
  resolveQueueOnDestroy: boolean;
280
+ /**
281
+ * Освобождает застрявшую загрузку сегментов в `DashProvider`: запись из `activeSegments`,
282
+ * когда её загрузчик закончил работу или когда `warmUpMediaSource()` переоткрыл
283
+ * `mediaSource`, и колбэки задач `sourceBufferTaskQueue`, когда очередь разрушается
284
+ * посреди `append` (UVP-11642, UVP-11519).
285
+ *
286
+ * Без первого ранний выход `onSegmentFullyAppended` по протухшему `sourceBuffer` оставляет
287
+ * запись навсегда, а `maintain()` планирует загрузки только при пустом `activeSegments` —
288
+ * видеодорожка перестаёт докачиваться до конца жизни `BufferManager`. Без второго
289
+ * `destroy()` зануляет `currentTask`, не вызвав callback, `loadTemplateSegment` навсегда
290
+ * стоит на `await`, а `initRepresentations` не доходит до `REPRESENTATIOS_READY`.
291
+ *
292
+ * Освобождённый сегмент возвращается в `NONE` через `abortSegment()`, то есть будет скачан
293
+ * заново: пережили ли байты переоткрытие буфера, достоверно неизвестно, и лишняя докачка
294
+ * дешевле замершего воспроизведения.
295
+ */
296
+ recoverStuckSegmentLoading: boolean;
273
297
  };
274
298
  dashCmafLive: {
275
299
  externalStopControl: boolean;