UNPKG

@observertc/samples-encoder

Version:

ObserveRTC Library for Encoding Samples

117 lines (116 loc) 5.61 kB
"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;