Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hls preconditions #14

Merged
merged 11 commits into from
Dec 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading