@vkontakte/videoplayer-core 2.0.179-dev.4cee6bcff.0 → 2.0.179-dev.62f578567.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.
- package/es2015.cjs +17 -17
- package/es2015.esm.js +16 -16
- package/esnext.cjs +16 -16
- package/esnext.esm.js +15 -15
- package/evergreen.esm.js +16 -16
- package/package.json +2 -2
- package/types/player/Player.d.ts +1 -1
- package/types/player/types.d.ts +2 -0
- package/types/providers/DashProvider/lib/buffer.d.ts +2 -0
- package/types/providers/DashProvider/lib/fetcher.d.ts +9 -4
- package/types/providers/DashProvider/lib/player.d.ts +1 -0
- package/types/providers/DashProviderVirtual/lib/buffer/types.d.ts +2 -0
- package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/baseVirtualBufferManager.d.ts +3 -1
- package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/byteRangeVirtualBufferManager.d.ts +1 -0
- package/types/providers/DashProviderVirtual/lib/fetcher.d.ts +9 -4
- package/types/providers/DashProviderVirtual/lib/player/basePlayer.d.ts +5 -2
- package/types/providers/ProviderContainer/index.d.ts +3 -0
- package/types/providers/types.d.ts +2 -2
- package/types/providers/utils/Abr/abrController.d.ts +7 -4
- package/types/providers/utils/Abr/controllers/historyController.d.ts +67 -0
- package/types/providers/utils/Abr/controllers/oscillationController.d.ts +83 -0
- package/types/providers/utils/Abr/controllers/trackOutcomeController.d.ts +53 -0
- package/types/providers/utils/Abr/rules/video/banBasedOnHistoryRule.d.ts +17 -0
- package/types/providers/utils/Abr/types.d.ts +6 -3
- package/types/providers/utils/Abr/utils.d.ts +1 -0
- package/types/providers/utils/segmentCache/IndexedDbSegmentCacheStorage.d.ts +54 -0
- package/types/providers/utils/segmentCache/MediaSegmentBatchCache.d.ts +59 -0
- package/types/providers/utils/segmentCache/constants.d.ts +20 -0
- package/types/providers/utils/segmentCache/index.d.ts +8 -0
- package/types/providers/utils/segmentCache/segmentCacheDb.d.ts +25 -0
- package/types/providers/utils/segmentCache/segmentCacheUtils.d.ts +25 -0
- package/types/providers/utils/segmentCache/types.d.ts +85 -0
- package/types/utils/tuningConfig.d.ts +8 -9
- package/types/providers/DashProvider/lib/urlsCache.d.ts +0 -23
- package/types/providers/DashProviderVirtual/lib/urlsCache.d.ts +0 -22
- package/types/providers/utils/Abr/trackHistory.d.ts +0 -9
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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 MediaSegmentBatchCache {
|
|
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
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { IndexedDbSegmentCacheStorage } from "./IndexedDbSegmentCacheStorage";
|
|
2
|
+
export { MediaSegmentBatchCache, CacheCheckResultType } from "./MediaSegmentBatchCache";
|
|
3
|
+
export type { CacheCheckResult } from "./MediaSegmentBatchCache";
|
|
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, SegmentCacheMode, SegmentCacheEntry, InitSegmentParams, InitSegmentRangeType, SetMediaSegmentParams, SetInitSegmentParams, SetSegmentParams, CacheRecord, CachePrimaryKey } from "./types";
|
|
@@ -0,0 +1,25 @@
|
|
|
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>;
|
|
@@ -0,0 +1,25 @@
|
|
|
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;
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
/**
|
|
45
|
+
* Режим кэширования в IndexedDB:
|
|
46
|
+
* - 'none' — кэш выключен, сервис не создаётся;
|
|
47
|
+
* - 'all' — кэшируются media-сегменты и init/index;
|
|
48
|
+
* - 'init' — кэшируются только init/index: фетчер не создаёт media-обёртку MediaSegmentBatchCache,
|
|
49
|
+
* сервис используется напрямую для init/index. Media-записи, оставшиеся в базе от режима
|
|
50
|
+
* 'all', не читаются и не перезаписываются — эксперимент по init-кэшу должен быть чистым.
|
|
51
|
+
*/
|
|
52
|
+
export type SegmentCacheMode = "none" | "all" | "init";
|
|
53
|
+
export interface SegmentCacheConfig {
|
|
54
|
+
/** Режим кэширования: 'all' — сегменты и init/index, 'init' — только init/index, 'none' — выключен */
|
|
55
|
+
mode: SegmentCacheMode;
|
|
56
|
+
/** Лимит суммарного размера кэша (media + init/index сегменты) в байтах. При QuotaExceededError автоматически опускается до текущего размера */
|
|
57
|
+
maxTotalSizeBytes: number;
|
|
58
|
+
/** Доля от эффективного лимита, при превышении которой запускается LRU-эвикт (0.9 = 90%) */
|
|
59
|
+
evictionThreshold: number;
|
|
60
|
+
/** Доля от максимального хранимого кэша, до которой LRU-эвикт очищает кэш (0.7 = 70%).
|
|
61
|
+
* Должна быть ниже evictionThreshold: запас между ними не даёт эвикту срабатывать на каждую запись у границы лимита
|
|
62
|
+
* */
|
|
63
|
+
evictionTargetPercent: number;
|
|
64
|
+
/** Максимальный объём данных в байтах, который LRU-эвикт удаляет за один проход (ограничивает длительность одной транзакции) */
|
|
65
|
+
evictionBatchMaxBytes: number;
|
|
66
|
+
/** Доля от maxTotalStoredBytes, которую нужно освободить при QuotaExceededError (0.5 = 50%) */
|
|
67
|
+
quotaExceededEvictPercent: number;
|
|
68
|
+
/** TTL для media-сегментов в миллисекундах. Протухшие записи удаляются при чтении и при rehydrate */
|
|
69
|
+
ttlMs: number;
|
|
70
|
+
/** TTL для init/index-сегментов в миллисекундах (обычно длиннее, т.к. они стабильнее) */
|
|
71
|
+
initTtlMs: number;
|
|
72
|
+
/** Стратегия очистки кэша при ошибках декодера/фетчера: 'once' — один раз за жизнь контейнера, 'always' — на каждую ошибку */
|
|
73
|
+
clearOnErrorStrategy: "once" | "always";
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Единая запись кэша. Ключ передаётся явно (out-of-line) через createMediaKey / createInitKey.
|
|
77
|
+
*/
|
|
78
|
+
export interface CacheRecord {
|
|
79
|
+
normalizedUrl: string;
|
|
80
|
+
data: ArrayBuffer;
|
|
81
|
+
byteLength: number;
|
|
82
|
+
createdAt: number;
|
|
83
|
+
lastAccessAt: number;
|
|
84
|
+
}
|
|
85
|
+
export type CachePrimaryKey = [string, CacheEntryType, number, number];
|
|
@@ -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 { SegmentCacheConfig } from "../providers/utils/segmentCache/types";
|
|
8
9
|
export type ITuningConfig = {
|
|
9
10
|
/** @deprecated */
|
|
10
11
|
configName?: string[];
|
|
@@ -132,6 +133,12 @@ export type ITuningConfig = {
|
|
|
132
133
|
considerPlaybackRate: boolean;
|
|
133
134
|
trackCooldownIncreaseQuality: Milliseconds;
|
|
134
135
|
trackCooldownDecreaseQuality: Milliseconds;
|
|
136
|
+
oscillationCooldownEnabled: boolean;
|
|
137
|
+
trackOutcomeEnabled: boolean;
|
|
138
|
+
trackProbationMs: Milliseconds;
|
|
139
|
+
trackBanAfterFails: number;
|
|
140
|
+
trackBanMs: Milliseconds;
|
|
141
|
+
trackBanWindowMs: Milliseconds;
|
|
135
142
|
backgroundVideoQualityLimit: VideoQuality;
|
|
136
143
|
activeVideoAreaThreshold: number;
|
|
137
144
|
trafficSavingLimit: ExactVideoQuality;
|
|
@@ -472,15 +479,6 @@ export type ITuningConfig = {
|
|
|
472
479
|
*/
|
|
473
480
|
handleExtendedNetworkErrorsSet?: boolean;
|
|
474
481
|
/**
|
|
475
|
-
* Кэшируем ответы от сервера руками, так как из за динамичесокй природы некоторых параметров в урле
|
|
476
|
-
* браузер это не может сделать.
|
|
477
|
-
*/
|
|
478
|
-
useUrlCacheMechanism?: boolean;
|
|
479
|
-
/**
|
|
480
|
-
* Очищаем кэш урлов при падение провайдера.
|
|
481
|
-
*/
|
|
482
|
-
dropUrlCacheWhenProviderCrashed?: boolean;
|
|
483
|
-
/**
|
|
484
482
|
* При смене/реините провайдера игнорируем результат того, смогло видео заиграть или нет.
|
|
485
483
|
*/
|
|
486
484
|
ignoreForcePlayResultWhenProviderChanged?: boolean;
|
|
@@ -508,6 +506,7 @@ export type ITuningConfig = {
|
|
|
508
506
|
* провайдер по-прежнему ждёт canplay, чтобы play() не вызывался до появления данных.
|
|
509
507
|
*/
|
|
510
508
|
readyOnLoadedMetadata: boolean;
|
|
509
|
+
segmentCache: SegmentCacheConfig;
|
|
511
510
|
};
|
|
512
511
|
export type IOptionalTuningConfig = RecursivePartial<ITuningConfig>;
|
|
513
512
|
export declare const fillDefault: (partial: IOptionalTuningConfig) => ITuningConfig;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export type CacheManager = {
|
|
2
|
-
get: () => Promise<Response | null>;
|
|
3
|
-
set: (response: Response) => void;
|
|
4
|
-
};
|
|
5
|
-
/**
|
|
6
|
-
* Пытаемся добиться кэширования вызовов.
|
|
7
|
-
* Сейчас есть проблема, что expires и sig меняются, хотя контент не меняется, поэтому ходим мимо кэша.
|
|
8
|
-
* Из за этого обрабатываем кэш вручную.
|
|
9
|
-
*/
|
|
10
|
-
export declare const createCacheManager: (url: string) => Promise<CacheManager>;
|
|
11
|
-
export declare function canUseCacheApi(): boolean;
|
|
12
|
-
export declare function normalizeUrl(url: string): string;
|
|
13
|
-
/**
|
|
14
|
-
* Проверяет, не просрочен ли кэшированный ответ
|
|
15
|
-
*/
|
|
16
|
-
export declare function isResponseExpired(response: Response): boolean;
|
|
17
|
-
export declare function cloneResponse(response: Response, url: string): Response;
|
|
18
|
-
/**
|
|
19
|
-
* Извлекает expires из оригинального URL (параметр expires1)
|
|
20
|
-
* Предполагается, что expires1 — timestamp в секундах
|
|
21
|
-
*/
|
|
22
|
-
export declare function getExpiresFromUrl(url: string): number;
|
|
23
|
-
export declare const dropUrlsCache: () => Promise<void>;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export type CacheManager = {
|
|
2
|
-
get: () => Promise<Response | null>;
|
|
3
|
-
set: (response: Response) => Promise<void>;
|
|
4
|
-
};
|
|
5
|
-
/**
|
|
6
|
-
* Пытаемся добиться кэширования вызовов.
|
|
7
|
-
* Сейчас есть проблема, что expires и sig меняются, хотя контент не меняется, поэтому ходим мимо кэша.
|
|
8
|
-
* Из за этого обрабатываем кэш вручную.
|
|
9
|
-
*/
|
|
10
|
-
export declare const createCacheManager: (url: string) => Promise<CacheManager>;
|
|
11
|
-
export declare function canUseCacheApi(): boolean;
|
|
12
|
-
export declare function normalizeUrl(url: string): string;
|
|
13
|
-
/**
|
|
14
|
-
* Проверяет, не просрочен ли кэшированный ответ
|
|
15
|
-
*/
|
|
16
|
-
export declare function isResponseExpired(response: Response): boolean;
|
|
17
|
-
export declare function cloneResponse(response: Response, url: string): Response;
|
|
18
|
-
/**
|
|
19
|
-
* Извлекает expires из оригинального URL (параметр expires1)
|
|
20
|
-
* Предполагается, что expires1 — timestamp в секундах
|
|
21
|
-
*/
|
|
22
|
-
export declare function getExpiresFromUrl(url: string): number;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { IBaseTrack } from "../../../player/types";
|
|
2
|
-
import type { Milliseconds } from "@vkontakte/videoplayer-shared";
|
|
3
|
-
export declare class TrackHistory<T extends IBaseTrack> {
|
|
4
|
-
last: T | undefined;
|
|
5
|
-
history: Record<IBaseTrack["id"], Milliseconds>;
|
|
6
|
-
recordSelection(track: T): void;
|
|
7
|
-
recordSwitch(track: T | undefined): void;
|
|
8
|
-
clear(): void;
|
|
9
|
-
}
|