51 lines
1.9 KiB
JavaScript
51 lines
1.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.makeProgressTracker = void 0;
|
|
const event_emitter_1 = require("./event-emitter");
|
|
// Make sure to distinguish null and undefined here
|
|
const makeProgressTracker = () => {
|
|
const trackNumberProgresses = {};
|
|
const eventEmitter = new event_emitter_1.IoEventEmitter();
|
|
let startingTimestamp = null;
|
|
const setPossibleLowestTimestamp = (timestamp) => {
|
|
if (startingTimestamp === null) {
|
|
startingTimestamp = timestamp;
|
|
}
|
|
else {
|
|
startingTimestamp = Math.min(startingTimestamp, timestamp);
|
|
}
|
|
};
|
|
const getSmallestProgress = () => {
|
|
const progressValues = Object.values(trackNumberProgresses).map((p) => {
|
|
if (p !== null) {
|
|
return p;
|
|
}
|
|
// The starting timestamp might not be 0, it might be very huge
|
|
// If no sample has arrived yet, we should assume the smallest value
|
|
// we know as the progress
|
|
if (startingTimestamp === null) {
|
|
throw new Error('No progress values to calculate smallest progress from');
|
|
}
|
|
return startingTimestamp;
|
|
});
|
|
return Math.min(...progressValues);
|
|
};
|
|
return {
|
|
registerTrack: (trackNumber) => {
|
|
trackNumberProgresses[trackNumber] = null;
|
|
},
|
|
getSmallestProgress,
|
|
updateTrackProgress: (trackNumber, progress) => {
|
|
if (trackNumberProgresses[trackNumber] === undefined) {
|
|
throw new Error(`Tried to update progress for a track that was not registered: ${trackNumber}`);
|
|
}
|
|
trackNumberProgresses[trackNumber] = progress;
|
|
eventEmitter.dispatchEvent('progress', {
|
|
smallestProgress: getSmallestProgress(),
|
|
});
|
|
},
|
|
setPossibleLowestTimestamp,
|
|
};
|
|
};
|
|
exports.makeProgressTracker = makeProgressTracker;
|