@vkontakte/videoplayer-core 2.0.181-dev.111b83b80.0 → 2.0.181-dev.132333d53.0

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.
Files changed (52) hide show
  1. package/es2015.cjs +16 -16
  2. package/es2015.esm.js +8 -8
  3. package/esnext.cjs +8 -8
  4. package/esnext.esm.js +15 -15
  5. package/evergreen.esm.js +8 -8
  6. package/package.json +2 -2
  7. package/types/index.d.ts +3 -1
  8. package/types/player/Player.d.ts +2 -0
  9. package/types/player/types.d.ts +20 -3
  10. package/types/providers/DashProvider/baseDashProvider.d.ts +3 -0
  11. package/types/providers/DashProvider/lib/buffer.d.ts +49 -5
  12. package/types/providers/DashProvider/lib/fetcher.d.ts +31 -6
  13. package/types/providers/DashProvider/lib/player.d.ts +5 -0
  14. package/types/providers/DashProviderVirtual/baseDashProvider.d.ts +3 -0
  15. package/types/providers/DashProviderVirtual/lib/buffer/types.d.ts +3 -0
  16. package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/baseVirtualBufferManager.d.ts +21 -4
  17. package/types/providers/DashProviderVirtual/lib/fetcher.d.ts +30 -6
  18. package/types/providers/DashProviderVirtual/lib/player/basePlayer.d.ts +2 -0
  19. package/types/providers/DashProviderVirtual/lib/player/types.d.ts +4 -1
  20. package/types/providers/ProviderContainer/index.d.ts +2 -0
  21. package/types/providers/types.d.ts +2 -1
  22. package/types/providers/utils/Abr/abrManager.d.ts +2 -0
  23. package/types/providers/utils/Abr/mlAbr/chunkDownloadHistory.d.ts +34 -0
  24. package/types/providers/utils/Abr/mlAbr/modelInput.d.ts +47 -0
  25. package/types/providers/utils/Abr/mlAbr/workerClient.d.ts +57 -0
  26. package/types/providers/utils/Abr/mlAbr/workerProtocol.d.ts +67 -0
  27. package/types/providers/utils/Abr/rules/baseRule.d.ts +2 -1
  28. package/types/providers/utils/Abr/rules/video/mlAbrRule.d.ts +52 -0
  29. package/types/providers/utils/Abr/rules/video/stallsRule.d.ts +9 -11
  30. package/types/providers/utils/Abr/types.d.ts +10 -1
  31. package/types/providers/utils/StallsManager.d.ts +1 -8
  32. package/types/utils/ClientChecker/services/DeviceChecker.d.ts +4 -0
  33. package/types/utils/ClientChecker/types/userAgentData.d.ts +4 -2
  34. package/types/utils/ThroughputEstimator.d.ts +20 -4
  35. package/types/utils/UserHappinessController.d.ts +8 -0
  36. package/types/utils/UserHappinessObserver/constants.d.ts +12 -0
  37. package/types/utils/UserHappinessObserver/index.d.ts +15 -0
  38. package/types/utils/UserHappinessObserver/metrics/hasFatalError.d.ts +3 -0
  39. package/types/utils/UserHappinessObserver/metrics/highStallRatio.d.ts +3 -0
  40. package/types/utils/UserHappinessObserver/metrics/lowQuality/constants.d.ts +5 -0
  41. package/types/utils/UserHappinessObserver/metrics/lowQuality/createLowQuality.d.ts +4 -0
  42. package/types/utils/UserHappinessObserver/metrics/lowQuality/index.d.ts +1 -0
  43. package/types/utils/UserHappinessObserver/metrics/lowQuality/types.d.ts +13 -0
  44. package/types/utils/UserHappinessObserver/metrics/lowQuality/utils.d.ts +26 -0
  45. package/types/utils/UserHappinessObserver/metrics/slowFirstFrame.d.ts +3 -0
  46. package/types/utils/UserHappinessObserver/types.d.ts +8 -0
  47. package/types/utils/UserHappinessObserver/utils/qualityPlatform.d.ts +2 -0
  48. package/types/utils/UserHappinessObserver/utils/thresholds.d.ts +2 -0
  49. package/types/utils/UserHappinessObserver/utils/watchedTimeSeconds.d.ts +3 -0
  50. package/types/utils/tuningConfig.d.ts +71 -20
  51. package/types/utils/userHappinessTriggers.d.ts +4 -0
  52. package/types/utils/buffer/getBackwardBufferDuration.d.ts +0 -3
