UNPKG

@observertc/observer-js

Version:

Server Side NodeJS Library for processing ObserveRTC Samples

111 lines (110 loc) 4.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MediasoupRemoteTrackResolver = void 0; class MediasoupRemoteTrackResolver { observedCall; eventMonitor; _consumerIdToProducerId = new Map(); _producerIdToOutboundTrack = new Map(); _consumerIdToInboundTrack = new Map(); // private _producerIdToOutboundTrack = new Map<string, ObservedOutboundTrack>(); _inboundTrackToConsumerId = new Map(); _producerIdToConsumerIds = new Map(); _outboundTrackToProducerId = new Map(); constructor(observedCall) { this.observedCall = observedCall; this.eventMonitor = this.observedCall.createEventMonitor({}); this.eventMonitor.onInboundTrackAdded = this._addInboundTrack.bind(this); this.eventMonitor.onInboundTrackRemoved = this._removeInboundTrack.bind(this); this.eventMonitor.onOutboundTrackAdded = this._addOutboundTrack.bind(this); this.eventMonitor.onOutboundTrackRemoved = this._removeOutboundTrack.bind(this); // this.eventMonitor.onClientEvent = (client, event) => { // }; } resolveRemoteOutboundTrack(inboundTrack) { const consumerId = this._inboundTrackToConsumerId.get(inboundTrack.id); if (!consumerId) return; const producerId = this._consumerIdToProducerId.get(consumerId); if (!producerId) return; return this._producerIdToOutboundTrack.get(producerId); } resolveRemoteInboundTracks(outboundTrack) { const producerId = this._outboundTrackToProducerId.get(outboundTrack.id); if (!producerId) return; const consumerIds = this._producerIdToConsumerIds.get(producerId); if (!consumerIds) return; return consumerIds .map((consumerId) => this._consumerIdToInboundTrack.get(consumerId)) .filter((inboundTrack) => Boolean(inboundTrack)); } _addInboundTrack(inboundTrack) { const attachments = this._getInboundTrackAttachments(inboundTrack); if (!attachments) return; const { producerId, consumerId } = attachments; this._inboundTrackToConsumerId.set(inboundTrack.id, consumerId); this._consumerIdToProducerId.set(consumerId, producerId); this._consumerIdToInboundTrack.set(consumerId, inboundTrack); let producerConsumers = this._producerIdToConsumerIds.get(producerId); if (!producerConsumers) { producerConsumers = []; this._producerIdToConsumerIds.set(producerId, producerConsumers); } producerConsumers.push(consumerId); } _removeInboundTrack(inboundTrack) { const consumerId = this._inboundTrackToConsumerId.get(inboundTrack.id); if (!consumerId) return; this._inboundTrackToConsumerId.delete(inboundTrack.id); this._consumerIdToProducerId.delete(consumerId); this._consumerIdToInboundTrack.delete(consumerId); const producerConsumers = this._producerIdToConsumerIds.get(consumerId); if (!producerConsumers) return; const filteredProducerConsumers = producerConsumers.filter((id) => id !== consumerId); if (filteredProducerConsumers.length === 0) { this._producerIdToConsumerIds.delete(consumerId); } else { this._producerIdToConsumerIds.set(consumerId, filteredProducerConsumers); } } _addOutboundTrack(outboundTrack) { const attachments = this._getOutboundTrackAttachments(outboundTrack); if (!attachments) return; const { producerId, } = attachments; this._producerIdToOutboundTrack.set(producerId, outboundTrack); this._outboundTrackToProducerId.set(outboundTrack.id, producerId); } _removeOutboundTrack(outboundTrack) { const producerId = this._outboundTrackToProducerId.get(outboundTrack.id); if (!producerId) return; this._producerIdToOutboundTrack.delete(producerId); this._outboundTrackToProducerId.delete(outboundTrack.id); } _getInboundTrackAttachments(inboundTrack) { const { producerId, consumerId } = inboundTrack.attachments ?? {}; if (!producerId || !consumerId || typeof producerId !== 'string' || typeof consumerId !== 'string') return; return { producerId, consumerId }; } _getOutboundTrackAttachments(outboundTrack) { const { producerId, } = outboundTrack.attachments ?? {}; if (!producerId || typeof producerId !== 'string') return; return { producerId, }; } } exports.MediasoupRemoteTrackResolver = MediasoupRemoteTrackResolver;