matrix-react-sdk
Version:
SDK for matrix.org using React
129 lines (123 loc) • 16.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.VoiceBroadcastChunkEvents = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _ = require("..");
/*
Copyright 2024 New Vector Ltd.
Copyright 2022 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
/**
* Voice broadcast chunk collection.
* Orders chunks by sequence (if available) or timestamp.
*/
class VoiceBroadcastChunkEvents {
constructor() {
(0, _defineProperty2.default)(this, "events", []);
(0, _defineProperty2.default)(this, "addOrReplaceEvent", event => {
this.events = this.events.filter(e => !this.equalByTxnIdOrId(event, e));
this.events.push(event);
return true;
});
(0, _defineProperty2.default)(this, "compareBySequence", (a, b) => {
const aSequence = a.getContent()?.[_.VoiceBroadcastChunkEventType]?.sequence || 0;
const bSequence = b.getContent()?.[_.VoiceBroadcastChunkEventType]?.sequence || 0;
return aSequence - bSequence;
});
(0, _defineProperty2.default)(this, "compareByTimestamp", (a, b) => {
return a.getTs() - b.getTs();
});
}
getEvents() {
return [...this.events];
}
getNext(event) {
return this.events[this.events.indexOf(event) + 1];
}
addEvent(event) {
if (this.addOrReplaceEvent(event)) {
this.sort();
}
}
addEvents(events) {
const atLeastOneNew = events.reduce((newSoFar, event) => {
return this.addOrReplaceEvent(event) || newSoFar;
}, false);
if (atLeastOneNew) {
this.sort();
}
}
includes(event) {
return !!this.events.find(e => this.equalByTxnIdOrId(event, e));
}
/**
* @returns {number} Length in milliseconds
*/
getLength() {
return this.events.reduce((length, event) => {
return length + this.calculateChunkLength(event);
}, 0);
}
getLengthSeconds() {
return this.getLength() / 1000;
}
/**
* Returns the accumulated length to (excl.) a chunk event.
*/
getLengthTo(event) {
let length = 0;
for (let i = 0; i < this.events.indexOf(event); i++) {
length += this.calculateChunkLength(this.events[i]);
}
return length;
}
findByTime(time) {
let lengthSoFar = 0;
for (let i = 0; i < this.events.length; i++) {
lengthSoFar += this.calculateChunkLength(this.events[i]);
if (lengthSoFar >= time) {
return this.events[i];
}
}
return null;
}
isLast(event) {
return this.events.indexOf(event) >= this.events.length - 1;
}
getSequenceForEvent(event) {
const sequence = parseInt(event.getContent()?.[_.VoiceBroadcastChunkEventType]?.sequence, 10);
if (!isNaN(sequence)) return sequence;
if (this.events.includes(event)) return this.events.indexOf(event) + 1;
return null;
}
getNumberOfEvents() {
return this.events.length;
}
calculateChunkLength(event) {
return event.getContent()?.["org.matrix.msc1767.audio"]?.duration || event.getContent()?.info?.duration || 0;
}
equalByTxnIdOrId(eventA, eventB) {
return eventA.getTxnId() && eventB.getTxnId() && eventA.getTxnId() === eventB.getTxnId() || eventA.getId() === eventB.getId();
}
/**
* Sort by sequence, if available for all events.
* Else fall back to timestamp.
*/
sort() {
const compareFn = this.allHaveSequence() ? this.compareBySequence : this.compareByTimestamp;
this.events.sort(compareFn);
}
allHaveSequence() {
return !this.events.some(event => {
const sequence = event.getContent()?.[_.VoiceBroadcastChunkEventType]?.sequence;
return parseInt(sequence, 10) !== sequence;
});
}
}
exports.VoiceBroadcastChunkEvents = VoiceBroadcastChunkEvents;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIlZvaWNlQnJvYWRjYXN0Q2h1bmtFdmVudHMiLCJjb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZXZlbnQiLCJldmVudHMiLCJmaWx0ZXIiLCJlIiwiZXF1YWxCeVR4bklkT3JJZCIsInB1c2giLCJhIiwiYiIsImFTZXF1ZW5jZSIsImdldENvbnRlbnQiLCJWb2ljZUJyb2FkY2FzdENodW5rRXZlbnRUeXBlIiwic2VxdWVuY2UiLCJiU2VxdWVuY2UiLCJnZXRUcyIsImdldEV2ZW50cyIsImdldE5leHQiLCJpbmRleE9mIiwiYWRkRXZlbnQiLCJhZGRPclJlcGxhY2VFdmVudCIsInNvcnQiLCJhZGRFdmVudHMiLCJhdExlYXN0T25lTmV3IiwicmVkdWNlIiwibmV3U29GYXIiLCJpbmNsdWRlcyIsImZpbmQiLCJnZXRMZW5ndGgiLCJsZW5ndGgiLCJjYWxjdWxhdGVDaHVua0xlbmd0aCIsImdldExlbmd0aFNlY29uZHMiLCJnZXRMZW5ndGhUbyIsImkiLCJmaW5kQnlUaW1lIiwidGltZSIsImxlbmd0aFNvRmFyIiwiaXNMYXN0IiwiZ2V0U2VxdWVuY2VGb3JFdmVudCIsInBhcnNlSW50IiwiaXNOYU4iLCJnZXROdW1iZXJPZkV2ZW50cyIsImR1cmF0aW9uIiwiaW5mbyIsImV2ZW50QSIsImV2ZW50QiIsImdldFR4bklkIiwiZ2V0SWQiLCJjb21wYXJlRm4iLCJhbGxIYXZlU2VxdWVuY2UiLCJjb21wYXJlQnlTZXF1ZW5jZSIsImNvbXBhcmVCeVRpbWVzdGFtcCIsInNvbWUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZvaWNlLWJyb2FkY2FzdC91dGlscy9Wb2ljZUJyb2FkY2FzdENodW5rRXZlbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IE1hdHJpeEV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyBWb2ljZUJyb2FkY2FzdENodW5rRXZlbnRUeXBlIH0gZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogVm9pY2UgYnJvYWRjYXN0IGNodW5rIGNvbGxlY3Rpb24uXG4gKiBPcmRlcnMgY2h1bmtzIGJ5IHNlcXVlbmNlIChpZiBhdmFpbGFibGUpIG9yIHRpbWVzdGFtcC5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvaWNlQnJvYWRjYXN0Q2h1bmtFdmVudHMge1xuICAgIHByaXZhdGUgZXZlbnRzOiBNYXRyaXhFdmVudFtdID0gW107XG5cbiAgICBwdWJsaWMgZ2V0RXZlbnRzKCk6IE1hdHJpeEV2ZW50W10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuZXZlbnRzXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmV4dChldmVudDogTWF0cml4RXZlbnQpOiBNYXRyaXhFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50c1t0aGlzLmV2ZW50cy5pbmRleE9mKGV2ZW50KSArIDFdO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFdmVudChldmVudDogTWF0cml4RXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkT3JSZXBsYWNlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFdmVudHMoZXZlbnRzOiBNYXRyaXhFdmVudFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGF0TGVhc3RPbmVOZXcgPSBldmVudHMucmVkdWNlKChuZXdTb0ZhcjogYm9vbGVhbiwgZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRPclJlcGxhY2VFdmVudChldmVudCkgfHwgbmV3U29GYXI7XG4gICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICBpZiAoYXRMZWFzdE9uZU5ldykge1xuICAgICAgICAgICAgdGhpcy5zb3J0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5jbHVkZXMoZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZXZlbnRzLmZpbmQoKGUpID0+IHRoaXMuZXF1YWxCeVR4bklkT3JJZChldmVudCwgZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IExlbmd0aCBpbiBtaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5yZWR1Y2UoKGxlbmd0aDogbnVtYmVyLCBldmVudDogTWF0cml4RXZlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBsZW5ndGggKyB0aGlzLmNhbGN1bGF0ZUNodW5rTGVuZ3RoKGV2ZW50KTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExlbmd0aFNlY29uZHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGVuZ3RoKCkgLyAxMDAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIGxlbmd0aCB0byAoZXhjbC4pIGEgY2h1bmsgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIGdldExlbmd0aFRvKGV2ZW50OiBNYXRyaXhFdmVudCk6IG51bWJlciB7XG4gICAgICAgIGxldCBsZW5ndGggPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ldmVudHMuaW5kZXhPZihldmVudCk7IGkrKykge1xuICAgICAgICAgICAgbGVuZ3RoICs9IHRoaXMuY2FsY3VsYXRlQ2h1bmtMZW5ndGgodGhpcy5ldmVudHNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZEJ5VGltZSh0aW1lOiBudW1iZXIpOiBNYXRyaXhFdmVudCB8IG51bGwge1xuICAgICAgICBsZXQgbGVuZ3RoU29GYXIgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxlbmd0aFNvRmFyICs9IHRoaXMuY2FsY3VsYXRlQ2h1bmtMZW5ndGgodGhpcy5ldmVudHNbaV0pO1xuXG4gICAgICAgICAgICBpZiAobGVuZ3RoU29GYXIgPj0gdGltZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV2ZW50c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0xhc3QoZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5pbmRleE9mKGV2ZW50KSA+PSB0aGlzLmV2ZW50cy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZXF1ZW5jZUZvckV2ZW50KGV2ZW50OiBNYXRyaXhFdmVudCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBzZXF1ZW5jZSA9IHBhcnNlSW50KGV2ZW50LmdldENvbnRlbnQoKT8uW1ZvaWNlQnJvYWRjYXN0Q2h1bmtFdmVudFR5cGVdPy5zZXF1ZW5jZSwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHNlcXVlbmNlKSkgcmV0dXJuIHNlcXVlbmNlO1xuXG4gICAgICAgIGlmICh0aGlzLmV2ZW50cy5pbmNsdWRlcyhldmVudCkpIHJldHVybiB0aGlzLmV2ZW50cy5pbmRleE9mKGV2ZW50KSArIDE7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE51bWJlck9mRXZlbnRzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDaHVua0xlbmd0aChldmVudDogTWF0cml4RXZlbnQpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gZXZlbnQuZ2V0Q29udGVudCgpPy5bXCJvcmcubWF0cml4Lm1zYzE3NjcuYXVkaW9cIl0/LmR1cmF0aW9uIHx8IGV2ZW50LmdldENvbnRlbnQoKT8uaW5mbz8uZHVyYXRpb24gfHwgMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE9yUmVwbGFjZUV2ZW50ID0gKGV2ZW50OiBNYXRyaXhFdmVudCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICB0aGlzLmV2ZW50cyA9IHRoaXMuZXZlbnRzLmZpbHRlcigoZSkgPT4gIXRoaXMuZXF1YWxCeVR4bklkT3JJZChldmVudCwgZSkpO1xuICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZXF1YWxCeVR4bklkT3JJZChldmVudEE6IE1hdHJpeEV2ZW50LCBldmVudEI6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZXZlbnRBLmdldFR4bklkKCkgJiYgZXZlbnRCLmdldFR4bklkKCkgJiYgZXZlbnRBLmdldFR4bklkKCkgPT09IGV2ZW50Qi5nZXRUeG5JZCgpKSB8fFxuICAgICAgICAgICAgZXZlbnRBLmdldElkKCkgPT09IGV2ZW50Qi5nZXRJZCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydCBieSBzZXF1ZW5jZSwgaWYgYXZhaWxhYmxlIGZvciBhbGwgZXZlbnRzLlxuICAgICAqIEVsc2UgZmFsbCBiYWNrIHRvIHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNvcnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmVGbiA9IHRoaXMuYWxsSGF2ZVNlcXVlbmNlKCkgPyB0aGlzLmNvbXBhcmVCeVNlcXVlbmNlIDogdGhpcy5jb21wYXJlQnlUaW1lc3RhbXA7XG4gICAgICAgIHRoaXMuZXZlbnRzLnNvcnQoY29tcGFyZUZuKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXBhcmVCeVNlcXVlbmNlID0gKGE6IE1hdHJpeEV2ZW50LCBiOiBNYXRyaXhFdmVudCk6IG51bWJlciA9PiB7XG4gICAgICAgIGNvbnN0IGFTZXF1ZW5jZSA9IGEuZ2V0Q29udGVudCgpPy5bVm9pY2VCcm9hZGNhc3RDaHVua0V2ZW50VHlwZV0/LnNlcXVlbmNlIHx8IDA7XG4gICAgICAgIGNvbnN0IGJTZXF1ZW5jZSA9IGIuZ2V0Q29udGVudCgpPy5bVm9pY2VCcm9hZGNhc3RDaHVua0V2ZW50VHlwZV0/LnNlcXVlbmNlIHx8IDA7XG4gICAgICAgIHJldHVybiBhU2VxdWVuY2UgLSBiU2VxdWVuY2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgY29tcGFyZUJ5VGltZXN0YW1wID0gKGE6IE1hdHJpeEV2ZW50LCBiOiBNYXRyaXhFdmVudCk6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiBhLmdldFRzKCkgLSBiLmdldFRzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYWxsSGF2ZVNlcXVlbmNlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZXZlbnRzLnNvbWUoKGV2ZW50OiBNYXRyaXhFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VxdWVuY2UgPSBldmVudC5nZXRDb250ZW50KCk/LltWb2ljZUJyb2FkY2FzdENodW5rRXZlbnRUeXBlXT8uc2VxdWVuY2U7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoc2VxdWVuY2Us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