@@ -5,6 +5,7 @@ import { IOSPreferredFormat } from "../enums/IOSPreferredFormat";
5
5
  import type { Byte, Kbps, Milliseconds, RecursivePartial, Seconds, TimerModule } from "@vkontakte/videoplayer-shared";
6
6
  import { type ExactVideoQuality, VideoQuality } from "@vkontakte/videoplayer-shared";
7
7
  import { AudioRuleName, VideoRuleName } from "../providers/utils/Abr/types";
8
+ import type { UserHappinessTrigger } from "./userHappinessTriggers";
8
9
  import type { SegmentCacheConfig } from "../providers/utils/segmentCache/types";
9
10
  export type ITuningConfig = {
10
11
  /** @deprecated */
@@ -42,6 +43,15 @@ export type ITuningConfig = {
42
43
  initialThroughput: Kbps;
43
44
  measureNonSegmentRequests: boolean;
44
45
  smallSampleMinDuration: Milliseconds;
46
+ /**
47
+ * Верхняя граница скорости одного замера (Кбпс), выше которой sanityCheck его
48
+ * отбрасывает: такую полосу не даёт пользовательский канал — это кэш CDN/браузера,
49
+ * отдавший объект практически мгновенно. Дефолт 1 000 000 Кбит/с унаследован из
50
+ * хардкода sanityCheck до этого поля. Поднимается в e2e (UVP-11954): CI-раннеры
51
+ * стоят в одном ДЦ с CDN и качают сегменты быстрее гигабита — с дефолтным лимитом
52
+ * все замеры режутся и хостовая запись кеша не появляется.
53
+ */
54
+ maxSampleRate: Kbps;
45
55
  cacheThresholdSize: Milliseconds;
46
56
  /**
47
57
  * UVP-11541: верхняя граница порога, ниже которого ответ считается кэш-хитом по TTFB.
@@ -71,7 +81,7 @@ export type ITuningConfig = {
71
81
  * мелкий сегмент качается параллельно с аудио и другого замера не получает.
72
82
  * Параллельной считается загрузка, отдававшая байты внутри окна замера: открытая,
73
83
  * но молчащая (подвисла либо уже выкачала своё и ждёт done) полосу не занимает.
74
- * Честный кэш (мгновенная отдача → rate > 1 Гбит/с) по-прежнему режется проверкой rate выше.
84
+ * Честный кэш (мгновенная отдача — скорость замера выше maxSampleRate) по-прежнему режется.
75
85
  *
76
86
  * Пункты 3 и 4 добавлены после эксперимента 37621: без них включённые быстрые сэмплы
77
87
  * систематически занижали оценку, ABR держал низкое качество и сегменты оставались
@@ -90,23 +100,41 @@ export type ITuningConfig = {
90
100
  maxLastEvaluationTimeout: Milliseconds;
91
101
  };
92
102
  /**
93
- * TTL + проверка типа сети для кешированного throughput из localStorage.
94
- * При включении: если сохранённое значение старше storedThroughputTtlMs
95
- * или тип сети изменился (Wi-Fi→3G) — значение отбрасывается.
96
- * Предотвращает старт в 4K при переходе с Wi-Fi на мобильную сеть.
103
+ * UVP-11954: кеш оценки сети с разрезом по хосту раздачи (CDN).
97
104
  *
98
- * При OFF (дефолт): читаем/пишем как до фикса — plain number в legacy-ключ
99
- * one_video_*. Это даёт безопасный rollback JS-версии без потери данных.
100
- * При ON: новый формат (JSON с timestamp+networkType) → новый ключ vk_uvp_*.
101
- */
102
- useThroughputTtl: boolean;
103
- /**
104
- * Срок жизни кешированного throughput (мс). По умолчанию 4 часа.
105
- * После истечения TTL значение из localStorage игнорируется —
106
- * используется browser estimation или initialThroughput.
107
- * Применимо только при useThroughputTtl=true.
105
+ * При включении: ключи vk_uvp_throughput / vk_uvp_rtt хранят JSON
106
+ * {"hosts":{"<host>":{"value","timestamp","networkType"?}}} — чтение только
107
+ * записи текущего хоста (TTL + совпадение networkType), промах = холодный старт
108
+ * (browser estimation, затем initialThroughput). Запись — hosts-only, без общей
109
+ * записи; набор хостов ограничен LRU по hostsLimit. Чтение отложено до
110
+ * первого события адаптации: определённая эмиссия hostname$ или первый замер.
108
111
  */
109
- storedThroughputTtlMs: Milliseconds;
112
+ cdnCache: {
113
+ /**
114
+ * Гейт всех изменений UVP-11954. При false (дефолт): бит-в-бит прежнее
115
+ * поведение — plain number в legacy-ключах one_video_*; ключи vk_uvp_*
116
+ * не читаются и не пишутся. Это даёт безопасный rollback JS-версии
117
+ * без потери свежих данных для старого кода.
118
+ */
119
+ enabled: boolean;
120
+ /**
121
+ * Срок жизни каждой хостовой записи кеша (мс). По умолчанию 4 часа.
122
+ * Запись старше TTL при чтении отбрасывается — холодный старт.
123
+ * Применимо только при cdnCache.enabled=true.
124
+ */
125
+ ttlMs: Milliseconds;
126
+ /**
127
+ * Предел числа хостовых записей в hosts (UVP-11954). При превышении при записи
128
+ * вытесняется запись с наименьшим timestamp (не считая текущего хоста).
129
+ * Протухшие по TTL записи уходят первыми — отдельной чистки нет.
130
+ * 10: ключ кеша — хост раздачи, а балансировщик video.get выдаёт хост
131
+ * при каждой загрузке видео и не гарантирует повтор предыдущего. За TTL
132
+ * активный пользователь может собрать записи по нескольким хостам —
133
+ * 10 покрывает это с запасом при ~100 Б на запись, ~1 КБ на набор из 10.
134
+ * Применимо только при cdnCache.enabled=true.
135
+ */
136
+ hostsLimit: number;
137
+ };
110
138
  };
111
139
  autoTrackSelection: {
112
140
  bitrateFactorAtEmptyBuffer: number;
@@ -143,7 +171,6 @@ export type ITuningConfig = {
143
171
  enabled: boolean;
144
172
  ignoreDynamicAbrForShortVideo: boolean;
145
173
  stallDurationNoDataBeforeQualityDecrease: Milliseconds;
146
- stallDurationToBeCount: Milliseconds;
147
174
  stallCountBeforeQualityDecrease: Milliseconds;
148
175
  resetQualityRestrictionTimeout: Milliseconds;
149
176
  ignoreStallsOnSeek: boolean;
@@ -256,6 +283,26 @@ export type ITuningConfig = {
256
283
  budgetFactor: number;
257
284
  fallbackSegmentDurationMs: Milliseconds;
258
285
  };
286
+ /**
287
+ * ML-правило ABR (UVP-12133). Поведенческие ручки; сессионный провайдер модели
288
+ * `instance.core.getAbrMLModel` — инстанс-данные initPlayer, не tuning.
289
+ */
290
+ mlAbr: {
291
+ /** Фича-флаг. Выключен — правило не регистрируется, сеть и бандл не меняются. */
292
+ enabled: boolean;
293
+ /** Гостевая модель, когда провайдер не передан или вернул null. */
294
+ guestModelUrl: string | undefined;
295
+ /** Артефакт воркера на CDN; версионируемый путь — ручка флагов и экспериментов. */
296
+ workerJsUrl: string;
297
+ /** Каталог litert-артефакта на CDN; оттуда префетчатся iife и wasm параллельно модели. */
298
+ litertWasmUrl: string;
299
+ /** Прогрев: минимум записей истории чанков до входа в ML-режим. */
300
+ minHistorySize: number;
301
+ /** Сила голоса правила в конвейере. */
302
+ confidence: "high" | "normal";
303
+ /** Таймаут от создания клиента до готовности инференса в воркере. */
304
+ runtimeInitTimeoutMs: Milliseconds;
305
+ };
259
306
  videoStreamRepresentaionsFilter: [VideoQuality, number, VideoCodecName][];
260
307
  filterOnDemandQualityList: boolean;
261
308
  dashMaxTvVideoQuality: boolean;
@@ -284,6 +331,8 @@ export type ITuningConfig = {
284
331
  */
285
332
  recoverStuckSegmentLoading: boolean;
286
333
  skipReloadOfFullyBufferedPartiallyEjectedSegments: boolean;
334
+ /** В Safari ждёт завершения append init-сегмента после abort перед выполнением remove. */
335
+ deferRemoveUntilAbortCompletes: boolean;
287
336
  };
288
337
  dashCmafLive: {
289
338
  externalStopControl: boolean;
@@ -343,6 +392,8 @@ export type ITuningConfig = {
343
392
  };
344
393
  enableWakeLock: boolean;
345
394
  enableTelemetryAtStart: boolean;
395
+ /** Список user-happiness-триггеров, включённых для отправки в tracer. Пустой список отключает их. */
396
+ userHappinessTriggers: UserHappinessTrigger[];
346
397
  forceFormat: VideoFormat | undefined;
347
398
  formatsToAvoid: VideoFormat[];
348
399
  disableChromecast: boolean;
@@ -374,10 +425,10 @@ export type ITuningConfig = {
374
425
  */
375
426
  stallIgnoreThreshold: Milliseconds;
376
427
  /**
377
- * Стратегия записи столлов
428
+ * Стратегия записи stall
378
429
  * verbose - записываем всё
379
- * exclude-threshold - записываем столлы длинее stallIgnoreThreshold, но вычитаем длину stallIgnoreThreshold
380
- * include-threshold - записываем столлы длинее stallIgnoreThreshold
430
+ * exclude-threshold - записываем stall длиннее stallIgnoreThreshold, но вычитаем длину stallIgnoreThreshold
431
+ * include-threshold - записываем stall длиннее stallIgnoreThreshold
381
432
  */
382
433
  stallHandlingStrategy: "verbose" | "exclude-threshold" | "include-threshold";
383
434
  stallIgnoreOnPause: boolean;
@@ -0,0 +1,4 @@
1
+ export declare const USER_HAPPINESS_TRIGGER_NAMES: readonly ["has_fatal_error", "slow_first_frame", "high_stall_ratio", "low_quality"];
2
+ export type UserHappinessTrigger = (typeof USER_HAPPINESS_TRIGGER_NAMES)[number];
3
+ export declare const isUserHappinessTrigger: (value: unknown) => value is UserHappinessTrigger;
4
+ export declare const normalizeUserHappinessTriggers: (value: unknown) => UserHappinessTrigger[];
@@ -1,3 +0,0 @@
1
- import type { Milliseconds } from "@vkontakte/videoplayer-shared";
2
- declare const _default: (timeRanges: TimeRanges, position: Milliseconds) => Milliseconds;
3
- export default _default;