Add .gitignore to exclude all node packages and lock files
This commit is contained in:
Generated
Vendored
+32
@@ -0,0 +1,32 @@
|
||||
type MediaParserEventMap = {
|
||||
pause: undefined;
|
||||
resume: undefined;
|
||||
abort: {
|
||||
reason?: unknown;
|
||||
};
|
||||
seek: {
|
||||
seek: number;
|
||||
};
|
||||
};
|
||||
export type MediaParserEventTypes = keyof MediaParserEventMap;
|
||||
export type CallbackListener<T extends MediaParserEventTypes> = (data: {
|
||||
detail: MediaParserEventMap[T];
|
||||
}) => void;
|
||||
type MediaParserListeners = {
|
||||
[EventType in MediaParserEventTypes]: CallbackListener<EventType>[];
|
||||
};
|
||||
export declare class MediaParserEmitter {
|
||||
#private;
|
||||
listeners: MediaParserListeners;
|
||||
readyPromise: Promise<void>;
|
||||
constructor();
|
||||
markAsReady: () => void;
|
||||
addEventListener: <Q extends MediaParserEventTypes>(name: Q, callback: CallbackListener<Q>) => void;
|
||||
removeEventListener: <Q extends MediaParserEventTypes>(name: Q, callback: CallbackListener<Q>) => void;
|
||||
private dispatchEvent;
|
||||
dispatchPause: () => void;
|
||||
dispatchResume: () => void;
|
||||
dispatchAbort: (reason?: unknown) => void;
|
||||
dispatchSeek: (seek: number) => void;
|
||||
}
|
||||
export {};
|
||||
Generated
Vendored
+66
@@ -0,0 +1,66 @@
|
||||
"use strict";
|
||||
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
||||
if (kind === "m") throw new TypeError("Private method is not writable");
|
||||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
||||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
||||
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
||||
};
|
||||
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
||||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
||||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
||||
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
||||
};
|
||||
var _MediaParserEmitter_markAsReady;
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.MediaParserEmitter = void 0;
|
||||
const with_resolvers_1 = require("../with-resolvers");
|
||||
class MediaParserEmitter {
|
||||
constructor() {
|
||||
this.listeners = {
|
||||
pause: [],
|
||||
resume: [],
|
||||
abort: [],
|
||||
seek: [],
|
||||
};
|
||||
_MediaParserEmitter_markAsReady.set(this, void 0);
|
||||
this.markAsReady = () => {
|
||||
__classPrivateFieldGet(this, _MediaParserEmitter_markAsReady, "f").call(this);
|
||||
};
|
||||
this.addEventListener = (name, callback) => {
|
||||
this.listeners[name].push(callback);
|
||||
};
|
||||
this.removeEventListener = (name, callback) => {
|
||||
this.listeners[name] = this.listeners[name].filter((l) => l !== callback);
|
||||
};
|
||||
this.dispatchPause = () => {
|
||||
this.readyPromise = this.readyPromise.then(() => {
|
||||
this.dispatchEvent('pause', undefined);
|
||||
});
|
||||
};
|
||||
this.dispatchResume = () => {
|
||||
this.readyPromise = this.readyPromise.then(() => {
|
||||
this.dispatchEvent('resume', undefined);
|
||||
});
|
||||
};
|
||||
this.dispatchAbort = (reason) => {
|
||||
this.readyPromise = this.readyPromise.then(() => {
|
||||
this.dispatchEvent('abort', { reason });
|
||||
});
|
||||
};
|
||||
this.dispatchSeek = (seek) => {
|
||||
this.readyPromise = this.readyPromise.then(() => {
|
||||
this.dispatchEvent('seek', { seek });
|
||||
});
|
||||
};
|
||||
const { promise, resolve } = (0, with_resolvers_1.withResolvers)();
|
||||
this.readyPromise = promise;
|
||||
__classPrivateFieldSet(this, _MediaParserEmitter_markAsReady, resolve, "f");
|
||||
}
|
||||
dispatchEvent(dispatchName, context) {
|
||||
this.listeners[dispatchName].forEach((callback) => {
|
||||
callback({ detail: context });
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.MediaParserEmitter = MediaParserEmitter;
|
||||
_MediaParserEmitter_markAsReady = new WeakMap();
|
||||
Generated
Vendored
+29
@@ -0,0 +1,29 @@
|
||||
import type { SeekingHints } from '../seeking-hints';
|
||||
import type { SeekResolution } from '../work-on-seek-request';
|
||||
import { MediaParserEmitter } from './emitter';
|
||||
import type { PauseSignal } from './pause-signal';
|
||||
import type { PerformedSeeksSignal } from './performed-seeks-stats';
|
||||
import type { SeekSignal } from './seek-signal';
|
||||
export type MediaParserController = {
|
||||
abort: (reason?: any) => void;
|
||||
pause: PauseSignal['pause'];
|
||||
resume: PauseSignal['resume'];
|
||||
seek: SeekSignal['seek'];
|
||||
simulateSeek: (seekInSeconds: number) => Promise<SeekResolution>;
|
||||
addEventListener: MediaParserEmitter['addEventListener'];
|
||||
removeEventListener: MediaParserEmitter['removeEventListener'];
|
||||
getSeekingHints: () => Promise<SeekingHints | null>;
|
||||
/**
|
||||
* @deprecated Not public API
|
||||
*/
|
||||
_internals: {
|
||||
signal: AbortSignal;
|
||||
checkForAbortAndPause: () => Promise<void>;
|
||||
seekSignal: SeekSignal;
|
||||
markAsReadyToEmitEvents: () => void;
|
||||
performedSeeksSignal: PerformedSeeksSignal;
|
||||
attachSeekingHintResolution: (callback: () => Promise<SeekingHints | null>) => void;
|
||||
attachSimulateSeekResolution: (callback: (seekInSeconds: number) => Promise<SeekResolution>) => void;
|
||||
};
|
||||
};
|
||||
export declare const mediaParserController: () => MediaParserController;
|
||||
Generated
Vendored
+75
@@ -0,0 +1,75 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.mediaParserController = void 0;
|
||||
const errors_1 = require("../errors");
|
||||
const emitter_1 = require("./emitter");
|
||||
const pause_signal_1 = require("./pause-signal");
|
||||
const performed_seeks_stats_1 = require("./performed-seeks-stats");
|
||||
const seek_signal_1 = require("./seek-signal");
|
||||
const mediaParserController = () => {
|
||||
const abortController = new AbortController();
|
||||
const emitter = new emitter_1.MediaParserEmitter();
|
||||
const pauseSignal = (0, pause_signal_1.makePauseSignal)(emitter);
|
||||
const seekSignal = (0, seek_signal_1.makeSeekSignal)(emitter);
|
||||
const performedSeeksSignal = (0, performed_seeks_stats_1.performedSeeksStats)();
|
||||
const checkForAbortAndPause = async () => {
|
||||
if (abortController.signal.aborted) {
|
||||
const err = new errors_1.MediaParserAbortError('Aborted');
|
||||
if (abortController.signal.reason) {
|
||||
err.cause = abortController.signal.reason;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
await pauseSignal.waitUntilResume();
|
||||
};
|
||||
let seekingHintResolution = null;
|
||||
let simulateSeekResolution = null;
|
||||
const getSeekingHints = () => {
|
||||
if (!seekingHintResolution) {
|
||||
throw new Error('The mediaParserController() was not yet used in a parseMedia() call');
|
||||
}
|
||||
return seekingHintResolution();
|
||||
};
|
||||
const simulateSeek = (seekInSeconds) => {
|
||||
if (!simulateSeekResolution) {
|
||||
throw new Error('The mediaParserController() was not yet used in a parseMedia() call');
|
||||
}
|
||||
return simulateSeekResolution(seekInSeconds);
|
||||
};
|
||||
const attachSeekingHintResolution = (callback) => {
|
||||
if (seekingHintResolution) {
|
||||
throw new Error('The mediaParserController() was used in multiple parseMedia() calls. Create a separate controller for each call.');
|
||||
}
|
||||
seekingHintResolution = callback;
|
||||
};
|
||||
const attachSimulateSeekResolution = (callback) => {
|
||||
if (simulateSeekResolution) {
|
||||
throw new Error('The mediaParserController() was used in multiple parseMedia() calls. Create a separate controller for each call.');
|
||||
}
|
||||
simulateSeekResolution = callback;
|
||||
};
|
||||
return {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
abort: (reason) => {
|
||||
abortController.abort(reason);
|
||||
emitter.dispatchAbort(reason);
|
||||
},
|
||||
seek: seekSignal.seek,
|
||||
simulateSeek,
|
||||
pause: pauseSignal.pause,
|
||||
resume: pauseSignal.resume,
|
||||
addEventListener: emitter.addEventListener,
|
||||
removeEventListener: emitter.removeEventListener,
|
||||
getSeekingHints,
|
||||
_internals: {
|
||||
signal: abortController.signal,
|
||||
checkForAbortAndPause,
|
||||
seekSignal,
|
||||
markAsReadyToEmitEvents: emitter.markAsReady,
|
||||
performedSeeksSignal,
|
||||
attachSeekingHintResolution,
|
||||
attachSimulateSeekResolution,
|
||||
},
|
||||
};
|
||||
};
|
||||
exports.mediaParserController = mediaParserController;
|
||||
Generated
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
import type { MediaParserEmitter } from './emitter';
|
||||
export type PauseSignal = {
|
||||
pause: () => void;
|
||||
resume: () => void;
|
||||
waitUntilResume: () => Promise<void>;
|
||||
};
|
||||
export declare const makePauseSignal: (emitter: MediaParserEmitter) => {
|
||||
pause: () => void;
|
||||
resume: () => void;
|
||||
waitUntilResume: () => Promise<void>;
|
||||
};
|
||||
Generated
Vendored
+38
@@ -0,0 +1,38 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.makePauseSignal = void 0;
|
||||
const makePauseSignal = (emitter) => {
|
||||
const waiterFns = [];
|
||||
let paused = false;
|
||||
return {
|
||||
pause: () => {
|
||||
if (paused) {
|
||||
return;
|
||||
}
|
||||
emitter.dispatchPause();
|
||||
paused = true;
|
||||
},
|
||||
resume: () => {
|
||||
if (!paused) {
|
||||
return;
|
||||
}
|
||||
paused = false;
|
||||
for (const waiterFn of waiterFns) {
|
||||
waiterFn();
|
||||
}
|
||||
waiterFns.length = 0;
|
||||
emitter.dispatchResume();
|
||||
},
|
||||
waitUntilResume: () => {
|
||||
return new Promise((resolve) => {
|
||||
if (!paused) {
|
||||
resolve();
|
||||
}
|
||||
else {
|
||||
waiterFns.push(resolve);
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
};
|
||||
exports.makePauseSignal = makePauseSignal;
|
||||
Generated
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
export type PerformedSeek = {
|
||||
from: number;
|
||||
to: number;
|
||||
type: 'user-initiated' | 'internal';
|
||||
};
|
||||
export declare const performedSeeksStats: () => {
|
||||
recordSeek: (seek: PerformedSeek) => void;
|
||||
getPerformedSeeks: () => PerformedSeek[];
|
||||
markLastSeekAsUserInitiated: () => void;
|
||||
};
|
||||
export type PerformedSeeksSignal = ReturnType<typeof performedSeeksStats>;
|
||||
Generated
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.performedSeeksStats = void 0;
|
||||
const performedSeeksStats = () => {
|
||||
const performedSeeks = [];
|
||||
const markLastSeekAsUserInitiated = () => {
|
||||
if (performedSeeks.length > 0) {
|
||||
performedSeeks[performedSeeks.length - 1].type = 'user-initiated';
|
||||
}
|
||||
};
|
||||
return {
|
||||
recordSeek: (seek) => {
|
||||
performedSeeks.push(seek);
|
||||
},
|
||||
getPerformedSeeks: () => {
|
||||
return performedSeeks;
|
||||
},
|
||||
markLastSeekAsUserInitiated,
|
||||
};
|
||||
};
|
||||
exports.performedSeeksStats = performedSeeksStats;
|
||||
Generated
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
import type { MediaParserEmitter } from './emitter';
|
||||
export type SeekSignal = {
|
||||
seek: (timeInSeconds: number) => void;
|
||||
getSeek: () => number | null;
|
||||
clearSeekIfStillSame: (previousSeek: number) => {
|
||||
hasChanged: boolean;
|
||||
};
|
||||
};
|
||||
export declare const makeSeekSignal: (emitter: MediaParserEmitter) => SeekSignal;
|
||||
Generated
Vendored
+24
@@ -0,0 +1,24 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.makeSeekSignal = void 0;
|
||||
const makeSeekSignal = (emitter) => {
|
||||
let seek = null;
|
||||
return {
|
||||
seek: (seekRequest) => {
|
||||
seek = seekRequest;
|
||||
emitter.dispatchSeek(seekRequest);
|
||||
},
|
||||
getSeek() {
|
||||
return seek;
|
||||
},
|
||||
// In the meanwhile a new seek could have been queued
|
||||
clearSeekIfStillSame(previousSeek) {
|
||||
if (seek === previousSeek) {
|
||||
seek = null;
|
||||
return { hasChanged: false };
|
||||
}
|
||||
return { hasChanged: true };
|
||||
},
|
||||
};
|
||||
};
|
||||
exports.makeSeekSignal = makeSeekSignal;
|
||||
Reference in New Issue
Block a user