@observertc/samples-encoder
Version:
ObserveRTC Library for Encoding Samples
345 lines (344 loc) • 16.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PeerConnectionSampleEncoder = void 0;
const MediaPlayoutEncoder_1 = require("./MediaPlayoutEncoder");
const CertificateEncoder_1 = require("./CertificateEncoder");
const CodecStatsEncoder_1 = require("./CodecStatsEncoder");
const DataChannelEncoder_1 = require("./DataChannelEncoder");
const IceCandidateEncoder_1 = require("./IceCandidateEncoder");
const IceCandidatePairStatsEncoder_1 = require("./IceCandidatePairStatsEncoder");
const IceTransportEncoder_1 = require("./IceTransportEncoder");
const InboundRtpEncoder_1 = require("./InboundRtpEncoder");
const InboundTrackEncoder_1 = require("./InboundTrackEncoder");
const MediaSourceEncoder_1 = require("./MediaSourceEncoder");
const OutboundRtpEncoder_1 = require("./OutboundRtpEncoder");
const OutboundTrackEncoder_1 = require("./OutboundTrackEncoder");
const OutputSamples_1 = require("./OutputSamples");
const PeerConnectionTransportEncoder_1 = require("./PeerConnectionTransportEncoder");
const RemoteInboundRtpEncoder_1 = require("./RemoteInboundRtpEncoder");
const RemoteOutboundRtpEncoder_1 = require("./RemoteOutboundRtpEncoder");
const utils_1 = require("./utils");
class PeerConnectionSampleEncoder {
constructor(peerConnectionId, parent) {
this.parent = parent;
this._visited = false;
this._scoreEncoder = new utils_1.NumberToNumberEncoder();
this._scoreReasonsEncoder = new utils_1.StringToStringEncoder();
this._inboundTracksEncoders = new Map();
this._outboundTracksEncoders = new Map();
this._codecStatsEncoders = new Map();
this._inboundRtpEncoders = new Map();
this._remoteInboundRtpEncoders = new Map();
this._outboundRtpEncoders = new Map();
this._remoteOutboundRtpEncoders = new Map();
this._mediaSourceEncoders = new Map();
this._mediaPlayoutEncoders = new Map();
this._peerConnectionTransportEncoders = new Map();
this._dataChannelEncoders = new Map();
this._iceTransportEncoders = new Map();
this._iceCandidateEncoders = new Map();
this._iceCandidatePairEncoders = new Map();
this._certificateEncoders = new Map();
this._peerConnectionId = this.parent.settings.peerConnectionIdIsUuid
? (0, utils_1.uuidToByteArray)(peerConnectionId)
: (0, utils_1.stringToBytesArray)(peerConnectionId);
this._attachmentsEncoder = this.parent.attachmentEncoderFactory.createPeerConnectionSampleAttachmentEncoder();
}
get visited() {
const result = this._visited;
this._visited = false;
return result;
}
reset() {
this._attachmentsEncoder.reset();
this._scoreEncoder.reset();
this._scoreReasonsEncoder.reset();
this._inboundTracksEncoders.forEach((encoder) => encoder.reset());
this._outboundTracksEncoders.forEach((encoder) => encoder.reset());
this._codecStatsEncoders.forEach((encoder) => encoder.reset());
this._inboundRtpEncoders.forEach((encoder) => encoder.reset());
this._remoteInboundRtpEncoders.forEach((encoder) => encoder.reset());
this._outboundRtpEncoders.forEach((encoder) => encoder.reset());
this._remoteOutboundRtpEncoders.forEach((encoder) => encoder.reset());
this._mediaSourceEncoders.forEach((encoder) => encoder.reset());
this._mediaPlayoutEncoders.forEach((encoder) => encoder.reset());
this._peerConnectionTransportEncoders.forEach((encoder) => encoder.reset());
this._dataChannelEncoders.forEach((encoder) => encoder.reset());
this._iceTransportEncoders.forEach((encoder) => encoder.reset());
this._iceCandidateEncoders.forEach((encoder) => encoder.reset());
this._iceCandidatePairEncoders.forEach((encoder) => encoder.reset());
this._certificateEncoders.forEach((encoder) => encoder.reset());
}
encode(sample) {
this._visited = true;
const inboundTracks = sample.inboundTracks?.map(this._encodeInboundTracks.bind(this));
const outboundTracks = sample.outboundTracks?.map(this._encodeOutboundTracks.bind(this));
const codecs = sample.codecs?.map(this._encodeCodecStats.bind(this));
const inboundRtps = sample.inboundRtps?.map(this._encodeInboundRtp.bind(this));
const remoteInboundRtps = sample.remoteInboundRtps?.map(this._encodeRemoteInboundRtp.bind(this));
const outboundRtps = sample.outboundRtps?.map(this._encodeOutboundRtp.bind(this));
const remoteOutboundRtps = sample.remoteOutboundRtps?.map(this._encodeRemoteOutboundRtp.bind(this));
const mediaSources = sample.mediaSources?.map(this._encodeMediaSource.bind(this));
const mediaPlayouts = sample.mediaPlayouts?.map(this._encodeMediaPlayout.bind(this));
const peerConnectionTransports = sample.peerConnectionTransports?.map(this._encodePeerConnectionTransport.bind(this));
const dataChannels = sample.dataChannels?.map(this._encodeDataChannel.bind(this));
const iceTransports = sample.iceTransports?.map(this._encodeIceTransport.bind(this));
const iceCandidates = sample.iceCandidates?.map(this._encodeIceCandidate.bind(this));
const iceCandidatePairs = sample.iceCandidatePairs?.map(this._encodeIceCandidatePair.bind(this));
const certificates = sample.certificates?.map(this._encodeCertificate.bind(this));
return new OutputSamples_1.ClientSample_PeerConnectionSample({
peerConnectionId: this._peerConnectionId,
attachments: this._attachmentsEncoder.encode(sample.attachments),
score: this._scoreEncoder.encode(sample.score),
scoreReasons: this._scoreReasonsEncoder.encode(sample.scoreReasons),
inboundTracks,
outboundTracks,
codecs,
inboundRtps,
remoteInboundRtps,
outboundRtps,
remoteOutboundRtps,
mediaSources,
mediaPlayouts,
peerConnectionTransports,
dataChannels,
iceTransports,
iceCandidates,
iceCandidatePairs,
certificates,
});
}
_encodeCodecStats(input) {
let encoder = this._codecStatsEncoders.get(input.id);
if (!encoder) {
encoder = new CodecStatsEncoder_1.CodecStatsEncoder(this.parent.attachmentEncoderFactory.createCodecStatsAttachmentEncoder());
this._codecStatsEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeInboundTracks(input) {
let encoder = this._inboundTracksEncoders.get(input.id);
if (!encoder) {
encoder = new InboundTrackEncoder_1.InboundTrackSampleEncoder(this.parent.attachmentEncoderFactory.createInboundTrackAttachmentEncoder());
this._inboundTracksEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeOutboundTracks(input) {
let encoder = this._outboundTracksEncoders.get(input.id);
if (!encoder) {
encoder = new OutboundTrackEncoder_1.OutboundTrackSampleEncoder(this.parent.attachmentEncoderFactory.createOutboundTrackAttachmentEncoder());
this._outboundTracksEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeInboundRtp(input) {
let encoder = this._inboundRtpEncoders.get(input.ssrc);
if (!encoder) {
const trackIdEncoder = this.parent.settings.trackIdIsUuid
? new utils_1.OneTimePassUuidToByteArrayEncoder()
: new utils_1.OneTimePassStringToUint8ArrayEncoder();
encoder = new InboundRtpEncoder_1.InboundRtpEncoder(input.ssrc, trackIdEncoder, this.parent.attachmentEncoderFactory.createInboundRtpAttachmentEncoder());
this._inboundRtpEncoders.set(input.ssrc, encoder);
}
return encoder.encode(input);
}
_encodeOutboundRtp(input) {
let encoder = this._outboundRtpEncoders.get(input.ssrc);
if (!encoder) {
encoder = new OutboundRtpEncoder_1.OutboundRtpEncoder(input.ssrc, this.parent.attachmentEncoderFactory.createOutboundRtpAttachmentEncoder());
this._outboundRtpEncoders.set(input.ssrc, encoder);
}
return encoder.encode(input);
}
_encodeRemoteInboundRtp(input) {
let encoder = this._remoteInboundRtpEncoders.get(input.ssrc);
if (!encoder) {
encoder = new RemoteInboundRtpEncoder_1.RemoteInboundRtpEncoder(input.ssrc, this.parent.attachmentEncoderFactory.createRemoteInboundRtpAttachmentEncoder());
this._remoteInboundRtpEncoders.set(input.ssrc, encoder);
}
return encoder.encode(input);
}
_encodeRemoteOutboundRtp(input) {
let encoder = this._remoteOutboundRtpEncoders.get(input.ssrc);
if (!encoder) {
encoder = new RemoteOutboundRtpEncoder_1.RemoteOutboundRtpEncoder(input.ssrc, this.parent.attachmentEncoderFactory.createRemoteOutboundRtpAttachmentEncoder());
this._remoteOutboundRtpEncoders.set(input.ssrc, encoder);
}
return encoder.encode(input);
}
_encodeDataChannel(input) {
let encoder = this._dataChannelEncoders.get(input.id);
if (!encoder) {
encoder = new DataChannelEncoder_1.DataChannelEncoder(this.parent.attachmentEncoderFactory.createDataChannelAttachmentEncoder());
this._dataChannelEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeMediaSource(input) {
let encoder = this._mediaSourceEncoders.get(input.id);
if (!encoder) {
encoder = new MediaSourceEncoder_1.MediaSourceStatsEncoder(this.parent.attachmentEncoderFactory.createMediaSourceAttachmentEncoder());
this._mediaSourceEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeMediaPlayout(input) {
let encoder = this._mediaPlayoutEncoders.get(input.id);
if (!encoder) {
encoder = new MediaPlayoutEncoder_1.MediaPlayoutStatsEncoder(this.parent.attachmentEncoderFactory.createMediaPlayoutAttachmentEncoder());
this._mediaPlayoutEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodePeerConnectionTransport(input) {
let encoder = this._peerConnectionTransportEncoders.get(input.id);
if (!encoder) {
encoder = new PeerConnectionTransportEncoder_1.PeerConnectionTransportEncoder(this.parent.attachmentEncoderFactory.createPeerConnectionTransportAttachmentEncoder());
this._peerConnectionTransportEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeIceTransport(input) {
let encoder = this._iceTransportEncoders.get(input.id);
if (!encoder) {
encoder = new IceTransportEncoder_1.IceTransportEncoder(this.parent.attachmentEncoderFactory.createIceTransportAttachmentEncoder());
this._iceTransportEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeIceCandidate(input) {
let encoder = this._iceCandidateEncoders.get(input.id);
if (!encoder) {
encoder = new IceCandidateEncoder_1.IceCandidateEncoder(this.parent.attachmentEncoderFactory.createIceCandidateAttachmentEncoder());
this._iceCandidateEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeIceCandidatePair(input) {
let encoder = this._iceCandidatePairEncoders.get(input.id);
if (!encoder) {
encoder = new IceCandidatePairStatsEncoder_1.IceCandidatePairEncoder(this.parent.attachmentEncoderFactory.createIceCandidatePairAttachmentEncoder());
this._iceCandidatePairEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
_encodeCertificate(input) {
let encoder = this._certificateEncoders.get(input.id);
if (!encoder) {
encoder = new CertificateEncoder_1.CertificateEncoder(this.parent.attachmentEncoderFactory.createCertificateAttachmentEncoder());
this._certificateEncoders.set(input.id, encoder);
}
return encoder.encode(input);
}
checkVisitsAndClean() {
let visited = false;
for (const [id, encoder] of [...this._inboundTracksEncoders.entries()]) {
if (!encoder.visited) {
this._inboundTracksEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._outboundTracksEncoders.entries()]) {
if (!encoder.visited) {
this._outboundTracksEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._codecStatsEncoders.entries()]) {
if (!encoder.visited) {
this._codecStatsEncoders.delete(id);
continue;
}
visited = true;
}
for (const [ssrc, encoder] of [...this._inboundRtpEncoders.entries()]) {
if (!encoder.visited) {
this._inboundRtpEncoders.delete(ssrc);
continue;
}
visited = true;
}
for (const [ssrc, encoder] of [...this._remoteInboundRtpEncoders.entries()]) {
if (!encoder.visited) {
this._remoteInboundRtpEncoders.delete(ssrc);
continue;
}
visited = true;
}
for (const [ssrc, encoder] of [...this._outboundRtpEncoders.entries()]) {
if (!encoder.visited) {
this._outboundRtpEncoders.delete(ssrc);
continue;
}
visited = true;
}
for (const [ssrc, encoder] of [...this._remoteOutboundRtpEncoders.entries()]) {
if (!encoder.visited) {
this._remoteOutboundRtpEncoders.delete(ssrc);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._mediaSourceEncoders.entries()]) {
if (!encoder.visited) {
this._mediaSourceEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._mediaPlayoutEncoders.entries()]) {
if (!encoder.visited) {
this._mediaPlayoutEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._peerConnectionTransportEncoders.entries()]) {
if (!encoder.visited) {
this._peerConnectionTransportEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._dataChannelEncoders.entries()]) {
if (!encoder.visited) {
this._dataChannelEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._iceTransportEncoders.entries()]) {
if (!encoder.visited) {
this._iceTransportEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._iceCandidateEncoders.entries()]) {
if (!encoder.visited) {
this._iceCandidateEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._iceCandidatePairEncoders.entries()]) {
if (!encoder.visited) {
this._iceCandidatePairEncoders.delete(id);
continue;
}
visited = true;
}
for (const [id, encoder] of [...this._certificateEncoders.entries()]) {
if (!encoder.visited) {
this._certificateEncoders.delete(id);
continue;
}
visited = true;
}
return visited;
}
}
exports.PeerConnectionSampleEncoder = PeerConnectionSampleEncoder;