@vkontakte/videoplayer-core 2.0.173-dev.ebda080eb.0 → 2.0.174-beta.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 (36) hide show
  1. package/es2015.cjs +17 -17
  2. package/es2015.esm.js +17 -17
  3. package/esnext.cjs +16 -16
  4. package/esnext.esm.js +16 -16
  5. package/evergreen.esm.js +16 -16
  6. package/package.json +2 -2
  7. package/types/providers/DashLiveProvider/DashLiveProvider.d.ts +1 -0
  8. package/types/providers/DashProvider/dashCmafLiveProvider.d.ts +1 -0
  9. package/types/providers/DashProvider/lib/buffer.d.ts +1 -2
  10. package/types/providers/DashProvider/lib/fetcher.d.ts +6 -8
  11. package/types/providers/DashProvider/lib/player.d.ts +0 -1
  12. package/types/providers/DashProvider/lib/sourceBufferTaskQueue.d.ts +3 -1
  13. package/types/providers/DashProvider/lib/urlsCache.d.ts +23 -0
  14. package/types/providers/DashProviderVirtual/lib/buffer/types.d.ts +0 -2
  15. package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/{baseVirtualBufferManager.versionA.d.ts → baseVirtualBufferManager.d.ts} +1 -3
  16. package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/{byteRangeVirtualBufferManager.versionA.d.ts → byteRangeVirtualBufferManager.d.ts} +1 -2
  17. package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/liveVirtualBuffer.d.ts +1 -1
  18. package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/{templateVirtualBufferManager.versionA.d.ts → templateVirtualBufferManager.d.ts} +1 -1
  19. package/types/providers/DashProviderVirtual/lib/fetcher.d.ts +6 -8
  20. package/types/providers/DashProviderVirtual/lib/player/basePlayer.d.ts +0 -2
  21. package/types/providers/DashProviderVirtual/lib/urlsCache.d.ts +22 -0
  22. package/types/providers/HlsLiveProvider/index.d.ts +1 -0
  23. package/types/providers/HlsProvider/manifestDataExtractor.d.ts +2 -0
  24. package/types/providers/ProviderContainer/index.d.ts +0 -3
  25. package/types/providers/utils/buildFmp4MasterUrl.d.ts +12 -0
  26. package/types/providers/utils/generateLiveUrl.d.ts +1 -0
  27. package/types/utils/ClientChecker/services/DeviceChecker.d.ts +14 -0
  28. package/types/utils/ClientChecker/services/DisplayChecker.d.ts +3 -0
  29. package/types/utils/tuningConfig.d.ts +59 -13
  30. package/types/providers/utils/segmentCache/IndexedDbSegmentCacheStorage.d.ts +0 -54
  31. package/types/providers/utils/segmentCache/SegmentCache.d.ts +0 -59
  32. package/types/providers/utils/segmentCache/constants.d.ts +0 -20
  33. package/types/providers/utils/segmentCache/index.d.ts +0 -8
  34. package/types/providers/utils/segmentCache/segmentCacheDb.d.ts +0 -25
  35. package/types/providers/utils/segmentCache/segmentCacheUtils.d.ts +0 -25
  36. package/types/providers/utils/segmentCache/types.d.ts +0 -76
