Skip to content

Commit

Permalink
Hls preconditions (#14)
Browse files Browse the repository at this point in the history
* feat: add player time ranges

* chore: refacotr player and add basic tests

* chore: add logger level tests

* chore: add mute/unmute tests

* chore: add parser deps for types

* fix: update dispose method

* chore: restructure files

* chore: update bun.lockb

* chore: add factory for networkManager

* chore: update pipelines

---------

Co-authored-by: Dzianis Dashkevich <ddashkevich@brightcove.com>
  • Loading branch information
dzianis-dashkevich and Dzianis Dashkevich authored Dec 16, 2023
1 parent 63c207e commit da14e73
Show file tree
Hide file tree
Showing 28 changed files with 832 additions and 252 deletions.
Binary file modified bun.lockb
Binary file not shown.
4 changes: 4 additions & 0 deletions packages/playback/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
"test": "bunx jest",
"test:coverage": "bunx jest --coverage=true"
},
"dependencies": {
"@videojs/hls-parser": "*",
"@videojs/dash-parser": "*"
},
"exports": {
"./player": {
"types": "./dist/player.d.ts",
Expand Down
5 changes: 0 additions & 5 deletions packages/playback/src/lib/configuration.ts

This file was deleted.

74 changes: 0 additions & 74 deletions packages/playback/src/lib/errors.ts

This file was deleted.

35 changes: 0 additions & 35 deletions packages/playback/src/lib/events.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import {
RequestInterceptorNetworkError,
ResponseInterceptorNetworkError,
TimeoutNetworkError,
} from './errors';
import type { RetryWrapperOptions } from './utils/retryWrapper';
import RetryWrapper from './utils/retryWrapper';
import type Logger from './utils/logger';
} from './networkManagerErrors';
import type { RetryWrapperOptions } from '../utils/retryWrapper';
import RetryWrapper from '../utils/retryWrapper';
import type Logger from '../utils/logger';

export enum RequestType {
InitSegment,
Expand Down Expand Up @@ -40,14 +40,22 @@ interface NetworkRequestWithProgressiveResponse {
done: Promise<void>;
}

interface NetworkManagerDependencies {
logger: Logger;
}

export default class NetworkManager {
public static create(dependencies: NetworkManagerDependencies): NetworkManager {
return new NetworkManager(dependencies);
}

private readonly requestInterceptors = new Map<RequestType, Array<RequestInterceptor>>();
private readonly responseHandlers = new Map<RequestType, Array<ResponseHandler>>();

private readonly logger: Logger;

public constructor(logger: Logger) {
this.logger = logger.createSubLogger('NetworkManager');
public constructor(dependencies: NetworkManagerDependencies) {
this.logger = dependencies.logger;
}

private add<T>(type: RequestType, interceptor: T, interceptors: Map<RequestType, Array<T>>): void {
Expand Down Expand Up @@ -160,7 +168,7 @@ export default class NetworkManager {
headersReceived
.then((response) => this.applyResponseHandlers(type, response))
.catch((e) => {
this.logger.debug('Error cached from response handlers: ', e);
this.logger.debug('Error catched from response handlers: ', e);
});

return { done, abort };
Expand Down Expand Up @@ -205,7 +213,7 @@ export default class NetworkManager {
headersReceived
.then((response) => this.applyResponseHandlers(type, response))
.catch((e) => {
this.logger.debug('Error cached from response handlers: ', e);
this.logger.debug('Error catched from response handlers: ', e);
});

return { done, abort };
Expand Down
27 changes: 27 additions & 0 deletions packages/playback/src/lib/network/networkManagerErrors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
export class RequestInterceptorNetworkError extends Error {}

export class ResponseInterceptorNetworkError extends Error {}

export class RequestAbortedNetworkError extends Error {}

export class TimeoutNetworkError extends Error {}

export class BadStatusNetworkError extends Error {
public readonly response: Response;

public constructor(response: Response) {
super();

this.response = response;
}
}

export class FetchError extends Error {
public readonly fetchError: TypeError;

public constructor(fetchError: TypeError) {
super();

this.fetchError = fetchError;
}
}
33 changes: 32 additions & 1 deletion packages/playback/src/lib/pipelines/basePipeline.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,35 @@
import type NetworkManager from '../network/networkManager';
import type Logger from '../utils/logger';

interface PipelineDependencies {
logger: Logger;
}

export default abstract class Pipeline {
public abstract loadRemoteAsset(uri: string): void;
private readonly logger: Logger;

public constructor(dependencies: PipelineDependencies) {
this.logger = dependencies.logger;
}

protected mapProtocolToNetworkManager = new Map<string, NetworkManager>();

public loadRemoteAsset(uri: URL): void {
const networkManager = this.mapProtocolToNetworkManager.get(uri.protocol);

if (!networkManager) {
// trigger error;
return;
}

return this.loadRemoteAssetWithNetworkManager(uri, networkManager);
}

public abstract loadRemoteAssetWithNetworkManager(uri: URL, networkManager: NetworkManager): void;

public abstract loadLocalAsset(asset: string | ArrayBuffer): void;

public setMapProtocolToNetworkManager(map: Map<string, NetworkManager>): void {
this.mapProtocolToNetworkManager = map;
}
}
1 change: 1 addition & 0 deletions packages/playback/src/lib/pipelines/consts/events.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const PipelineEvents = {} as const;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export interface PipelinePlayerEventTypeToEventMap {}
21 changes: 17 additions & 4 deletions packages/playback/src/lib/pipelines/mse/dash/dashPipeline.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,26 @@
import MsePipeLine from '../msePipeline';
import type NetworkManager from '../../../network/networkManager';

export default class DashPipeline extends MsePipeLine {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public loadLocalAsset(asset: string | ArrayBuffer): void {
//TODO
public loadRemoteAssetWithNetworkManager(uri: URL, networkManager: NetworkManager): void {
// if (this.progressiveParser) {
// load and parse progressively
// }
// if (this.fullPlaylistParser) {
// load and parse sequentially
// }
//trigger error;
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
public loadRemoteAsset(uri: string): void {
//TODO
public loadLocalAsset(asset: string | ArrayBuffer): void {
// if (this.fullPlaylistParser) {
// just parse
// }
// if (this.progressiveParser) {
// push
// }
// trigger error;
}
}
37 changes: 33 additions & 4 deletions packages/playback/src/lib/pipelines/mse/hls/hlsPipeline.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,42 @@
import type { FullPlaylistParser, ProgressiveParser } from '@videojs/hls-parser';
import MsePipeLine from '../msePipeline';
import type NetworkManager from '../../../network/networkManager';

export default class HlsPipeline extends MsePipeLine {
private progressiveParser: ProgressiveParser | null = null;
private fullPlaylistParser: FullPlaylistParser | null = null;

public setProgressiveParser(parser: ProgressiveParser): void {
this.progressiveParser = parser;
}

public setFullPlaylistParser(parser: FullPlaylistParser): void {
this.fullPlaylistParser = parser;
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
public loadLocalAsset(asset: string | ArrayBuffer): void {
//TODO
public loadRemoteAssetWithNetworkManager(uri: URL, networkManager: NetworkManager): void {
if (this.progressiveParser) {
// load and parse progressively
}

if (this.fullPlaylistParser) {
// load and parse sequentially
}

//trigger error;
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
public loadRemoteAsset(uri: string): void {
//TODO
public loadLocalAsset(asset: string | ArrayBuffer): void {
if (this.fullPlaylistParser) {
// just parse
}

if (this.progressiveParser) {
// push
}

// trigger error;
}
}
3 changes: 2 additions & 1 deletion packages/playback/src/lib/pipelines/mse/msePipeline.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import Pipeline from '../basePipeline';
import type NetworkManager from '../../network/networkManager';

export default abstract class MsePipeLine extends Pipeline {
public abstract loadLocalAsset(asset: string | ArrayBuffer): void;

public abstract loadRemoteAsset(uri: string): void;
public abstract loadRemoteAssetWithNetworkManager(uri: URL, networkManager: NetworkManager): void;
}
5 changes: 2 additions & 3 deletions packages/playback/src/lib/pipelines/native/nativePipeline.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Pipeline from '../basePipeline';
import type NetworkManager from '../../network/networkManager';

export default class NativePipeline extends Pipeline {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
Expand All @@ -7,7 +8,5 @@ export default class NativePipeline extends Pipeline {
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
public loadRemoteAsset(uri: string): void {
//TODO
}
public loadRemoteAssetWithNetworkManager(uri: URL, networkManager: NetworkManager): void {}
}
24 changes: 24 additions & 0 deletions packages/playback/src/lib/player/configuration/configuration.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// interface NetworkConfiguration {
// maxAttempts: number;
// delay: number;
// delayFactor: number;
// fuzzFactor: number;
// timeout: number;
// }
//
// interface StreamingConfiguration {
// network: NetworkConfiguration;
// }
//
// interface HlsConfiguration extends StreamingConfiguration {}
//
// interface DashConfiguration extends StreamingConfiguration {}
//
// export interface PlayerConfiguration {
// hls: HlsConfiguration;
// dash: DashConfiguration;
// }

interface PlayerConfiguration {}

export const createDefaultConfiguration = (): PlayerConfiguration => ({});
14 changes: 14 additions & 0 deletions packages/playback/src/lib/player/consts/errors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export const ErrorCategory = {
Pipeline: 'Pipeline',
Network: 'Network',
} as const;

export const PipelineErrorCodes = {
NoSupportedPipeline: 'NoSupportedPipeline',
} as const;

export const NetworkErrorCodes = {
NoNetworkManagerRegisteredForProtocol: 'NoNetworkManagerRegisteredForProtocol',
} as const;

export type ErrorCode = keyof typeof PipelineErrorCodes | keyof typeof NetworkErrorCodes;
Loading

0 comments on commit da14e73

Please sign in to comment.