@observertc/samples-encoder
Version:
ObserveRTC Library for Encoding Samples
117 lines (116 loc) • 5.61 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ClientSampleEncoder = void 0;
const OutputSamples_1 = require("./OutputSamples");
const utils_1 = require("./utils");
const PeerConnectionSampleEncoder_1 = require("./PeerConnectionSampleEncoder");
const ClientEventEncoder_1 = require("./ClientEventEncoder");
const ClientMetaDataEncoder_1 = require("./ClientMetaDataEncoder");
const ExtensionStatsEncoder_1 = require("./ExtensionStatsEncoder");
const ClientIssueEncoder_1 = require("./ClientIssueEncoder");
class ClientSampleEncoder {
constructor(clientId, settings) {
this.attachmentEncoderFactory = new utils_1.DefaultAttachmentEncoderFactory();
this.clientEventEncoder = new ClientEventEncoder_1.DefaultClientEventEncoder();
this.clientIssueEncoder = new ClientIssueEncoder_1.DefaultClientIssueEncoder();
this.clientMetaDataEncoder = new ClientMetaDataEncoder_1.DefaultClientMetaDataEncoder();
this.extensionStatsEncoder = new ExtensionStatsEncoder_1.DefaultExtensionStatsEncoder();
this._timestampEncoder = new utils_1.NumberToNumberEncoder();
this._scoreEncoder = new utils_1.NumberToNumberEncoder();
this._scoreReasonsEncoder = new utils_1.StringToStringEncoder();
this._visited = false;
this._peerConnectionSampleEncoders = new Map();
this.settings = {
clientIdIsUuid: false,
peerConnectionIdIsUuid: false,
callIdIsUuid: false,
trackIdIsUuid: false,
...(settings ?? {}),
};
this._clientId = this.settings.clientIdIsUuid ? (0, utils_1.uuidToByteArray)(clientId) : (0, utils_1.stringToBytesArray)(clientId);
this._callIdEncoder = this.settings.callIdIsUuid ? new utils_1.OneTimePassUuidToByteArrayEncoder() : new utils_1.OneTimePassStringToUint8ArrayEncoder();
this._attachmentEncoder = this.attachmentEncoderFactory.createClientSampleAttachmentEncoder();
}
get visited() {
const result = this._visited;
this._visited = false;
return result;
}
encodeToBytes(clientSample) {
return this.encodeToProtobufSamples(clientSample).toBinary();
}
encodeToBase64(clientSample) {
const bytes = this.encodeToProtobufSamples(clientSample).toBinary();
return (0, utils_1.convertUint8ToBase64)(bytes);
}
encodeToProtobufSamples(clientSample) {
this._visited = true;
const clientEvents = clientSample
.clientEvents
?.map(this.clientEventEncoder.encode.bind(this.clientEventEncoder))
?.filter((event) => event !== undefined);
const clientMetaItems = clientSample
.clientMetaItems
?.map(this.clientMetaDataEncoder.encode.bind(this.clientMetaDataEncoder))
?.filter((metaItem) => metaItem !== undefined);
const extensionStats = clientSample
.extensionStats
?.map(this.extensionStatsEncoder.encode.bind(this.extensionStatsEncoder))
?.filter((extensionStat) => extensionStat !== undefined);
const peerConnections = clientSample
.peerConnections
?.map(this._encodePeerConnectionSample.bind(this))
?.filter((peerConnection) => peerConnection !== undefined);
const clientIssues = clientSample
.clientIssues
?.map(this.clientIssueEncoder.encode.bind(this.clientIssueEncoder))
?.filter((issue) => issue !== undefined);
const result = new OutputSamples_1.ClientSample({
timestamp: this._timestampEncoder.encode(clientSample.timestamp),
callId: this._callIdEncoder.encode(clientSample.callId),
clientId: this._clientId,
attachments: this._attachmentEncoder.encode(clientSample.attachments),
score: this._scoreEncoder.encode(clientSample.score),
scoreReasons: this._scoreReasonsEncoder.encode(clientSample.scoreReasons),
peerConnections,
clientEvents,
clientIssues,
clientMetaItems,
extensionStats,
});
// console.warn("ClientSampleEncoder: ", clientSample, " -> ", result);
this._checkVisitsAndClean();
return result;
}
reset() {
this._timestampEncoder.reset();
this._callIdEncoder.reset();
this._attachmentEncoder.reset();
this._scoreEncoder.reset();
this._scoreReasonsEncoder.reset();
this._peerConnectionSampleEncoders.forEach((encoder) => encoder.reset());
this.clientEventEncoder.reset();
this.clientIssueEncoder.reset();
this.clientMetaDataEncoder.reset();
this.extensionStatsEncoder.reset();
}
_encodePeerConnectionSample(input) {
let encoder = this._peerConnectionSampleEncoders.get(input.peerConnectionId);
if (!encoder) {
encoder = new PeerConnectionSampleEncoder_1.PeerConnectionSampleEncoder(input.peerConnectionId, this);
this._peerConnectionSampleEncoders.set(input.peerConnectionId, encoder);
}
return encoder.encode(input);
}
_checkVisitsAndClean() {
let visited = false;
for (const [peerConnectionId, encoder] of Array.from(this._peerConnectionSampleEncoders.entries())) {
const visited = encoder.checkVisitsAndClean();
if (!visited) {
this._peerConnectionSampleEncoders.delete(peerConnectionId);
}
}
return visited;
}
}
exports.ClientSampleEncoder = ClientSampleEncoder;