@@ -1,54 +0,0 @@
1
- import type { InitSegmentParams, ISegmentCacheStorage, SegmentCacheConfig, SetSegmentParams } from "./types";
2
- export declare class IndexedDbSegmentCacheStorage implements ISegmentCacheStorage {
3
- private config;
4
- private dbPromise;
5
- private destroyed;
6
- private evictionTimerId;
7
- private globalTotalBytes;
8
- private maxTotalStoredBytes;
9
- private quotaExceeded;
10
- private cacheEventsChannel;
11
- constructor(config: SegmentCacheConfig);
12
- private getDb;
13
- private isFresh;
14
- /**
15
- * Читает записи по массиву ключей в одной транзакции.
16
- * Свежие по TTL — возвращает данные и обновляет lastAccessAt (не чаще чем раз в TOUCH_INTERVAL_MS,
17
- * чтобы избежать write amplification: каждый cache hit не должен делать store.put с полным ArrayBuffer).
18
- * Протухшие — удаляет, декрементирует globalTotalBytes.
19
- */
20
- private readFreshRecord;
21
- /**
22
- * При открытии БД пересчитывает globalTotalBytes: проходит по всем записям,
23
- * суммирует размер живых (не протухших по TTL) и удаляет протухшие.
24
- * TTL различается: media — ttlMs, init/index — initTtlMs.
25
- */
26
- private handleDbOpened;
27
- /** Возвращает TTL в зависимости от типа записи по первичному ключу. */
28
- private ttlForEntry;
29
- getSegments(normalizedUrl: string, indices: number[]): Promise<Map<number, ArrayBuffer>>;
30
- /** Удаляет записи по индексам сегментов в одной транзакции, декрементируя globalTotalBytes. */
31
- deleteSegments(normalizedUrl: string, indices: number[]): Promise<void>;
32
- setSegment(params: SetSegmentParams): Promise<void>;
33
- getInitSegment({ normalizedUrl, rangeType, range }: InitSegmentParams): Promise<ArrayBuffer | null>;
34
- /** Универсальная запись с подсчётом delta, QuotaExceededError-обработкой и eviction. */
35
- private putRecord;
36
- private handleQuotaExceededError;
37
- /** Полная очистка кэша с рассылкой события остальным инстансам (вкладки, другие плееры). */
38
- clear(): Promise<void>;
39
- destroy(): void;
40
- private scheduleEviction;
41
- /**
42
- * LRU-eviction: запускается по дебаунсу после каждой записи.
43
- * Без квоты — триггерит при достижении maxTotalStoredBytes.
44
- * После QuotaExceededError — раньше, на maxTotalStoredBytes * evictionThreshold,
45
- * чтобы не упереться в квоту повторно.
46
- * Очищает с запасом — до maxTotalStoredBytes * evictionTargetPercent.
47
- */
48
- private runEviction;
49
- /**
50
- * Удаляет самые старые по lastAccessAt записи, пока не освободит хотя бы bytesToFree.
51
- * maxBytesPerBatch ограничивает длительность одной транзакции; без лимита — при QuotaExceededError.
52
- */
53
- private evictOldest;
54
- }
@@ -1,59 +0,0 @@
1
- import type { ISegmentCacheStorage, CacheMetadata, CacheMetadataEntry } from "./types";
2
- import type { SubRange } from "./segmentCacheUtils";
3
- export declare enum CacheCheckResultType {
4
- FullHit = "full_hit",
5
- FullMiss = "full_miss",
6
- Partial = "partial"
7
- }
8
- export type CacheCheckResult = {
9
- type: CacheCheckResultType.FullHit;
10
- data: ArrayBuffer;
11
- } | {
12
- type: CacheCheckResultType.FullMiss;
13
- } | {
14
- type: CacheCheckResultType.Partial;
15
- cached: Map<number, ArrayBuffer>;
16
- missingRange: SubRange;
17
- startBuffer: {
18
- buffer: ArrayBuffer;
19
- loaded: number;
20
- } | null;
21
- };
22
- export declare class SegmentCache {
23
- private cacheService;
24
- constructor(cacheService: ISegmentCacheStorage);
25
- getCached(url: string, metadata: CacheMetadata): Promise<CacheCheckResult>;
26
- /**
27
- * Длина записи обязана совпадать с byteRange сегмента: и сборка (assembleFromCached склеивает
28
- * конкатенацией, assembleStartBuffer — по абсолютным смещениям), и кормление буфера адресуют
29
- * сегменты по этим смещениям. Битая запись сдвигает/зануляет весь батч после себя.
30
- * Расхождение = отрава: считаем miss и удаляем ключ — сегмент перекачается и перезапишется.
31
- */
32
- private dropCorruptedEntries;
33
- storeDownloadedSegments({ url, buffer, segments, networkDataOffset, validBytes, onSkipped }: {
34
- url: string;
35
- buffer: ArrayBuffer;
36
- segments: CacheMetadataEntry[];
37
- networkDataOffset?: number;
38
- /**
39
- * Сколько байт в начале buffer содержат реальные данные.
40
- * Может быть меньше buffer.byteLength — при пре-аллокации (bufferOptimisation) хвост буфера остаётся нулями.
41
- */
42
- validBytes?: number;
43
- /**
44
- * Вызывается, если часть сегментов не влезла в validBytes: они не записаны в кэш
45
- * и докачаются как miss при следующем запросе региона.
46
- */
47
- onSkipped?: (segments: CacheMetadataEntry[]) => void;
48
- }): void;
49
- private assembleStartBuffer;
50
- private buildPartialFromCacheStart;
51
- storeMissing({ url, missingRange, networkData, networkDataOffset, validBytes, onSkipped }: {
52
- url: string;
53
- missingRange: SubRange;
54
- networkData: ArrayBuffer;
55
- networkDataOffset?: number;
56
- validBytes?: number;
57
- onSkipped?: (segments: CacheMetadataEntry[]) => void;
58
- }): void;
59
- }
@@ -1,20 +0,0 @@
1
- export declare const DB_NAME = "vk_player_segment_cache";
2
- export declare const DB_VERSION = 1;
3
- export declare const STORE = "cache";
4
- export declare const EVICTION_DEBOUNCE_MS = 5e3;
5
- /** Канал синхронизации инстансов storage (вкладки, несколько плееров на странице) */
6
- export declare const CACHE_EVENTS_CHANNEL = "vk_player_segment_cache_events";
7
- /** Событие полной очистки кэша: получатель сбрасывает in-memory счётчик байт, база уже пуста */
8
- export declare const CACHE_CLEARED_EVENT = "cleared";
9
- /**
10
- * Минимальный интервал между обновлениями lastAccessAt при чтении.
11
- * Без него каждый cache hit делал бы store.put с полным ArrayBuffer ради одного поля.
12
- * При TTL в часы точность LRU до минут не нужна — 5 минут достаточно.
13
- */
14
- export declare const TOUCH_INTERVAL_MS: number;
15
- /** Тип записи: media-сегмент, init-сегмент, index-сегмент */
16
- export declare enum CacheEntryType {
17
- Media = 0,
18
- Init = 1,
19
- Index = 2
20
- }
@@ -1,8 +0,0 @@
1
- export { IndexedDbSegmentCacheStorage } from "./IndexedDbSegmentCacheStorage";
2
- export { SegmentCache, CacheCheckResultType } from "./SegmentCache";
3
- export type { CacheCheckResult } from "./SegmentCache";
4
- export { normalizeSegmentCacheUrl, assemblePartialBuffer, toEntryType, createMediaKey, createInitKey, isQuotaExceededError } from "./segmentCacheUtils";
5
- export type { SubRange } from "./segmentCacheUtils";
6
- export { clearSegmentCacheDb } from "./segmentCacheDb";
7
- export { DB_NAME, DB_VERSION, STORE, EVICTION_DEBOUNCE_MS, CacheEntryType } from "./constants";
8
- export type { ISegmentCacheStorage, CacheMetadata, CacheMetadataEntry, SegmentCacheConfig, SegmentCacheEntry, InitSegmentParams, InitSegmentRangeType, SetMediaSegmentParams, SetInitSegmentParams, SetSegmentParams, CacheRecord, CachePrimaryKey } from "./types";
@@ -1,25 +0,0 @@
1
- export declare const INDEX_BY_LAST_ACCESS = "byLastAccess";
2
- export declare const INDEX_BY_SIZE_AND_AGE = "bySizeAndAge";
3
- export declare const INDEX_BY_LAST_ACCESS_AND_SIZE = "byLastAccessAndSize";
4
- /**
5
- * Открывает базу кэша, при первом создании поднимает store и индексы.
6
- * onOpened (если передан) await-ится до resolve — используется только в clearSegmentCacheDb.
7
- * Инстанс storage не использует onOpened: rehydrate запускается параллельно, чтобы не блокировать чтения.
8
- */
9
- export declare const openSegmentCacheDb: (onOpened?: (db: IDBDatabase) => Promise<void>) => Promise<IDBDatabase>;
10
- /** Выполняет операции в одной readwrite-транзакции, резолвится по её завершении. */
11
- export declare const execStoreTx: (db: IDBDatabase, body: (store: IDBObjectStore) => void) => Promise<void>;
12
- /**
13
- * Гоняет курсор по индексу, вызывая visit на каждой записи.
14
- * visit возвращает false — итерация останавливается, транзакция завершается.
15
- * Работает только внутри execStoreTx: завершение итерации отслеживается транзакцией.
16
- */
17
- export declare const iterateCursor: <T extends IDBCursor>(request: IDBRequest<T | null>, visit: (cursor: T) => boolean) => void;
18
- /** Рассылает событие полной очистки кэша всем инстансам storage (вкладки, другие плееры на странице). */
19
- export declare const broadcastCacheCleared: () => void;
20
- /**
21
- * Полностью очищает кэш без привязки к инстансу storage: можно звать из мест,
22
- * где экземпляр IndexedDbSegmentCacheStorage недоступен (например, из ProviderContainer при ошибках).
23
- * Живые инстансы узнают об очистке через broadcastCacheCleared и сбросят in-memory счётчики.
24
- */
25
- export declare const clearSegmentCacheDb: () => Promise<void>;
@@ -1,25 +0,0 @@
1
- import type { Byte, IRange } from "@vkontakte/videoplayer-shared";
2
- import type { CacheMetadata, CacheMetadataEntry, InitSegmentRangeType, CachePrimaryKey } from "./types";
3
- import { CacheEntryType } from "./constants";
4
- /** Приводит URL к каноническому виду: заменяет hostname на cache.local и удаляет CDN-параметры (sig, expires, bytes, fromCache). */
5
- export declare function normalizeSegmentCacheUrl(url: string): string;
6
- export declare function toEntryType(rangeType: InitSegmentRangeType): CacheEntryType;
7
- export declare function createMediaKey(normalizedUrl: string, segmentIndex: number): CachePrimaryKey;
8
- export declare function createInitKey(normalizedUrl: string, entryType: CacheEntryType, rangeFrom: number, rangeTo: number): CachePrimaryKey;
9
- export declare function isQuotaExceededError(error: unknown): boolean;
10
- export type SubRange = {
11
- range: IRange<Byte>;
12
- segments: CacheMetadataEntry[];
13
- };
14
- /** Проверяет, что сегменты идут подряд по индексам — без разрывов между ними. Ожидает отсортированный массив. */
15
- export declare function isContiguous(segments: CacheMetadataEntry[]): boolean;
16
- /** Склеивает буферы закэшированных сегментов в один ArrayBuffer. Используется при full hit. */
17
- export declare function assembleFromCached(metadata: CacheMetadata, cached: Map<number, ArrayBuffer>): ArrayBuffer;
18
- /** Склеивает закэшированные и сетевые данные в один ArrayBuffer для partial hit. */
19
- export declare function assemblePartialBuffer({ metadata, cached, missingRange, networkData, networkDataOffset }: {
20
- metadata: CacheMetadata;
21
- cached: Map<number, ArrayBuffer>;
22
- missingRange: SubRange;
23
- networkData: ArrayBuffer;
24
- networkDataOffset?: number;
25
- }): ArrayBuffer;
@@ -1,76 +0,0 @@
1
- import type { Byte, IRange } from "@vkontakte/videoplayer-shared";
2
- import type { CacheEntryType } from "./constants";
3
- export type InitSegmentRangeType = "init" | "index";
4
- export interface SegmentCacheEntry {
5
- data: ArrayBuffer;
6
- segmentIndex: number;
7
- }
8
- export interface InitSegmentParams {
9
- normalizedUrl: string;
10
- rangeType: InitSegmentRangeType;
11
- range: IRange<Byte>;
12
- }
13
- export interface SetMediaSegmentParams {
14
- type: "media";
15
- normalizedUrl: string;
16
- segmentIndex: number;
17
- data: ArrayBuffer;
18
- }
19
- export interface SetInitSegmentParams {
20
- type: "init";
21
- normalizedUrl: string;
22
- rangeType: InitSegmentRangeType;
23
- range: IRange<Byte>;
24
- data: ArrayBuffer;
25
- }
26
- export type SetSegmentParams = SetMediaSegmentParams | SetInitSegmentParams;
27
- export interface ISegmentCacheStorage {
28
- getSegments(normalizedUrl: string, indices: number[]): Promise<Map<number, ArrayBuffer>>;
29
- setSegment(params: SetSegmentParams): Promise<void>;
30
- /** Удаляет media-записи по индексам сегментов. Используется для самолечения: запись с несовпадающей длиной удаляется и сегмент перекачивается */
31
- deleteSegments(normalizedUrl: string, indices: number[]): Promise<void>;
32
- getInitSegment(params: InitSegmentParams): Promise<ArrayBuffer | null>;
33
- /** Полная очистка кэша (все записи, без привязки к url) с рассылкой события другим инстансам */
34
- clear(): Promise<void>;
35
- destroy(): void;
36
- }
37
- export interface CacheMetadataEntry {
38
- index: number;
39
- byteRange: IRange<Byte>;
40
- }
41
- export interface CacheMetadata {
42
- segments: CacheMetadataEntry[];
43
- }
44
- export interface SegmentCacheConfig {
45
- /** Включает кэширование media-сегментов в IndexedDB */
46
- enabled: boolean;
47
- /** Лимит суммарного размера кэша (media + init/index сегменты) в байтах. При QuotaExceededError автоматически опускается до текущего размера */
48
- maxTotalSizeBytes: number;
49
- /** Доля от эффективного лимита, при превышении которой запускается LRU-эвикт (0.9 = 90%) */
50
- evictionThreshold: number;
51
- /** Доля от максимального хранимого кэша, до которой LRU-эвикт очищает кэш (0.7 = 70%).
52
- * Должна быть ниже evictionThreshold: запас между ними не даёт эвикту срабатывать на каждую запись у границы лимита
53
- * */
54
- evictionTargetPercent: number;
55
- /** Максимальный объём данных в байтах, который LRU-эвикт удаляет за один проход (ограничивает длительность одной транзакции) */
56
- evictionBatchMaxBytes: number;
57
- /** Доля от maxTotalStoredBytes, которую нужно освободить при QuotaExceededError (0.5 = 50%) */
58
- quotaExceededEvictPercent: number;
59
- /** TTL для media-сегментов в миллисекундах. Протухшие записи удаляются при чтении и при rehydrate */
60
- ttlMs: number;
61
- /** TTL для init/index-сегментов в миллисекундах (обычно длиннее, т.к. они стабильнее) */
62
- initTtlMs: number;
63
- /** Стратегия очистки кэша при ошибках декодера/фетчера: 'once' — один раз за жизнь контейнера, 'always' — на каждую ошибку */
64
- clearOnErrorStrategy: "once" | "always";
65
- }
66
- /**
67
- * Единая запись кэша. Ключ передаётся явно (out-of-line) через createMediaKey / createInitKey.
68
- */
69
- export interface CacheRecord {
70
- normalizedUrl: string;
71
- data: ArrayBuffer;
72
- byteLength: number;
73
- createdAt: number;
74
- lastAccessAt: number;
75
- }
76
- export type CachePrimaryKey = [string, CacheEntryType, number, number];