Showing preview only (7,054K chars total). Download the full file or copy to clipboard to get everything.
Repository: ibc/mediasoup
Branch: v3
Commit: f14a6d4d16ca
Files: 1274
Total size: 6.5 MB
Directory structure:
gitextract_nw9bolxa/
├── .editorconfig
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── Bug_Report.md
│ │ ├── Feature_Request.md
│ │ └── config.yml
│ └── workflows/
│ ├── mediasoup-codeql.yaml
│ ├── mediasoup-node.yaml
│ ├── mediasoup-rust.yaml
│ ├── mediasoup-worker-clang-tidy.yaml
│ ├── mediasoup-worker-fuzzer.yaml
│ ├── mediasoup-worker-prebuild.yaml
│ └── mediasoup-worker.yaml
├── .gitignore
├── .npmrc
├── .prettierrc.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── README.md
├── doc/
│ ├── Building.md
│ ├── Charts.md
│ ├── Closures.md
│ ├── Fuzzer.md
│ ├── README.md
│ ├── RTCP.md
│ └── Rust-crates.md
├── eslint.config.mjs
├── jest.config.mjs
├── knip.config.mjs
├── node/
│ └── src/
│ ├── ActiveSpeakerObserver.ts
│ ├── ActiveSpeakerObserverTypes.ts
│ ├── AudioLevelObserver.ts
│ ├── AudioLevelObserverTypes.ts
│ ├── Channel.ts
│ ├── Consumer.ts
│ ├── ConsumerTypes.ts
│ ├── DataConsumer.ts
│ ├── DataConsumerTypes.ts
│ ├── DataProducer.ts
│ ├── DataProducerTypes.ts
│ ├── DirectTransport.ts
│ ├── DirectTransportTypes.ts
│ ├── Logger.ts
│ ├── PipeTransport.ts
│ ├── PipeTransportTypes.ts
│ ├── PlainTransport.ts
│ ├── PlainTransportTypes.ts
│ ├── Producer.ts
│ ├── ProducerTypes.ts
│ ├── Router.ts
│ ├── RouterTypes.ts
│ ├── RtpObserver.ts
│ ├── RtpObserverTypes.ts
│ ├── Transport.ts
│ ├── TransportTypes.ts
│ ├── WebRtcServer.ts
│ ├── WebRtcServerTypes.ts
│ ├── WebRtcTransport.ts
│ ├── WebRtcTransportTypes.ts
│ ├── Worker.ts
│ ├── WorkerTypes.ts
│ ├── enhancedEvents.ts
│ ├── errors.ts
│ ├── extras.ts
│ ├── fbsUtils.ts
│ ├── index.ts
│ ├── indexTypes.ts
│ ├── ortc.ts
│ ├── rtpParametersFbsUtils.ts
│ ├── rtpParametersTypes.ts
│ ├── rtpStreamStatsFbsUtils.ts
│ ├── rtpStreamStatsTypes.ts
│ ├── scalabilityModesTypes.ts
│ ├── scalabilityModesUtils.ts
│ ├── sctpParametersFbsUtils.ts
│ ├── sctpParametersTypes.ts
│ ├── srtpParametersFbsUtils.ts
│ ├── srtpParametersTypes.ts
│ ├── supportedRtpCapabilities.ts
│ ├── test/
│ │ ├── data/
│ │ │ ├── dtls-cert.pem
│ │ │ └── dtls-key.pem
│ │ ├── test-ActiveSpeakerObserver.ts
│ │ ├── test-AudioLevelObserver.ts
│ │ ├── test-Consumer.ts
│ │ ├── test-DataConsumer.ts
│ │ ├── test-DataProducer.ts
│ │ ├── test-DirectTransport.ts
│ │ ├── test-PipeTransport.ts
│ │ ├── test-PlainTransport.ts
│ │ ├── test-Producer.ts
│ │ ├── test-Router.ts
│ │ ├── test-WebRtcServer.ts
│ │ ├── test-WebRtcTransport.ts
│ │ ├── test-Worker.ts
│ │ ├── test-mediasoup.ts
│ │ ├── test-multiopus.ts
│ │ ├── test-ortc.ts
│ │ └── test-werift-sctp.ts
│ ├── types.ts
│ └── utils.ts
├── npm-scripts.mjs
├── package.json
├── rust/
│ ├── CHANGELOG.md
│ ├── Cargo.toml
│ ├── benches/
│ │ ├── direct_data.rs
│ │ └── producer.rs
│ ├── examples/
│ │ ├── echo.rs
│ │ ├── multiopus.rs
│ │ ├── readme.md
│ │ ├── svc-simulcast.rs
│ │ └── videoroom.rs
│ ├── examples-frontend/
│ │ ├── echo/
│ │ │ ├── .eslintrc.js
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── index.ts
│ │ │ ├── tsconfig.json
│ │ │ └── webpack.config.js
│ │ ├── multiopus/
│ │ │ ├── .eslintrc.js
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── index.ts
│ │ │ ├── tsconfig.json
│ │ │ └── webpack.config.js
│ │ ├── readme.md
│ │ ├── svc-simulcast/
│ │ │ ├── .eslintrc.js
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── index.ts
│ │ │ ├── tsconfig.json
│ │ │ └── webpack.config.js
│ │ └── videoroom/
│ │ ├── .eslintrc.js
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ ├── tsconfig.json
│ │ └── webpack.config.js
│ ├── src/
│ │ ├── data_structures.rs
│ │ ├── fbs.rs
│ │ ├── lib.rs
│ │ ├── macros.rs
│ │ ├── messages.rs
│ │ ├── ortc/
│ │ │ └── tests.rs
│ │ ├── ortc.rs
│ │ ├── prelude.rs
│ │ ├── router/
│ │ │ ├── active_speaker_observer/
│ │ │ │ └── tests.rs
│ │ │ ├── active_speaker_observer.rs
│ │ │ ├── audio_level_observer/
│ │ │ │ └── tests.rs
│ │ │ ├── audio_level_observer.rs
│ │ │ ├── consumer/
│ │ │ │ └── tests.rs
│ │ │ ├── consumer.rs
│ │ │ ├── data_consumer/
│ │ │ │ └── tests.rs
│ │ │ ├── data_consumer.rs
│ │ │ ├── data_producer/
│ │ │ │ └── tests.rs
│ │ │ ├── data_producer.rs
│ │ │ ├── direct_transport/
│ │ │ │ └── tests.rs
│ │ │ ├── direct_transport.rs
│ │ │ ├── pipe_transport/
│ │ │ │ └── tests.rs
│ │ │ ├── pipe_transport.rs
│ │ │ ├── plain_transport/
│ │ │ │ └── tests.rs
│ │ │ ├── plain_transport.rs
│ │ │ ├── producer/
│ │ │ │ └── tests.rs
│ │ │ ├── producer.rs
│ │ │ ├── rtp_observer.rs
│ │ │ ├── tests.rs
│ │ │ ├── transport.rs
│ │ │ ├── webrtc_transport/
│ │ │ │ └── tests.rs
│ │ │ └── webrtc_transport.rs
│ │ ├── router.rs
│ │ ├── rtp_parameters.rs
│ │ ├── scalability_modes.rs
│ │ ├── sctp_parameters.rs
│ │ ├── srtp_parameters.rs
│ │ ├── supported_rtp_capabilities.rs
│ │ ├── webrtc_server/
│ │ │ └── tests.rs
│ │ ├── webrtc_server.rs
│ │ ├── worker/
│ │ │ ├── channel.rs
│ │ │ ├── common.rs
│ │ │ ├── utils/
│ │ │ │ ├── channel_read_fn.rs
│ │ │ │ └── channel_write_fn.rs
│ │ │ └── utils.rs
│ │ ├── worker.rs
│ │ ├── worker_manager/
│ │ │ └── tests.rs
│ │ └── worker_manager.rs
│ ├── tests/
│ │ └── integration/
│ │ ├── active_speaker_observer.rs
│ │ ├── audio_level_observer.rs
│ │ ├── consumer.rs
│ │ ├── data/
│ │ │ ├── dtls-cert.pem
│ │ │ └── dtls-key.pem
│ │ ├── data_consumer.rs
│ │ ├── data_producer.rs
│ │ ├── direct_transport.rs
│ │ ├── main.rs
│ │ ├── multiopus.rs
│ │ ├── pipe_transport.rs
│ │ ├── plain_transport.rs
│ │ ├── producer.rs
│ │ ├── router.rs
│ │ ├── smoke.rs
│ │ ├── webrtc_server.rs
│ │ ├── webrtc_transport.rs
│ │ └── worker.rs
│ └── types/
│ ├── CHANGELOG.md
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── data_structures/
│ │ └── tests.rs
│ ├── data_structures.rs
│ ├── lib.rs
│ ├── rtp_parameters/
│ │ └── tests.rs
│ ├── rtp_parameters.rs
│ ├── scalability_modes/
│ │ └── tests.rs
│ ├── scalability_modes.rs
│ ├── sctp_parameters.rs
│ └── srtp_parameters.rs
├── rust-toolchain.toml
├── tsconfig.json
└── worker/
├── .clang-format
├── .clang-tidy
├── .clangd
├── Cargo.toml
├── Dockerfile
├── Dockerfile.386
├── Dockerfile.alpine
├── Makefile
├── build.rs
├── deps/
│ ├── libwebrtc/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── README.md
│ │ ├── libwebrtc/
│ │ │ ├── api/
│ │ │ │ ├── bitrate_constraints.h
│ │ │ │ ├── network_state_predictor.cc
│ │ │ │ ├── network_state_predictor.h
│ │ │ │ ├── transport/
│ │ │ │ │ ├── bitrate_settings.cc
│ │ │ │ │ ├── bitrate_settings.h
│ │ │ │ │ ├── field_trial_based_config.cc
│ │ │ │ │ ├── field_trial_based_config.h
│ │ │ │ │ ├── goog_cc_factory.cc
│ │ │ │ │ ├── goog_cc_factory.h
│ │ │ │ │ ├── network_control.h
│ │ │ │ │ ├── network_types.cc
│ │ │ │ │ ├── network_types.h
│ │ │ │ │ └── webrtc_key_value_config.h
│ │ │ │ └── units/
│ │ │ │ ├── data_rate.cc
│ │ │ │ ├── data_rate.h
│ │ │ │ ├── data_size.cc
│ │ │ │ ├── data_size.h
│ │ │ │ ├── frequency.cc
│ │ │ │ ├── frequency.h
│ │ │ │ ├── time_delta.cc
│ │ │ │ ├── time_delta.h
│ │ │ │ ├── timestamp.cc
│ │ │ │ └── timestamp.h
│ │ │ ├── call/
│ │ │ │ ├── rtp_transport_controller_send.cc
│ │ │ │ ├── rtp_transport_controller_send.h
│ │ │ │ └── rtp_transport_controller_send_interface.h
│ │ │ ├── mediasoup_helpers.h
│ │ │ ├── modules/
│ │ │ │ ├── bitrate_controller/
│ │ │ │ │ ├── loss_based_bandwidth_estimation.cc
│ │ │ │ │ ├── loss_based_bandwidth_estimation.h
│ │ │ │ │ ├── send_side_bandwidth_estimation.cc
│ │ │ │ │ └── send_side_bandwidth_estimation.h
│ │ │ │ ├── congestion_controller/
│ │ │ │ │ ├── goog_cc/
│ │ │ │ │ │ ├── acknowledged_bitrate_estimator.cc
│ │ │ │ │ │ ├── acknowledged_bitrate_estimator.h
│ │ │ │ │ │ ├── alr_detector.cc
│ │ │ │ │ │ ├── alr_detector.h
│ │ │ │ │ │ ├── bitrate_estimator.cc
│ │ │ │ │ │ ├── bitrate_estimator.h
│ │ │ │ │ │ ├── congestion_window_pushback_controller.cc
│ │ │ │ │ │ ├── congestion_window_pushback_controller.h
│ │ │ │ │ │ ├── delay_based_bwe.cc
│ │ │ │ │ │ ├── delay_based_bwe.h
│ │ │ │ │ │ ├── delay_increase_detector_interface.h
│ │ │ │ │ │ ├── goog_cc_network_control.cc
│ │ │ │ │ │ ├── goog_cc_network_control.h
│ │ │ │ │ │ ├── link_capacity_estimator.cc
│ │ │ │ │ │ ├── link_capacity_estimator.h
│ │ │ │ │ │ ├── median_slope_estimator.cc
│ │ │ │ │ │ ├── median_slope_estimator.h
│ │ │ │ │ │ ├── probe_bitrate_estimator.cc
│ │ │ │ │ │ ├── probe_bitrate_estimator.h
│ │ │ │ │ │ ├── probe_controller.cc
│ │ │ │ │ │ ├── probe_controller.h
│ │ │ │ │ │ ├── trendline_estimator.cc
│ │ │ │ │ │ └── trendline_estimator.h
│ │ │ │ │ └── rtp/
│ │ │ │ │ ├── control_handler.cc
│ │ │ │ │ ├── control_handler.h
│ │ │ │ │ ├── send_time_history.cc
│ │ │ │ │ ├── send_time_history.h
│ │ │ │ │ ├── transport_feedback_adapter.cc
│ │ │ │ │ └── transport_feedback_adapter.h
│ │ │ │ ├── include/
│ │ │ │ │ └── module_common_types_public.h
│ │ │ │ ├── pacing/
│ │ │ │ │ ├── bitrate_prober.cc
│ │ │ │ │ ├── bitrate_prober.h
│ │ │ │ │ ├── interval_budget.cc
│ │ │ │ │ ├── interval_budget.h
│ │ │ │ │ ├── paced_sender.cc
│ │ │ │ │ ├── paced_sender.h
│ │ │ │ │ └── packet_router.h
│ │ │ │ ├── remote_bitrate_estimator/
│ │ │ │ │ ├── aimd_rate_control.cc
│ │ │ │ │ ├── aimd_rate_control.h
│ │ │ │ │ ├── bwe_defines.cc
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── bwe_defines.h
│ │ │ │ │ │ └── remote_bitrate_estimator.h
│ │ │ │ │ ├── inter_arrival.cc
│ │ │ │ │ ├── inter_arrival.h
│ │ │ │ │ ├── overuse_detector.cc
│ │ │ │ │ ├── overuse_detector.h
│ │ │ │ │ ├── overuse_estimator.cc
│ │ │ │ │ ├── overuse_estimator.h
│ │ │ │ │ ├── remote_bitrate_estimator_abs_send_time.cc
│ │ │ │ │ └── remote_bitrate_estimator_abs_send_time.h
│ │ │ │ └── rtp_rtcp/
│ │ │ │ ├── include/
│ │ │ │ │ ├── rtp_rtcp_defines.cc
│ │ │ │ │ └── rtp_rtcp_defines.h
│ │ │ │ └── source/
│ │ │ │ └── rtp_packet/
│ │ │ │ └── transport_feedback.h
│ │ │ ├── rtc_base/
│ │ │ │ ├── constructor_magic.h
│ │ │ │ ├── experiments/
│ │ │ │ │ ├── alr_experiment.cc
│ │ │ │ │ ├── alr_experiment.h
│ │ │ │ │ ├── field_trial_parser.cc
│ │ │ │ │ ├── field_trial_parser.h
│ │ │ │ │ ├── field_trial_units.cc
│ │ │ │ │ ├── field_trial_units.h
│ │ │ │ │ ├── rate_control_settings.cc
│ │ │ │ │ └── rate_control_settings.h
│ │ │ │ ├── network/
│ │ │ │ │ ├── sent_packet.cc
│ │ │ │ │ └── sent_packet.h
│ │ │ │ ├── numerics/
│ │ │ │ │ ├── percentile_filter.h
│ │ │ │ │ ├── safe_compare.h
│ │ │ │ │ ├── safe_conversions.h
│ │ │ │ │ ├── safe_conversions_impl.h
│ │ │ │ │ └── safe_minmax.h
│ │ │ │ ├── rate_statistics.cc
│ │ │ │ ├── rate_statistics.h
│ │ │ │ ├── system/
│ │ │ │ │ └── unused.h
│ │ │ │ ├── type_traits.h
│ │ │ │ └── units/
│ │ │ │ └── unit_base.h
│ │ │ └── system_wrappers/
│ │ │ └── source/
│ │ │ ├── field_trial.cc
│ │ │ └── field_trial.h
│ │ ├── libwebrtc.gyp
│ │ └── meson.build
│ └── webrtc-fuzzer-corpora/
│ ├── README.md
│ ├── add_sha1.sh
│ ├── corpora/
│ │ ├── agc-corpus/
│ │ │ ├── agc-1
│ │ │ ├── agc-2
│ │ │ ├── agc-3
│ │ │ └── agc-4
│ │ ├── audio_processing-corpus/
│ │ │ ├── audio-processing-0
│ │ │ ├── audio-processing-1
│ │ │ ├── audio-processing-2
│ │ │ └── audio-processing-3
│ │ ├── mdns-corpus/
│ │ │ ├── 1.mdns
│ │ │ ├── 10.mdns
│ │ │ ├── 11.mdns
│ │ │ ├── 12.mdns
│ │ │ ├── 13.mdns
│ │ │ ├── 14.mdns
│ │ │ ├── 15.mdns
│ │ │ ├── 16.mdns
│ │ │ ├── 17.mdns
│ │ │ ├── 18.mdns
│ │ │ ├── 19.mdns
│ │ │ ├── 2.mdns
│ │ │ ├── 20.mdns
│ │ │ ├── 3.mdns
│ │ │ ├── 4.mdns
│ │ │ ├── 5.mdns
│ │ │ ├── 6.mdns
│ │ │ ├── 7.mdns
│ │ │ ├── 8.mdns
│ │ │ └── 9.mdns
│ │ ├── pseudotcp-corpus/
│ │ │ └── 785b96587d0eb44dd5d75b7a886f37e2ac504511
│ │ ├── rtcp-corpus/
│ │ │ ├── 0.rtcp
│ │ │ ├── 1.rtcp
│ │ │ ├── 10.rtcp
│ │ │ ├── 11.rtcp
│ │ │ ├── 12.rtcp
│ │ │ ├── 13.rtcp
│ │ │ ├── 14.rtcp
│ │ │ ├── 15.rtcp
│ │ │ ├── 16.rtcp
│ │ │ ├── 17.rtcp
│ │ │ ├── 18.rtcp
│ │ │ ├── 19.rtcp
│ │ │ ├── 2.rtcp
│ │ │ ├── 20.rtcp
│ │ │ ├── 21.rtcp
│ │ │ ├── 22.rtcp
│ │ │ ├── 23.rtcp
│ │ │ ├── 24.rtcp
│ │ │ ├── 25.rtcp
│ │ │ ├── 26.rtcp
│ │ │ ├── 27.rtcp
│ │ │ ├── 28.rtcp
│ │ │ ├── 29.rtcp
│ │ │ ├── 3.rtcp
│ │ │ ├── 30.rtcp
│ │ │ ├── 31.rtcp
│ │ │ ├── 32.rtcp
│ │ │ ├── 33.rtcp
│ │ │ ├── 34.rtcp
│ │ │ ├── 35.rtcp
│ │ │ ├── 36.rtcp
│ │ │ ├── 37.rtcp
│ │ │ ├── 38.rtcp
│ │ │ ├── 39.rtcp
│ │ │ ├── 4.rtcp
│ │ │ ├── 40.rtcp
│ │ │ ├── 41.rtcp
│ │ │ ├── 42.rtcp
│ │ │ ├── 43.rtcp
│ │ │ ├── 44.rtcp
│ │ │ ├── 45.rtcp
│ │ │ ├── 46.rtcp
│ │ │ ├── 47.rtcp
│ │ │ ├── 48.rtcp
│ │ │ ├── 49.rtcp
│ │ │ ├── 5.rtcp
│ │ │ ├── 50.rtcp
│ │ │ ├── 51.rtcp
│ │ │ ├── 52.rtcp
│ │ │ ├── 53.rtcp
│ │ │ ├── 54.rtcp
│ │ │ ├── 55.rtcp
│ │ │ ├── 56.rtcp
│ │ │ ├── 57.rtcp
│ │ │ ├── 58.rtcp
│ │ │ ├── 59.rtcp
│ │ │ ├── 6.rtcp
│ │ │ ├── 60.rtcp
│ │ │ ├── 61.rtcp
│ │ │ ├── 62.rtcp
│ │ │ ├── 63.rtcp
│ │ │ ├── 64.rtcp
│ │ │ ├── 65.rtcp
│ │ │ ├── 66.rtcp
│ │ │ ├── 7.rtcp
│ │ │ ├── 8.rtcp
│ │ │ ├── 9.rtcp
│ │ │ ├── fir.rtcp
│ │ │ ├── pli.rtcp
│ │ │ ├── remb.rtcp
│ │ │ ├── rr-remb.rtcp
│ │ │ ├── rr-sdes-bye.rtcp
│ │ │ ├── rr.rtcp
│ │ │ ├── sr-sdes.rtcp
│ │ │ └── twcc-feedback.rtcp
│ │ ├── rtp-corpus/
│ │ │ ├── rtp-0
│ │ │ ├── rtp-1
│ │ │ ├── rtp-2
│ │ │ ├── rtp-3
│ │ │ ├── rtp-4
│ │ │ ├── rtp-5
│ │ │ ├── rtp-6
│ │ │ └── rtp-7
│ │ ├── sdp-corpus/
│ │ │ ├── 10.sdp
│ │ │ ├── 11.sdp
│ │ │ ├── 12.sdp
│ │ │ ├── 13.sdp
│ │ │ ├── 14.sdp
│ │ │ ├── 15.sdp
│ │ │ ├── 16.sdp
│ │ │ ├── 17.sdp
│ │ │ ├── 18.sdp
│ │ │ ├── 19.sdp
│ │ │ ├── 2.sdp
│ │ │ ├── 20.sdp
│ │ │ ├── 21.sdp
│ │ │ ├── 22.sdp
│ │ │ ├── 23.sdp
│ │ │ ├── 24.sdp
│ │ │ ├── 25.sdp
│ │ │ ├── 26.sdp
│ │ │ ├── 27.sdp
│ │ │ ├── 28.sdp
│ │ │ ├── 29.sdp
│ │ │ ├── 3.sdp
│ │ │ ├── 30.sdp
│ │ │ ├── 31.sdp
│ │ │ ├── 32.sdp
│ │ │ ├── 33.sdp
│ │ │ ├── 34.sdp
│ │ │ ├── 35.sdp
│ │ │ ├── 36.sdp
│ │ │ ├── 37.sdp
│ │ │ ├── 38.sdp
│ │ │ ├── 39.sdp
│ │ │ ├── 4.sdp
│ │ │ ├── 40.sdp
│ │ │ ├── 41.sdp
│ │ │ ├── 42.sdp
│ │ │ ├── 43.sdp
│ │ │ ├── 44.sdp
│ │ │ ├── 45.sdp
│ │ │ ├── 46.sdp
│ │ │ ├── 47.sdp
│ │ │ ├── 48.sdp
│ │ │ ├── 49.sdp
│ │ │ ├── 5.sdp
│ │ │ ├── 50.sdp
│ │ │ ├── 51.sdp
│ │ │ ├── 52.sdp
│ │ │ ├── 53.sdp
│ │ │ ├── 54.sdp
│ │ │ ├── 55.sdp
│ │ │ ├── 6.sdp
│ │ │ ├── 7.sdp
│ │ │ ├── 8.sdp
│ │ │ ├── 9.sdp
│ │ │ ├── firefox-1.sdp
│ │ │ ├── firefox-2.sdp
│ │ │ ├── opera-1.sdp
│ │ │ ├── opera-2.sdp
│ │ │ ├── unittest-1.sdp
│ │ │ ├── unittest-2.sdp
│ │ │ ├── unittest-3.sdp
│ │ │ ├── unittest-4.sdp
│ │ │ ├── unittest-5.sdp
│ │ │ ├── unittest-6.sdp
│ │ │ ├── unittest-7.sdp
│ │ │ ├── unittest-8.sdp
│ │ │ └── unittest-9.sdp
│ │ └── stun-corpus/
│ │ ├── 0.stun
│ │ ├── 1.stun
│ │ ├── 10.stun
│ │ ├── 11.stun
│ │ ├── 12.stun
│ │ ├── 13.stun
│ │ ├── 14.stun
│ │ ├── 15.stun
│ │ ├── 16.stun
│ │ ├── 17.stun
│ │ ├── 2.stun
│ │ ├── 3.stun
│ │ ├── 4.stun
│ │ ├── 5.stun
│ │ ├── 6.stun
│ │ ├── 7.stun
│ │ ├── 8.stun
│ │ ├── 9.stun
│ │ └── validator-crash-1.stun
│ └── reports/
│ ├── crashes/
│ │ ├── .placeholder
│ │ ├── rtcp/
│ │ │ ├── crash-1640b2f21ba20409d930e9653052d579d450073a
│ │ │ ├── crash-16b8706455b637b7696aeb56ed40dad8f90d81d0
│ │ │ ├── crash-17ccf761d298d6a703f71627197c5f1adcf57140
│ │ │ ├── crash-3762f3b9f11328e939e577de46e20a3fb0ccc324
│ │ │ ├── crash-461a0e9201a7ea5ea6a43511571bdafce10b8185
│ │ │ ├── crash-7257232c6e9efe6362b921117ad3cd5d8170ec0d
│ │ │ ├── crash-75a5a7739802ac20cbe2937d6206348ffde23605
│ │ │ ├── crash-85b6e5d82d61837df67df0e333cb2392044a47c6
│ │ │ ├── crash-c7a1f348bd6f9422caeb41079e46331551fd2587
│ │ │ └── crash-daf57e58c2552e5cf091b0b92aa9f4ab2d4a5b4a
│ │ └── rtp/
│ │ ├── crash-15d89650c0a728a6431c10c3adeb8e9a2484af83
│ │ ├── crash-1e7e56a8894a7dc2c735a0732429930f4e4a9232
│ │ ├── crash-42df1e99b29f5c2e2a881c257a31ab3a3e76c650
│ │ ├── crash-5b35219e5f366ac6577599c82bc54cc33f7bbba4
│ │ ├── crash-6d9f1846dbb7acbe5dcb70623e5ac9ade871de1a
│ │ ├── crash-7e2d460edd5d5d7f5548922f10489f468d1638bf
│ │ ├── crash-7e3b3351f85a64bf0932a9ec7faca66717991c0f
│ │ ├── crash-9b6dfaedb1a8baca07492a8be205582db2e81ae3
│ │ ├── crash-af6dff495b4c6b06250561160b019a33de972478
│ │ ├── crash-b9a848d594a7b1d0a0d698d10d2fed4f2f96c038
│ │ ├── crash-ba25a83b65e08f750cf832e205e16f1d298ea614
│ │ └── crash-c14c0b082685dee2e98ab564c39883932f869cdd
│ ├── memory-leaks/
│ │ └── .placeholder
│ └── timeouts/
│ └── .placeholder
├── fbs/
│ ├── activeSpeakerObserver.fbs
│ ├── audioLevelObserver.fbs
│ ├── common.fbs
│ ├── consumer.fbs
│ ├── dataConsumer.fbs
│ ├── dataProducer.fbs
│ ├── directTransport.fbs
│ ├── liburing.fbs
│ ├── log.fbs
│ ├── meson.build
│ ├── message.fbs
│ ├── notification.fbs
│ ├── pipeTransport.fbs
│ ├── plainTransport.fbs
│ ├── producer.fbs
│ ├── request.fbs
│ ├── response.fbs
│ ├── router.fbs
│ ├── rtpObserver.fbs
│ ├── rtpPacket.fbs
│ ├── rtpParameters.fbs
│ ├── rtpStream.fbs
│ ├── rtxStream.fbs
│ ├── sctpAssociation.fbs
│ ├── sctpParameters.fbs
│ ├── srtpParameters.fbs
│ ├── transport.fbs
│ ├── webRtcServer.fbs
│ ├── webRtcTransport.fbs
│ └── worker.fbs
├── fuzzer/
│ ├── include/
│ │ ├── FuzzerUtils.hpp
│ │ └── RTC/
│ │ ├── FuzzerDtlsTransport.hpp
│ │ ├── FuzzerRateCalculator.hpp
│ │ ├── FuzzerSeqManager.hpp
│ │ ├── FuzzerTrendCalculator.hpp
│ │ ├── ICE/
│ │ │ └── FuzzerStunPacket.hpp
│ │ ├── RTCP/
│ │ │ ├── FuzzerBye.hpp
│ │ │ ├── FuzzerFeedbackPs.hpp
│ │ │ ├── FuzzerFeedbackPsAfb.hpp
│ │ │ ├── FuzzerFeedbackPsFir.hpp
│ │ │ ├── FuzzerFeedbackPsLei.hpp
│ │ │ ├── FuzzerFeedbackPsPli.hpp
│ │ │ ├── FuzzerFeedbackPsRemb.hpp
│ │ │ ├── FuzzerFeedbackPsRpsi.hpp
│ │ │ ├── FuzzerFeedbackPsSli.hpp
│ │ │ ├── FuzzerFeedbackPsTst.hpp
│ │ │ ├── FuzzerFeedbackPsVbcm.hpp
│ │ │ ├── FuzzerFeedbackRtp.hpp
│ │ │ ├── FuzzerFeedbackRtpEcn.hpp
│ │ │ ├── FuzzerFeedbackRtpNack.hpp
│ │ │ ├── FuzzerFeedbackRtpSrReq.hpp
│ │ │ ├── FuzzerFeedbackRtpTllei.hpp
│ │ │ ├── FuzzerFeedbackRtpTmmb.hpp
│ │ │ ├── FuzzerFeedbackRtpTransport.hpp
│ │ │ ├── FuzzerPacket.hpp
│ │ │ ├── FuzzerReceiverReport.hpp
│ │ │ ├── FuzzerSdes.hpp
│ │ │ ├── FuzzerSenderReport.hpp
│ │ │ └── FuzzerXr.hpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── FuzzerAV1.hpp
│ │ │ │ ├── FuzzerDependencyDescriptor.hpp
│ │ │ │ ├── FuzzerH264.hpp
│ │ │ │ ├── FuzzerOpus.hpp
│ │ │ │ ├── FuzzerVP8.hpp
│ │ │ │ └── FuzzerVP9.hpp
│ │ │ ├── FuzzerPacket.hpp
│ │ │ ├── FuzzerProbationGenerator.hpp
│ │ │ ├── FuzzerRetransmissionBuffer.hpp
│ │ │ └── FuzzerRtpStreamSend.hpp
│ │ └── SCTP/
│ │ ├── FuzzerStateCookie.hpp
│ │ └── packet/
│ │ └── FuzzerPacket.hpp
│ ├── new-corpus/
│ │ └── .placeholder
│ ├── reports/
│ │ ├── .placeholder
│ │ ├── crash-058a4c1cc23eb6852d2d239a5596b10c572faa7b
│ │ ├── crash-082d8c1a727f57b415a81ea68d8dd0c21804a4a1
│ │ ├── crash-2d204ea940d313bbdb69874f035ec5e7664b7181
│ │ ├── crash-572450c78229fbb005891235ad020c4374d44f82
│ │ ├── crash-6cfd7698f02bb829e64f926e2d8ce86596562843
│ │ ├── crash-732ced16c38f8a29b621a590e243782f2102e771
│ │ ├── crash-7e7caf72377ad55d353719f28febb5238eadfc9e
│ │ ├── crash-89d745213ab3a50a7bd6c0bfaa3caf3dd5b81c96
│ │ ├── crash-91572165de5ef12fe8415b150e40457eccca0362
│ │ ├── crash-92e8ac42827b4da15e94289879d56a44c70ee4ec
│ │ ├── crash-9401450d2dad5c11b31f93d7c69660e28ae6a1d6
│ │ ├── crash-9cc885b84ba02d766f422c6512ead3808ded0189
│ │ ├── crash-ac5d03e5d918b7f714c0452a59ad9c0e1ca3e501
│ │ ├── crash-b1dc07dd80d43d55c727cbf97e3db1285502bc39
│ │ ├── crash-b75c1208384621922270e954b4902442592c3ca9
│ │ ├── crash-c079dea0539424a1e986de88801b6a11005509c6
│ │ ├── crash-cb8c8802d60e3501cbf36d5e88b6882b8dfb76c9
│ │ ├── crash-cfd568c4ff6705458b0f431bf5e6fc89d7aa6883
│ │ ├── crash-da39a3ee5e6b4b0d3255bfef95601890afd80709
│ │ ├── crash-dcfd05592934ab472c98a1813256aabb9bb43bfb
│ │ ├── crash-ddfab2c0dd845e8d3e8f8d27e1f4cb49d92d279a
│ │ └── crash-f7c53b8c190ca20d0a3ab04b51a075e2e29bb4c6
│ └── src/
│ ├── FuzzerUtils.cpp
│ ├── RTC/
│ │ ├── FuzzerDtlsTransport.cpp
│ │ ├── FuzzerRateCalculator.cpp
│ │ ├── FuzzerSeqManager.cpp
│ │ ├── FuzzerTrendCalculator.cpp
│ │ ├── ICE/
│ │ │ └── FuzzerStunPacket.cpp
│ │ ├── RTCP/
│ │ │ ├── FuzzerBye.cpp
│ │ │ ├── FuzzerFeedbackPs.cpp
│ │ │ ├── FuzzerFeedbackPsAfb.cpp
│ │ │ ├── FuzzerFeedbackPsFir.cpp
│ │ │ ├── FuzzerFeedbackPsLei.cpp
│ │ │ ├── FuzzerFeedbackPsPli.cpp
│ │ │ ├── FuzzerFeedbackPsRemb.cpp
│ │ │ ├── FuzzerFeedbackPsRpsi.cpp
│ │ │ ├── FuzzerFeedbackPsSli.cpp
│ │ │ ├── FuzzerFeedbackPsTst.cpp
│ │ │ ├── FuzzerFeedbackPsVbcm.cpp
│ │ │ ├── FuzzerFeedbackRtp.cpp
│ │ │ ├── FuzzerFeedbackRtpEcn.cpp
│ │ │ ├── FuzzerFeedbackRtpNack.cpp
│ │ │ ├── FuzzerFeedbackRtpSrReq.cpp
│ │ │ ├── FuzzerFeedbackRtpTllei.cpp
│ │ │ ├── FuzzerFeedbackRtpTmmb.cpp
│ │ │ ├── FuzzerFeedbackRtpTransport.cpp
│ │ │ ├── FuzzerPacket.cpp
│ │ │ ├── FuzzerReceiverReport.cpp
│ │ │ ├── FuzzerSdes.cpp
│ │ │ ├── FuzzerSenderReport.cpp
│ │ │ └── FuzzerXr.cpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── FuzzerAV1.cpp
│ │ │ │ ├── FuzzerDependencyDescriptor.cpp
│ │ │ │ ├── FuzzerH264.cpp
│ │ │ │ ├── FuzzerOpus.cpp
│ │ │ │ ├── FuzzerVP8.cpp
│ │ │ │ └── FuzzerVP9.cpp
│ │ │ ├── FuzzerPacket.cpp
│ │ │ ├── FuzzerProbationGenerator.cpp
│ │ │ ├── FuzzerRetransmissionBuffer.cpp
│ │ │ └── FuzzerRtpStreamSend.cpp
│ │ └── SCTP/
│ │ ├── association/
│ │ │ └── FuzzerStateCookie.cpp
│ │ └── packet/
│ │ └── FuzzerPacket.cpp
│ └── fuzzer.cpp
├── include/
│ ├── Channel/
│ │ ├── ChannelMessageRegistrator.hpp
│ │ ├── ChannelMessageRegistratorInterface.hpp
│ │ ├── ChannelNotification.hpp
│ │ ├── ChannelNotifier.hpp
│ │ ├── ChannelRequest.hpp
│ │ └── ChannelSocket.hpp
│ ├── DepLibSRTP.hpp
│ ├── DepLibUV.hpp
│ ├── DepLibUring.hpp
│ ├── DepLibWebRTC.hpp
│ ├── DepOpenSSL.hpp
│ ├── DepUsrSCTP.hpp
│ ├── LogLevel.hpp
│ ├── Logger.hpp
│ ├── MediaSoupErrors.hpp
│ ├── RTC/
│ │ ├── ActiveSpeakerObserver.hpp
│ │ ├── AudioLevelObserver.hpp
│ │ ├── BweType.hpp
│ │ ├── Consts.hpp
│ │ ├── Consumer.hpp
│ │ ├── ConsumerTypes.hpp
│ │ ├── DataConsumer.hpp
│ │ ├── DataProducer.hpp
│ │ ├── DirectTransport.hpp
│ │ ├── DtlsTransport.hpp
│ │ ├── ICE/
│ │ │ ├── IceCandidate.hpp
│ │ │ ├── IceServer.hpp
│ │ │ └── StunPacket.hpp
│ │ ├── KeyFrameRequestManager.hpp
│ │ ├── NackGenerator.hpp
│ │ ├── Parameters.hpp
│ │ ├── PipeConsumer.hpp
│ │ ├── PipeTransport.hpp
│ │ ├── PlainTransport.hpp
│ │ ├── PortManager.hpp
│ │ ├── Producer.hpp
│ │ ├── RTCP/
│ │ │ ├── Bye.hpp
│ │ │ ├── CompoundPacket.hpp
│ │ │ ├── Feedback.hpp
│ │ │ ├── FeedbackItem.hpp
│ │ │ ├── FeedbackPs.hpp
│ │ │ ├── FeedbackPsAfb.hpp
│ │ │ ├── FeedbackPsFir.hpp
│ │ │ ├── FeedbackPsLei.hpp
│ │ │ ├── FeedbackPsPli.hpp
│ │ │ ├── FeedbackPsRemb.hpp
│ │ │ ├── FeedbackPsRpsi.hpp
│ │ │ ├── FeedbackPsSli.hpp
│ │ │ ├── FeedbackPsTst.hpp
│ │ │ ├── FeedbackPsVbcm.hpp
│ │ │ ├── FeedbackRtp.hpp
│ │ │ ├── FeedbackRtpEcn.hpp
│ │ │ ├── FeedbackRtpNack.hpp
│ │ │ ├── FeedbackRtpSrReq.hpp
│ │ │ ├── FeedbackRtpTllei.hpp
│ │ │ ├── FeedbackRtpTmmb.hpp
│ │ │ ├── FeedbackRtpTransport.hpp
│ │ │ ├── Packet.hpp
│ │ │ ├── ReceiverReport.hpp
│ │ │ ├── Sdes.hpp
│ │ │ ├── SenderReport.hpp
│ │ │ ├── XR.hpp
│ │ │ ├── XrDelaySinceLastRr.hpp
│ │ │ └── XrReceiverReferenceTime.hpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── AV1.hpp
│ │ │ │ ├── DependencyDescriptor.hpp
│ │ │ │ ├── H264.hpp
│ │ │ │ ├── Opus.hpp
│ │ │ │ ├── PayloadDescriptorHandler.hpp
│ │ │ │ ├── Tools.hpp
│ │ │ │ ├── VP8.hpp
│ │ │ │ └── VP9.hpp
│ │ │ ├── HeaderExtensionIds.hpp
│ │ │ ├── Packet.hpp
│ │ │ ├── ProbationGenerator.hpp
│ │ │ ├── RetransmissionBuffer.hpp
│ │ │ ├── RtpStream.hpp
│ │ │ ├── RtpStreamRecv.hpp
│ │ │ ├── RtpStreamSend.hpp
│ │ │ ├── RtxStream.hpp
│ │ │ └── SharedPacket.hpp
│ │ ├── RateCalculator.hpp
│ │ ├── Router.hpp
│ │ ├── RtcLogger.hpp
│ │ ├── RtpDictionaries.hpp
│ │ ├── RtpListener.hpp
│ │ ├── RtpObserver.hpp
│ │ ├── SCTP/
│ │ │ ├── TODO_SCTP.md
│ │ │ ├── association/
│ │ │ │ ├── Association.hpp
│ │ │ │ ├── AssociationListenerDeferrer.hpp
│ │ │ │ ├── HeartbeatHandler.hpp
│ │ │ │ ├── NegotiatedCapabilities.hpp
│ │ │ │ ├── PacketSender.hpp
│ │ │ │ ├── StateCookie.hpp
│ │ │ │ ├── StreamResetHandler.hpp
│ │ │ │ ├── TransmissionControlBlock.hpp
│ │ │ │ └── TransmissionControlBlockContextInterface.hpp
│ │ │ ├── packet/
│ │ │ │ ├── Chunk.hpp
│ │ │ │ ├── ErrorCause.hpp
│ │ │ │ ├── Packet.hpp
│ │ │ │ ├── Parameter.hpp
│ │ │ │ ├── TLV.hpp
│ │ │ │ ├── UserData.hpp
│ │ │ │ ├── chunks/
│ │ │ │ │ ├── AbortAssociationChunk.hpp
│ │ │ │ │ ├── AnyDataChunk.hpp
│ │ │ │ │ ├── AnyForwardTsnChunk.hpp
│ │ │ │ │ ├── AnyInitChunk.hpp
│ │ │ │ │ ├── CookieAckChunk.hpp
│ │ │ │ │ ├── CookieEchoChunk.hpp
│ │ │ │ │ ├── DataChunk.hpp
│ │ │ │ │ ├── ForwardTsnChunk.hpp
│ │ │ │ │ ├── HeartbeatAckChunk.hpp
│ │ │ │ │ ├── HeartbeatRequestChunk.hpp
│ │ │ │ │ ├── IDataChunk.hpp
│ │ │ │ │ ├── IForwardTsnChunk.hpp
│ │ │ │ │ ├── InitAckChunk.hpp
│ │ │ │ │ ├── InitChunk.hpp
│ │ │ │ │ ├── OperationErrorChunk.hpp
│ │ │ │ │ ├── ReConfigChunk.hpp
│ │ │ │ │ ├── SackChunk.hpp
│ │ │ │ │ ├── ShutdownAckChunk.hpp
│ │ │ │ │ ├── ShutdownChunk.hpp
│ │ │ │ │ ├── ShutdownCompleteChunk.hpp
│ │ │ │ │ └── UnknownChunk.hpp
│ │ │ │ ├── errorCauses/
│ │ │ │ │ ├── CookieReceivedWhileShuttingDownErrorCause.hpp
│ │ │ │ │ ├── InvalidMandatoryParameterErrorCause.hpp
│ │ │ │ │ ├── InvalidStreamIdentifierErrorCause.hpp
│ │ │ │ │ ├── MissingMandatoryParameterErrorCause.hpp
│ │ │ │ │ ├── NoUserDataErrorCause.hpp
│ │ │ │ │ ├── OutOfResourceErrorCause.hpp
│ │ │ │ │ ├── ProtocolViolationErrorCause.hpp
│ │ │ │ │ ├── RestartOfAnAssociationWithNewAddressesErrorCause.hpp
│ │ │ │ │ ├── StaleCookieErrorCause.hpp
│ │ │ │ │ ├── UnknownErrorCause.hpp
│ │ │ │ │ ├── UnrecognizedChunkTypeErrorCause.hpp
│ │ │ │ │ ├── UnrecognizedParametersErrorCause.hpp
│ │ │ │ │ ├── UnresolvableAddressErrorCause.hpp
│ │ │ │ │ └── UserInitiatedAbortErrorCause.hpp
│ │ │ │ └── parameters/
│ │ │ │ ├── AddIncomingStreamsRequestParameter.hpp
│ │ │ │ ├── AddOutgoingStreamsRequestParameter.hpp
│ │ │ │ ├── CookiePreservativeParameter.hpp
│ │ │ │ ├── ForwardTsnSupportedParameter.hpp
│ │ │ │ ├── HeartbeatInfoParameter.hpp
│ │ │ │ ├── IPv4AddressParameter.hpp
│ │ │ │ ├── IPv6AddressParameter.hpp
│ │ │ │ ├── IncomingSsnResetRequestParameter.hpp
│ │ │ │ ├── OutgoingSsnResetRequestParameter.hpp
│ │ │ │ ├── ReconfigurationResponseParameter.hpp
│ │ │ │ ├── SsnTsnResetRequestParameter.hpp
│ │ │ │ ├── StateCookieParameter.hpp
│ │ │ │ ├── SupportedAddressTypesParameter.hpp
│ │ │ │ ├── SupportedExtensionsParameter.hpp
│ │ │ │ ├── UnknownParameter.hpp
│ │ │ │ ├── UnrecognizedParameterParameter.hpp
│ │ │ │ └── ZeroChecksumAcceptableParameter.hpp
│ │ │ ├── public/
│ │ │ │ ├── AssociationInterface.hpp
│ │ │ │ ├── AssociationListenerInterface.hpp
│ │ │ │ ├── AssociationMetrics.hpp
│ │ │ │ ├── Message.hpp
│ │ │ │ ├── SctpOptions.hpp
│ │ │ │ └── SctpTypes.hpp
│ │ │ ├── rx/
│ │ │ │ ├── DataTracker.hpp
│ │ │ │ ├── InterleavedReassemblyStreams.hpp
│ │ │ │ ├── ReassemblyQueue.hpp
│ │ │ │ ├── ReassemblyStreamsInterface.hpp
│ │ │ │ └── TraditionalReassemblyStreams.hpp
│ │ │ └── tx/
│ │ │ ├── OutstandingData.hpp
│ │ │ ├── RetransmissionErrorCounter.hpp
│ │ │ ├── RetransmissionQueue.hpp
│ │ │ ├── RetransmissionTimeout.hpp
│ │ │ ├── RoundRobinSendQueue.hpp
│ │ │ ├── SendQueueInterface.hpp
│ │ │ └── StreamScheduler.hpp
│ │ ├── SctpAssociation.hpp
│ │ ├── SctpDictionaries.hpp
│ │ ├── SctpListener.hpp
│ │ ├── SenderBandwidthEstimator.hpp
│ │ ├── SeqManager.hpp
│ │ ├── Serializable.hpp
│ │ ├── SimpleConsumer.hpp
│ │ ├── SimulcastConsumer.hpp
│ │ ├── SrtpSession.hpp
│ │ ├── SvcConsumer.hpp
│ │ ├── TcpConnection.hpp
│ │ ├── TcpServer.hpp
│ │ ├── Transport.hpp
│ │ ├── TransportCongestionControlClient.hpp
│ │ ├── TransportCongestionControlServer.hpp
│ │ ├── TransportTuple.hpp
│ │ ├── TrendCalculator.hpp
│ │ ├── UdpSocket.hpp
│ │ ├── WebRtcServer.hpp
│ │ └── WebRtcTransport.hpp
│ ├── Settings.hpp
│ ├── Shared.hpp
│ ├── SharedInterface.hpp
│ ├── Utils/
│ │ └── UnwrappedSequenceNumber.hpp
│ ├── Utils.hpp
│ ├── Worker.hpp
│ ├── common.hpp
│ ├── handles/
│ │ ├── BackoffTimerHandle.hpp
│ │ ├── BackoffTimerHandleInterface.hpp
│ │ ├── SignalHandle.hpp
│ │ ├── TcpConnectionHandle.hpp
│ │ ├── TcpServerHandle.hpp
│ │ ├── TimerHandle.hpp
│ │ ├── TimerHandleInterface.hpp
│ │ ├── UdpSocketHandle.hpp
│ │ └── UnixStreamSocketHandle.hpp
│ └── lib.hpp
├── meson.build
├── meson_options.txt
├── mocks/
│ ├── include/
│ │ ├── Channel/
│ │ │ └── MockChannelMessageRegistrator.hpp
│ │ ├── MockShared.hpp
│ │ ├── RTC/
│ │ │ └── SCTP/
│ │ │ ├── association/
│ │ │ │ ├── MockAssociationListener.hpp
│ │ │ │ └── MockTransmissionControlBlockContext.hpp
│ │ │ └── tx/
│ │ │ └── MockSendQueue.hpp
│ │ ├── handles/
│ │ │ ├── MockBackoffTimerHandle.hpp
│ │ │ └── MockTimerHandle.hpp
│ │ └── mockTypes.hpp
│ └── src/
│ ├── Channel/
│ │ └── MockChannelMessageRegistrator.cpp
│ ├── MockShared.cpp
│ ├── RTC/
│ │ └── SCTP/
│ │ └── association/
│ │ └── MockTransmissionControlBlockContext.cpp
│ └── handles/
│ └── MockBackoffTimerHandle.cpp
├── scripts/
│ ├── .npmrc
│ ├── clang-scripts.mjs
│ ├── get-dep.sh
│ ├── package.json
│ └── run-fuzzer.sh
├── src/
│ ├── Channel/
│ │ ├── ChannelMessageRegistrator.cpp
│ │ ├── ChannelNotification.cpp
│ │ ├── ChannelNotifier.cpp
│ │ ├── ChannelRequest.cpp
│ │ └── ChannelSocket.cpp
│ ├── DepLibSRTP.cpp
│ ├── DepLibUV.cpp
│ ├── DepLibUring.cpp
│ ├── DepLibWebRTC.cpp
│ ├── DepOpenSSL.cpp
│ ├── DepUsrSCTP.cpp
│ ├── Logger.cpp
│ ├── MediaSoupErrors.cpp
│ ├── RTC/
│ │ ├── ActiveSpeakerObserver.cpp
│ │ ├── AudioLevelObserver.cpp
│ │ ├── Consumer.cpp
│ │ ├── DataConsumer.cpp
│ │ ├── DataProducer.cpp
│ │ ├── DirectTransport.cpp
│ │ ├── DtlsTransport.cpp
│ │ ├── ICE/
│ │ │ ├── IceCandidate.cpp
│ │ │ ├── IceServer.cpp
│ │ │ └── StunPacket.cpp
│ │ ├── KeyFrameRequestManager.cpp
│ │ ├── NackGenerator.cpp
│ │ ├── PipeConsumer.cpp
│ │ ├── PipeTransport.cpp
│ │ ├── PlainTransport.cpp
│ │ ├── PortManager.cpp
│ │ ├── Producer.cpp
│ │ ├── RTCP/
│ │ │ ├── Bye.cpp
│ │ │ ├── CompoundPacket.cpp
│ │ │ ├── Feedback.cpp
│ │ │ ├── FeedbackPs.cpp
│ │ │ ├── FeedbackPsAfb.cpp
│ │ │ ├── FeedbackPsFir.cpp
│ │ │ ├── FeedbackPsLei.cpp
│ │ │ ├── FeedbackPsPli.cpp
│ │ │ ├── FeedbackPsRemb.cpp
│ │ │ ├── FeedbackPsRpsi.cpp
│ │ │ ├── FeedbackPsSli.cpp
│ │ │ ├── FeedbackPsTst.cpp
│ │ │ ├── FeedbackPsVbcm.cpp
│ │ │ ├── FeedbackRtp.cpp
│ │ │ ├── FeedbackRtpEcn.cpp
│ │ │ ├── FeedbackRtpNack.cpp
│ │ │ ├── FeedbackRtpSrReq.cpp
│ │ │ ├── FeedbackRtpTllei.cpp
│ │ │ ├── FeedbackRtpTmmb.cpp
│ │ │ ├── FeedbackRtpTransport.cpp
│ │ │ ├── Packet.cpp
│ │ │ ├── ReceiverReport.cpp
│ │ │ ├── Sdes.cpp
│ │ │ ├── SenderReport.cpp
│ │ │ ├── XR.cpp
│ │ │ ├── XrDelaySinceLastRr.cpp
│ │ │ └── XrReceiverReferenceTime.cpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── AV1.cpp
│ │ │ │ ├── DependencyDescriptor.cpp
│ │ │ │ ├── H264.cpp
│ │ │ │ ├── Opus.cpp
│ │ │ │ ├── VP8.cpp
│ │ │ │ └── VP9.cpp
│ │ │ ├── Packet.cpp
│ │ │ ├── ProbationGenerator.cpp
│ │ │ ├── RetransmissionBuffer.cpp
│ │ │ ├── RtpStream.cpp
│ │ │ ├── RtpStreamRecv.cpp
│ │ │ ├── RtpStreamSend.cpp
│ │ │ ├── RtxStream.cpp
│ │ │ └── SharedPacket.cpp
│ │ ├── RateCalculator.cpp
│ │ ├── Router.cpp
│ │ ├── RtcLogger.cpp
│ │ ├── RtpDictionaries/
│ │ │ ├── Parameters.cpp
│ │ │ ├── RtcpFeedback.cpp
│ │ │ ├── RtcpParameters.cpp
│ │ │ ├── RtpCodecMimeType.cpp
│ │ │ ├── RtpCodecParameters.cpp
│ │ │ ├── RtpEncodingParameters.cpp
│ │ │ ├── RtpHeaderExtensionParameters.cpp
│ │ │ ├── RtpHeaderExtensionUri.cpp
│ │ │ ├── RtpParameters.cpp
│ │ │ └── RtpRtxParameters.cpp
│ │ ├── RtpListener.cpp
│ │ ├── RtpObserver.cpp
│ │ ├── SCTP/
│ │ │ ├── association/
│ │ │ │ ├── Association.cpp
│ │ │ │ ├── AssociationListenerDeferrer.cpp
│ │ │ │ ├── HeartbeatHandler.cpp
│ │ │ │ ├── NegotiatedCapabilities.cpp
│ │ │ │ ├── PacketSender.cpp
│ │ │ │ ├── StateCookie.cpp
│ │ │ │ ├── StreamResetHandler.cpp
│ │ │ │ └── TransmissionControlBlock.cpp
│ │ │ ├── packet/
│ │ │ │ ├── Chunk.cpp
│ │ │ │ ├── ErrorCause.cpp
│ │ │ │ ├── Packet.cpp
│ │ │ │ ├── Parameter.cpp
│ │ │ │ ├── TLV.cpp
│ │ │ │ ├── UserData.cpp
│ │ │ │ ├── chunks/
│ │ │ │ │ ├── AbortAssociationChunk.cpp
│ │ │ │ │ ├── CookieAckChunk.cpp
│ │ │ │ │ ├── CookieEchoChunk.cpp
│ │ │ │ │ ├── DataChunk.cpp
│ │ │ │ │ ├── ForwardTsnChunk.cpp
│ │ │ │ │ ├── HeartbeatAckChunk.cpp
│ │ │ │ │ ├── HeartbeatRequestChunk.cpp
│ │ │ │ │ ├── IDataChunk.cpp
│ │ │ │ │ ├── IForwardTsnChunk.cpp
│ │ │ │ │ ├── InitAckChunk.cpp
│ │ │ │ │ ├── InitChunk.cpp
│ │ │ │ │ ├── OperationErrorChunk.cpp
│ │ │ │ │ ├── ReConfigChunk.cpp
│ │ │ │ │ ├── SackChunk.cpp
│ │ │ │ │ ├── ShutdownAckChunk.cpp
│ │ │ │ │ ├── ShutdownChunk.cpp
│ │ │ │ │ ├── ShutdownCompleteChunk.cpp
│ │ │ │ │ └── UnknownChunk.cpp
│ │ │ │ ├── errorCauses/
│ │ │ │ │ ├── CookieReceivedWhileShuttingDownErrorCause.cpp
│ │ │ │ │ ├── InvalidMandatoryParameterErrorCause.cpp
│ │ │ │ │ ├── InvalidStreamIdentifierErrorCause.cpp
│ │ │ │ │ ├── MissingMandatoryParameterErrorCause.cpp
│ │ │ │ │ ├── NoUserDataErrorCause.cpp
│ │ │ │ │ ├── OutOfResourceErrorCause.cpp
│ │ │ │ │ ├── ProtocolViolationErrorCause.cpp
│ │ │ │ │ ├── RestartOfAnAssociationWithNewAddressesErrorCause.cpp
│ │ │ │ │ ├── StaleCookieErrorCause.cpp
│ │ │ │ │ ├── UnknownErrorCause.cpp
│ │ │ │ │ ├── UnrecognizedChunkTypeErrorCause.cpp
│ │ │ │ │ ├── UnrecognizedParametersErrorCause.cpp
│ │ │ │ │ ├── UnresolvableAddressErrorCause.cpp
│ │ │ │ │ └── UserInitiatedAbortErrorCause.cpp
│ │ │ │ └── parameters/
│ │ │ │ ├── AddIncomingStreamsRequestParameter.cpp
│ │ │ │ ├── AddOutgoingStreamsRequestParameter.cpp
│ │ │ │ ├── CookiePreservativeParameter.cpp
│ │ │ │ ├── ForwardTsnSupportedParameter.cpp
│ │ │ │ ├── HeartbeatInfoParameter.cpp
│ │ │ │ ├── IPv4AddressParameter.cpp
│ │ │ │ ├── IPv6AddressParameter.cpp
│ │ │ │ ├── IncomingSsnResetRequestParameter.cpp
│ │ │ │ ├── OutgoingSsnResetRequestParameter.cpp
│ │ │ │ ├── ReconfigurationResponseParameter.cpp
│ │ │ │ ├── SsnTsnResetRequestParameter.cpp
│ │ │ │ ├── StateCookieParameter.cpp
│ │ │ │ ├── SupportedAddressTypesParameter.cpp
│ │ │ │ ├── SupportedExtensionsParameter.cpp
│ │ │ │ ├── UnknownParameter.cpp
│ │ │ │ ├── UnrecognizedParameterParameter.cpp
│ │ │ │ └── ZeroChecksumAcceptableParameter.cpp
│ │ │ ├── public/
│ │ │ │ ├── AssociationMetrics.cpp
│ │ │ │ └── Message.cpp
│ │ │ ├── rx/
│ │ │ │ ├── DataTracker.cpp
│ │ │ │ ├── InterleavedReassemblyStreams.cpp
│ │ │ │ ├── ReassemblyQueue.cpp
│ │ │ │ └── TraditionalReassemblyStreams.cpp
│ │ │ └── tx/
│ │ │ ├── OutstandingData.cpp
│ │ │ ├── RetransmissionErrorCounter.cpp
│ │ │ ├── RetransmissionQueue.cpp
│ │ │ ├── RetransmissionTimeout.cpp
│ │ │ ├── RoundRobinSendQueue.cpp
│ │ │ └── StreamScheduler.cpp
│ │ ├── SctpAssociation.cpp
│ │ ├── SctpDictionaries/
│ │ │ └── SctpStreamParameters.cpp
│ │ ├── SctpListener.cpp
│ │ ├── SenderBandwidthEstimator.cpp
│ │ ├── SeqManager.cpp
│ │ ├── Serializable.cpp
│ │ ├── SimpleConsumer.cpp
│ │ ├── SimulcastConsumer.cpp
│ │ ├── SrtpSession.cpp
│ │ ├── SvcConsumer.cpp
│ │ ├── TcpConnection.cpp
│ │ ├── TcpServer.cpp
│ │ ├── Transport.cpp
│ │ ├── TransportCongestionControlClient.cpp
│ │ ├── TransportCongestionControlServer.cpp
│ │ ├── TransportTuple.cpp
│ │ ├── TrendCalculator.cpp
│ │ ├── UdpSocket.cpp
│ │ ├── WebRtcServer.cpp
│ │ └── WebRtcTransport.cpp
│ ├── Settings.cpp
│ ├── Shared.cpp
│ ├── Utils/
│ │ ├── BitStream.cpp
│ │ ├── Crypto.cpp
│ │ ├── File.cpp
│ │ ├── IP.cpp
│ │ ├── README_BASE64_UTILS
│ │ └── String.cpp
│ ├── Worker.cpp
│ ├── handles/
│ │ ├── BackoffTimerHandle.cpp
│ │ ├── SignalHandle.cpp
│ │ ├── TcpConnectionHandle.cpp
│ │ ├── TcpServerHandle.cpp
│ │ ├── TimerHandle.cpp
│ │ ├── UdpSocketHandle.cpp
│ │ └── UnixStreamSocketHandle.cpp
│ ├── lib.cpp
│ ├── lib.rs
│ └── main.cpp
├── subprojects/
│ ├── .clang-tidy
│ ├── abseil-cpp.wrap
│ ├── catch2.wrap
│ ├── flatbuffers.wrap
│ ├── libsrtp3.wrap
│ ├── liburing.wrap
│ ├── libuv.wrap
│ ├── openssl.wrap
│ ├── usrsctp.wrap
│ └── wingetopt.wrap
├── tasks.py
├── test/
│ ├── data/
│ │ ├── H264_SVC/
│ │ │ └── naluInfo/
│ │ │ ├── naluInfo.264
│ │ │ └── naluInfo.csv
│ │ ├── packet1.info
│ │ ├── packet1.raw
│ │ ├── packet2.info
│ │ ├── packet2.raw
│ │ ├── packet3.info
│ │ ├── packet3.raw
│ │ └── rtp-stream-1.txt
│ ├── include/
│ │ ├── RTC/
│ │ │ ├── ICE/
│ │ │ │ └── iceCommon.hpp
│ │ │ ├── RTP/
│ │ │ │ └── rtpCommon.hpp
│ │ │ └── SCTP/
│ │ │ └── sctpCommon.hpp
│ │ ├── catch2Macros.hpp
│ │ └── testHelpers.hpp
│ └── src/
│ ├── RTC/
│ │ ├── ICE/
│ │ │ ├── TestStunPacket.cpp
│ │ │ └── iceCommon.cpp
│ │ ├── RTCP/
│ │ │ ├── TestBye.cpp
│ │ │ ├── TestFeedbackPsAfb.cpp
│ │ │ ├── TestFeedbackPsFir.cpp
│ │ │ ├── TestFeedbackPsLei.cpp
│ │ │ ├── TestFeedbackPsPli.cpp
│ │ │ ├── TestFeedbackPsRemb.cpp
│ │ │ ├── TestFeedbackPsRpsi.cpp
│ │ │ ├── TestFeedbackPsSli.cpp
│ │ │ ├── TestFeedbackPsTst.cpp
│ │ │ ├── TestFeedbackPsVbcm.cpp
│ │ │ ├── TestFeedbackRtpEcn.cpp
│ │ │ ├── TestFeedbackRtpNack.cpp
│ │ │ ├── TestFeedbackRtpSrReq.cpp
│ │ │ ├── TestFeedbackRtpTllei.cpp
│ │ │ ├── TestFeedbackRtpTmmb.cpp
│ │ │ ├── TestFeedbackRtpTransport.cpp
│ │ │ ├── TestPacket.cpp
│ │ │ ├── TestReceiverReport.cpp
│ │ │ ├── TestSdes.cpp
│ │ │ ├── TestSenderReport.cpp
│ │ │ └── TestXr.cpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── TestDependencyDescriptor.cpp
│ │ │ │ ├── TestH264.cpp
│ │ │ │ ├── TestVP8.cpp
│ │ │ │ └── TestVP9.cpp
│ │ │ ├── TestPacket.cpp
│ │ │ ├── TestProbationGenerator.cpp
│ │ │ ├── TestRetransmissionBuffer.cpp
│ │ │ ├── TestRtpStreamRecv.cpp
│ │ │ ├── TestRtpStreamSend.cpp
│ │ │ ├── TestSharedPacket.cpp
│ │ │ └── rtpCommon.cpp
│ │ ├── SCTP/
│ │ │ ├── association/
│ │ │ │ ├── TestHeartbeatHandler.cpp
│ │ │ │ ├── TestNegotiatedCapabilities.cpp
│ │ │ │ └── TestStateCookie.cpp
│ │ │ ├── packet/
│ │ │ │ ├── TestChunk.cpp
│ │ │ │ ├── TestErrorCause.cpp
│ │ │ │ ├── TestPacket.cpp
│ │ │ │ ├── TestParameter.cpp
│ │ │ │ ├── chunks/
│ │ │ │ │ ├── TestAbortAssociationChunk.cpp
│ │ │ │ │ ├── TestCookieAckChunk.cpp
│ │ │ │ │ ├── TestCookieEchoChunk.cpp
│ │ │ │ │ ├── TestDataChunk.cpp
│ │ │ │ │ ├── TestForwardTsnChunk.cpp
│ │ │ │ │ ├── TestHeartbeatAckChunk.cpp
│ │ │ │ │ ├── TestHeartbeatRequestChunk.cpp
│ │ │ │ │ ├── TestIDataChunk.cpp
│ │ │ │ │ ├── TestIForwardTsnChunk.cpp
│ │ │ │ │ ├── TestInitAckChunk.cpp
│ │ │ │ │ ├── TestInitChunk.cpp
│ │ │ │ │ ├── TestOperationErrorChunk.cpp
│ │ │ │ │ ├── TestReConfigChunk.cpp
│ │ │ │ │ ├── TestSackChunk.cpp
│ │ │ │ │ ├── TestShutdownAckChunk.cpp
│ │ │ │ │ ├── TestShutdownChunk.cpp
│ │ │ │ │ ├── TestShutdownCompleteChunk.cpp
│ │ │ │ │ └── TestUnknownChunk.cpp
│ │ │ │ ├── errorCauses/
│ │ │ │ │ ├── TestCookieReceivedWhileShuttingDownErrorCause.cpp
│ │ │ │ │ ├── TestInvalidMandatoryParameterErrorCause.cpp
│ │ │ │ │ ├── TestInvalidStreamIdentifierErrorCause.cpp
│ │ │ │ │ ├── TestMissingMandatoryParameterErrorCause.cpp
│ │ │ │ │ ├── TestNoUserDataErrorCause.cpp
│ │ │ │ │ ├── TestOutOfResourceErrorCause.cpp
│ │ │ │ │ ├── TestProtocolViolationErrorCause.cpp
│ │ │ │ │ ├── TestRestartOfAnAssociationWithNewAddressesErrorCause.cpp
│ │ │ │ │ ├── TestStaleCookieErrorCause.cpp
│ │ │ │ │ ├── TestUnknownErrorCause.cpp
│ │ │ │ │ ├── TestUnrecognizedChunkTypeErrorCause.cpp
│ │ │ │ │ ├── TestUnrecognizedParametersErrorCause.cpp
│ │ │ │ │ ├── TestUnresolvableAddressErrorCause.cpp
│ │ │ │ │ └── TestUserInitiatedAbortErrorCause.cpp
│ │ │ │ └── parameters/
│ │ │ │ ├── TestAddIncomingStreamsRequestParameter.cpp
│ │ │ │ ├── TestAddOutgoingStreamsRequestParameter.cpp
│ │ │ │ ├── TestCookiePreservativeParameter.cpp
│ │ │ │ ├── TestForwardTsnSupportedParameter.cpp
│ │ │ │ ├── TestHeartbeatInfoParameter.cpp
│ │ │ │ ├── TestIPv4AddressParameter.cpp
│ │ │ │ ├── TestIPv6AddressParameter.cpp
│ │ │ │ ├── TestIncomingSsnResetRequestParameter.cpp
│ │ │ │ ├── TestOutgoingSsnResetRequestParameter.cpp
│ │ │ │ ├── TestReconfigurationResponseParameter.cpp
│ │ │ │ ├── TestSsnTsnResetRequestParameter.cpp
│ │ │ │ ├── TestStateCookieParameter.cpp
│ │ │ │ ├── TestSupportedAddressTypesParameter.cpp
│ │ │ │ ├── TestSupportedExtensionsParameter.cpp
│ │ │ │ ├── TestUnknownParameter.cpp
│ │ │ │ ├── TestUnrecognizedParameterParameter.cpp
│ │ │ │ └── TestZeroChecksumAcceptableParameter.cpp
│ │ │ ├── rx/
│ │ │ │ ├── TestDataTracker.cpp
│ │ │ │ ├── TestInterleavedReassemblyStreams.cpp
│ │ │ │ ├── TestReassemblyQueue.cpp
│ │ │ │ └── TestTraditionalReassemblyStreams.cpp
│ │ │ ├── sctpCommon.cpp
│ │ │ └── tx/
│ │ │ ├── TestOutstandingData.cpp
│ │ │ ├── TestRetransmissionErrorCounter.cpp
│ │ │ ├── TestRetransmissionQueue.cpp
│ │ │ ├── TestRetransmissionTimeout.cpp
│ │ │ ├── TestRoundRobinSendQueue.cpp
│ │ │ └── TestStreamScheduler.cpp
│ │ ├── TestKeyFrameRequestManager.cpp
│ │ ├── TestNackGenerator.cpp
│ │ ├── TestRateCalculator.cpp
│ │ ├── TestRtpEncodingParameters.cpp
│ │ ├── TestSeqManager.cpp
│ │ ├── TestSimpleConsumer.cpp
│ │ ├── TestTransportCongestionControlServer.cpp
│ │ ├── TestTransportTuple.cpp
│ │ └── TestTrendCalculator.cpp
│ ├── Utils/
│ │ ├── TestBits.cpp
│ │ ├── TestByte.cpp
│ │ ├── TestCrypto.cpp
│ │ ├── TestIP.cpp
│ │ ├── TestNumber.cpp
│ │ ├── TestString.cpp
│ │ ├── TestTime.cpp
│ │ └── TestUnwrappedSequenceNumber.cpp
│ ├── testHelpers.cpp
│ └── tests.cpp
└── ubsan_suppressions.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: https://editorconfig.org
root = true
[*]
indent_style = tab
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{ts,mts,mjs,cjs,js}]
indent_style = tab
[*.json]
indent_style = tab
[*.md]
indent_style = tab
[*.toml]
indent_style = space
indent_size = 4
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: mediasoup
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with a single custom sponsorship URL
================================================
FILE: .github/ISSUE_TEMPLATE/Bug_Report.md
================================================
---
name: 🐍 Bug Report
about: Report a bug in mediasoup
labels: bug
---
# Bug Report
**IMPORTANT:** We primarily use GitHub as an issue tracker. Just open an issue here if you have encountered a bug in mediasoup.
If you have questions or doubts about mediasoup or need support, please use the mediasoup Discourse Group instead:
https://mediasoup.discourse.group
If you got a crash in mediasoup, please try to provide a core dump into the issue report:
https://mediasoup.org/support/#crashes-in-mediasoup-get-a-core-dump
## Your environment
- Operating system:
- gcc/clang version:
- mediasoup (Node) version:
- mediasoup (Rust) version:
- mediasoup-client version:
## Issue description
================================================
FILE: .github/ISSUE_TEMPLATE/Feature_Request.md
================================================
---
name: 🚀 Feature Request
about: Suggest an idea or improvement for mediasoup
labels: feature
---
# Feature Request
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: 🙈 Support Question
url: https://mediasoup.discourse.group
about: |
We primarily use GitHub as an issue tracker. Please, use the mediasoup Discourse Group if you have questions or doubts or if you need support about mediasoup and its ecosystem.
Before asking any questions, please check the mediasoup official documentation at https://mediasoup.org/documentation
================================================
FILE: .github/workflows/mediasoup-codeql.yaml
================================================
name: mediasoup-codeql
on:
push:
branches: [v3]
paths:
- 'worker/**'
- 'node/src/**'
- 'rust/src/**'
pull_request:
paths:
- 'worker/**'
- 'node/src/**'
- 'rust/src/**'
workflow_dispatch:
concurrency:
# Cancel a currently running workflow from the same PR, branch or tag when a
# new workflow is triggered.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
analyze:
name: Analyze
runs-on: ubuntu-24.04
timeout-minutes: 120
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ['c-cpp', 'javascript-typescript', 'python']
env:
MEDIASOUP_SKIP_WORKER_PREBUILT_DOWNLOAD: 'true'
MEDIASOUP_LOCAL_DEV: 'true'
MEDIASOUP_BUILDTYPE: 'Release'
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Node.js
uses: actions/setup-node@v6
with:
node-version: 24
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
config: |
paths-ignore:
- 'art/**'
- 'doc/**'
- 'node_modules/**'
- 'node/lib/**'
- 'node/src/fbs/**'
- 'rust/benches/**'
- 'rust/examples/**'
- 'rust/examples-frontend/**'
- 'worker/deps/**'
- 'worker/subprojects/**'
- 'worker/fuzzer/new-corpus/**'
- 'worker/fuzzer/reports/**'
- 'worker/out/**'
# If you wish to specify custom queries, you can do so here or in a
# config file. By default, queries listed here will override any
# specified in a config file. Prefix the list here with "+" to use
# these queries and those in the config file.
#
# Details on CodeQL's query packs refer to:
# https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
#
# queries: security-extended,security-and-quality
# Use `npm ci` to build mediasoup Node and worker instead of relying on
# built-in Autobuild.
- name: npm ci
run: npm ci --foreground-scripts
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: '/language:${{matrix.language}}'
================================================
FILE: .github/workflows/mediasoup-node.yaml
================================================
name: mediasoup-node
on:
push:
branches: [v3]
paths:
- 'node/**'
- 'worker/**'
- 'package.json'
- 'package-lock.json'
- 'tsconfig.json'
- 'npm-scripts.mjs'
- '.github/workflows/mediasoup-node.yaml'
pull_request:
paths:
- 'node/**'
- 'worker/**'
- 'package.json'
- 'package-lock.json'
- 'tsconfig.json'
- 'npm-scripts.mjs'
- '.github/workflows/mediasoup-node.yaml'
workflow_dispatch:
concurrency:
# Cancel a currently running workflow from the same PR, branch or tag when a
# new workflow is triggered.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
ci:
strategy:
# Here we want to see all errors, not just the first one.
fail-fast: false
matrix:
build:
- os: ubuntu-24.04
node: 22
cc: gcc
cxx: g++
- os: ubuntu-24.04
node: 24
cc: gcc
cxx: g++
meson_args: '-Db_sanitize=address'
npm-audit: true
run-lint: true
- os: ubuntu-24.04
node: 24
cc: gcc
cxx: g++
- os: ubuntu-24.04
node: 24
cc: clang
cxx: clang++
meson_args: '-Db_sanitize=undefined'
- os: ubuntu-24.04-arm
node: 22
cc: gcc
cxx: g++
- os: ubuntu-24.04-arm
node: 24
cc: gcc
cxx: g++
meson_args: '-Db_sanitize=address'
# In Ubuntu 24.04 ARM in Debug build type with ASAN, createWorker()
# takes too long.
# See https://github.com/versatica/mediasoup/pull/1503.
skip-test-in-debug-build-type: true
- os: macos-15
node: 24
cc: clang
cxx: clang++
- os: windows-2022
node: 22
cc: cl
cxx: cl
- os: windows-2025
node: 24
cc: cl
cxx: cl
build-type:
- Release
- Debug
runs-on: ${{ matrix.build.os }}
timeout-minutes: 60
env:
CC: ${{ matrix.build.cc }}
CXX: ${{ matrix.build.cxx }}
MEDIASOUP_SKIP_WORKER_PREBUILT_DOWNLOAD: 'true'
MEDIASOUP_LOCAL_DEV: 'true'
MEDIASOUP_BUILDTYPE: ${{ matrix.build-type }}
MESON_ARGS: ${{ matrix.build.meson_args }}
# Disable leak detection because it's detected by the tool flatc uses to build.
# NOTE: This env only affects when 'b_sanitize' args are given in `meson_args`.
ASAN_OPTIONS: 'detect_leaks=0 symbolize=1 detect_stack_use_after_return=1 strict_init_order=1 check_initialization_order=1 detect_container_overflow=1'
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Node.js
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.build.node }}
- name: Configure cache
uses: actions/cache@v5
with:
path: |
~/.npm
key: ${{ matrix.build.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ matrix.build.os }}-node-
- name: npm ci --foreground-scripts
run: npm ci --foreground-scripts
- if: ${{ matrix.build.npm-audit }}
name: npm audit --omit dev
run: npm audit --omit dev
- if: ${{ matrix.build.npm-audit }}
name: npm audit --prefix worker/scripts
run: npm audit --prefix worker/scripts
- if: ${{ matrix.build-type == 'Release' }}
name: npm run worker:prebuild
run: npm run worker:prebuild
- name: npm run worker:prebuild-name
run: npm run worker:prebuild-name
- if: ${{ matrix.build.run-lint }}
name: npm run lint:node
run: npm run lint:node
- if: ${{ !matrix.build.skip-test-in-debug-build-type || matrix.build-type != 'Debug' }}
name: npm run test:node
run: npm run test:node
================================================
FILE: .github/workflows/mediasoup-rust.yaml
================================================
name: mediasoup-rust
on:
push:
branches: [v3]
paths:
- 'rust/**'
- 'worker/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'rust-toolchain.toml'
- '.github/workflows/mediasoup-rust.yaml'
pull_request:
paths:
- 'rust/**'
- 'worker/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'rust-toolchain.toml'
- '.github/workflows/mediasoup-rust.yaml'
workflow_dispatch:
concurrency:
# Cancel a currently running workflow from the same PR, branch or tag when a
# new workflow is triggered.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
jobs:
ci:
strategy:
# Here we want to see all errors, not just the first one.
fail-fast: false
matrix:
build:
- os: ubuntu-24.04
run-cargo-fmt: true
- os: ubuntu-24.04-arm
- os: macos-15
- os: windows-2022
- os: windows-2025
runs-on: ${{ matrix.build.os }}
timeout-minutes: 60
env:
KEEP_BUILD_ARTIFACTS: '1'
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Configure cache
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ matrix.build.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ matrix.build.os }}-cargo-
- if: ${{ matrix.build.run-cargo-fmt }}
name: cargo fmt --all -- --check
run: cargo fmt --all -- --check
- name: cargo clippy --all-targets -- -D warnings
run: cargo clippy --all-targets -- -D warnings
# NOTE: In Windows this will build and test libmediasoupworker in release
# mode twice since build.rs doesn't allow debug mode on Windows.
- name: cargo test
run: |
cargo test --verbose
cargo test --release --verbose
- name: cargo doc --locked --all --no-deps --lib
run: cargo doc --locked --all --no-deps --lib
env:
DOCS_RS: '1'
RUSTDOCFLAGS: '-D rustdoc::broken-intra-doc-links -D rustdoc::private_intra_doc_links'
================================================
FILE: .github/workflows/mediasoup-worker-clang-tidy.yaml
================================================
name: mediasoup-worker-clang-tidy
on:
pull_request:
paths:
- 'worker/src/**/*.cpp'
- 'worker/include/**/*.hpp'
- 'worker/test/src/**/*.cpp'
- 'worker/test/include/**/*.hpp'
- 'worker/fuzzer/src/**/*.cpp'
- 'worker/fuzzer/include/**/*.hpp'
- 'worker/meson.build'
- 'worker/tasks.py'
- 'worker/.clang-format'
- 'worker/.clang-tidy'
- '.github/workflows/mediasoup-worker-clang-tidy.yaml'
concurrency:
# Cancel a currently running workflow from the same PR, branch or tag when a
# new workflow is triggered.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
clang-tidy:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- name: Install dependencies
run: pip3 install --break-system-packages invoke
- name: Setup Meson build (generates compile_commands.json)
working-directory: worker
env:
MESON_ARGS: '-Dms_build_tests=true'
run: invoke setup
- name: Compile flatbuffers FBS files
working-directory: worker
run: invoke flatc
- name: Install NPM worker development tools
run: npm ci --prefix worker/scripts --foreground-scripts
- name: Normalize compile_commands.json paths
run: npm run normalize-compile-commands --prefix worker/scripts --foreground-scripts
- uses: ZedThree/clang-tidy-review@v0.23.1
id: review
with:
apt_packages: 'libclang-rt-21-dev'
build_dir: 'worker/out/Release/build'
config_file: 'worker/.clang-tidy'
clang_tidy_version: '21'
lgtm_comment_body: ''
extra_arguments: --quiet
include: 'worker/src/**/*.cpp,worker/test/src/**/*.cpp,worker/fuzzer/src/**/*.cpp'
# Uploads an artifact containing clang_fixes.json.
- uses: ZedThree/clang-tidy-review/upload@v0.23.1
id: upload-review
# If there are any comments, fail the check.
- if: steps.review.outputs.total_comments > 0
run: exit 1
================================================
FILE: .github/workflows/mediasoup-worker-fuzzer.yaml
================================================
name: mediasoup-worker-fuzzer
on:
push:
branches: [v3]
paths:
- 'worker/**'
- '.github/workflows/mediasoup-worker-fuzzer.yaml'
pull_request:
paths:
- 'worker/**'
- '.github/workflows/mediasoup-worker-fuzzer.yaml'
workflow_dispatch:
concurrency:
# Cancel a currently running workflow from the same PR, branch or tag when a
# new workflow is triggered.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
ci:
strategy:
matrix:
build:
- os: ubuntu-24.04
cc: clang
cxx: clang++
pip-break-system-packages: true
- os: ubuntu-24.04-arm
cc: clang
cxx: clang++
pip-break-system-packages: true
build-type:
- Release
- Debug
runs-on: ${{ matrix.build.os }}
timeout-minutes: 60
env:
CC: ${{ matrix.build.cc }}
CXX: ${{ matrix.build.cxx }}
MEDIASOUP_SKIP_WORKER_PREBUILT_DOWNLOAD: 'true'
MEDIASOUP_LOCAL_DEV: 'true'
MEDIASOUP_BUILDTYPE: ${{ matrix.build-type }}
steps:
- name: Checkout
uses: actions/checkout@v6
# We need to install pip invoke manually.
- if: ${{ !matrix.build.pip-break-system-packages }}
name: pip3 install invoke
run: pip3 install invoke
# In modern OSs we need to run pip with this option.
- if: ${{ matrix.build.pip-break-system-packages }}
name: pip3 install --break-system-packages invoke
run: pip3 install --break-system-packages invoke
# Build the mediasoup-worker-fuzzer binary (which uses libFuzzer).
- name: invoke -r worker fuzzer
run: invoke -r worker fuzzer
# Run mediasoup-worker-fuzzer for 5 minutes.
- name: run-fuzzer.sh 300
run: cd worker && ./scripts/run-fuzzer.sh 300
================================================
FILE: .github/workflows/mediasoup-worker-prebuild.yaml
================================================
name: mediasoup-worker-prebuild
# Only trigger on GitHub releases.
on:
release:
types: [published]
jobs:
ci:
strategy:
# Here we want to see all errors, not just the first one.
fail-fast: false
matrix:
build:
# Worker prebuild for Linux with kernel version 6 Ubuntu (22.04).
# Let's use Ubuntu 22.04 instead of 24.04 so that it builds the
# mediasoup-worker binary using an old version of GLib that will work
# on Linux hosts running more modern GLib versions.
# See https://github.com/versatica/mediasoup/issues/1089.
- os: ubuntu-22.04
cc: gcc
cxx: g++
- os: ubuntu-22.04-arm
cc: gcc
cxx: g++
- os: macos-15
cc: clang
cxx: clang++
- os: windows-2025
cc: cl
cxx: cl
runs-on: ${{ matrix.build.os }}
timeout-minutes: 90
env:
CC: ${{ matrix.build.cc }}
CXX: ${{ matrix.build.cxx }}
MEDIASOUP_SKIP_WORKER_PREBUILT_DOWNLOAD: 'true'
MEDIASOUP_LOCAL_DEV: 'true'
MEDIASOUP_BUILDTYPE: 'Release'
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Node.js
uses: actions/setup-node@v6
with:
node-version: 24
# We need to install some NPM production deps for npm-scripts.mjs to
# work.
- name: npm ci --ignore-scripts --omit=dev --foreground-scripts
run: npm ci --ignore-scripts --omit=dev --foreground-scripts
- name: npm run worker:prebuild-name
run: npm run worker:prebuild-name
- name: npm run worker:build
run: npm run worker:build
# Publish prebuild binaries on tag.
- name: npm run worker:prebuild
run: npm run worker:prebuild
- name: Upload mediasoup-worker prebuilt binary
uses: softprops/action-gh-release@v2
with:
files: worker/prebuild/mediasoup-worker-*.tgz
================================================
FILE: .github/workflows/mediasoup-worker.yaml
================================================
name: mediasoup-worker
on:
push:
branches: [v3]
paths:
- 'worker/**'
- 'worker/scripts/package.json'
- 'worker/scripts/package-lock.json'
- '.github/workflows/mediasoup-worker.yaml'
pull_request:
paths:
- 'worker/**'
- 'worker/scripts/package.json'
- 'worker/scripts/package-lock.json'
- '.github/workflows/mediasoup-worker.yaml'
workflow_dispatch:
concurrency:
# Cancel a currently running workflow from the same PR, branch or tag when a
# new workflow is triggered.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
ci:
strategy:
# Here we want to see all errors, not just the first one.
fail-fast: false
matrix:
build:
- os: ubuntu-22.04
cc: gcc
cxx: g++
build-type: Release
run-lint: false
run-test: true
run-test-asan-address: false
run-test-asan-undefined: false
- os: ubuntu-22.04
cc: clang
cxx: clang++
build-type: Release
run-lint: false
run-test: true
run-test-asan-address: false
run-test-asan-undefined: false
- os: ubuntu-22.04-arm
cc: gcc
cxx: g++
build-type: Release
# No clang-format for ARM.
run-lint: false
run-test: true
run-test-asan-address: false
run-test-asan-undefined: false
- os: ubuntu-24.04
cc: gcc
cxx: g++
build-type: Release
pip-break-system-packages: true
run-lint: false
run-test: true
run-test-asan-address: false
run-test-asan-undefined: false
# Compile with all Meson option flags enabled once with gcc in
# Release mode.
meson_args: '-Dms_log_trace=true -Dms_log_file_line=true -Dms_rtc_logger_rtp=true -Dms_dump_rtp_payload_descriptor=true -Dms_dump_rtp_shared_packet_memory_usage=true'
- os: ubuntu-24.04
cc: gcc
cxx: g++
build-type: Debug
pip-break-system-packages: true
run-lint: false
run-test: true
run-test-asan-address: false
run-test-asan-undefined: false
# Compile with all Meson option flags enabled once with gcc in
# Debug mode.
meson_args: '-Dms_log_trace=true -Dms_log_file_line=true -Dms_rtc_logger_rtp=true -Dms_dump_rtp_payload_descriptor=true -Dms_dump_rtp_shared_packet_memory_usage=true -Dms_disable_liburing=true'
- os: ubuntu-24.04
cc: clang
cxx: clang++
build-type: Release
pip-break-system-packages: true
run-lint: false
run-test: true
run-test-asan-address: true
run-test-asan-undefined: true
# Let's just compile with all Meson option flags enabled once with
# clang.
meson_args: '-Dms_log_trace=true -Dms_log_file_line=true -Dms_rtc_logger_rtp=true -Dms_dump_rtp_payload_descriptor=true -Dms_dump_rtp_shared_packet_memory_usage=true'
- os: ubuntu-24.04-arm
cc: gcc
cxx: g++
build-type: Release
pip-break-system-packages: true
# No clang-format for ARM.
run-lint: false
run-test: true
run-test-asan-address: false
run-test-asan-undefined: false
- os: ubuntu-24.04-arm
cc: clang
cxx: clang++
build-type: Release
pip-break-system-packages: true
# No clang-format for ARM.
run-lint: false
run-test: true
run-test-asan-address: false
run-test-asan-undefined: false
- os: macos-15
cc: clang
cxx: clang++
build-type: Release
pip-break-system-packages: true
# Run lint for the latest macos.
run-lint: true
run-test: true
run-test-asan-address: false
run-test-asan-undefined: false
- os: windows-2022
cc: cl
cxx: cl
build-type: Release
# No clang-format for Windows.
run-lint: false
# Maybe some day we fix this.
run-test: false
# Address Sanitizer does not work on Windows.
run-test-asan-address: false
run-test-asan-undefined: false
- os: windows-2025
cc: cl
cxx: cl
build-type: Release
# No clang-format for Windows.
run-lint: false
# Maybe some day we fix this.
run-test: false
# Address Sanitizer does not work on Windows.
run-test-asan-address: false
run-test-asan-undefined: false
runs-on: ${{ matrix.build.os }}
timeout-minutes: 90
env:
CC: ${{ matrix.build.cc }}
CXX: ${{ matrix.build.cxx }}
MEDIASOUP_SKIP_WORKER_PREBUILT_DOWNLOAD: 'true'
MEDIASOUP_LOCAL_DEV: 'false'
MEDIASOUP_BUILDTYPE: ${{ matrix.build.build-type }}
MESON_ARGS: ${{ matrix.build.meson_args }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Node.js
uses: actions/setup-node@v6
with:
node-version: 24
- name: Configure cache
uses: actions/cache@v5
with:
path: |
~/.npm
key: ${{ matrix.build.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ matrix.build.os }}-node-
# We need to install pip invoke manually.
- if: ${{ !matrix.build.pip-break-system-packages }}
name: pip3 install invoke
run: pip3 install invoke
# In modern OSs we need to run pip with this option.
- if: ${{ matrix.build.pip-break-system-packages }}
name: pip3 install --break-system-packages invoke
run: pip3 install --break-system-packages invoke
# Fail if run-lint is set for non macos.
- if: ${{ matrix.build.run-lint && !startsWith(matrix.build.os, 'macos') }}
name: fail if run-lint is set for non macos
run: |
echo "run-lint set for non macos"
exit 1
# Install clang-format on macos.
- if: ${{ matrix.build.run-lint && startsWith(matrix.build.os, 'macos') }}
name: brew install clang-format@22
run: |
brew install clang-format@22
# We need to install npm deps of worker/scripts/package.json.
- if: ${{ matrix.build.run-lint }}
name: npm ci --prefix worker/scripts
run: npm ci --prefix worker/scripts --foreground-scripts
- if: ${{ matrix.build.run-lint }}
name: invoke -r worker lint
run: invoke -r worker lint
- name: invoke -r worker mediasoup-worker
run: invoke -r worker mediasoup-worker
- if: ${{ matrix.build.run-test }}
name: invoke -r worker test
run: invoke -r worker test
# Let's clean everything before rebuilding worker tests with ASAN.
- if: ${{ matrix.build.run-test-asan-address }}
name: invoke -r worker test-asan-address
run: invoke -r worker clean-all && invoke -r worker test-asan-address
# Let's clean everything before rebuilding worker tests with ASAN.
- if: ${{ matrix.build.run-test-asan-undefined }}
name: invoke -r worker test-asan-undefined
run: invoke -r worker clean-all && invoke -r worker test-asan-undefined
================================================
FILE: .gitignore
================================================
## Meson.
/worker/out
/worker/subprojects/*
!/worker/subprojects/*.wrap
!/worker/subprojects/.clang-tidy
## Node.
/node_modules
/node/lib
# flatc generated files.
/node/src/fbs
## Rust.
/rust/examples-frontend/*/node_modules
/rust/examples-frontend/*/package-lock.json
/target
## Worker.
/worker/scripts/node_modules
# Flatc generated files.
/worker/include/FBS
/worker/prebuild
# Python invoke.
/worker/pip_invoke
# Build artifacts.
/worker/**/Debug
/worker/**/Release
# clang-fuzzer stuff is too big.
/worker/deps/clang-fuzzer
# Ignore all fuzzer generated test inputs.
/worker/fuzzer/new-corpus/*
!/worker/fuzzer/new-corpus/.placeholder
## Others.
/coverage
/.cache
# Packaged module.
*.tgz
## Text editors' config files.
/.zed
================================================
FILE: .npmrc
================================================
# Generate package-lock.json.
package-lock=true
# For bad node/npm version to throw actual error.
engine-strict=true
================================================
FILE: .prettierrc.json
================================================
{
"useTabs": true,
"tabWidth": 2,
"arrowParens": "avoid",
"bracketSpacing": true,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"endOfLine": "auto"
}
================================================
FILE: CHANGELOG.md
================================================
# Changelog
### NEXT
- Node: Update TypeScript to v6 ([PR #1790](https://github.com/versatica/mediasoup/pull/1790)).
### 3.19.22
- Node: Avoid "worker died" event when the Node application is closed via signal without calling `worker.close()` ([PR #1788](https://github.com/versatica/mediasoup/pull/1788)).
### 3.19.21
- Worker: Fix regression in `DirectTransport` when closing a `DataProducer` or `DataConsumer` ([PR #1780](https://github.com/versatica/mediasoup/pull/1780)).
### 3.19.20
- Worker: Add `useBuiltInSctpStack` setting (defaults to `false`) to enable mediasoup built-in SCTP stack ([PR #1777](https://github.com/versatica/mediasoup/pull/1777)).
### 3.19.19
- Worker: Ensure 4-byte alignment for network packet receive buffers and test buffers to avoid undefined behavior ([PR #1756](https://github.com/versatica/mediasoup/pull/1756)).
- Worker: Update liburing from 2.12-1 to 2.14-1 ([PR #1761](https://github.com/versatica/mediasoup/pull/1761)).
### 3.19.18
- Worker: Improve `Utils::Crypto::GetRandomUInt()` ([PR #1725](https://github.com/versatica/mediasoup/pull/1725)).
- Convert `WORKER_CLOSE` into a notification ([PR #1729](https://github.com/versatica/mediasoup/pull/1729)).
- Node tests: Replace `sctp` unmaintained library with `werift-sctp` ([PR #1732](https://github.com/versatica/mediasoup/pull/1732), thanks to @shinyoshiaki for his help with `werift-sctp`).
- Worker: Require C++20 ([PR #1741](https://github.com/versatica/mediasoup/pull/1741)).
- Fix "SCTP failed" if no DataChannel is created on a Transport with `enableSctp: true` ([PR #1749](https://github.com/versatica/mediasoup/pull/1749)).
### 3.19.17
- `ICE::StunPacket`: Fix wrong memory access in `GetXorMappedAddress()` method ([08c1ec9](https://github.com/versatica/mediasoup/commit/ea464d40ef77247c3ff7acd10e4a0118665fdd14)).
### 3.19.16
- `RTP::ProbationGenerator`: Remove wrong warning log ([PR #1703](https://github.com/versatica/mediasoup/pull/1703)).
### 3.19.15
- `RtpStreamSend`: duplicated packets are discarded ([PR #1683](https://github.com/versatica/mediasoup/pull/1683)).
- Worker: Update liburing from 2.5-2 to 2.12-1 ([PR #1686](https://github.com/versatica/mediasoup/pull/1686)).
- Worker: Use the new `RTP::Packet` class ([PR #1689](https://github.com/versatica/mediasoup/pull/1689)).
- Worker: Use the new `ICE::StunPacket` class ([PR #1697](https://github.com/versatica/mediasoup/pull/1697)).
- Node: Expose `ortc` functions in `exports` in `package.json` and main module ([PR #1698](https://github.com/versatica/mediasoup/pull/1698)).
### 3.19.14
- Worker: Fix missing system header include, which fails in GCC 15 ([PR #1679](https://github.com/versatica/mediasoup/pull/1679), credits to @upisfree).
### 3.19.13
- `RtxStream`: Don't check if RTP timestamp moved backwards ([PR #1668](https://github.com/versatica/mediasoup/pull/1668), credits to @Lynnworld).
- Fix RTX packets containing non yet seen RTP packets being discarded ([PR #1653](https://github.com/versatica/mediasoup/pull/1653), credits to @penguinol, @mengbieting and @Lynnworld).
### 3.19.12
- Only look up the RTP packet’s RID extension if the packet doesn’t have MID extension ([PR #1666](https://github.com/versatica/mediasoup/pull/1666)).
### 3.19.11
- Node: Add `workerBin` optional field in `createWorker()` ([PR #1660](https://github.com/versatica/mediasoup/pull/1660)).
### 3.19.10
- Add `jitter` in `Consumer` 'outbound-rtp' stats ([PR #1654](https://github.com/versatica/mediasoup/pull/1654)).
### 3.19.9
- Fix RTCP packets lost in stats ([PR #1651](https://github.com/versatica/mediasoup/pull/1651)).
### 3.19.8
- Fix RTCP cumulative total lost computation ([PR #1650](https://github.com/versatica/mediasoup/pull/1650)).
### 3.19.7
- Bump up Meson from 1.5.0 to 1.9.1 ([PR #1634](https://github.com/versatica/mediasoup/pull/1634)).
- `SeqManager`: Fix, properly account out of order drops until an input is forwarded ([#1635](https://github.com/versatica/mediasoup/pull/1635)), thanks to @pnts-se-whereby for reporting.
- `RtpParameters`: Add `msid` optional field ([PR #1634](https://github.com/versatica/mediasoup/pull/1634)).
### 3.19.6
- AV1: Set DependencyDescriptor Header Extension to 'recvonly' but forward it between pipe transports ([#1632](https://github.com/versatica/mediasoup/pull/1632)).
### 3.19.5
- Add custom 'urn:mediasoup:params:rtp-hdrext:packet-id' (mediasoup-packet-id) header extension ([#1631](https://github.com/versatica/mediasoup/pull/1631)).
### 3.19.4
- AV1: Add support for DD extension header forwarding ([#1610](https://github.com/versatica/mediasoup/pull/1610)).
- DependencyDescriptor: Update listener on RtpPacket clone ([#1618](https://github.com/versatica/mediasoup/pull/1618)).
### 3.19.3
- CI: Remove `macos-13` hosts.
- VP8: Fix keyframe detection if "extended" bit is not set ([PR #1612](https://github.com/versatica/mediasoup/pull/1612), credits to @nifigase).
- CI: Remove `node-20` GitHub actions.
- Require Node.js >= 22 ([PR #1614](https://github.com/versatica/mediasoup/pull/1614)).
### 3.19.2
- `IceServer`: Fix active tuple selection when in "completed" state ([PR #1608](https://github.com/versatica/mediasoup/pull/1608), credits to @pangsimon).
### 3.19.1
- Worker: Fix retransmissions, set proper marker bit ([PR #1606](https://github.com/versatica/mediasoup/pull/1606)).
### 3.19.0
- Node: Improve worker binary location detection ([PR #1603](https://github.com/versatica/mediasoup/pull/1603)).
- `router.pipeToRouter()` can now connect two `Routers` in the same `Worker` if `keepId` is set to `false` ([PR #1604](https://github.com/versatica/mediasoup/pull/1604)).
### 3.18.1
- `TransportTuple`: Generate hash based not only on remote IP:port but also on local IP:port ([PR #1586](https://github.com/versatica/mediasoup/pull/1586)).
- `IceServer`: Only update selected tuple if the new Binding request has ICE renomination ([PR #1587](https://github.com/versatica/mediasoup/pull/1587), credits to @pangsimon).
- Fix installation in paths with spaces ([PR #1596](https://github.com/versatica/mediasoup/pull/1596), thanks to @ShuzhaoFeng for reporting and helping with this issue).
### 3.18.0
- Node: Make `RtpCodecCapability.preferredPayloadType` mandatory and add `RouterRtpCodecCapability` type (in which `preferredPayloadType` is optional) and `RouterRtpCapabilities` type ([PR #1584](https://github.com/versatica/mediasoup/pull/1584)).
### 3.17.1
- `WebRtcServer`: Remove the limit of 8 `listenInfos`.
### 3.17.0
- Worker: Update Meson subprojects ([PR #1582](https://github.com/versatica/mediasoup/pull/1582)).
- `TransportListenInfo`: Add `exposeInternalIp` which, if set to `true` and `announcedAddress` is set, exposes an additional ICE candidate in `WebRtcTransport` whose IP is `listenInfo.ip` rather than `listenInfo.announcedAddress` ([PR #1583](https://github.com/versatica/mediasoup/pull/1583)).
### 3.16.8
- Node: Fix `PipeConsumerOptions` TypeScript type (make `ConsumerAppData` TS argument optional) ([PR #1581](https://github.com/versatica/mediasoup/pull/1581)).
### 3.16.7
- `Router`: Add `updateMediaCodecs()` method to dynamically change Router's RTP capabilities ([PR #1571](https://github.com/versatica/mediasoup/pull/1571)).
- `RtpStream`: Update `maxPacketTs` if RTP timestamp moved backwards despite in-order RTP sequence number ([PR #1574](https://github.com/versatica/mediasoup/pull/1574), credits to @oppolixiang).
- `RtpStream`: Ignore padding only RTP packets in RTP data counters ([PR #1580](https://github.com/versatica/mediasoup/pull/1580), thanks to @quanli168 for reporting the issue).
### 3.16.6
- Remove H265 codec and deprecated frame-marking RTP extension ([PR #1564](https://github.com/versatica/mediasoup/pull/1564)).
- `SimulcastConsumer`: Fix selecting spatial layer higher than preferred one ([PR #1565](https://github.com/versatica/mediasoup/pull/1565)).
- Remove H264-SVC codec ([PR #1568](https://github.com/versatica/mediasoup/pull/1568)).
- `RateCalculator`: Fix crash due to buffer overflow and avoid time overflow ([PR #1570](https://github.com/versatica/mediasoup/pull/1570)).
### 3.16.5
- `Consumer` classes: Really fix target layer retransmission buffer ([PR #1558](https://github.com/versatica/mediasoup/pull/1558)).
### 3.16.4
- `Consumer` classes: Disable target layer retransmission buffer until [issue #1554] (https://github.com/versatica/mediasoup/issues/1554) is really fixed.
### 3.16.3
- `Consumer` classes: Fix target layer retransmission buffer ([PR #1555](https://github.com/versatica/mediasoup/pull/1555)).
### 3.16.2
- `Consumer` classes: Disable target layer retransmission buffer until [issue #1554] (https://github.com/versatica/mediasoup/issues/1554) is fixed.
### 3.16.1
- libuv: Update to v1.51.0 ([PR #1543](https://github.com/versatica/mediasoup/pull/1543)).
- libsrtp: Update to v3.0.0-beta version in our fork ([PR #1544](https://github.com/versatica/mediasoup/pull/1544)).
- `Consumer` classes: Only drop packets in RTP sequence manager when they belong to current spatial layer ([PR #1549](https://github.com/versatica/mediasoup/pull/1549)).
- `Consumer` classes: Add target layer retransmission buffer to avoid PLIs/FIRs when RTP packets containing a key frame arrive out of order ([PR #1550](https://github.com/versatica/mediasoup/pull/1550)).
### 3.16.0
- Node: Make `worker.close()` close the worker process by sending a `WORKER_CLOSE` request through the channel instead of by sending a SIGINT signal ([PR #1534](https://github.com/versatica/mediasoup/pull/1534)).
- Worker: Add initial AV1 codec support ([PR #1508](https://github.com/versatica/mediasoup/pull/1508)).
- `SvcConsumer`: Fix K-SVC bitrate in `IncreaseLayer()` method ([PR #1535](https://github.com/versatica/mediasoup/pull/1535) by @vpalmisano).
- Node: Require Node >= 20 (drop support for Node 18) ([PR #1536](https://github.com/versatica/mediasoup/pull/1536)).
### 3.15.8
- Worker: Fix encode retransmitted packets with the corresponding data ([PR #1527](https://github.com/versatica/mediasoup/pull/1527)).
### 3.15.7
- CI: Remove redundant hosts `macos-14` and `windows-2022` from `mediasoup-worker-prebuild` job ([PR #1506](https://github.com/versatica/mediasoup/pull/1506)).
- Node: Modernize code ([PR #1513](https://github.com/versatica/mediasoup/pull/1513)).
- Fix wrong SCTP stream parameters in SCTP `DataConsumer` that consumes from a direct `DataProducer` ([PR #1516](https://github.com/versatica/mediasoup/pull/1516)).
### 3.15.6
- CI: Remove deprecated `ubuntu-20.04` host and add `windows-2025`, `ubuntu-22.04-arm` and `ubuntu-24.04-arm` hosts ([PR #1500](https://github.com/versatica/mediasoup/pull/1500)).
### 3.15.5
- `Consumer`: Fix sequence number gap ([PR #1494](https://github.com/versatica/mediasoup/pull/1494)).
- Fix VP9 out of order packets forwarding ([PR #1486](https://github.com/versatica/mediasoup/pull/1486) by @vpalmisano).
### 3.15.4
- Worker: Drop VP8 packets with a higher temporal layer than the current one ([PR #1009](https://github.com/versatica/mediasoup/pull/1009)).
- Fix the problem of the TCC package being omitted from being sent ([PR #1492](https://github.com/versatica/mediasoup/pull/1492) by @penguinol).
### 3.15.3
- Node: Expose `Index` interface in `types.indexTypes` or via `import { Index as MediasoupIndex } from 'mediasoup/lib/indexTypes'` ([PR #1485](https://github.com/versatica/mediasoup/pull/1485)).
### 3.15.2
- Worker: Fix crash when using colliding `portRange` values in different transports ([PR #1469](https://github.com/versatica/mediasoup/pull/1469)).
### 3.15.1
- Expose `extras` namespace which exports `EnhancedEventEmitter` and `enhancedOnce()` for now ([PR #1464](https://github.com/versatica/mediasoup/pull/1464)).
### 3.15.0
- Node: Add TypeScript interfaces for all exported classes ([PR #1463](https://github.com/versatica/mediasoup/pull/1463)).
- Node: Add new `transport.type` getter than returns `'webrtc' | 'plain' | 'pipe' | 'direct'` ([PR #1463](https://github.com/versatica/mediasoup/pull/1463)).
- Node: Add new `rtpObserver.type` getter than returns `'activespeaker' | 'audiolevel'` ([PR #1463](https://github.com/versatica/mediasoup/pull/1463)).
### 3.14.16
- `SimulcastConsumer`: Fix cannot switch layers if initial `tsReferenceSpatialLayer disappears` disappears ([PR #1459](https://github.com/versatica/mediasoup/pull/1459) by @Lynnworld).
### 3.14.15
- Update worker abseil-cpp dependency to 20240722.0 LTS (fixes compilation for FreeBSD systems) ([PR #1457](https://github.com/versatica/mediasoup/pull/1457), credits to @garrettboone).
### 3.14.14
- Sign self generated DTLS certificate with SHA256 ([PR #1450](https://github.com/versatica/mediasoup/pull/1450)).
- Node: Fix `mediasoup.types` exported types are empty ([PR #1453](https://github.com/versatica/mediasoup/pull/1453)).
### 3.14.13
- Node: Fix regression in exported `mediasoup.types` (classes are now exported as classes instead of types).
### 3.14.12
- Worker: Fix `io_uring` support detection ([PR #1445](https://github.com/versatica/mediasoup/pull/1445)).
- Mitigate libsrtp wraparound with loss decryption failure ([PR #1438](https://github.com/versatica/mediasoup/pull/1438)).
- Node: New `setLogEventListeners()` utility to get log events ([PR #1448](https://github.com/versatica/mediasoup/pull/1448)).
### 3.14.11
- Worker: Fix `disableLiburing` option in `WorkerSettings` ([PR #1444](https://github.com/versatica/mediasoup/pull/1444)).
### 3.14.10
- CI: Support Node 22 ([PR #1434](https://github.com/versatica/mediasoup/pull/1434)).
- Update ESLint to version 9 ([PR #1435](https://github.com/versatica/mediasoup/pull/1435)).
- Worker: Add `disableLiburing` boolean option (`false` by default) to disable `io_uring` even if it's supported by the prebuilt `mediasoup-worker` and by current host ([PR #1442](https://github.com/versatica/mediasoup/pull/1442)).
### 3.14.9
- Worker: Test, fix buffer overflow ([PR #1419](https://github.com/versatica/mediasoup/pull/1419)).
- Bump up Meson from 1.3.0 to 1.5.0 ([PR #1424](https://github.com/versatica/mediasoup/pull/1424)).
- Node: Export new `WorkerObserver`, `ProducerObserver`, etc. TypeScript types ([PR #1430](https://github.com/versatica/mediasoup/pull/1430)).
- Fix frozen video in simulcast due to wrong dropping of padding only packets ([PR #1431](https://github.com/versatica/mediasoup/pull/1431), thanks to @quanli168).
### 3.14.8
- Add support for 'playout-delay' RTP extension ([PR #1412](https://github.com/versatica/mediasoup/pull/1412) by @DavidNegro).
### 3.14.7
- `SimulcastConsumer`: Fix increase layer when current layer has not receive SR ([PR #1098](https://github.com/versatica/mediasoup/pull/1098) by @penguinol).
- Ignore RTP packets with empty payload ([PR #1403](https://github.com/versatica/mediasoup/pull/1403), credits to @ggarber).
### 3.14.6
- Worker: Fix potential double free when ICE consent check fails ([PR #1393](https://github.com/versatica/mediasoup/pull/1393)).
### 3.14.5
- Worker: Fix memory leak when using `WebRtcServer` with TCP enabled ([PR #1389](https://github.com/versatica/mediasoup/pull/1389)).
- Worker: Fix crash when closing `WebRtcServer` with active `WebRtcTransports` ([PR #1390](https://github.com/versatica/mediasoup/pull/1390)).
### 3.14.4
- Worker: Fix crash. `RtcpFeedback` parameter is optional ([PR #1387](https://github.com/versatica/mediasoup/pull/1387), credits to @Lynnworld).
### 3.14.3
- Worker: Fix possible value overflow in `FeedbackRtpTransport.cpp` ([PR #1386](https://github.com/versatica/mediasoup/pull/1386), credits to @Lynnworld).
### 3.14.2
- Update worker subprojects ([PR #1376](https://github.com/versatica/mediasoup/pull/1376)).
- OPUS: Fix DTX detection ([PR #1357](https://github.com/versatica/mediasoup/pull/1357)).
- Worker: Fix sending callback leaks ([PR #1383](https://github.com/versatica/mediasoup/pull/1383), credits to @Lynnworld).
### 3.14.1
- Node: Bring transport `rtpPacketLossReceived` and `rtpPacketLossSent` stats back ([PR #1371](https://github.com/versatica/mediasoup/pull/1371)).
### 3.14.0
- `TransportListenInfo`: Add `portRange` (deprecate worker port range) ([PR #1365](https://github.com/versatica/mediasoup/pull/1365)).
- Require Node.js >= 18 ([PR #1365](https://github.com/versatica/mediasoup/pull/1365)).
### 3.13.24
- Node: Fix missing `bitrateByLayer` field in stats of `RtpRecvStream` in Node ([PR #1349](https://github.com/versatica/mediasoup/pull/1349)).
- Update worker dependency libuv to 1.48.0.
- Update worker FlatBuffers to 24.3.6-1 (fix cannot set temporal layer 0) ([PR #1348](https://github.com/versatica/mediasoup/pull/1348)).
### 3.13.23
- Fix DTLS packets do not honor configured DTLS MTU (attempt 3) ([PR #1345](https://github.com/versatica/mediasoup/pull/1345)).
### 3.13.22
- Fix wrong publication of mediasoup NPM 3.13.21.
### 3.13.21
- Revert ([PR #1156](https://github.com/versatica/mediasoup/pull/1156)) "Make DTLS fragment stay within MTU size range" because it causes a memory leak ([PR #1342](https://github.com/versatica/mediasoup/pull/1342)).
### 3.13.20
- Add server side ICE consent checks to detect silent WebRTC disconnections ([PR #1332](https://github.com/versatica/mediasoup/pull/1332)).
- Fix regression (crash) in transport-cc feedback generation ([PR #1339](https://github.com/versatica/mediasoup/pull/1339)).
### 3.13.19
- Node: Fix `router.createWebRtcTransport()` with `listenIps` ([PR #1330](https://github.com/versatica/mediasoup/pull/1330)).
### 3.13.18
- Make transport-cc feedback work similarly to libwebrtc ([PR #1088](https://github.com/versatica/mediasoup/pull/1088) by @penguinol).
- `TransportListenInfo`: "announced ip" can also be a hostname ([PR #1322](https://github.com/versatica/mediasoup/pull/1322)).
- `TransportListenInfo`: Rename "announced ip" to "announced address" ([PR #1324](https://github.com/versatica/mediasoup/pull/1324)).
- CI: Add `macos-14`.
### 3.13.17
- Fix prebuilt worker download ([PR #1319](https://github.com/versatica/mediasoup/pull/1319) by @brynrichards).
- libsrtp: Update to v3.0-alpha version in our fork.
### 3.13.16
- Node: Add new `worker.on('subprocessclose')` event ([PR #1307](https://github.com/versatica/mediasoup/pull/1307)).
### 3.13.15
- Add worker prebuild binary for Linux kernel 6 ([PR #1300](https://github.com/versatica/mediasoup/pull/1300)).
### 3.13.14
- Avoid modification of user input data ([PR #1285](https://github.com/versatica/mediasoup/pull/1285)).
- `TransportListenInfo`: Add transport socket flags ([PR #1291](https://github.com/versatica/mediasoup/pull/1291)).
- Note that `flags.ipv6Only` is `false` by default.
- `TransportListenInfo`: Ignore given socket flags if not suitable for given IP family or transport ([PR #1294](https://github.com/versatica/mediasoup/pull/1294)).
- Meson: Remove `-Db_pie=true -Db_staticpic=true` args ([PR #1293](https://github.com/versatica/mediasoup/pull/1293)).
- Add RTCP Sender Report trace event ([PR #1267](https://github.com/versatica/mediasoup/pull/1267) by @GithubUser8080).
### 3.13.13
- Worker: Do not use references for async callbacks ([PR #1274](https://github.com/versatica/mediasoup/pull/1274)).
- liburing: Enable zero copy ([PR #1273](https://github.com/versatica/mediasoup/pull/1273)).
- Fix build on musl based systems (such as Alpine Linux) ([PR #1279](https://github.com/versatica/mediasoup/pull/1279)).
### 3.13.12
- Worker: Disable `RtcLogger` usage if not enabled ([PR #1264](https://github.com/versatica/mediasoup/pull/1264)).
- npm installation: Don't require Python if valid worker prebuilt binary is fetched ([PR #1265](https://github.com/versatica/mediasoup/pull/1265)).
- Update h264-profile-level-id NPM dependency to 1.1.0.
### 3.13.11
- liburing: Avoid extra memcpy on RTP ([PR #1258](https://github.com/versatica/mediasoup/pull/1258)).
- libsrtp: Use our own fork with performance gain ([PR #1260](https://github.com/versatica/mediasoup/pull/1260)).
- `DataConsumer`: Add `addSubchannel()` and `removeSubchannel()` methods ([PR #1263](https://github.com/versatica/mediasoup/pull/1263)).
- Fix Rust `DataConsumer` ([PR #1262](https://github.com/versatica/mediasoup/pull/1262)).
### 3.13.10
- `tasks.py`: Always include `--no-user` in `pip install` commands to avoid the "can not combine --user and --target" error in Windows ([PR #1257](https://github.com/versatica/mediasoup/pull/1257)).
### 3.13.9
- Update worker liburing dependency to 2.4-2 ([PR #1254](https://github.com/versatica/mediasoup/pull/1254)).
- liburing: Enable by default ([PR 1255](https://github.com/versatica/mediasoup/pull/1255)).
### 3.13.8
- liburing: Enable liburing usage for SCTP data delivery ([PR 1249](https://github.com/versatica/mediasoup/pull/1249)).
- liburing: Disable by default ([PR 1253](https://github.com/versatica/mediasoup/pull/1253)).
### 3.13.7
- Update worker dependencies ([PR #1201](https://github.com/versatica/mediasoup/pull/1201)):
- abseil-cpp 20230802.0-2
- libuv 1.47.0-1
- OpenSSL 3.0.8-2
- usrsctp snapshot ebb18adac6501bad4501b1f6dccb67a1c85cc299
- Enable `liburing` usage for Linux (kernel versions >= 6) ([PR #1218](https://github.com/versatica/mediasoup/pull/1218)).
### 3.13.6
- Replace make + Makefile with Python Invoke library + tasks.py (also fix installation under path with whitespaces) ([PR #1239](https://github.com/versatica/mediasoup/pull/1239)).
### 3.13.5
- Fix RTCP SDES packet size calculation ([PR #1236](https://github.com/versatica/mediasoup/pull/1236) based on PR [PR #1234](https://github.com/versatica/mediasoup/pull/1234) by @ybybwdwd).
- RTCP Compound Packet: Use a single DLRR report to hold all ssrc info sub-blocks ([PR #1237](https://github.com/versatica/mediasoup/pull/1237)).
### 3.13.4
- Fix RTCP DLRR (Delay Since Last Receiver Report) block parsing ([PR #1234](https://github.com/versatica/mediasoup/pull/1234)).
### 3.13.3
- Node: Fix issue when 'pause'/'resume' events are not emitted ([PR #1231](https://github.com/versatica/mediasoup/pull/1231) by @douglaseel).
### 3.13.2
- FBS: `LayersChangeNotification` body must be optional (fixes a crash) ([PR #1227](https://github.com/versatica/mediasoup/pull/1227)).
### 3.13.1
- Node: Extract version from `package.json` using `require()` ([PR #1217](https://github.com/versatica/mediasoup/pull/1217) by @arcinston).
### 3.13.0
- Switch from JSON based messages to FlatBuffers ([PR #1064](https://github.com/versatica/mediasoup/pull/1064)).
- Add `TransportListenInfo` in all transports and send/recv buffer size options ([PR #1084](https://github.com/versatica/mediasoup/pull/1084)).
- Add optional `rtcpListenInfo` in `PlainTransportOptions` ([PR #1099](https://github.com/versatica/mediasoup/pull/1099)).
- Add pause/resume API in `DataProducer` and `DataConsumer` ([PR #1104](https://github.com/versatica/mediasoup/pull/1104)).
- DataChannel subchannels feature ([PR #1152](https://github.com/versatica/mediasoup/pull/1152)).
- Worker: Make DTLS fragment stay within MTU size range ([PR #1156](https://github.com/versatica/mediasoup/pull/1156), based on [PR #1143](https://github.com/versatica/mediasoup/pull/1143) by @vpnts-se).
### 3.12.16
- Fix `IceServer` crash when client uses ICE renomination ([PR #1182](https://github.com/versatica/mediasoup/pull/1182)).
### 3.12.15
- Fix NPM "postinstall" task in Windows ([PR #1187](https://github.com/versatica/mediasoup/pull/1187)).
### 3.12.14
- CI: Use Node.js version 20 ([PR #1177](https://github.com/versatica/mediasoup/pull/1177)).
- Use given `PYTHON` environment variable (if given) when running `worker/scripts/getmake.py` ([PR #1186](https://github.com/versatica/mediasoup/pull/1186)).
### 3.12.13
- Bump up Meson from 1.1.0 to 1.2.1 (fixes Xcode 15 build issues) ([PR #1163](https://github.com/versatica/mediasoup/pull/1163) by @arcinston).
### 3.12.12
- Support C++20 ([PR #1150](https://github.com/versatica/mediasoup/pull/1150) by @o-u-p).
### 3.12.11
- Google Transport Feedback: Read Reference Time field as 24bits signed as per spec ([PR #1145](https://github.com/versatica/mediasoup/pull/1145)).
### 3.12.10
- Node: Rename `WebRtcTransport.webRtcServerClosed()` to `listenServerClosed()` ([PR #1141](https://github.com/versatica/mediasoup/pull/1141) by @piranna).
### 3.12.9
- Fix RTCP SDES ([PR #1139](https://github.com/versatica/mediasoup/pull/1139)).
### 3.12.8
- Export `workerBin` absolute path ([PR #1123](https://github.com/versatica/mediasoup/pull/1123)).
### 3.12.7
- `SimulcastConsumer`: Fix lack of "layerschange" event when all streams in the producer die ([PR #1122](https://github.com/versatica/mediasoup/pull/1122)).
### 3.12.6
- Worker: Add `Transport::Destroying()` protected method ([PR #1114](https://github.com/versatica/mediasoup/pull/1114)).
- `RtpStreamRecv`: Fix jitter calculation ([PR #1117](https://github.com/versatica/mediasoup/pull/1117), thanks to @penguinol).
- Revert "Node: make types.ts only export types rather than the entire class/code" ([PR #1109](https://github.com/versatica/mediasoup/pull/1109)) because it requires `typescript` >= 5 in the apps that import mediasoup and we don't want to be that strict yet.
### 3.12.5
- `DataConsumer`: Fix removed 'bufferedamountlow' notification ([PR #1113](https://github.com/versatica/mediasoup/pull/1113)).
### 3.12.4
- Fix downloaded prebuilt binary check on Windows ([PR #1105](https://github.com/versatica/mediasoup/pull/1105) by @woodfe).
### 3.12.3
Migrate `npm-scripts.js` to `npm-scripts.mjs` (ES Module) ([PR #1093](https://github.com/versatica/mediasoup/pull/1093)).
### 3.12.2
- CI: Use `ubuntu-20.04` to build `mediasoup-worker` prebuilt on Linux ([PR #1092](https://github.com/versatica/mediasoup/pull/1092)).
### 3.12.1
- `mediasoup-worker` prebuild: Fallback to local building if fetched binary doesn't run on current host ([PR #1090](https://github.com/versatica/mediasoup/pull/1090)).
### 3.12.0
- Automate and publish prebuilt `mediasoup-worker` binaries ([PR #1087](https://github.com/versatica/mediasoup/pull/1087), thanks to @barlock for his work in ([PR #1083](https://github.com/versatica/mediasoup/pull/1083)).
### 3.11.26
- Worker: Fix NACK timer and avoid negative RTT ([PR #1082](https://github.com/versatica/mediasoup/pull/1082), thanks to @o-u-p for his work in ([PR #1076](https://github.com/versatica/mediasoup/pull/1076)).
### 3.11.25
- Worker: Require C++17, Meson >= 1.1.0 and update subprojects ([PR #1081](https://github.com/versatica/mediasoup/pull/1081)).
### 3.11.24
- `SeqManager`: Fix performance regression ([PR #1068](https://github.com/versatica/mediasoup/pull/1068), thanks to @vpalmisano for properly reporting).
### 3.11.23
- Node: Fix `appData` for `Transport` and `RtpObserver` parent classes ([PR #1066](https://github.com/versatica/mediasoup/pull/1066)).
### 3.11.22
- `RtpStreamRecv`: Only perform RTP inactivity check on simulcast streams ([PR #1061](https://github.com/versatica/mediasoup/pull/1061)).
- `SeqManager`: Properly remove old dropped entries ([PR #1054](https://github.com/versatica/mediasoup/pull/1054)).
- libwebrtc: Upgrade trendline estimator to improve low bandwidth conditions ([PR #1055](https://github.com/versatica/mediasoup/pull/1055) by @ggarber).
- libwebrtc: Fix bandwidth probation dead state ([PR #1031](https://github.com/versatica/mediasoup/pull/1031) by @vpalmisano).
### 3.11.21
- Fix check division by zero in transport congestion control ([PR #1049](https://github.com/versatica/mediasoup/pull/1049) by @ggarber).
- Fix lost pending statuses in transport CC feedback ([PR #1050](https://github.com/versatica/mediasoup/pull/1050) by @ggarber).
### 3.11.20
- `RtpStreamSend`: Reset RTP retransmission buffer upon RTP sequence number reset ([PR #1041](https://github.com/versatica/mediasoup/pull/1041)).
- `RtpRetransmissionBuffer`: Handle corner case in which received packet has lower seq than newest packet in the buffer but higher timestamp ([PR #1044](https://github.com/versatica/mediasoup/pull/1044)).
- `SeqManager`: Fix crash and add fuzzer ([PR #1045](https://github.com/versatica/mediasoup/pull/1045)).
- Node: Make `appData` TS typed and writable ([PR #1046](https://github.com/versatica/mediasoup/pull/1046), credits to @mango-martin).
### 3.11.19
- `SvcConsumer`: Properly handle VP9 K-SVC bandwidth allocation ([PR #1036](https://github.com/versatica/mediasoup/pull/1036) by @vpalmisano).
### 3.11.18
- `RtpRetransmissionBuffer`: Consider the case of packet with newest timestamp but "old" seq number ([PR #1039](https://github.com/versatica/mediasoup/pull/1039)).
### 3.11.17
- Add `transport.setMinOutgoingBitrate()` method ([PR #1038](https://github.com/versatica/mediasoup/pull/1038), credits to @ jcague).
- `RTC::RetransmissionBuffer`: Increase `RetransmissionBufferMaxItems` from 2500 to 5000.
### 3.11.16
- Fix `SeqManager`: Properly consider previous cycle dropped inputs ([PR #1032](https://github.com/versatica/mediasoup/pull/1032)).
- `RtpRetransmissionBuffer`: Get rid of not necessary `startSeq` private member ([PR #1029](https://github.com/versatica/mediasoup/pull/1029)).
- Node: Upgrade TypeScript to 5.0.2.
### 3.11.15
- `RtpRetransmissionBuffer`: Fix crash and add fuzzer ([PR #1028](https://github.com/versatica/mediasoup/pull/1028)).
### 3.11.14
- Refactor RTP retransmission buffer in a separate and testable `RTC::RetransmissionBuffer` class ([PR #1023](https://github.com/versatica/mediasoup/pull/1023)).
### 3.11.13
- `AudioLevelObserver`: Use multimap rather than map to avoid conflict if various Producers generate same audio level ([PR #1021](https://github.com/versatica/mediasoup/pull/1021), issue reported by @buptlsp).
### 3.11.12
- Fix jitter calculation ([PR #1019](https://github.com/versatica/mediasoup/pull/1019), credits to @alexciarlillo and @snnz).
### 3.11.11
- Add support for RTCP NACK in OPUS ([PR #1015](https://github.com/versatica/mediasoup/pull/1015)).
### 3.11.10
- Download and use MSYS/make locally for Windows postinstall ([PR #792](https://github.com/versatica/mediasoup/pull/792) by @snnz).
### 3.11.9
- Allow simulcast with a single encoding (and N temporal layers) ([PR #1013](https://github.com/versatica/mediasoup/pull/1013)).
- Update libsrtp to 2.5.0.
### 3.11.8
- `SimulcastConsumer::GetDesiredBitrate()`: Choose the highest bitrate among all Producer streams ([PR #992](https://github.com/versatica/mediasoup/pull/992)).
- `SimulcastConsumer`: Fix frozen video when syncing keyframe is discarded due to too high RTP timestamp extra offset needed ([PR #999](https://github.com/versatica/mediasoup/pull/999), thanks to @satoren for properly reporting the issue and helping with the solution).
### 3.11.7
- libwebrtc: Fix crash due to invalid `arrival_time` value ([PR #985](https://github.com/versatica/mediasoup/pull/985) by @ggarber).
- libwebrtc: Replace `MS_ASSERT()` with `MS_ERROR()` ([PR #988](https://github.com/versatica/mediasoup/pull/988)).
### 3.11.6
- Fix wrong `PictureID` rolling over in VP9 and VP8 ([PR #984](https://github.com/versatica/mediasoup/pull/984) by @jcague).
### 3.11.5
- Require Node.js >= 16 ([PR #973](https://github.com/versatica/mediasoup/pull/973)).
- Fix wrong `Consumer` bandwidth estimation under `Producer` packet loss ([PR #962](https://github.com/versatica/mediasoup/pull/962) by @ggarber).
### 3.11.4
- Node: Migrate tests to TypeScript ([PR #958](https://github.com/versatica/mediasoup/pull/958)).
- Node: Remove compiled JavaScript from repository and compile TypeScript code on NPM `prepare` script on demand when installed via git ([PR #954](https://github.com/versatica/mediasoup/pull/954)).
- Worker: Add `RTC::Shared` singleton for RTC entities ([PR #953](https://github.com/versatica/mediasoup/pull/953)).
- Update OpenSSL to 3.0.7.
### 3.11.3
- `ChannelMessageHandlers`: Make `RegisterHandler()` not remove the existing handler if another one with same `id` is given ([PR #952](https://github.com/versatica/mediasoup/pull/952)).
### 3.11.2
- Fix installation issue in Linux due to a bug in ninja latest version 1.11.1 ([PR #948](https://github.com/versatica/mediasoup/pull/948)).
### 3.11.1
- `ActiveSpeakerObserver`: Revert 'dominantspeaker' event changes in [PR #941](https://github.com/versatica/mediasoup/pull/941) to avoid breaking changes ([PR #947](https://github.com/versatica/mediasoup/pull/947)).
### 3.11.0
- `Transport`: Remove duplicate call to method ([PR #931](https://github.com/versatica/mediasoup/pull/931)).
- RTCP: Adjust maximum compound packet size ([PR #934](https://github.com/versatica/mediasoup/pull/934)).
- `DataConsumer`: Fix `bufferedAmount` type to be a number again ([PR #936](https://github.com/versatica/mediasoup/pull/936)).
- `ActiveSpeakerObserver`: Fix 'dominantspeaker' event by having a single `Producer` as argument rather than an array with a single `Producer` into it ([PR #941](https://github.com/versatica/mediasoup/pull/941)).
- `ActiveSpeakerObserver`: Fix memory leak ([PR #942](https://github.com/versatica/mediasoup/pull/942)).
- Fix some libwebrtc issues ([PR #944](https://github.com/versatica/mediasoup/pull/944)).
- Tests: Normalize hexadecimal data representation ([PR #945](https://github.com/versatica/mediasoup/pull/945)).
- `SctpAssociation`: Fix memory violation ([PR #943](https://github.com/versatica/mediasoup/pull/943)).
### 3.10.12
- Fix worker crash due to `std::out_of_range` exception ([PR #933](https://github.com/versatica/mediasoup/pull/933)).
### 3.10.11
- RTCP: Fix trailing space needed by `srtp_protect_rtcp()` ([PR #929](https://github.com/versatica/mediasoup/pull/929)).
### 3.10.10
- Fix the JSON serialization for the payload channel `rtp` event ([PR #926](https://github.com/versatica/mediasoup/pull/926) by @mhammo).
### 3.10.9
- RTCP enhancements ([PR #914](https://github.com/versatica/mediasoup/pull/914)).
### 3.10.8
- `Consumer`: use a bitset instead of a set for supported payload types ([PR #919](https://github.com/versatica/mediasoup/pull/919)).
- RtpPacket: optimize UpdateMid() ([PR #920](https://github.com/versatica/mediasoup/pull/920)).
- Little optimizations and modernization ([PR #916](https://github.com/versatica/mediasoup/pull/916)).
- Fix SIGSEGV at `RTC::WebRtcTransport::OnIceServerTupleRemoved()` ([PR #915](https://github.com/versatica/mediasoup/pull/915), credits to @ybybwdwd).
- `WebRtcServer`: Make `port` optional (if not given, a random available port from the `Worker` port range is used) ([PR #908](https://github.com/versatica/mediasoup/pull/908) by @satoren).
### 3.10.7
- Forward `abs-capture-time` RTP extension also for audio packets ([PR #911](https://github.com/versatica/mediasoup/pull/911)).
### 3.10.6
- Node: Define TypeScript types for `internal` and `data` objects ([PR #891](https://github.com/versatica/mediasoup/pull/891)).
- `Channel` and `PayloadChannel`: Refactor `internal` with a single `handlerId` ([PR #889](https://github.com/versatica/mediasoup/pull/889)).
- `Channel` and `PayloadChannel`: Optimize message format and JSON generation ([PR #893](https://github.com/versatica/mediasoup/pull/893)).
- New C++ `ChannelMessageHandlers` class ([PR #894](https://github.com/versatica/mediasoup/pull/894)).
- Fix Rust support after recent changes ([PR #898](https://github.com/versatica/mediasoup/pull/898)).
- Modify `FeedbackRtpTransport` and tests to be compliant with latest libwebrtc code, make reference time to be unsigned ([PR #899](https://github.com/versatica/mediasoup/pull/899) by @penguinol and @sarumjanuch).
### 3.10.5
- `RtpStreamSend`: Do not store too old RTP packets ([PR #885](https://github.com/versatica/mediasoup/pull/885)).
- Log error details in channel socket. ([PR #875](https://github.com/versatica/mediasoup/pull/875) by @mstyura).
### 3.10.4
- Do not clone RTP packets if not needed ([PR #850](https://github.com/versatica/mediasoup/pull/850)).
- Fix DTLS related crash ([PR #867](https://github.com/versatica/mediasoup/pull/867)).
### 3.10.3
- `SimpleConsumer`: Fix. Only process Opus codec ([PR #865](https://github.com/versatica/mediasoup/pull/865)).
- TypeScript: Improve `WebRtcTransportOptions` type to not allow `webRtcServer` and `listenIps`options at the same time ([PR #852](https://github.com/versatica/mediasoup/pull/852)).
### 3.10.2
- Fix release contents by including `meson_options.txt` ([PR #863](https://github.com/versatica/mediasoup/pull/863)).
### 3.10.1
- `RtpStreamSend`: Memory optimizations ([PR #840](https://github.com/versatica/mediasoup/pull/840)). Extracted from #675, by @nazar-pc.
- `SimpleConsumer`: Opus DTX ignore capabilities ([PR #846](https://github.com/versatica/mediasoup/pull/846)).
- Update `libuv` to 1.44.1: Fixes `libuv` build ([PR #857](https://github.com/versatica/mediasoup/pull/857)).
### 3.10.0
- `WebRtcServer`: A new class that brings to `WebRtcTransports` the ability to listen on a single UDP/TCP port ([PR #834](https://github.com/versatica/mediasoup/pull/834)).
- More SRTP crypto suites ([PR #837](https://github.com/versatica/mediasoup/pull/837)).
- Improve `EnhancedEventEmitter` ([PR #836](https://github.com/versatica/mediasoup/pull/836)).
- `TransportCongestionControlClient`: Allow setting max outgoing bitrate before `tccClient` is created ([PR #833](https://github.com/versatica/mediasoup/pull/833)).
- Update TypeScript version.
### 3.9.17
- `RateCalculator`: Fix old buffer items cleanup ([PR #830](https://github.com/versatica/mediasoup/pull/830) by @dsdolzhenko).
- Update TypeScript version.
### 3.9.16
- `SimulcastConsumer`: Fix spatial layer switch with unordered packets ([PR #823](https://github.com/versatica/mediasoup/pull/823) by @jcague).
- Update TypeScript version.
### 3.9.15
- `RateCalculator`: Revert Fix old buffer items cleanup ([PR #819](https://github.com/versatica/mediasoup/pull/819) by @dsdolzhenko).
### 3.9.14
- `NackGenerator`: Add a configurable delay before sending NACK ([PR #827](https://github.com/versatica/mediasoup/pull/827), credits to @penguinol).
- `SimulcastConsumer`: Fix a race condition in SimulcastConsumer ([PR #825](https://github.com/versatica/mediasoup/pull/825) by @dsdolzhenko).
- Add support for H264 SVC (#798 by @prtmD).
- `RtpStreamSend`: Support receive RTCP-XR RRT and send RTCP-XR DLRR ([PR #781](https://github.com/versatica/mediasoup/pull/781) by @aggresss).
- `RateCalculator`: Fix old buffer items cleanup ([PR #819](https://github.com/versatica/mediasoup/pull/819) by @dsdolzhenko).
- `DirectTransport`: Create a buffer to process RTP packets ([PR #730](https://github.com/versatica/mediasoup/pull/730) by @rtctt).
- Node: Improve `appData` TypeScript syntax and initialization.
- Allow setting max outgoing bitrate below the initial value ([PR #826](https://github.com/versatica/mediasoup/pull/826) by @ggarber).
- Update TypeScript version.
### 3.9.13
- `VP8`: Do not discard `TL0PICIDX` from Temporal Layers higher than 0 (PR @817 by @jcague).
- Update TypeScript version.
### 3.9.12
- `DtlsTransport`: Make DTLS negotiation run immediately ([PR #815](https://github.com/versatica/mediasoup/pull/815)).
- Update TypeScript version.
### 3.9.11
- Modify `SimulcastConsumer` to keep using layers without good scores ([PR #804](https://github.com/versatica/mediasoup/pull/804) by @ggarber).
### 3.9.10
- Update worker dependencies:
- OpenSSL 3.0.2.
- abseil-cpp 20211102.0.
- nlohmann_json 3.10.5.
- usrsctp snapshot 4e06feb01cadcd127d119486b98a4bd3d64aa1e7.
- wingetopt 1.00.
- Update TypeScript version.
- Fix RTP marker bit not being reseted after mangling in each `Consumer` ([PR #811](https://github.com/versatica/mediasoup/pull/811) by @ggarber).
### 3.9.9
- Optimize RTP header extension handling ([PR #786](https://github.com/versatica/mediasoup/pull/786)).
- `RateCalculator`: Reset optimization ([PR #785](https://github.com/versatica/mediasoup/pull/785)).
- Fix frozen video due to double call to `Consumer::UserOnTransportDisconnected()` ([PR #788](https://github.com/versatica/mediasoup/pull/788), thanks to @ggarber for exposing this issue in [PR #787](https://github.com/versatica/mediasoup/pull/787)).
### 3.9.8
- Fix VP9 kSVC forwarding logic to not forward lower unneded layers ([PR #778](https://github.com/versatica/mediasoup/pull/778) by @ggarber).
- Fix update bandwidth estimation configuration and available bitrate when updating max outgoing bitrate ([PR #779](https://github.com/versatica/mediasoup/pull/779) by @ggarber).
- Replace outdated `random-numbers` package by native `crypto.randomInt()` ([PR #776](https://github.com/versatica/mediasoup/pull/776) by @piranna).
- Update TypeScript version.
### 3.9.7
- Typing event emitters in mediasoup Node ([PR #764](https://github.com/versatica/mediasoup/pull/764) by @unao).
### 3.9.6
- TCC client optimizations for faster and more stable BWE ([PR #712](https://github.com/versatica/mediasoup/pull/712) by @ggarber).
- Added support for RTP abs-capture-time header ([PR #761](https://github.com/versatica/mediasoup/pull/761) by @oto313).
### 3.9.5
- ICE renomination support ([PR #756](https://github.com/versatica/mediasoup/pull/756)).
- Update `libuv` to 1.43.0.
### 3.9.4
- Worker: Fix bad printing of error messages from Worker ([PR #750](https://github.com/versatica/mediasoup/pull/750) by @j1elo).
### 3.9.3
- Single H264/H265 codec configuration in `supportedRtpCapabilities` ([PR #718](https://github.com/versatica/mediasoup/pull/718)).
- Improve Windows support by not requiring MSVC configuration ([PR #741](https://github.com/versatica/mediasoup/pull/741)).
### 3.9.2
- `pipeToRouter()`: Reuse same `PipeTransport` when possible ([PR #697](https://github.com/versatica/mediasoup/pull/697)).
- Add `worker.died` boolean getter.
- Update TypeScript version to 4.X.X and use `target: "esnext"` so transpilation of ECMAScript private fields (`#xxxxx`) don't use `WeakMaps` tricks but use standard syntax instead.
- Use more than one core for compilation on Windows ([PR #709](https://github.com/versatica/mediasoup/pull/709)).
- `Consumer`: Modification of bitrate allocation algorithm ([PR #708](https://github.com/versatica/mediasoup/pull/708)).
### 3.9.1
- NixOS friendly build process ([PR #683](https://github.com/versatica/mediasoup/pull/683)).
- Worker: Emit "died" event before observer "close" ([PR #684](https://github.com/versatica/mediasoup/pull/684)).
- Transport: Hide debug message for RTX RTCP-RR packets ([PR #688](https://github.com/versatica/mediasoup/pull/688)).
- Update `libuv` to 1.42.0.
- Improve Windows support ([PR #692](https://github.com/versatica/mediasoup/pull/692)).
- Avoid build commands when MEDIASOUP_WORKER_BIN is set ([PR #695](https://github.com/versatica/mediasoup/pull/695)).
### 3.9.0
- Replaces GYP build system with fully-functional Meson build system ([PR #622](https://github.com/versatica/mediasoup/pull/622)).
- Worker communication optimization (aka removing netstring dependency) ([PR #644](https://github.com/versatica/mediasoup/pull/644)).
- Move TypeScript and compiled JavaScript code to a new `node` folder.
- Use ES6 private fields.
- Require Node.js version >= 12.
### 3.8.4
- OPUS multi-channel (Surround sound) support ([PR #647](https://github.com/versatica/mediasoup/pull/647)).
- Add `packetLoss` stats to transport ([PR #648](https://github.com/versatica/mediasoup/pull/648) by @ggarber).
- Fixes for active speaker observer ([PR #655](https://github.com/versatica/mediasoup/pull/655) by @ggarber).
- Fix big endian issues ([PR #639](https://github.com/versatica/mediasoup/pull/639)).
### 3.8.3
- Fix wrong `size_t*` to `int*` conversion in 64bit Big-Endian hosts ([PR #637](https://github.com/versatica/mediasoup/pull/637)).
### 3.8.2
- `ActiveSpeakerObserver`: Fix crash due to a `nullptr` ([PR #634](https://github.com/versatica/mediasoup/pull/634)).
### 3.8.1
- `SimulcastConsumer`: Fix RTP timestamp when switching layers ([PR #626](https://github.com/versatica/mediasoup/pull/626) by @penguinol).
### 3.8.0
- Update `libuv` to 1.42.0.
- Use non-ASM OpenSSL on Windows ([PR #614](https://github.com/versatica/mediasoup/pull/614)).
- Fix minor memory leak caused by non-virtual destructor ([PR #625](https://github.com/versatica/mediasoup/pull/625)).
- Dominant Speaker Event ([PR #603](https://github.com/versatica/mediasoup/pull/603) by @SteveMcFarlin).
### 3.7.19
- Update `libuv` to 1.41.0.
- C++:
- Move header includes ([PR #608](https://github.com/versatica/mediasoup/pull/608)).
- Enhance debugging on channel request/notification error ([PR #607](https://github.com/versatica/mediasoup/pull/607)).
### 3.7.18
- Support for optional fixed port on transports ([PR #593](https://github.com/versatica/mediasoup/pull/593) by @nazar-pc).
- Upgrade and optimize OpenSSL dependency ([PR #598](https://github.com/versatica/mediasoup/pull/598) by @vpalmisano):
- OpenSSL upgraded to version 1.1.1k.
- Enable the compilation of assembly extensions for OpenSSL.
- Optimize the worker build (`-O3`) and disable the debug flag (`-g`).
### 3.7.17
- Introduce `PipeConsumerOptions` to avoid incorrect type information on `PipeTransport.consume()` arguments.
- Make `ConsumerOptions.rtpCapabilities` field required as it should have always been.
### 3.7.16
- Add `mid` option in `ConsumerOptions` to provide way to override MID ([PR #586](https://github.com/versatica/mediasoup/pull/586) by @mstyura).
### 3.7.15
- `kind` field of `RtpHeaderExtension` is no longer optional. It must be 'audio' or 'video'.
- Refactor API inconsistency in internal RTP Observer communication with worker.
### 3.7.14
- Update `usrsctp` to include a "possible use after free bug" fix (commit [here](https://github.com/sctplab/usrsctp/commit/0f8d58300b1fdcd943b4a9dd3fbd830825390d4d)).
### 3.7.13
- Fix build on FreeBSD ([PR #585](https://github.com/versatica/mediasoup/pull/585) by @smortex).
### 3.7.12
- `mediasoup-worker`: Fix memory leaks on error exit ([PR #581](https://github.com/versatica/mediasoup/pull/581)).
### 3.7.11
- Fix `DepUsrSCTP::Checker::timer` not being freed on `Worker` close ([PR #576](https://github.com/versatica/mediasoup/pull/576)). Thanks @nazar-pc for discovering this.
### 3.7.10
- Remove clang tools binaries from regular installation.
### 3.7.9
- Code clean up.
### 3.7.8
- `PayloadChannel`: Copy received messages into a separate buffer to avoid memory corruption if the message is later modified ([PR #570](https://github.com/versatica/mediasoup/pull/570) by @aggresss).
### 3.7.7
- Thread and memory safety fixes needed for mediasoup-rust ([PR #562](https://github.com/versatica/mediasoup/pull/562) by @nazar-pc).
- mediasoup-rust support on macOS ([PR #567](https://github.com/versatica/mediasoup/pull/567) by @nazar-pc).
- mediasoup-rust release 0.7.2.
### 3.7.6
- `Transport`: Implement new `setMaxOutgoingBitrate()` method ([PR #555](https://github.com/versatica/mediasoup/pull/555) by @t-mullen).
- `SctpAssociation`: Don't warn if SCTP send buffer is full.
- Rust: Update modules structure and other minor improvements for Rust version ([PR #558](https://github.com/versatica/mediasoup/pull/558)).
- `mediasoup-worker`: Avoid duplicated basenames so that `libmediasoup-worker` is compilable on macOS ([PR #557](https://github.com/versatica/mediasoup/pull/557)).
### 3.7.5
- SctpAssociation: provide 'sctpsendbufferfull' reason on send error (#552).
### 3.7.4
- Improve `RateCalculator` ([PR #547](https://github.com/versatica/mediasoup/pull/547) by @vpalmisano).
### 3.7.3
- Make worker M1 compilable.
### 3.7.2
- `RateCalculator` optimization ([PR #538](https://github.com/versatica/mediasoup/pull/538) by @vpalmisano).
### 3.7.1
- `SimulcastConsumer`: Fix miscalculation when increasing layer ([PR #541](https://github.com/versatica/mediasoup/pull/541) by @penguinol).
- Rust version with thread-based worker ([PR #540](https://github.com/versatica/mediasoup/pull/540)).
### 3.7.0
- Welcome to `mediasoup-rust`! Authored by @nazar-pc (PRs #518 and #533).
- Update `usrsctp`.
### 3.6.37
- Fix crash if empty `fingerprints` array is given in `webrtcTransport.connect()` (issue #537).
### 3.6.36
- `Producer`: Add new stats field 'rtxPacketsDiscarded' ([PR #536](https://github.com/versatica/mediasoup/pull/536)).
### 3.6.35
- `Consumer` classes: make `IsActive()` return `true` (even if `Producer`'s score is 0) when DTX is enabled ([PR #534](https://github.com/versatica/mediasoup/pull/534) due to issue #532).
### 3.6.34
- Fix crash (regression, issue #529).
### 3.6.33
- Add missing `delete cb` that otherwise would leak ([PR #527](https://github.com/versatica/mediasoup/pull/527) based on [PR #526](https://github.com/versatica/mediasoup/pull/526) by @vpalmisano).
- `router.pipeToRouter()`: Fix possible inconsistency in `pipeProducer.paused` status (as discussed in this [thread](https://mediasoup.discourse.group/t/concurrency-architecture/2515/) in the mediasoup forum).
- Update `nlohmann/json` to 3.9.1.
- Update `usrsctp`.
- Enhance Jitter calculation.
### 3.6.32
- Fix notifications from `mediasoup-worker` being processed before responses received before them (issue #501).
### 3.6.31
- Move `bufferedAmount` from `dataConsumer.dump()` to `dataConsumer.getStats()`.
### 3.6.30
- Add `pipe` option to `transport.consume()`([PR #494](https://github.com/versatica/mediasoup/pull/494)).
- So the receiver will get all streams from the `Producer`.
- It works for any kind of transport (but `PipeTransport` which is always like this).
- Add `LICENSE` and `PATENTS` files in `libwebrtc` dependency (issue #495).
- Added `worker/src/Utils/README_BASE64_UTILS` (issue #497).
- Update `usrsctp`.
### 3.6.29
- Fix wrong message about `rtcMinPort` and `rtcMaxPort`.
- Update deps.
- Improve `EnhancedEventEmitter.safeAsPromise()` (although not used).
### 3.6.28
- Fix replacement of `__MEDIASOUP_VERSION__` in `lib/index.d.ts` (issue #483).
- `worker/scripts/configure.py`: Handle 'mips64' ([PR #485](https://github.com/versatica/mediasoup/pull/485)).
### 3.6.27
- Allow the `mediasoup-worker` process to inherit all environment variables (issue #480).
### 3.6.26
- BWE tweaks and debug logs.
### 3.6.25
- SCTP fixes ([PR #479](https://github.com/versatica/mediasoup/pull/479)).
### 3.6.24
- Update `awaitqueue` dependency.
### 3.6.23
- Fix yet another memory leak in Node.js layer due to `PayloadChannel` event listener not being removed.
### 3.6.22
- `Transport.cpp`: Provide transport congestion client with RTCP Receiver Reports (#464).
- Update `libuv` to 1.40.0.
- Update Node deps.
- `SctpAssociation.cpp`: increase `sctpBufferedAmount` before sending any data (#472).
### 3.6.21
- Fix memory leak in Node.js layer due to `PayloadChannel` event listener not being removed (related to #463).
### 3.6.20
- Remove `-fwrapv` when building `mediasoup-worker` in `Debug` mode (issue #460).
- Add `MEDIASOUP_MAX_CORES` to limit `NUM_CORES` during `mediasoup-worker` build ([PR #462](https://github.com/versatica/mediasoup/pull/462)).
### 3.6.19
- Update `usrsctp` dependency.
- Update `typescript-eslint` deps.
- Update Node deps.
### 3.6.18
- Fix `ortc.getConsumerRtpParameters()` RTX codec comparison issue ([PR #453](https://github.com/versatica/mediasoup/pull/453)).
- RtpObserver: expose `RtpObserverAddRemoveProducerOptions` for `addProducer()` and `removeProducer()` methods.
### 3.6.17
- Update `libuv` to 1.39.0.
- Update Node deps.
- SimulcastConsumer: Prefer the highest spatial layer initially ([PR #450](https://github.com/versatica/mediasoup/pull/450)).
- RtpStreamRecv: Set RtpDataCounter window size to 6 secs if DTX (#451)
### 3.6.16
- `SctpAssociation.cpp`: Fix `OnSctpAssociationBufferedAmount()` call.
- Update deps.
- New API to send data from Node throught SCTP DataConsumer.
### 3.6.15
- Avoid SRTP leak by deleting invalid SSRCs after STRP decryption (issue #437, thanks to @penguinol for reporting).
- Update `usrsctp` dep.
- DataConsumer 'bufferedAmount' implementation ([PR #442](https://github.com/versatica/mediasoup/pull/442)).
### 3.6.14
- Fix `usrsctp` vulnerability ([PR #439](https://github.com/versatica/mediasoup/pull/439)).
- Fix issue #435 (thanks to @penguinol for reporting).
- `TransportCongestionControlClient.cpp`: Enable periodic ALR probing to recover faster from network issues.
- Update `nlohmann::json` C++ dep to 3.9.0.
### 3.6.13
- RTP on `DirectTransport` (issue #433, [PR #434](https://github.com/versatica/mediasoup/pull/434)):
- New API `producer.send(rtpPacket: Buffer)`.
- New API `consumer.on('rtp', (rtpPacket: Buffer)`.
- New API `directTransport.sendRtcp(rtcpPacket: Buffer)`.
- New API `directTransport.on('rtcp', (rtpPacket: Buffer)`.
### 3.6.12
- Release script.
### 3.6.11
- `Transport`: rename `maxSctpSendBufferSize` to `sctpSendBufferSize`.
### 3.6.10
- `Transport`: Implement `maxSctpSendBufferSize`.
- Update `libuv` to 1.38.1.
### 3.6.9
- `Transport::ReceiveRtpPacket()`: Call `RecvStreamClosed(packet->GetSsrc())` if received RTP packet does not match any `Producer`.
- `Transport::HandleRtcpPacket()`: Ensure `Consumer` is found for received NACK Feedback packets.
- Fix issue #408.
### 3.6.8
- Fix SRTP leak due to streams not being removed when a `Producer` or `Consumer` is closed.
- [PR #428](https://github.com/versatica/mediasoup/pull/428) (fixes issues #426).
- Credits to credits to @penguinol for reporting and initial work at [PR #427](https://github.com/versatica/mediasoup/pull/427).
- Update `nlohmann::json` C++ dep to 3.8.0.
- C++: Enhance `const` correctness.
### 3.6.7
- `ConsumerScore`: Add `producerScores`, scores of all RTP streams in the producer ordered by encoding (just useful when the producer uses simulcast).
- [PR #421](https://github.com/versatica/mediasoup/pull/421) (fixes issues #420).
- Hide worker executable console in Windows.
- [PR #419](https://github.com/versatica/mediasoup/pull/419) (credits to @BlueMagnificent).
- `RtpStream.cpp`: Fix wrong `std::round()` usage.
- Issue #423.
### 3.6.6
- Update `usrsctp` library.
- Update ESLint and TypeScript related dependencies.
### 3.6.5
- Set `score:0` when `dtx:true` is set in an `encoding` and there is no RTP for some seconds for that RTP stream.
- Fixes #415.
### 3.6.4
- `gyp`: Fix CLT version detection in OSX Catalina when XCode app is not installed.
- [PR #413](https://github.com/versatica/mediasoup/pull/413) (credits to @enimo).
### 3.6.3
- Modernize TypeScript.
### 3.6.2
- Fix crash in `Transport.ts` when closing a `DataConsumer` created on a `DirectTransport`.
### 3.6.1
- Export new `DirectTransport` in `types`.
- Make `DataProducerOptions` optional (not needed when in a `DirectTransport`).
### 3.6.0
- SCTP/DataChannel termination:
- [PR #409](https://github.com/versatica/mediasoup/pull/409)
- Allow the Node application to directly send text/binary messages to `mediasoup-worker` C++ process so others can consume them using `DataConsumers`.
- And vice-versa: allow the Node application to directly consume in Node messages send by `DataProducers`.
- Add `WorkerLogTag` TypeScript enum and also add a new 'message' tag into it.
### 3.5.15
- Simulcast and SVC: Better computation of desired bitrate based on `maxBitrate` field in the `producer.rtpParameters.encodings`.
### 3.5.14
- Update deps, specially `uuid` and `@types/uuid` that had a TypeScript related bug.
- `TransportCongestionClient.cpp`: Improve sender side bandwidth estimation by do not reporting `this->initialAvailableBitrate` as available bitrate due to strange behavior in the algorithm.
### 3.5.13
- Simplify `GetDesiredBitrate()` in `SimulcastConsumer` and `SvcConsumer`.
- Update `libuv` to 1.38.0.
### 3.5.12
- `SeqManager.cpp`: Improve performance.
- [PR #398](https://github.com/versatica/mediasoup/pull/398) (credits to @penguinol).
### 3.5.11
- `SeqManager.cpp`: Fix a bug and improve performance.
- Fixes issue #395 via [PR #396](https://github.com/versatica/mediasoup/pull/396) (credits to @penguinol).
- Drop Node.js 8 support. Minimum supported Node.js version is now 10.
- Upgrade `eslint` and `jest` major versions.
### 3.5.10
- `SimulcastConsumer.cpp`: Fix `IncreaseLayer()` method (fixes #394).
- Udpate Node deps.
### 3.5.9
- `libwebrtc`: Apply patch by @sspanak and @Ivaka to avoid crash. Related issue: #357.
- `PortManager.cpp`: Do not use `UV_UDP_RECVMMSG` in Windows due to a bug in `libuv` 1.37.0.
- Update Node deps.
### 3.5.8
- Enable `UV_UDP_RECVMMSG`:
- Upgrade `libuv` to 1.37.0.
- Use `uv_udp_init_ex()` with `UV_UDP_RECVMMSG` flag.
- Add our own `uv.gyp` now that `libuv` has removed support for GYP (fixes #384).
### 3.5.7
- Fix crash in `mediasoup-worker` due to conversion from `uint64_t` to `int64_t` (used within `libwebrtc` code. Fixes #357.
- Update `usrsctp` library.
- Update Node deps.
### 3.5.6
- `SeqManager.cpp`: Fix video lag after a long time.
- Fixes #372 (thanks @penguinol for reporting it and giving the solution).
### 3.5.5
- `UdpSocket.cpp`: Revert `uv__udp_recvmmsg()` usage since it notifies about received UDP packets in reverse order. Feature on hold until fixed.
### 3.5.4
- `Transport.cpp`: Enable transport congestion client for the first video Consumer, no matter it's uses simulcast, SVC or a single stream.
- Update `libuv` to 1.35.0.
- `UdpSocket.cpp`: Ensure the new libuv's `uv__udp_recvmmsg()` is used, which is more efficient.
### 3.5.3
- `PlainTransport`: Remove `multiSource` option. It was a hack nobody should use.
### 3.5.2
- Enable MID RTP extension in mediasoup to receivers direction (for consumers).
- This **requires** mediasoup-client 3.5.2 to work.
### 3.5.1
- `PlainTransport`: Fix event name: 'rtcpTuple' => 'rtcptuple'.
### 3.5.0
- `PipeTransport`: Add support for SRTP and RTP retransmission (RTX + NACK). Useful when connecting two mediasoup servers running in different hosts via pipe transports.
- `PlainTransport`: Add support for SRTP.
- Rename `PlainRtpTransport` to `PlainTransport` everywhere (classes, methods, TypeScript types, etc). Keep previous names and mark them as DEPRECATED.
- Fix vulnarability in IPv6 parser.
### 3.4.13
- Update `uuid` dep to 7.0.X (new API).
- Fix crash due wrong array index in `PipeConsumer::FillJson()`.
- Fixes #364
### 3.4.12
- TypeScript: generate `es2020` instead of `es6`.
- Update `usrsctp` library.
- Fixes #362 (thanks @chvarlam for reporting it).
### 3.4.11
- `IceServer.cpp`: Reject received STUN Binding request with 487 if remote peer indicates ICE-CONTROLLED into it.
### 3.4.10
- `ProducerOptions`: Rename `keyFrameWaitTime` option to `keyFrameRequestDelay` and make it work as expected.
### 3.4.9
- Add `Utils::Json::IsPositiveInteger()` to not rely on `is_number_unsigned()` of json lib, which is unreliable due to its design.
- Avoid ES6 `export default` and always use named `export`.
- `router.pipeToRouter()`: Ensure a single `PipeTransport` pair is created between `router1` and `router2`.
- Since the operation is async, it may happen that two simultaneous calls to `router1.pipeToRouter({ producerId: xxx, router: router2 })` would end up generating two pairs of `PipeTranports`. To prevent that, let's use an async queue.
- Add `keyFrameWaitTime` option to `ProducerOptions`.
- Update Node and C++ deps.
### 3.4.8
- `libsrtp.gyp`: Fix regression in mediasoup for Windows.
- `libsrtp.gyp`: Modernize it based on the new `BUILD.gn` in Chromium.
- `libsrtp.gyp`: Don't include "test" and other targets.
- Assume `HAVE_INTTYPES_H`, `HAVE_INT8_T`, etc. in Windows.
- Issue details: https://github.com/sctplab/usrsctp/issues/353
- `gyp` dependency: Add support for Microsoft Visual Studio 2019.
- Modify our own `gyp` sources to fix the issue.
- CL uploaded to GYP project with the fix.
- Issue details: https://github.com/sctplab/usrsctp/issues/347
### 3.4.7
- `PortManager.cpp`: Do not limit the number of failed `bind()` attempts to 20 since it does not work well in scenarios that launch tons of `Workers` with same port range. Instead iterate all ports in the range given to the Worker.
- Do not copy `catch.hpp` into `test/include/` but make the GYP `mediasoup-worker-test` target include the corresponding folder in `deps/catch`.
### 3.4.6
- Update libsrtp to 2.3.0.
- Update ESLint and TypeScript deps.
### 3.4.5
- Update deps.
- Fix text in `./github/Bug_Report.md` so it no longer references the deprecated mailing list.
### 3.4.4
- `Transport.cpp`: Ignore RTCP SDES packets (we don't do anything with them anyway).
- `Producer` and `Consumer` stats: Always show `roundTripTime` (even if calculated value is 0) after a `roundTripTime` > 0 has been seen.
### 3.4.3
- `Transport.cpp`: Fix RTCP FIR processing:
- Instead of looking at the media ssrc in the common header, iterate FIR items and look for associated `Consumers` based on ssrcs in each FIR item.
- Fixes #350 (thanks @j1elo for reporting and documenting the issue).
### 3.4.2
- `SctpAssociation.cpp`: Improve/fix logs.
- Improve Node `EventEmitter` events inline documentation.
- `test-node-sctp.js`: Wait for SCTP association to be open before sending data.
### 3.4.1
- Improve `mediasoup-worker` build system by using `sh` instead of `bash` and default to 4 cores (thanks @smoke, [PR #349](https://github.com/versatica/mediasoup/pull/349)).
### 3.4.0
- Add `worker.getResourceUsage()` API.
- Update OpenSSL to 1.1.1d.
- Update `libuv` to 1.34.0.
- Update TypeScript version.
### 3.3.8
- Update usrsctp dependency (it fixes a potential wrong memory access).
- More details in the reported issue: https://github.com/sctplab/usrsctp/issues/408
### 3.3.7
- Fix `version` getter.
### 3.3.6
- `SctpAssociation.cpp`: Initialize the `usrsctp` socket in the class constructor. Fixes #348.
### 3.3.5
- Fix usage of a deallocated `RTC::TcpConnection` instance under heavy CPU usage due to mediasoup deleting the instance in the middle of a receiving iteration. Fixes #333.
- More details in the commit: https://github.com/versatica/mediasoup/commit/49824baf102ab6d2b01e5bca565c29b8ac0fec22
### 3.3.4
- IPv6 fix: Use `INET6_ADDRSTRLEN` instead of `INET_ADDRSTRLEN`.
### 3.3.3
- Add `consumer.setPriority()` and `consumer.priority` API to prioritize how the estimated outgoing bitrate in a transport is distributed among all video consumers (in case there is not enough bitrate to satisfy them).
- Make video `SimpleConsumers` play the BWE game by helping in probation generation and bitrate distribution.
- Add `consumer.preferredLayers` getter.
- Rename `enablePacketEvent()` and "packet" event to `enableTraceEvent()` and "trace" event (sorry SEMVER).
- Transport: Add a new "trace" event of type "bwe" with detailed information about bitrates.
### 3.3.2
- Improve "packet" event by not firing both "keyframe" and "rtp" types for the same RTP packet.
### 3.3.1
- Add type "keyframe" as a valid type for "packet" event in `Producers` and `Consumers`.
### 3.3.0
- Add transport-cc bandwidth estimation and congestion control in sender and receiver side.
- Run in Windows.
- Rewrite to TypeScript.
- Tons of improvements.
### 3.2.5
- Fix TCP leak (#325).
### 3.2.4
- `PlainRtpTransport`: Fix comedia mode.
### 3.2.3
- `RateCalculator`: improve efficiency in `GetRate()` method (#324).
### 3.2.2
- `RtpDataCounter`: use window size of 2500 ms instead of 1000 ms.
- Fixes false "lack of RTP" detection in some screen sharing usages with simulcast.
- Fixes #312.
### 3.2.1
- Add RTCP Extended Reports for RTT calculation on receiver RTP stream (thanks @yangjinechofor for initial pull request #314).
- Make `mediasoup-worker` compile in Armbian Debian Buster (thanks @krishisola, fixes #321).
### 3.2.0
- Add DataChannel support via DataProducers and DataConsumers (#10).
- SRTP: Add support for AEAD GCM (#320).
### 3.1.7
- `PipeConsumer.cpp`: Fix RTCP generation (thanks @vpalmisano).
### 3.1.6
- VP8 and H264: Fix regression in 3.1.5 that produces lot of changes in current temporal layer detection.
### 3.1.5
- VP8 and H264: Allow packets without temporal layer information even if N temporal layers were announced.
### 3.1.4
- Add `-fPIC` in `cflags` to compile in x86-64. Fixes #315.
### 3.1.3
- Set the sender SSRC on PLI and FIR requests [related thread](https://mediasoup.discourse.group/t/broadcasting-a-vp8-rtp-stream-from-gstreamer/93).
### 3.1.2
- Workaround to detect H264 key frames when Chrome uses external encoder (related [issue](https://bugs.chromium.org/p/webrtc/issues/detail?id=10746)). Fixes #313.
### 3.1.1
- Improve `GetBitratePriority()` method in `SimulcastConsumer` and `SvcConsumer` by checking the total bitrate of all temporal layers in a given producer stream or spatial layer.
### 3.1.0
- Add SVC support. It includes VP9 full SVC and VP9 K-SVC as implemented by libwebrtc.
- Prefer Python 2 (if available) over Python 3. This is because there are yet pending issues with gyp + Python 3.
### 3.0.12
- Do not require Python 2 to compile mediasoup worker (#207). Both Python 2 and 3 can now be used.
### 3.0.11
- Codecs: Improve temporal layer switching in VP8 and H264.
- Skip worker compilation if `MEDIASOUP_WORKER_BIN` environment variable is given (#309). This makes it possible to install mediasoup in platforms in which, somehow, gcc > 4.8 is not available during `npm install mediasoup` but it's available later.
- Fix `RtpStreamRecv::TransmissionCounter::GetBitrate()`.
### 3.0.10
- `parseScalabilityMode()`: allow "S" as spatial layer (and not just "L"). "L" means "dependent spatial layer" while "S" means "independent spatial layer", which is used in K-SVC (VP9, AV1, etc).
### 3.0.9
- `RtpStreamSend::ReceiveRtcpReceiverReport()`: improve `rtt` calculation if no Sender Report info is reported in received Received Report.
- Update `libuv` to version 1.29.1.
### 3.0.8
- VP8 & H264: Improve temporal layer switching.
### 3.0.7
- RTP frame-marking: Add some missing checks.
### 3.0.6
- Fix regression in proxied RTP header extensions.
### 3.0.5
- Add support for frame-marking RTP extension and use it to enable temporal layers switching in H264 codec (#305).
### 3.0.4
- Improve RTP probation for simulcast/svc consumers by using proper RTP retransmission with increasing sequence number.
### 3.0.3
- Simulcast: Improve timestamps extra offset handling by having a map of extra offsets indexed by received timestamps. This helps in case of packet retransmission.
### 3.0.2
- Simulcast: proper RTP stream switching by rewriting packet timestamp with a new timestamp calculated from the SenderReports' NTP relationship.
### 3.0.1
- Fix crash in `SimulcastConsumer::IncreaseLayer()` with Safari and H264 (#300).
### 3.0.0
- v3 is here!
### 2.6.19
- `RtpStreamSend.cpp`: Fix a crash in `StorePacket()` when it receives an old packet and there is no space left in the storage buffer (thanks to zkfun for reporting it and providing us with the solution).
- Update deps.
### 2.6.18
- Fix usage of a deallocated `RTC::TcpConnection` instance under heavy CPU usage due to mediasoup deleting the instance in the middle of a receiving iteration.
### 2.6.17
- Improve build system by using all available CPU cores in parallel.
### 2.6.16
- Don't mandate server port range to be >= 99.
### 2.6.15
- Fix NACK retransmissions.
### 2.6.14
- Fix TCP leak (#325).
### 2.6.13
- Make `mediasoup-worker` compile in Armbian Debian Buster (thanks @krishisola, fixes #321).
- Update deps.
### 2.6.12
- Fix RTCP Receiver Report handling.
### 2.6.11
- Update deps.
- Simulcast: Increase profiles one by one unless explicitly forced (fixes #188).
### 2.6.10
- `PlainRtpTransport.js`: Add missing methods and events.
### 2.6.9
- Remove a potential crash if a single `encoding` is given in the Producer `rtpParameters` and it has a `profile` value.
### 2.6.8
- C++: Verify in libuv static callbacks that the associated C++ instance has not been deallocated (thanks @artushin and @mariat-atg for reporting and providing valuable help in #258).
### 2.6.7
- Fix wrong destruction of Transports in Router.cpp that generates 100% CPU usage in `mediasoup-worker` processes.
### 2.6.6
- Fix a port leak when a WebRtcTransport is remotely closed due to a DTLS close alert (thanks @artushin for reporting it in #259).
### 2.6.5
- RtpPacket: Fix Two-Byte header extensions parsing.
### 2.6.4
- Upgrade again to OpenSSL 1.1.0j (20 Nov 2018) after adding a workaround for issue [#257](https://github.com/versatica/mediasoup/issues/257).
### 2.6.3
- Downgrade OpenSSL to version 1.1.0h (27 Mar 2018) until issue [#257](https://github.com/versatica/mediasoup/issues/257) is fixed.
### 2.6.2
- C++: Remove all `Destroy()` class methods and no longer do `delete this`.
- Update libuv to 1.24.1.
- Update OpenSSL to 1.1.0g.
### 2.6.1
- worker: Internal refactor and code cleanup.
- Remove announced support for certain RTCP feedback types that mediasoup does nothing with (and avoid forwarding them to the remote RTP sender).
- fuzzer: fix some wrong memory access in `RtpPacket::Dump()` and `StunMessage::Dump()` (just used during development).
### 2.6.0
- Integrate [libFuzzer](http://llvm.org/docs/LibFuzzer.html) into mediasoup (documentation in the `doc` folder). Extensive testing done. Several heap-buffer-overflow and memory leaks fixed.
### 2.5.6
- `Producer.cpp`: Remove `UpdateRtpParameters()`. It was broken since Consumers
were not notified about profile removed and so on, so they may crash.
- `Producer.cpp: Remove some maps and simplify streams handling by having a
single `mapSsrcRtpStreamInfo`. Just keep `mapActiveProfiles`because`GetActiveProfiles()` method needs it.
- `Producer::MayNeedNewStream()`: Ignore new media streams with new SSRC if
its RID is already in use by other media stream (fixes #235).
- Fix a bad memory access when using two byte RTP header extensions.
### 2.5.5
- `Server.js`: If a worker crashes make sure `_latestWorkerIdx` becomes 0.
### 2.5.4
- `server.Room()`: Assign workers incrementally or explicitly via new `workerIdx` argument.
- Add `server.numWorkers` getter.
### 2.5.3
- Don't announce `muxId` nor RTP MID extension support in `Consumer` RTP parameters.
### 2.5.2
- Enable RTP MID extension again.
### 2.5.1
- Disable RTP MID extension until [#230](https://github.com/versatica/mediasoup/issues/230) is fixed.
### 2.5.0
- Add RTP MID extension support.
### 2.4.6
- Do not close `Transport` on ICE disconnected (as it would prevent ICE restart on "recv" TCP transports).
### 2.4.5
- Improve codec matching.
### 2.4.4
- Fix audio codec matching when `channels` parameter is not given.
### 2.4.3
- Make `PlainRtpTransport` not leak if port allocation fails (related issue [#224](https://github.com/versatica/mediasoup/issues/224)).
### 2.4.2
- Fix a crash in when no more RTP ports were available (see related issue [#222](https://github.com/versatica/mediasoup/issues/222)).
### 2.4.1
- Update dependencies.
### 2.4.0
- Allow non WebRTC peers to create plain RTP transports (no ICE/DTLS/SRTP but just plain RTP and RTCP) for sending and receiving media.
### 2.3.3
- Fix C++ syntax to avoid an error when building the worker with clang 8.0.0 (OSX 10.11.6).
### 2.3.2
- `Channel.js`: Upgrade `REQUEST_TIMEOUT` to 20 seconds to avoid timeout errors when the Node or worker thread usage is too high (related to this [issue](https://github.com/versatica/mediasoup-client/issues/48)).
### 2.3.1
- H264: Check if there is room for the indicated NAL unit size (thanks @ggarber).
- H264: Code cleanup.
### 2.3.0
- Add new "spy" feature. A "spy" peer cannot produce media and is invisible for other peers in the room.
### 2.2.7
- Fix H264 simulcast by properly detecting when the profile switching should be done.
- Fix a crash in `Consumer::GetStats()` (see related issue [#196](https://github.com/versatica/mediasoup/issues/196)).
### 2.2.6
- Add H264 simulcast capability.
### 2.2.5
- Avoid calling deprecated (NOOP) `SSL_CTX_set_ecdh_auto()` function in OpenSSL >= 1.1.0.
### 2.2.4
- [Fix #4](https://github.com/versatica/mediasoup/issues/4): Avoid DTLS handshake fragmentation.
### 2.2.3
- [Fix #196](https://github.com/versatica/mediasoup/issues/196): Crash in `Consumer::getStats()` due to wrong `targetProfile`.
### 2.2.2
- Improve [issue #209](https://github.com/versatica/mediasoup/issues/209).
### 2.2.1
- [Fix #209](https://github.com/versatica/mediasoup/issues/209): `DtlsTransport`: don't crash when signaled fingerprint and DTLS fingerprint do not match (thanks @yangjinecho for reporting it).
### 2.2.0
- Update Node and C/C++ dependencies.
### 2.1.0
- Add `localIP` option for `room.createRtpStreamer()` and `transport.startMirroring()` [[PR #199](https://github.com/versatica/mediasoup/pull/199)](https://github.com/versatica/mediasoup/pull/199).
### 2.0.16
- Improve C++ usage (remove "warning: missing initializer for member" [-Wmissing-field-initializers]).
- Update Travis-CI settings.
### 2.0.15
- Make `PlainRtpTransport` also send RTCP SR/RR reports (thanks @artushin for reporting).
### 2.0.14
- [Fix #193](https://github.com/versatica/mediasoup/issues/193): `preferTcp` not honored (thanks @artushin).
### 2.0.13
- Avoid crash when no remote IP/port is given.
### 2.0.12
- Add `handled` and `unhandled` events to `Consumer`.
### 2.0.11
- [Fix #185](https://github.com/versatica/mediasoup/issues/185): Consumer: initialize effective profile to 'NONE' (thanks @artushin).
- [Fix #186](https://github.com/versatica/mediasoup/issues/186): NackGenerator code being executed after instance deletion (thanks @baiyufei).
### 2.0.10
- [Fix #183](https://github.com/versatica/mediasoup/issues/183): Always reset the effective `Consumer` profile when removed (thanks @thehappycoder).
### 2.0.9
- Make ICE+DTLS more flexible by allowing sending DTLS handshake when ICE is just connected.
### 2.0.8
- Disable stats periodic retrieval also on remote closure of `Producer` and `WebRtcTransport`.
### 2.0.7
- [Fix #180](https://github.com/versatica/mediasoup/issues/180): Added missing include `cmath` so that `std::round` can be used (thanks @jacobEAdamson).
### 2.0.6
- [Fix #173](https://github.com/versatica/mediasoup/issues/173): Avoid buffer overflow in `()` (thanks @lightmare).
- Improve stream layers management in `Consumer` by using the new `RtpMonitor` class.
### 2.0.5
- [Fix #164](https://github.com/versatica/mediasoup/issues/164): Sometimes video freezes forever (no RTP received in browser at all).
- [Fix #160](https://github.com/versatica/mediasoup/issues/160): Assert error in `RTC::Consumer::GetStats()`.
### 2.0.4
- [Fix #159](https://github.com/versatica/mediasoup/issues/159): Don’t rely on VP8 payload descriptor flags to assure the existence of data.
- [Fix #160](https://github.com/versatica/mediasoup/issues/160): Reset `targetProfile` when the corresponding profile is removed.
### 2.0.3
- worker: Fix crash when VP8 payload has no `PictureId`.
### 2.0.2
- worker: Remove wrong `assert` on `Producer::DeactivateStreamProfiles()`.
### 2.0.1
- Update README file.
### 2.0.0
- New design based on `Producers` and `Consumer` plus a mediasoup protocol and the **mediasoup-client** client side SDK.
### 1.2.8
- Fix a crash due to RTX packet processing while the associated `NackGenerator` is not yet created.
### 1.2.7
- Habemus RTX ([RFC 4588](https://tools.ietf.org/html/rfc4588)) for proper RTP retransmission.
### 1.2.6
- Fix an issue in `buffer.toString()` that makes mediasoup fail in Node 8.
- Update libuv to version 1.12.0.
### 1.2.5
- Add support for [ICE renomination](https://tools.ietf.org/html/draft-thatcher-ice-renomination).
### 1.2.4
- Fix a SDP negotiation issue when the remote peer does not have compatible codecs.
### 1.2.3
- Add video codecs supported by Microsoft Edge.
### 1.2.2
- `RtpReceiver`: generate RTCP PLI when "rtpraw" or "rtpobject" event listener is set.
### 1.2.1
- `RtpReceiver`: fix an error producing packets when "rtpobject" event is set.
### 1.2.0
- `RtpSender`: allow `disable()`/`enable()` without forcing SDP renegotiation (#114).
### 1.1.0
- Add `Room.on('audiolevels')` event.
### 1.0.2
- Set a maximum value of 1500 bytes for packet storage in `RtpStreamSend`.
### 1.0.1
- Avoid possible segfault if `RemoteBitrateEstimator` generates a bandwidth estimation with zero SSRCs.
### 1.0.0
- First stable release.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to mediasoup
Thanks for taking the time to contribute to mediasoup! 🎉👍
## License
By contributing to mediasoup, you agree that your contributions will be licensed under its ISC License.
## Reporting Bugs
We primarily use GitHub as an issue tracker. Just open an issue in GitHub if you have encountered a bug in mediasoup.
If you have questions or doubts about mediasoup or need support, please use the mediasoup Discourse Group instead:
- https://mediasoup.discourse.group
If you got a crash in mediasoup, please try to provide a core dump into the issue report:
- https://mediasoup.org/support/#crashes-in-mediasoup-get-a-core-dump
## Pull Request Process
When creating a Pull Request for mediasoup:
- Ensure that changes/additions done in TypeScript files (in `node/src` folder) are also applied to the Rust layer (in `rust` folder), and vice-versa.
- Test units must be added for both Node.js and Rust.
- Changes/additions in C++ code may need tests in `worker/test` folder.
Once all changes are done, run the following commands to verify that the code in your PR conforms to the code syntax of the project, it does not break existing funtionality and tests pass:
- `npm run lint`: Check TypeScript and C++ linting rules. Formating errors can be automatically fixed by running `npm run format`.
- `npm run typescript:build`: Compile TypeScript code (under `src` folder) into JavaScript code (under `lib` folder).
- `npm run test`: Run JavaScript and C++ test units.
- Instead, you can run `npm run release:check` which will run all those steps.
- `cargo fmt`, `cargo clippy` and `cargo test` to ensure that everything is good in Rust side.
The full list of `npm` scripts, `invoke` tasks and `cargo` commands is available in the [doc/Building.md](/doc/Building.md) file.
## Coding Style
In adition to automatic checks performed by commands above, we also enforce other minor things related to coding style:
### Comments in TypeScript and C++
We use `//` for inline comments in both JavaScript and C++ source files.
- Comments must start with upercase letter.
- Comments must not exceed 80 columns (split into different lines if necessary).
- Comments must end with a dot.
Example (good):
```ts
// Calculate foo based on bar value.
const foo = bar / 2;
```
Example (bad):
```ts
// calculate foo based on bar value
const foo = bar / 2;
```
When adding inline documentation for methods or functions, we use `/** */` syntax. Example:
```ts
/**
* Calculates current score for foo and bar.
*/
function calculateScore(): number {
// [...]
}
```
================================================
FILE: Cargo.toml
================================================
[workspace]
resolver = "2"
members = [
"rust",
"rust/types",
"worker"
]
================================================
FILE: LICENSE
================================================
ISC License
Copyright © 2015, Iñaki Baz Castillo <ibc@aliax.net>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
================================================
FILE: README.md
================================================
# mediasoup v3
[![][mediasoup-banner]][mediasoup-website]
[![][npm-shield-mediasoup]][npm-mediasoup]
[![][crates-shield-mediasoup]][crates-mediasoup]
[![][opencollective-shield-mediasoup]][opencollective-mediasoup]
---
[![][github-actions-shield-mediasoup-node]][github-actions-mediasoup-node]
[![][github-actions-shield-mediasoup-worker]][github-actions-mediasoup-worker]
[![][github-actions-shield-mediasoup-rust]][github-actions-mediasoup-rust]
[![][github-actions-shield-mediasoup-worker-fuzzer]][github-actions-mediasoup-worker-fuzzer]
[![][github-actions-shield-mediasoup-worker-prebuild]][github-actions-mediasoup-worker-prebuild]
[![][github-actions-mediasoup-codeql-shield-mediasoup]][github-actions-mediasoup-codeql-mediasoup]
## Website and Documentation
- [mediasoup.org][mediasoup-website]
## Support Forum
- [mediasoup.discourse.group][mediasoup-discourse]
## Design Goals
mediasoup and its client side libraries are designed to accomplish with the following goals:
- Be a SFU (Selective Forwarding Unit).
- Support both WebRTC and plain RTP input and output.
- Be a Node.js module or Rust crate in server side.
- Be a tiny TypeScript and C++ libraries in client side.
- Be minimalist: just handle the media layer.
- Be signaling agnostic: do not mandate any signaling protocol.
- Be super low level API.
- Support all existing WebRTC endpoints.
- Enable integration with well known multimedia libraries/tools.
## Architecture
![][mediasoup-architecture]
## Use Cases
mediasoup and its client side libraries provide a super low level API. They are intended to enable different use cases and scenarios, without any constraint or assumption. Some of these use cases are:
- Group video chat applications.
- One-to-many (or few-to-many) broadcasting applications in real-time.
- RTP streaming.
## Features
- ECMAScript 6/Idiomatic Rust low level API.
- Multi-stream: multiple audio/video streams over a single ICE + DTLS transport.
- IPv6 ready.
- ICE / DTLS / RTP / RTCP over UDP and TCP.
- Simulcast and SVC support.
- Congestion control.
- Sender and receiver bandwidth estimation with spatial/temporal layers distribution algorithm.
- Data message exchange (via WebRTC DataChannels, SCTP over plain UDP, and direct termination in Node.js/Rust).
- Extremely powerful (media worker thread/subprocess coded in C++ on top of [libuv](https://libuv.org)).
## Demo Online
[![][mediasoup-demo-screenshot]][mediasoup-demo]
Try it at [v3demo.mediasoup.org](https://v3demo.mediasoup.org) ([source code](https://github.com/versatica/mediasoup-demo)).
## Authors
- Iñaki Baz Castillo [[website](https://inakibaz.me)|[github](https://github.com/ibc/)]
- José Luis Millán [[github](https://github.com/jmillan/)]
- Nazar Mokynskyi [[github](https://github.com/nazar-pc/)]
## Social
- Bluesky: [@mediasoup-sfu.bsky.social](https://bsky.app/profile/mediasoup-sfu.bsky.social)
## Sponsor
You can support mediasoup by [sponsoring][sponsor] it. Thanks!
## License
[ISC](./LICENSE)
[mediasoup-banner]: /art/mediasoup-banner.png
[mediasoup-website]: https://mediasoup.org
[mediasoup-discourse]: https://mediasoup.discourse.group
[npm-shield-mediasoup]: https://img.shields.io/npm/v/mediasoup.svg
[npm-mediasoup]: https://npmjs.org/package/mediasoup
[crates-shield-mediasoup]: https://img.shields.io/crates/v/mediasoup.svg
[crates-mediasoup]: https://crates.io/crates/mediasoup
[opencollective-shield-mediasoup]: https://img.shields.io/opencollective/all/mediasoup.svg
[opencollective-mediasoup]: https://opencollective.com/mediasoup
[github-actions-shield-mediasoup-node]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-node.yaml/badge.svg?branch=v3
[github-actions-mediasoup-node]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-node.yaml?query=branch%3Av3
[github-actions-shield-mediasoup-worker]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-worker.yaml/badge.svg?branch=v3
[github-actions-mediasoup-worker]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-worker.yaml?query=branch%3Av3
[github-actions-shield-mediasoup-rust]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-rust.yaml/badge.svg?branch=v3
[github-actions-mediasoup-rust]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-rust.yaml?query=branch%3Av3
[github-actions-shield-mediasoup-worker-fuzzer]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-worker-fuzzer.yaml/badge.svg?branch=v3
[github-actions-mediasoup-worker-fuzzer]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-worker-fuzzer.yaml?query=branch%3Av3
[github-actions-shield-mediasoup-worker-prebuild]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-worker-prebuild.yaml/badge.svg?event=release
[github-actions-mediasoup-worker-prebuild]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-worker-prebuild.yaml?query=event%3Arelease
[github-actions-mediasoup-codeql-shield-mediasoup]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-codeql.yaml/badge.svg?branch=v3
[github-actions-mediasoup-codeql-mediasoup]: https://github.com/versatica/mediasoup/actions/workflows/mediasoup-codeql.yaml?query=branch%3Av3
[sponsor]: https://mediasoup.org/sponsor
[mediasoup-architecture]: /art/mediasoup-v3-architecture-02.png
[mediasoup-demo-screenshot]: /art/mediasoup-v3.png
[mediasoup-demo]: https://v3demo.mediasoup.org
================================================
FILE: doc/Building.md
================================================
# Building
This document is intended for mediasoup developers.
## NPM scripts
The `package.json` file in the main folder includes the following scripts:
### `npm run typescript:build`
Compiles mediasoup TypeScript code (`node/src` folder) JavaScript and places it into the `node/lib` directory.
### `npm run typescript:watch`
Compiles mediasoup TypeScript code (`node/src` folder) JavaScript, places it into the `node/lib` directory an watches for changes in the TypeScript files.
### `npm run worker:build`
Builds the `mediasoup-worker` binary. It invokes `invoke`below.
### `npm run worker:prebuild-name`
Prints the name of the corresponding `mediasoup-worker` prebuild tar file.
### `npm run worker:prebuild`
Creates a prebuilt of `mediasoup-worker` binary in the `worker/prebuild` folder.
### `npm run lint`
Runs both `lint:node` and `lint:worker` tasks.
### `npm run lint:node`
Validates mediasoup TypeScript files using [ESLint](https://eslint.org), [Prettier](https://prettier.io) and [Knip](https://knip.dev/).
### `npm run lint:worker`
Validates mediasoup worker C++ files using [clang-format](https://clang.llvm.org/docs/ClangFormat.html). It invokes `invoke lint` below.
See [Install clang-format](#install-clang-format) for requirements.
### `npm run format`
Runs both `format:node` and `format:worker` tasks.
### `npm run format:node`
Format TypeScript and JavaScript code using [Prettier](https://prettier.io).
### `npm run format:worker`
Rewrites mediasoup worker C++ files using [clang-format](https://clang.llvm.org/docs/ClangFormat.html). It invokes `invoke format` below.
See [Install clang-format](#install-clang-format) for requirements.
### `npm run tidy:worker`
Runs [clang-tidy](http://clang.llvm.org/extra/clang-tidy) and performs C++ code checks following `worker/.clang-tidy` rules. It invokes `invoke tidy` below.
See [Install clang-tidy](#install-clang-tidy) for requirements.
### `npm run tidy:worker:fix`
Same as `npm run tidy:worker` but it also applies fixes.
### `npm run flatc`
Runs both `flatc:node` and `flatc:worker` tasks.
### `npm run flatc:node`
Compiles [FlatBuffers](https://github.com/google/flatbuffers) `.fbs` files in `worker/fbs` to TypeScript code.
### `npm run flatc:worker`
Compiles [FlatBuffers](https://github.com/google/flatbuffers) `.fbs` files in `worker/fbs` to C++ code.
### `npm run test`
Runs both `test:node` and `test:worker` tasks.
### `npm run test:node`
Runs [Jest](https://jestjs.io) test units located at `node/test` folder.
Jest command arguments can be given using `--` as follows:
```bash
npm run test:node -- --testPathPatterns "node/src/test/test-Worker.ts" --testNamePattern "createWorker"
```
### `npm run test:worker`
Runs [Catch2](https://github.com/catchorg/Catch2) test units located at `worker/test` folder. It invokes `invoke test` below.
### `npm run coverage`
Runs `coverage:node` task.
### `npm run coverage:node`
Same as `test:node` task but it also opens a browser window with TypeScript coverage results.
### `npm run release:check`
Runs linters and tests in Node and C++ code.
### `npm run release`
Publishes a new NPM version of mediasoup. Requirements for it to work:
- "version" field in `package.json` must have been incremented (and not commited to Git).
- `CHANGELOG.md` file must have been updated with an entry matching the new version.
- Of course, permissions to publish in NPM registry are required.
## Rust
The only special feature in Rust case is special environment variable "KEEP_BUILD_ARTIFACTS", that when set to "1" will allow incremental recompilation of changed C++ sources during hacking on mediasoup.
It is not necessary for normal usage of mediasoup as a dependency.
## Python Invoke and `tasks.py` file
mediasoup uses Python [Invoke](https://www.pyinvoke.org) library for managing and organizing tasks in the `worker` folder (mediasoup worker C++ subproject). `Invoke` is basically a replacemente of `make` + `Makefile` written in Python. mediasoup automatically installs `Invoke` in a local custom path during the installation process (in both Node and Rust) so the user doesn't need to worry about it.
Tasks are defined in `worker/tasks.py`. For development purposes, developers or contributors can install `Invoke` using `pip3 install invoke` and run tasks below within the `worker` folder.
See all the tasks by running `invoke --list` within the `worker` folder.
_NOTE:_ For some of these tasks to work, npm dependencies of `worker/scripts/package.json` must be installed:
```bash
npm ci --prefix worker/scripts
```
### `invoke` (default task)
Alias of `invoke mediasoup-worker` task below.
### `invoke meson-ninja`
Installs `meson` and `ninja` into a local custom path.
### `invoke clean`
Cleans built objects and binaries.
### `invoke clean-build`
Cleans built objects and other artifacts, but keeps `mediasoup-worker` binary in place.
### `invoke clean-pip`
Cleans `meson` and `ninja` installed in local prefix with pip.
### `invoke clean-subprojects`
Cleans subprojects downloaded with Meson.
### `invoke clean-all`
Cleans built objects and binaries, `meson` and `ninja` installed in local prefix with pip and all subprojects downloaded with Meson.
### `invoke update-wrap-file [subproject]`
Updates the wrap file of a subproject (those in `worker/subprojects` folder) with Meson. After updating it, `invoke setup` must be called by passing `MESON_ARGS="--reconfigure"` environment variable. Usage example:
```bash
cd worker
invoke update-wrap-file openssl
MESON_ARGS="--reconfigure" invoke setup
```
### `invoke mediasoup-worker`
Builds the `mediasoup-worker` binary at `worker/out/Release`.
If the "MEDIASOUP_MAX_CORES" environment variable is set, the build process will use that number of CPU cores. Otherwise it will auto-detect the number of cores in the machine.
"MEDIASOUP_BUILDTYPE" environment variable controls build types, "Release" and "Debug" are presets optimized for those use cases. Other build types are possible too, but they are not presets and will require "MESON_ARGS" use to customize build configuration.
Check the meaning of useful macros in the `worker/include/Logger.hpp` header file if you want to enable tracing or other debug information.
Binary is built at `worker/out/MEDIASOUP_BUILDTYPE/build`.
In order to instruct the mediasoup Node.js module to use the "Debug" mediasoup-worker` binary, an environment variable must be set before running the Node.js application:
```bash
MEDIASOUP_BUILDTYPE=Debug node myapp.js
```
If the "MEDIASOUP_WORKER_BIN" environment variable is set (it must be an absolute file path), mediasoup will use the it as `mediasoup-worker` binary and **won't** compile the binary:
```bash
MEDIASOUP_WORKER_BIN="/home/xxx/src/foo/mediasoup-worker" node myapp.js
```
### `invoke libmediasoup-worker`
Builds the `libmediasoup-worker` static library at `worker/out/Release`.
"MEDIASOUP_MAX_CORES"` and "MEDIASOUP_BUILDTYPE" environment variables from above still apply for static library build.
### `invoke xcode`
Builds a Xcode project for the mediasoup worker subproject.
### `invoke lint`
Validates mediasoup worker C++ files using [clang-format](https://clang.llvm.org/docs/ClangFormat.html) and rules in `worker/.clang-format`.
**Requirements:**
- A specific version of `clang-format`is required. See [Install clang-format](#install-clang-format).
- `clang-format-VERSION` or `clang-format` (corresponding to the required version) must be in the `PATH`. If not, add it before running the command.
### `invoke format`
Rewrites mediasoup worker C++ files using [clang-format](https://clang.llvm.org/docs/ClangFormat.html).
**Requirements:**
- A specific version of `clang-format`is required. See [Install clang-format](#install-clang-format).
- `clang-format-VERSION` or `clang-format` (corresponding to the required version) must be in the `PATH`. If not, add it before running the command.
### `invoke tidy`
Runs [clang-tidy](http://clang.llvm.org/extra/clang-tidy) and performs C++ code checks following `worker/.clang-tidy` rules.
**Requirements:**
- `invoke clean` must have been called first.
- A specific version of `clang-tidy`is required. See [Install clang-tidy](#install-clang-tidy).
- `clang-tidy-VERSION` or `clang-tidy` (corresponding to the required version) must be in the `PATH`. If not, add it before running the command. Same for other `clang-tidy` related executables such as `run-clang-tidy` and `clang-apply-replacements`,
**Environment variables:**
- "MEDIASOUP_TIDY_CHECKS": Optional. Comma separated list of checks. Overrides the checks defined in `worker/.clang-tidy` file.
- "MEDIASOUP_TIDY_FILES": Optional. Space separated source file paths to process. All `.cpp` files will be processes by default.
- File paths must be relative to `worker/` folder.
- File paths can use [glob](https://github.com/isaacs/node-glob) syntax. Example: `"src/RTC/SCTP/**/*.cpp"`.
**Usage example in macOS:**
```bash
PATH="/opt/homebrew/opt/llvm/bin/:$PATH" invoke tidy
```
It may happens that `clang-tidy` doesn't know where C++ standard libraries are so it shows lot of warnings about them. Depending on your local setup this may work:
```bash
PATH="/opt/homebrew/opt/llvm/bin/:$PATH" CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1 invoke tidy
```
### `invoke tidy-fix`
Same as `invoke tidy` but it also applies fixes.
### `invoke test`
Builds and runs the `mediasoup-worker-test` binary at `worker/out/Release` (or at `worker/out/Debug` if the "MEDIASOUP_BUILDTYPE" environment variable is set to "Debug"), which uses [Catch2](https://github.com/catchorg/Catch2) to run test units located at `worker/test` folder.
### `invoke test-asan-address`
Run test with Address Sanitizer with `-fsanitize=address`.
### `invoke test-asan-undefined`
Run test with Address Sanitizer with `-fsanitize=undefined`.
### `invoke fuzzer`
Builds the `mediasoup-worker-fuzzer` binary (which uses [libFuzzer](http://llvm.org/docs/LibFuzzer.html)) at `worker/out/Release` (or at `worker/out/Debug/` if the "MEDIASOUP_BUILDTYPE" environment variable is set to "Debug").
**Requirements:**
- Linux with fuzzer capable clang++.
- "CC" environment variable must point to `clang`.
- "CXX" environment variable must point to `clang++`.
Read the [Fuzzer](Fuzzer.md) documentation for detailed information.
### `invoke fuzzer-run-all`
Runs all fuzzer cases.
### `invoke docker`
Builds a Linux Ubuntu Docker image with fuzzer capable clang++ and all dependencies to run mediasoup.
### `invoke docker-run`
Runs a container of the Ubuntu Docker image created with `invoke docker`. It automatically executes a `bash` session in the mediasoup directory, which is a Docker volume that points to the mediasoup root folder.
**NOTE:** To install and run mediasoup in the container, previous installation (if any) must be properly cleaned by entering the `worker` directory and running `invoke clean-all`.
### `invoke docker-alpine`
Builds a Linux Alpine Docker image with all dependencies to run mediasoup.
### `invoke docker-alpine-run`
Runs a container of the Alpine Docker image created with `invoke docker-alpine`. It automatically executes an `ash` session in the mediasoup directory, which is a Docker volume that points to the mediasoup root folder.
**NOTE:** To install and run mediasoup in the container, previous installation (if any) must be properly cleaned by entering the `worker` directory and running `invoke clean-all`.
### `invoke docker-386`
Builds a 386 Linux Debian (32 bits arch) Docker image with all dependencies to run mediasoup.
### `invoke docker-alpine-386`
Runs a container of the 386 Linux Debian (32 bits arch) Docker image created with `invoke docker-386`. It automatically executes an `ash` session in the mediasoup directory, which is a Docker volume that points to the mediasoup root folder.
**NOTE:** To install and run mediasoup in the container, previous installation (if any) must be properly cleaned by entering the `worker` directory and running `invoke clean-all`.
**NOTE:** Due to the very old Node v18 in this image, in order to run mediasoup Node tests, `npm ci` must be executed with `--ignore-scripts --engine-strict=false` arguments.
## Makefile
The `worker` folder contains a `Makefile` file for the mediasoup worker C++ subproject. It acts as a proxy to the `Invoke` tasks defined in `tasks.py`. The `Makefile` file exists to help developers or contributors that prefer keep using `make` commands.
All tasks defined in `tasks.py` (see above) are available in `Makefile`. There is only one exception:
- The `update-wrap-file` needs a "SUBPROJECT" environment variable indicating the subproject to update. Usage example:
```bash
cd worker
make update-wrap-file SUBPROJECT=openssl
```
## Install clang-format
A specific `clang-format` version is required to be installed in the system, which is defined in [clang-scripts.mjs](../worker/scripts/clang-scripts.mjs).
macOS:
```bash
brew install clang-format@VERSION
```
Linux:
```bash
apt-get install clang-format-VERSION
```
## Install clang-tidy
A specific `clang-tidy` version is required to be installed in the system, which is defined in [clang-scripts.mjs](../worker/scripts/clang-scripts.mjs).
macOS:
```bash
brew install clang-tidy@VERSION
```
Linux:
```bash
apt-get install clang-tidy-VERSION
```
================================================
FILE: doc/Charts.md
================================================
# Charts
## Broadcasting
mediasoup **v2** (a room uses a single media worker subprocess by design, so a single CPU).
Charts provided by [CoSMo](https://www.cosmosoftware.io) team.
Scenario:
- 1 peer producing audio and video tracks.
- N spy peers receiving them.
#### Bandwidth out (Mbps) / number of viewers

#### Packets per second / number of viewers

#### Average bitrate (bps) and googRTT (ms) / number of viewers

#### CPU usage / number of viewers

================================================
FILE: doc/Closures.md
================================================
# Closures
Some considerations:
- Any JS `xxxxx.yyyyyClosed()` method is equivalent to the corresponding C++ `~Xxxxx()` destructor. They both silently destroy things without generating any internal notifications/events.
- _NOTE:_ Yes, the JS `xxxxx.yyyyyClosed()` produces **public** JS event `xxxxx.on('yyyyyclose')`, but that's not internal stuff.
## JS worker.close()
- Public API.
- Kills the mediasoup-worker process (if not already died) via signal.
- Iterates all JS Routers and calls `router.workerClosed()`.
## mediasoup-worker process dies unexpectely
- The JS Worker emits public JS `worker.on('died')`.
- Iterates all JS Routers and calls `router.workerClosed()`.
## C++ Worker::Close()
- Called when the mediasoup-worker process is killed.
- Iterates all C++ Routers and calls `delete router`.
## JS router.workerClosed()
- Private API.
- Emits public JS `router.on('workerclose')`.
## JS router.close()
- Public API.
- Sends channel request `WORKER_CLOSE_ROUTER`:
- Processed by the C++ Worker.
- It removes the C++ Router from its map.
- It calls C++ `delete router`.
- Iterates all JS Transports and calls `transport.routerClosed()`.
- Emits private JS `router.on('@close')` (so the JS Worker cleans its map).
## C++ ~Router() destructor
- Iterates all C++ Transports and calls `delete transport`.
## JS transport.routerClosed()
- Private API.
- Iterates all JS Producers and calls `producer.transportClosed()`.
- Iterates all JS Consumers and calls `consumer.transportClosed()`.
- Emits public JS `transport.on('routerclose')`.
## JS transport.close()
- Public API.
- Sends channel request `ROUTER_CLOSE_TRANSPORT`.
- Processed by the C++ Router.
- It calls C++ `transport->Close()` (so the C++ Transport will notify the C++ Router about closed Producers and Consumers in that Transport).
- It removes the C++ Transport from its map.
- It calls C++ `delete transport`.
- Iterates all JS Producers and calls `producer.transportClosed()`.
- For each JS Producer, the JS Transport emits private JS `transport.on('@producerclose')` (so the JS Router cleans its maps).
- Iterates all JS Consumers and calls `consumer.transportClosed()`.
- Emits private JS `transport.on('@close')` (so the JS Router cleans its map).
## C++ ~Transport() destructor
- Iterates all C++ Producers and calls `delete producer`.
- Iterates all C++ Consumer and calls `delete consumer`.
## C++ Transport::Close()
- Iterates all C++ Producers. For each Producer:
- Removes it from its map of Producers.
- Calls its `listener->OnTransportProducerClosed(this, producer)` (so the C++ Router cleans its maps and calls `consumer->ProducerClosed()` on its associated Consumers).
- Calls `delete producer`.
- It clears its map of C++ Producers.
- Iterates all C++ Consumer. For each Consumer:
- Removes it from its map of Consumers.
- Call its `listener->OnTransportConsumerClosed(this, consumer)` (so the C++ Router cleans its maps).
- Calls `delete consumer`.
- It clears its map of C++ Consumers.
_NOTE:_ If a Transport holds a Producer and a Consumer associated to that Producer, ugly things may happen when calling `Transport::Close()`:
- While iterating the C++ Producers as above, the C++ Consumer would be deleted (via `Consumer::ProducerClosed()`).
- As far as it's properly removed from the `Transport::mapConsumers` everything would be ok when later iterating the map of Consumers.
- Must ensure that, in this scenario, the JS event `consumer.on('producerclose')` is not called since `consumer.on('transportclose')` is supposed to happen before.
- This won't happen since the JS `Consumer` has removed its channel notifications within its `transportClosed()` method.
## C++ Router::OnTransportProducerClosed(transport, producer)
- Gets the set of C++ Consumers associated to the closed Producer in its `mapProducerConsumers`. For each Consumer:
- Calls `consumer->ProducerClosed()`.
- Deletes the entry in `mapProducerConsumers` with key `producer`.
- Deletes the entry in `mapProducers` with key `producer->id`.
## C++ Router::OnTransportConsumerClosed(transport, consumer)
- Get the associated C++ Producer from `mapConsumerProducer`.
- Remove the closed C++ Consumer from the set of Consumers in the corresponding `mapProducerConsumers` entry for the given Producer.
- Deletes the entry in `mapConsumerProducer` with key `consumer`.
## JS producer.transportClosed()
- Private API.
- Emits public JS `producer.on('transportclose')`.
## JS producer.close()
- Public API.
- Sends channel request `TRANSPORT_CLOSE_PRODUCER`.
- Processed by the C++ Transport.
- Removes it from its map of Producers.
- Calls its `listener->OnTransportProducerClosed(this, producer)` (so the C++ Router cleans its maps and calls `consumer->ProducerClose()` on its associated Consumers).
- Calls `delete producer`.
- Emits private JS `producer.on('@close')` (so the JS Transport cleans its map and will also emit private JS `transport.on('@producerclose')` so the JS Router cleans its map).
## C++ ~Producer() destructor
- Destroys its stuff.
## JS consumer.transportClosed()
- Private API.
- Emits public JS `consumer.on('transportclose')`.
## JS consumer.close()
- Public API.
- Sends channel request `TRANSPORT_CLOSE_CONSUMER`.
- Processed by the C++ Transport.
- Removes it from its map of Consumers.
- Calls its `listener->OnTransportConsumerClosed(this, consumer)` (so the C++ Router cleans its maps).
- Calls `delete consumer`.
- Emits private JS `consumer.on('@close')` (so the JS Transport cleans its map).
## C++ ~Consumer() destructor
- Destroys its stuff.
## C++ Consumer::ProducerClosed()
- Called from the C++ Router within the `Router::OnTransportProducerClosed()` listener.
- Send a channel notification `producerclose` to the JS Consumer.
- The JS Consumer emits private JS `consumer.on('@produceclose')` (so the JS Transport cleans its map).
- The JS Consumer emits public JS `consumer.on('produceclose')`.
- Notifies its C++ Transport via `listener->onConsumerProducerClosed()` which:
- cleans its map of Consumers,
- notifies the Router via `listener->OnTransportConsumerClosed()`), and
- deletes the Consumer.
================================================
FILE: doc/Fuzzer.md
================================================
# Fuzzer
Once we have built the `mediasoup-worker-fuzzer` target in a Linux environment with `fuzzer` capable clang (see `make fuzzer` documentation in [Building](Building.md)) we can then execute the fuzzer binary at `worker/out/Release/mediasoup-worker-fuzzer`.
**NOTE:** From now on, we assume we are in the mediasoup `worker` directory.
## Related documentation
- [libFuzzer documentation](http://llvm.org/docs/LibFuzzer.html)
- [libFuzzer Tutorial](https://github.com/google/fuzzer-test-suite/blob/master/tutorial/libFuzzerTutorial.md)
- [webrtcH4cKS ~ Lets get better at fuzzing in 2019](https://webrtchacks.com/lets-get-better-at-fuzzing-in-2019-heres-how/)
- [OSS-Fuzz](https://github.com/google/oss-fuzz) - Continuous fuzzing of open source software ("fuzz for me")
## Corpus files
The `deps/webrtc-fuzzer-corpora/corpora` directory has corpus directories taken from the [webrtc-fuzzer-corpora](https://github.com/RTC-Cartel/webrtc-fuzzer-corpora) project. They should be use to feed fuzzer with appropriate input.
However, given how `libFuzzer` [works](http://llvm.org/docs/LibFuzzer.html#options), the first directory given as command line parameter is not just used for reading corpus files, but also to store newly generated ones. So, it's recommended to pass `fuzzer/new-corpus` as first directory. Such a directory is gitignored.
## Crash reports
When the fuzzer detects an issue it generates a crash report file which contains the bytes given as input. Those files can be individually used later (instead of passing corpus directories) to the fuzzer to verify that the issue has been fixed.
The `fuzzer/reports` directory should be used to store those new crash reports. In order to use it, the following option must be given to the fuzzer executable:
```bash
-artifact_prefix=fuzzer/reports/
```
## Others
It's recommended to (also) pass the following options to the fuzzer:
- `-max_len=1400`: We don't need much more input size.
For memory leak detection enable the following environment variable:
- `LSAN_OPTIONS=verbosity=1:log_threads=1`
The mediasoup-worker fuzzer reads some custom environment variables to decide which kind of fuzzing perform:
- `MS_FUZZ_STUN=1`: Enable STUN fuzzer.
- `MS_FUZZ_DTLS=1`: Enable DTLS fuzzer.
- `MS_FUZZ_SCTP=1`: Enable SCTP fuzzer.
- `MS_FUZZ_RTP=1`: Enable RTP fuzzer.
- `MS_FUZZ_RTCP=1`: Enable RTCP fuzzer.
- `MS_FUZZ_CODECS=1`: Enable audio/video codecs fuzzer.
- `MS_FUZZ_UTILS=1`: Enable C++ utils fuzzer.
- If none of them is given, then **all** fuzzers are enabled.
The log level can also be set by setting the `MS_FUZZ_LOG_LEVEL` environment variable to "debug", "warn" or "error" (it is "none" if unset).
## Usage examples
- Detect memory leaks and just fuzz STUN:
```bash
MS_FUZZ_STUN=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus deps/webrtc-fuzzer-corpora/corpora/stun-corpus
```
- Detect memory leaks and just fuzz DTLS:
```bash
MS_FUZZ_DTLS=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus
```
- Detect memory leaks and just fuzz SCTP:
```bash
MS_FUZZ_SCTP=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus
```
- Detect memory leaks and just fuzz RTP:
```bash
MS_FUZZ_RTP=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus deps/webrtc-fuzzer-corpora/corpora/rtp-corpus
```
- Detect memory leaks and just fuzz RTCP:
```bash
MS_FUZZ_RTCP=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus deps/webrtc-fuzzer-corpora/corpora/rtcp-corpus
```
- Detect memory leaks and just fuzz audio/video codecs:
```bash
MS_FUZZ_CODECS=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus
```
- Detect memory leaks and just fuzz mediasoup-worker C++ utils:
```bash
MS_FUZZ_UTILS=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=2000 fuzzer/new-corpus
```
- Detect memory leaks and fuzz everything with log level "warn" and enable log tags "rtp" and "rtcp":
```bash
MS_FUZZ_LOG_LEVEL=warn MS_FUZZ_LOG_TAGS="rtp rtcp" LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus deps/webrtc-fuzzer-corpora/corpora/stun-corpus deps/webrtc-fuzzer-corpora/corpora/rtp-corpus deps/webrtc-fuzzer-corpora/corpora/rtcp-corpus
```
- Verify that a specific crash is fixed:
```bash
LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer fuzzer/reports/crash-f39771f7a03c0e7e539d4e52f48f7adad8976404
```
================================================
FILE: doc/README.md
================================================
# Internal Documentation
**NOTE:** Internal documentation for developing purposes. Get the mediasoup public documentation at [mediasoup.org](https://mediasoup.org).
- [Building](Building.md)
- [Fuzzer](Fuzzer.md)
- [Rust-crates](Rust-crates.md)
- [RTCP](RTCP.md)
- [Closures](Closures.md)
- [Charts](Charts.md)
================================================
FILE: doc/RTCP.md
================================================
# RTCP
This documentation describes how RTCP packets are processed in mediasoup.
Being a SFU, some received RTCP packets are locally consumed and others are ignored.
This document also describes which RTCP packets are locally generated by mediasoup.
mediasoup does not forward feedback information from a remote RTP receiver, which could incur in the remote sender modifying the transmition rate in a way that it would affect the reception quality for the overall participants in a router (i.e. limiting the remote RTP sender transmition rate).
### Sender Reports
mediasoup locally generates the Sender Reports of the streams it sends and processes the Sender Reports is receives from producer endpoints.
### Receiver Reports
mediasoup locally generates the Receiver Reports of the streams it receives and consumes the Receiver Reports from every remote RTP receivers.
The combination of Sender and Receiver Reports are used to determine the quality of each link. Information that is available at the JavaScript API level in order to determine the quality of each participant in the router.
### SDES
SDES information is locally consumed.
### BYE
This information is ignored.
### APP
This information is ignored.
### XR
Currently not implemented (ignored). The same logic should be applied as to Receiver Reports.
## RTP Feedback
### NACK
Received NACK requests are locally consumed. The solicited RTP packets are re-sent to the remote RTP receiver that requested them.
mediasoup locally generate NACK requests for remote senders.
### TMMBR / TMMBN
```
RFC 5104:
A receiver, translator, or mixer uses the Temporary Maximum Media
Stream Bit Rate Request (TMMBR, "timber") to request a sender to
limit the maximum bit rate for a media stream (see section 2.2) to,
or below, the provided value.
```
This information is ignored.
As for now, we do not limit the bit rate for the media streams as we are relying on locally generated reception reports (RR) to make the remote RTP senders adjust their transmition rates given such values.
### RTCP-SR-REQ
```
RFC 6051:
This memo outlines how RTP sessions are synchronised, and discusses
how rapidly such synchronisation can occur. We show that most RTP
sessions can be synchronised immediately, but that the use of video
switching multipoint conference units (MCUs) or large source-specific
multicast (SSM) groups can greatly increase the synchronisation
delay. This increase in delay can be unacceptable to some
applications that use layered and/or multi-description codecs.
```
This information is ignored.
### RAMS
This information is ignored.
### TLLEI
This information is ignored. In future it could be useful to acknowledge remote RTP receivers when mediasoup generates NACK request in order to avoid them sending them, which could generate the so called "feedback storm" or "NACK storm".
```
RFC 6642:
The RTCP TPLR message can be used by the intermediaries to
inform the receiver that the sender of the RTCP TPLR has received
reports that the indicated packets were lost and ask the receiver not
to send feedback to it regarding these packets.
```
### RTCP-ECN-FB
This information is ignored.
### PAUSE-RESUME
This information is ignored (and not even implemented in any RTP/WebRTC endpoint).
### Transport-wide Congestion Control (TCC)
Planned for v3.
## PS Feedback
### PLI
This information is locally consumed and generates a PLI request to the corresponding RTP sender.
Also it is locally sent when required. This is: a new participant joins the conference for a fast rendering by the rest of participants.
### SLI
This information is ignored.
### RPSI
This information is ignored.
### FIR
This information is locally consumed and generates a PLI request to the corresponding RTP sender.
### TSTR/TSTN
This information is ignored.
```
RFC 5104:
The Temporal-Spatial Trade-off Request (TSTR) instructs the video
encoder to change its trade-off between temporal and spatial
resolution. Index values from 0 to 31 indicate monotonically a
desire for higher frame rate.
```
### VBCM
This information is ignored.
### PSLEI
Same applicability as **TLLEI**.
### AFB
This information is ignored except for the REMB messages, which is locally consumed.
### REMB
This information is locally consumed to perform sender side bandwidth estimation.
REMB RTCP is generated locally based on the remote bitrate estimation.
## Mediasoup internal behaviour for each type of RTCP
### Generic RTCP
| | SR | RR | SDES | BYE | APP |
| -------- | --- | --- | ---- | --- | --- |
| Consumer | G | C | | | |
| Producer | C | G | C | I | I |
### RTP Feedback RTCP
| | NACK | TMMBR | TMMBN | TLLEI | ECN-FB | PAUSE-RESUME | TCC |
| -------- | ---- | ----- | ----- | ----- | ------ | ------------ | --- |
| Consumer | C | I | I | I | I | I | |
| Producer | G | | I | I | | | |
## PS Feedback RTCP
| | PLI | SLI | RPSI | FIR | TSTR | TSTN | VBCM | PSLI | AFB | REMB |
| --------- | --- | --- | ---- | --- | ---- | ---- | ---- | ---- | --- | ---- |
| Consumer | C | I | I | C | I | | I | | I | C |
| Producer | G | | | | | I | | I | | |
| Transport | | | | | | | | | | G |
( ): Does not apply.
(I): Ignore.
(C): Consume locally.
(B): Bypass.
(G): Generate locally.
================================================
FILE: doc/Rust-crates.md
================================================
# Rust crates
There are 3 crates: `mediasoup`, `mediasoup-sys` and `mediasoup-types`:
- `mediasoup-sys` crate wraps C++ worker into Rust.
- `mediasoup-types` crate defines and exposes mediasoup Rust types.
- `mediasoup` crate uses `mediasoup-sys` and `mediasoup-types` and it exposes nice user API in idiomatic Rust.
- `mediasoup-sys` is the only one that needs updating if changes are purely inside the worker or inside the `mediasoup-sys` crate. You can bump them all, but it is not required.
- If `mediasoup-sys`'s API changes in a breaking way, then its minor version needs to be changed, otherwise patch version needs to be changed. Same for `mediasoup-types` crate.
**Important:** Adding new APIs that `mediasoup` crate has to understand to continue working normally is a breaking change because it'll start crashing/printing errors if unexpected things happen.
## Steps to publish new mediasoup crates
1. Update versions in `worker/Cargo.toml` (for `mediasoup-sys` crate), `rust/types/Cargo.toml` (for `mediasoup-types` crate) and `rust/Cargo.toml` (for `mediasoup` crate). Note that in `rust/Cargo.toml` you may need to update the version of `[dependencies.mediasoup-sys]` and/or `[dependencies.mediasoup-types]` if it also changed.
2. Update `rust/CHANGELOG.md`.
3. Run `cargo build` to reflect changes in `Cargo.lock`.
4. Create PR and have it merged in mediasoup main branch.
5. Upload Git tags (the new one in `rust/CHANGELOG.md`, so the new `mediasoup` crate version):
```sh
git tag -a rust-X.X.X -m rust-X.X.X
git push origin rust-X.X.X
```
6. Publish crates (you need an account and permissions and so on):
```sh
cd rust/types
cargo publish
cd worker
cargo publish
cd rust
cargo publish
```
## Notes
- Depending on the state in `worker` directory you may need to run `invoke clean-all` or `make clean-all` in `worker` directory first.
- `cargo publish` will create the crate package, check if all necessary dependencies are already present on [crates.io](https://crates.io/), will then compile the package (to ensure that you don't publish a broken version) and will upload it to [crates.io](https://crates.io/).
- Never publish from random branches or local state that is not on GitHub. If you have local files modified Cargo will refuse to publish until you commit all the changes.
## Extras
### Check crate without publishing
If you want to do everything except publishing itself, `cargo package` command exists. You can also run `cargo package --dry-run` to avoid package generation or `cargo publish --dry-run`.
### Update required Rust version
Using `rustup` command:
```sh
rustup update
```
================================================
FILE: eslint.config.mjs
================================================
import eslint from '@eslint/js';
import tsEslint from 'typescript-eslint';
import jestEslint from 'eslint-plugin-jest';
import prettierRecommendedEslint from 'eslint-plugin-prettier/recommended';
import globals from 'globals';
const config = tsEslint.config(
{
languageOptions: {
sourceType: 'module',
globals: { ...globals.node },
},
linterOptions: {
noInlineConfig: false,
reportUnusedDisableDirectives: 'error',
},
},
eslint.configs.recommended,
prettierRecommendedEslint,
{
rules: {
'constructor-super': 2,
curly: [2, 'all'],
// Unfortunatelly `curly` does not apply to blocks in `switch` cases so
// this is needed.
'no-restricted-syntax': [
2,
{
selector: 'SwitchCase > *.consequent[type!="BlockStatement"]',
message: 'Switch cases without blocks are disallowed',
},
],
'guard-for-in': 2,
'newline-after-var': 2,
'newline-before-return': 2,
'no-alert': 2,
'no-caller': 2,
'no-case-declarations': 2,
'no-catch-shadow': 2,
'no-class-assign': 2,
'no-console': 2,
'no-const-assign': 2,
'no-debugger': 2,
'no-dupe-args': 2,
'no-dupe-keys': 2,
'no-duplicate-case': 2,
'no-div-regex': 2,
'no-empty': [2, { allowEmptyCatch: true }],
'no-empty-pattern': 2,
'no-eval': 2,
'no-extend-native': 2,
'no-ex-assign': 2,
'no-extra-bind': 2,
'no-extra-boolean-cast': 2,
'no-extra-label': 2,
'no-fallthrough': 2,
'no-func-assign': 2,
'no-global-assign': 2,
'no-implicit-coercion': 2,
'no-implicit-globals': 2,
'no-inner-declarations': 2,
'no-invalid-regexp': 2,
'no-invalid-this': 2,
'no-irregular-whitespace': 2,
'no-lonely-if': 2,
'no-multi-str': 2,
'no-native-reassign': 2,
'no-negated-in-lhs': 2,
'no-new': 2,
'no-new-func': 2,
'no-new-wrappers': 2,
'no-obj-calls': 2,
'no-proto': 2,
'no-prototype-builtins': 0,
'no-redeclare': 2,
'no-regex-spaces': 2,
'no-restricted-imports': 2,
'no-return-assign': 2,
'no-self-assign': 2,
'no-self-compare': 2,
'no-sequences': 2,
'no-shadow': 2,
'no-shadow-restricted-names': 2,
'no-sparse-arrays': 2,
'no-this-before-super': 2,
'no-throw-literal': 2,
'no-undef': 2,
'no-unmodified-loop-condition': 2,
'no-unreachable': 2,
'no-unused-vars': [
2,
{ vars: 'all', args: 'after-used', caughtErrors: 'none' },
],
'no-unused-private-class-members': 2,
'no-use-before-define': 0,
'no-useless-call': 2,
'no-useless-computed-key': 2,
'no-useless-concat': 2,
'no-useless-rename': 2,
'no-var': 2,
'object-curly-newline': 0,
'prefer-const': 2,
'prefer-rest-params': 2,
'prefer-spread': 2,
'prefer-template': 2,
'spaced-comment': [2, 'always'],
strict: 2,
'valid-typeof': 2,
yoda: 2,
},
},
// NOTE: We need to apply this only to .ts source files (and not to .mjs
// files).
...tsEslint.configs.recommendedTypeChecked.map(item => ({
...item,
files: ['node/src/**/*.ts'],
})),
// NOTE: We need to apply this only to .ts source files (and not to .mjs
// files).
...tsEslint.configs.stylisticTypeChecked.map(item => ({
...item,
files: ['node/src/**/*.ts'],
})),
{
name: '.ts source files',
files: ['node/src/**/*.ts'],
languageOptions: {
parserOptions: {
project: 'tsconfig.json',
},
},
rules: {
'@typescript-eslint/class-literal-property-style': [2, 'getters'],
'@typescript-eslint/consistent-generic-constructors': [
2,
'type-annotation',
],
'@typescript-eslint/dot-notation': 0,
'@typescript-eslint/no-unused-vars': [
2,
{
vars: 'all',
args: 'after-used',
caughtErrors: 'none',
ignoreRestSiblings: false,
},
],
// We want to use `type` instead of `interface`.
'@typescript-eslint/consistent-type-definitions': 0,
'@typescript-eslint/prefer-nullish-coalescing': [
0,
{
ignorePrimitives: { string: true },
},
],
'@typescript-eslint/explicit-function-return-type': [
2,
{ allowExpressions: true },
],
'@typescript-eslint/no-unsafe-member-access': 0,
'@typescript-eslint/no-unsafe-assignment': 0,
'@typescript-eslint/no-unsafe-call': 0,
'@typescript-eslint/no-unsafe-return': 0,
'@typescript-eslint/no-unsafe-argument': 0,
'@typescript-eslint/consistent-indexed-object-style': 0,
'@typescript-eslint/no-empty-function': 0,
'@typescript-eslint/restrict-template-expressions': 0,
'@typescript-eslint/no-duplicate-type-constituents': [
2,
{ ignoreUnions: true },
],
'@typescript-eslint/no-redundant-type-constituents': 0,
},
},
{
name: '.ts test files',
...jestEslint.configs['flat/recommended'],
files: ['node/src/test/**/*.ts'],
rules: {
...jestEslint.configs['flat/recommended'].rules,
'jest/no-disabled-tests': 2,
'jest/prefer-expect-assertions': 0,
'@typescript-eslint/no-unnecessary-type-assertion': 0,
},
}
);
export default config;
================================================
FILE: jest.config.mjs
================================================
const config = {
verbose: true,
testEnvironment: 'node',
testRegex: 'node/src/test/test-.*\\.ts',
transform: {
// transpilation: true is needed to avoid warnigns. However we lose TS
// checks. We don't care since we have TS tasks for that.
// See https://kulshekhar.github.io/ts-jest/docs/getting-started/options/transpilation
'^.+\\.ts?$': ['ts-jest', { transpilation: true }],
},
coveragePathIgnorePatterns: [
'node/src/Logger.ts',
'node/src/enhancedEvents.ts',
'node/src/fbs',
'node/src/test',
],
modulePathIgnorePatterns: ['worker', 'rust', 'target'],
cacheDirectory: '.cache/jest',
};
export default config;
================================================
FILE: knip.config.mjs
================================================
const config = {
$schema: 'https://unpkg.com/knip@5/schema.json',
project: ['node/src/**/*.ts'],
ignore: [
'node/src/fbsUtils.ts',
'node/src/rtpParametersFbsUtils.ts',
'node/src/rtpStreamStatsFbsUtils.ts',
'node/src/srtpParametersFbsUtils.ts',
],
ignoreDependencies: ['open-cli', 'supports-color'],
typescript: {
config: ['tsconfig.json'],
},
jest: {
config: ['jest.config.mjs'],
entry: ['node/src/test/**/*.ts'],
},
};
export default config;
================================================
FILE: node/src/ActiveSpeakerObserver.ts
================================================
import { Logger } from './Logger';
import { EnhancedEventEmitter } from './enhancedEvents';
import type {
ActiveSpeakerObserver,
ActiveSpeakerObserverDominantSpeaker,
ActiveSpeakerObserverEvents,
ActiveSpeakerObserverObserver,
ActiveSpeakerObserverObserverEvents,
} from './ActiveSpeakerObserverTypes';
import type { RtpObserver } from './RtpObserverTypes';
import { RtpObserverImpl, RtpObserverConstructorOptions } from './RtpObserver';
import type { AppData } from './types';
import { Event, Notification } from './fbs/notification';
import * as FbsActiveSpeakerObserver from './fbs/active-speaker-observer';
type RtpObserverObserverConstructorOptions<ActiveSpeakerObserverAppData> =
RtpObserverConstructorOptions<ActiveSpeakerObserverAppData>;
const logger = new Logger('ActiveSpeakerObserver');
export class ActiveSpeakerObserverImpl<
ActiveSpeakerObserverAppData extends AppData = AppData,
>
extends RtpObserverImpl<
ActiveSpeakerObserverAppData,
ActiveSpeakerObserverEvents,
ActiveSpeakerObserverObserver
>
implements RtpObserver, ActiveSpeakerObserver
{
constructor(
options: RtpObserverObserverConstructorOptions<ActiveSpeakerObserverAppData>
) {
const observer: ActiveSpeakerObserverObserver =
new EnhancedEventEmitter<ActiveSpeakerObserverObserverEvents>();
super(options, observer);
this.handleWorkerNotifications();
this.handleListenerError();
}
get type(): 'activespeaker' {
return 'activespeaker';
}
override get observer(): ActiveSpeakerObserverObserver {
return super.observer;
}
private handleWorkerNotifications(): void {
this.channel.on(
this.internal.rtpObserverId,
(event: Event, data?: Notification) => {
switch (event) {
case Event.ACTIVESPEAKEROBSERVER_DOMINANT_SPEAKER: {
const notification =
new FbsActiveSpeakerObserver.DominantSpeakerNotification();
data!.body(notification);
const producer = this.getProducerById(notification.producerId()!);
if (!producer) {
break;
}
const dominantSpeaker: ActiveSpeakerObserverDominantSpeaker = {
producer,
};
this.safeEmit('dominantspeaker', dominantSpeaker);
this.observer.safeEmit('dominantspeaker', dominantSpeaker);
break;
}
default: {
logger.error(`ignoring unknown event "${event}"`);
}
}
}
);
}
private handleListenerError(): void {
this.on('listenererror', (eventName, error) => {
logger.error(
`event listener threw an error [eventName:${eventName}]:`,
error
);
});
}
}
================================================
FILE: node/src/ActiveSpeakerObserverTypes.ts
================================================
import type { EnhancedEventEmitter } from './enhancedEvents';
import type {
RtpObserver,
RtpObserverEvents,
RtpObserverObserverEvents,
} from './RtpObserverTypes';
import type { Producer } from './ProducerTypes';
import type { AppData } from './types';
export type ActiveSpeakerObserverOptions<
ActiveSpeakerObserverAppData extends AppData = AppData,
> = {
interval?: number;
/**
* Custom application data.
*/
appData?: ActiveSpeakerObserverAppData;
};
export type ActiveSpeakerObserverDominantSpeaker = {
/**
* The audio Producer instance.
*/
producer: Producer;
};
export type ActiveSpeakerObserverEvents = RtpObserverEvents & {
dominantspeaker: [ActiveSpeakerObserverDominantSpeaker];
};
export type ActiveSpeakerObserverObserver =
EnhancedEventEmitter<ActiveSpeakerObserverObserverEvents>;
export type ActiveSpeakerObserverObserverEvents = RtpObserverObserverEvents & {
dominantspeaker: [ActiveSpeakerObserverDominantSpeaker];
};
export interface ActiveSpeakerObserver<
ActiveSpeakerObserverAppData extends AppData = AppData,
> extends RtpObserver<
ActiveSpeakerObserverAppData,
ActiveSpeakerObserverEvents,
ActiveSpeakerObserverObserver
> {
/**
* RtpObserver type.
*
* @override
*/
get type(): 'activespeaker';
/**
* Observer.
*
* @override
*/
get observer(): ActiveSpeakerObserverObserver;
}
================================================
FILE: node/src/AudioLevelObserver.ts
================================================
import { Logger } from './Logger';
import { EnhancedEventEmitter } from './enhancedEvents';
import type {
AudioLevelObserver,
AudioLevelObserverVolume,
AudioLevelObserverEvents,
AudioLevelObserverObserver,
AudioLevelObserverObserverEvents,
} from './AudioLevelObserverTypes';
import type { RtpObserver } from './RtpObserverTypes';
import { RtpObserverImpl, RtpObserverConstructorOptions } from './RtpObserver';
import type { Producer } from './ProducerTypes';
import type { AppData } from './types';
import * as fbsUtils from './fbsUtils';
import { Event, Notification } from './fbs/notification';
import * as FbsAudioLevelObserver from './fbs/audio-level-observer';
type AudioLevelObserverConstructorOptions<AudioLevelObserverAppData> =
RtpObserverConstructorOptions<AudioLevelObserverAppData>;
const logger = new Logger('AudioLevelObserver');
export class AudioLevelObserverImpl<
AudioLevelObserverAppData extends AppData = AppData,
>
extends RtpObserverImpl<
AudioLevelObserverAppData,
AudioLevelObserverEvents,
AudioLevelObserverObserver
>
implements RtpObserver, AudioLevelObserver
{
constructor(
options: AudioLevelObserverConstructorOptions<AudioLevelObserverAppData>
) {
const observer: AudioLevelObserverObserver =
new EnhancedEventEmitter<AudioLevelObserverObserverEvents>();
super(options, observer);
this.handleWorkerNotifications();
this.handleListenerError();
}
get type(): 'audiolevel' {
return 'audiolevel';
}
override get observer(): AudioLevelObserverObserver {
return super.observer;
}
private handleWorkerNotifications(): void {
this.channel.on(
this.internal.rtpObserverId,
(event: Event, data?: Notification) => {
switch (event) {
case Event.AUDIOLEVELOBSERVER_VOLUMES: {
const notification =
new FbsAudioLevelObserver.VolumesNotification();
data!.body(notification);
// Get the corresponding Producer instance and remove entries with
// no Producer (it may have been closed in the meanwhile).
const volumes: AudioLevelObserverVolume[] = fbsUtils
.parseVector(notification, 'volumes', parseVolume)
.map(
({
producerId,
volume,
}: {
producerId: string;
volume: number;
}) => ({
producer: this.getProducerById(producerId)!,
volume,
})
)
.filter(({ producer }: { producer: Producer }) => producer);
if (volumes.length > 0) {
this.safeEmit('volumes', volumes);
// Emit observer event.
this.observer.safeEmit('volumes', volumes);
}
break;
}
case Event.AUDIOLEVELOBSERVER_SILENCE: {
this.safeEmit('silence');
// Emit observer event.
this.observer.safeEmit('silence');
break;
}
default: {
logger.error(`ignoring unknown event "${event}"`);
}
}
}
);
}
private handleListenerError(): void {
this.on('listenererror', (eventName, error) => {
logger.error(
`event listener threw an error [eventName:${eventName}]:`,
error
);
});
}
}
function parseVolume(binary: FbsAudioLevelObserver.Volume): {
producerId: string;
volume: number;
} {
return {
producerId: binary.producerId()!,
volume: binary.volume(),
};
}
================================================
FILE: node/src/AudioLevelObserverTypes.ts
================================================
import type { EnhancedEventEmitter } from './enhancedEvents';
import type {
RtpObserver,
RtpObserverEvents,
RtpObserverObserverEvents,
} from './RtpObserverTypes';
import type { Producer } from './ProducerTypes';
import type { AppData } from './types';
export type AudioLevelObserverOptions<
AudioLevelObserverAppData extends AppData = AppData,
> = {
/**
* Maximum number of entries in the 'volumes”' event. Default 1.
*/
maxEntries?: number;
/**
* Minimum average volume (in dBvo from -127 to 0) for entries in the
* 'volumes' event. Default -80.
*/
threshold?: number;
/**
* Interval in ms for checking audio volumes. Default 1000.
*/
interval?: number;
/**
* Custom application data.
*/
appData?: AudioLevelObserverAppData;
};
export type AudioLevelObserverVolume = {
/**
* The audio Producer instance.
*/
producer: Producer;
/**
* The average volume (in dBvo from -127 to 0) of the audio Producer in the
* last interval.
*/
volume: number;
};
export type AudioLevelObserverEvents = RtpObserverEvents & {
volumes: [AudioLevelObserverVolume[]];
silence: [];
};
export type AudioLevelObserverObserver =
EnhancedEventEmitter<AudioLevelObserverObserverEvents>;
export type AudioLevelObserverObserverEvents = RtpObserverObserverEvents & {
volumes: [AudioLevelObserverVolume[]];
silence: [];
};
export interface AudioLevelObserver<
AudioLevelObserverAppData extends AppData = AppData,
> extends RtpObserver<
AudioLevelObserverAppData,
AudioLevelObserverEvents,
AudioLevelObserverObserver
> {
/**
* RtpObserver type.
*
* @override
*/
get type(): 'audiolevel';
/**
* Observer.
*
* @override
*/
get observer(): AudioLevelObserverObserver;
}
================================================
FILE: node/src/Channel.ts
================================================
import * as os from 'node:os';
import type { Duplex } from 'node:stream';
import { info, warn } from 'node:console';
import * as flatbuffers from 'flatbuffers';
import { Logger } from './Logger';
import { EnhancedEventEmitter } from './enhancedEvents';
import { InvalidStateError } from './errors';
import { Body as RequestBody, Method, Request } from './fbs/request';
import { Response } from './fbs/response';
import { Message, Body as MessageBody } from './fbs/message';
import {
Notification,
Body as NotificationBody,
Event,
} from './fbs/notification';
import { Log } from './fbs/log';
const IS_LITTLE_ENDIAN = os.endianness() === 'LE';
const logger = new Logger('Channel');
type Sent = {
id: number;
method: string;
resolve: (data: Response | PromiseLike<Response>) => void;
reject: (error: Error) => void;
close: () => void;
};
// Binary length for a 4194304 bytes payload.
const MESSAGE_MAX_LEN = 4194308;
const PAYLOAD_MAX_LEN = 4194304;
export class Channel extends EnhancedEventEmitter {
// Closed flag.
#closed = false;
// Unix Socket instance for sending messages to the worker process.
readonly #producerSocket: Duplex;
// Unix Socket instance for receiving messages to the worker process.
readonly #consumerSocket: Duplex;
// Next id for messages sent to the worker process.
#nextId = 0;
// Map of pending sent requests.
readonly #sents: Map<number, Sent> = new Map();
// Buffer for reading messages from the worker.
#recvBuffer: Buffer = Buffer.alloc(0);
// flatbuffers builder.
#bufferBuilder: flatbuffers.Builder = new flatbuffers.Builder(1024);
constructor({
producerSocket,
consumerSocket,
pid,
}: {
producerSocket: Duplex;
consumerSocket: Duplex;
pid: number;
}) {
super();
logger.debug('constructor()');
this.#producerSocket = producerSocket;
this.#consumerSocket = consumerSocket;
// Read Channel responses/notifications from the worker.
this.#consumerSocket.on('data', (buffer: Buffer) => {
if (!this.#recvBuffer.length) {
this.#recvBuffer = buffer;
} else {
this.#recvBuffer = Buffer.concat(
[this.#recvBuffer, buffer],
this.#recvBuffer.length + buffer.length
);
}
if (this.#recvBuffer.length > PAYLOAD_MAX_LEN) {
logger.error('receiving buffer is full, discarding all data in it');
// Reset the buffer and exit.
this.#recvBuffer = Buffer.alloc(0);
return;
}
let msgStart = 0;
while (true) {
const readLen = this.#recvBuffer.length - msgStart;
if (readLen < 4) {
// Incomplete data.
break;
}
const dataView = new DataView(
this.#recvBuffer.buffer,
this.#recvBuffer.byteOffset + msgStart
);
const msgLen = dataView.getUint32(0, IS_LITTLE_ENDIAN);
if (readLen < 4 + msgLen) {
// Incomplete data.
break;
}
const payload = this.#recvBuffer.subarray(
msgStart + 4,
msgStart + 4 + msgLen
);
msgStart += 4 + msgLen;
const buf = new flatbuffers.ByteBuffer(new Uint8Array(payload));
const message = Message.getRootAsMessage(buf);
try {
switch (message.dataType()) {
case MessageBody.Response: {
const response = new Response();
message.data(response);
this.processResponse(response);
break;
}
case MessageBody.Notification: {
const notification = new Notification();
message.data(notification);
this.processNotification(notification);
break;
}
case MessageBody.Log: {
const log = new Log();
message.data(log);
this.processLog(pid, log);
break;
}
default: {
warn(
`worker[pid:${pid}] unexpected data: ${payload.toString(
'utf8',
1
)}`
);
}
}
} catch (error) {
logger.error(
`received invalid message from the worker process: ${error}`
);
}
}
if (msgStart != 0) {
this.#recvBuffer = this.#recvBuffer.slice(msgStart);
}
});
this.#consumerSocket.on('end', () => {
logger.debug('Consumer Channel ended by the worker process');
});
this.#consumerSocket.on('error', error => {
logger.error(`Consumer Channel error: ${error}`);
});
this.#producerSocket.on('end', () => {
logger.debug('Producer Channel ended by the worker process');
});
this.#producerSocket.on('error', error => {
logger.error(`Producer Channel error: ${error}`);
});
}
/**
* flatbuffer builder.
*/
get bufferBuilder(): flatbuffers.Builder {
return this.#bufferBuilder;
}
close(): void {
if (this.#closed) {
return;
}
logger.debug('close()');
this.#closed = true;
// Close every pending sent.
for (const sent of this.#sents.values()) {
sent.close();
}
// Remove event listeners but leave a fake 'error' hander to avoid
// propagation.
this.#consumerSocket.removeAllListeners('end');
this.#consumerSocket.removeAllListeners('error');
this.#consumerSocket.on('error', () => {});
this.#producerSocket.removeAllListeners('end');
this.#producerSocket.removeAllListeners('error');
this.#producerSocket.on('error', () => {});
// Destroy the sockets.
try {
this.#producerSocket.destroy();
} catch (error) {}
try {
this.#consumerSocket.destroy();
} catch (error) {}
}
notify(
event: Event,
bodyType?: NotificationBody,
bodyOffset?: number,
handlerId?: string
): void {
logger.debug(`notify() [event:${Event[event]}]`);
if (this.#closed) {
throw new InvalidStateError(
`Channel closed, cannot send notification [event:${Event[event]}]`
);
}
const handlerIdOffset = this.#bufferBuilder.createString(handlerId ?? '');
let notificationOffset: number;
if (bodyType && bodyOffset) {
notificationOffset = Notification.createNotification(
this.#bufferBuilder,
handlerIdOffset,
event,
bodyType,
bodyOffset
);
} else {
notificationOffset = Notification.createNotification(
this.#bufferBuilder,
handlerIdOffset,
event,
NotificationBody.NONE,
0
);
}
const messageOffset = Message.createMessage(
this.#bufferBuilder,
MessageBody.Notification,
notificationOffset
);
// Finalizes the buffer and adds a 4 byte prefix with the size of the buffer.
this.#bufferBuilder.finishSizePrefixed(messageOffset);
// Create a new buffer with this data so multiple contiguous flatbuffers
// do not point to the builder buffer overriding others info.
const buffer = new Uint8Array(this.#bufferBuilder.asUint8Array());
// Clear the buffer builder so it's reused for the next request.
this.#bufferBuilder.clear();
if (buffer.byteLength > MESSAGE_MAX_LEN) {
logger.error(`notify() | notification too big [event:${Event[event]}]`);
return;
}
try {
// This may throw if closed or remote side ended.
this.#producerSocket.write(buffer, 'binary');
} catch (error) {
logger.error(`notify() | sending notification failed: ${error}`);
return;
}
}
async request(
method: Method,
bodyType?: RequestBody,
bodyOffset?: number,
handlerId?: string
): Promise<Response> {
logger.debug(`request() [method:${Method[method]}]`);
if (this.#closed) {
throw new InvalidStateError(
`Channel closed, cannot send request [method:${Method[method]}]`
);
}
if (this.#nextId < 4294967295) {
++this.#nextId;
} else {
this.#nextId = 1;
}
const id = this.#nextId;
const handlerIdOffset = this.#bufferBuilder.createString(handlerId ?? '');
let requestOffset: number;
if (bodyType && bodyOffset) {
requestOffset = Request.createRequest(
this.#bufferBuilder,
id,
method,
handlerIdOffset,
bodyType,
bodyOffset
);
} else {
requestOffset = Request.createRequest(
this.#bufferBuilder,
id,
method,
handlerIdOffset,
RequestBody.NONE,
0
);
}
const messageOffset = Message.createMessage(
this.#bufferBuilder,
MessageBody.Request,
requestOffset
);
// Finalizes the buffer and adds a 4 byte prefix with the size of the buffer.
this.#bufferBuilder.finishSizePrefixed(messageOffset);
// Create a new buffer with this data so multiple contiguous flatbuffers
// do not point to the builder buffer overriding others info.
const buffer = new Uint8Array(this.#bufferBuilder.asUint8Array());
// Clear the buffer builder so it's reused for the next request.
this.#bufferBuilder.clear();
if (buffer.byteLength > MESSAGE_MAX_LEN) {
throw new Error(`request too big [method:${Method[method]}]`);
}
// This may throw if closed or remote side ended.
this.#producerSocket.write(buffer, 'binary');
return new Promise((pResolve, pReject) => {
const sent: Sent = {
id: id,
method: Method[method],
resolve: data2 => {
if (!this.#sents.delete(id)) {
return;
}
pResolve(data2);
},
reject: error => {
if (!this.#sents.delete(id)) {
return;
}
pReject(error);
},
close: () => {
pReject(
new InvalidStateError(
`Channel closed, pending request aborted [method:${Method[method]}, id:${id}]`
)
);
},
};
// Add sent stuff to the map.
this.#sents.set(id, sent);
});
}
private processResponse(response: Response): void {
const sent = this.#sents.get(response.id());
if (!sent) {
logger.error(
`received response does not match any sent request [id:${response.id()}]`
);
return;
}
if (response.accepted()) {
logger.debug(`request succeeded [method:${sent.method}, id:${sent.id}]`);
sent.resolve(response);
} else if (response.error()) {
logger.warn(
`request failed [method:${sent.method}, id:${
sent.id
}]: ${response.reason()}`
);
switch (response.error()!) {
case 'TypeError': {
sent.reject(new TypeError(response.reason()!));
break;
}
default: {
sent.reject(new Error(response.reason()!));
}
}
} else {
logger.error(
`received response is not accepted nor rejected [method:${sent.method}, id:${sent.id}]`
);
}
}
private processNotification(notification: Notification): void {
// Due to how Promises work, it may happen that we receive a response
// from the worker followed by a notification from the worker. If we
// emit the notification immediately it may reach its target **before**
// the response, destroying the ordered delivery. So we must wait a bit
// here.
// See https://github.com/versatica/mediasoup/issues/510
setImmediate(() =>
this.emit(notification.handlerId()!, notification.event(), notification)
);
}
private processLog(pid: number, log: Log): void {
const logData = log.data()!;
switch (logData[0]) {
// 'D' (a debug log).
case 'D': {
logger.debug(`[pid:${pid}] ${logData.slice(1)}`);
break;
}
// 'W' (a warn log).
case 'W': {
logger.warn(`[pid:${pid}] ${logData.slice(1)}`);
break;
}
// 'E' (a error log).
case 'E': {
logger.error(`[pid:${pid}] ${logData.slice(1)}`);
break;
}
// 'X' (a dump log).
case 'X': {
info(logData.slice(1));
break;
}
}
}
}
================================================
FILE: node/src/Consumer.ts
================================================
import { Logger } from './Logger';
import { EnhancedEventEmitter } from './enhancedEvents';
import type {
Consumer,
ConsumerType,
ConsumerScore,
ConsumerLayers,
ConsumerDump,
SimpleConsumerDump,
SimulcastConsumerDump,
SvcConsumerDump,
PipeConsumerDump,
BaseConsumerDump,
RtpStreamDump,
RtpStreamParametersDump,
RtxStreamDump,
RtxStreamParameters,
ConsumerStat,
ConsumerTraceEventType,
ConsumerTraceEventData,
ConsumerEvents,
ConsumerObserver,
ConsumerObserverEvents,
} from './ConsumerTypes';
import { Channel } from './Channel';
import type { TransportInternal } from './Transport';
import type { ProducerStat } from './ProducerTypes';
import type { MediaKind, RtpParameters } from './rtpParametersTypes';
import {
parseRtpEncodingParameters,
parseRtpParameters,
} from './rtpParametersFbsUtils';
import { parseRtpStreamStats } from './rtpStreamStatsFbsUtils';
import type { AppData } from './types';
import * as fbsUtils from './fbsUtils';
import { Event, Notification } from './fbs/notification';
import { TraceDirection as FbsTraceDirection } from './fbs/common';
import * as FbsRequest from './fbs/request';
import * as FbsTransport from './fbs/transport';
import * as FbsConsumer from './fbs/consumer';
import * as FbsConsumerTraceInfo from './fbs/consumer/trace-info';
import * as FbsRtpStream from './fbs/rtp-stream';
import * as FbsRtxStream from './fbs/rtx-stream';
import { Type as FbsRtpParametersType } from './fbs/rtp-parameters';
import * as FbsRtpParameters from './fbs/rtp-parameters';
type ConsumerInternal = TransportInternal & {
consumerId: string;
};
type ConsumerData = {
producerId: string;
kind: MediaKind;
rtpParameters: RtpParameters;
type: ConsumerType;
};
const logger = new Logger('Consumer');
export class ConsumerImpl<ConsumerAppData extends AppData = AppData>
extends EnhancedEventEmitter<ConsumerEvents>
implements Consumer
{
// Internal data.
readonly #internal: ConsumerInternal;
// Consumer data.
readonly #data: ConsumerData;
// Channel instance.
readonly #channel: Channel;
// Closed flag.
#closed = false;
// Custom app data.
#appData: ConsumerAppData;
// Paused flag.
#paused = false;
// Associated Producer paused flag.
#producerPaused = false;
// Current priority.
#priority = 1;
// Current score.
#score: ConsumerScore;
// Preferred layers.
#preferredLayers?: ConsumerLayers;
// Curent layers.
#currentLayers?: ConsumerLayers;
// Observer instance.
readonly #observer: ConsumerObserver =
new EnhancedEventEmitter<ConsumerObserverEvents>();
constructor({
internal,
data,
channel,
appData,
paused,
producerPaused,
score = { score: 10, producerScore: 10, producerScores: [] },
preferredLayers,
}: {
internal: ConsumerInternal;
data: ConsumerData;
channel: Channel;
appData?: ConsumerAppData;
paused: boolean;
producerPaused: boolean;
score?: ConsumerScore;
preferredLayers?: ConsumerLayers;
}) {
super();
logger.debug('constructor()');
this.#internal = internal;
this.#data = data;
this.#channel = channel;
this.#paused = paused;
this.#producerPaused = producerPaused;
this.#score = score;
this.#preferredLayers = preferredLayers;
this.#appData = appData ?? ({} as ConsumerAppData);
this.handleWorkerNotifications();
this.handleListenerError();
}
get id(): string {
return this.#internal.consumerId;
}
get producerId(): string {
return this.#data.producerId;
}
get closed(): boolean {
return this.#closed;
}
get kind(): MediaKind {
return this.#data.kind;
}
get rtpParameters(): RtpParameters {
return this.#data.rtpParameters;
}
get type(): ConsumerType {
return this.#data.type;
}
get paused(): boolean {
return this.#paused;
}
get producerPaused(): boolean {
return this.#producerPaused;
}
get priority(): number {
return this.#priority;
}
get score(): ConsumerScore {
return this.#score;
}
get preferredLayers(): ConsumerLayers | undefined {
return this.#preferredLayers;
}
get currentLayers(): ConsumerLayers | undefined {
return this.#currentLayers;
}
get appData(): ConsumerAppData {
return this.#appData;
}
set appData(appData: ConsumerAppData) {
this.#appData = appData;
}
get observer(): ConsumerObserver {
return this.#observer;
}
/**
* Just for testing purposes.
*
* @private
*/
get channelForTesting(): Channel {
return this.#channel;
}
close(): void {
if (this.#closed) {
return;
}
logger.debug('close()');
this.#closed = true;
// Remove notification subscriptions.
this.#channel.removeAllListeners(this.#internal.consumerId);
/* Build Request. */
const requestOffset = new FbsTransport.CloseConsumerRequestT(
this.#internal.consumerId
).pack(this.#channel.bufferBuilder);
this.#channel
.request(
FbsRequest.Method.TRANSPORT_CLOSE_CONSUMER,
FbsRequest.Body.Transport_CloseConsumerRequest,
requestOffset,
this.#internal.transportId
)
.catch(() => {});
this.emit('@close');
// Emit observer event.
this.#observer.safeEmit('close');
}
transportClosed(): void {
if (this.#closed) {
return;
}
logger.debug('transportClosed()');
this.#closed = true;
// Remove notification subscriptions.
this.#channel.removeAllListeners(this.#internal.consumerId);
this.safeEmit('transportclose');
// Emit observer event.
this.#observer.safeEmit('close');
}
async dump(): Promise<ConsumerDump> {
logger.debug('dump()');
const response = await this.#channel.request(
FbsRequest.Method.CONSUMER_DUMP,
undefined,
undefined,
this.#internal.consumerId
);
/* Decode Response. */
const data = new FbsConsumer.DumpResponse();
response.body(data);
return parseConsumerDumpResponse(data);
}
async getStats(): Promise<(ConsumerStat | ProducerStat)[]> {
logger.debug('getStats()');
const response = await this.#channel.request(
FbsRequest.Method.CONSUMER_GET_STATS,
undefined,
undefined,
this.#internal.consumerId
);
/* Decode Response. */
const data = new FbsConsumer.GetStatsResponse();
response.body(data);
return parseConsumerStats(data);
}
async pause(): Promise<void> {
logger.debug('pause()');
await this.#channel.request(
FbsRequest.Method.CONSUMER_PAUSE,
undefined,
undefined,
this.#internal.consumerId
);
const wasPaused = this.#paused;
this.#paused = true;
// Emit observer event.
if (!wasPaused && !this.#producerPaused) {
this.#observer.safeEmit('pause');
}
}
async resume(): Promise<void> {
logger.debug('resume()');
await this.#channel.request(
FbsRequest.Method.CONSUMER_RESUME,
undefined,
undefined,
this.#internal.consumerId
);
const wasPaused = this.#paused;
this.#paused = false;
// Emit observer event.
if (wasPaused && !this.#producerPaused) {
this.#observer.safeEmit('resume');
}
}
async setPreferredLayers({
spatialLayer,
temporalLayer,
}: ConsumerLayers): Promise<void> {
logger.debug('setPreferredLayers()');
if (typeof spatialLayer !== 'number') {
throw new TypeError('spatialLayer must be a number');
}
if (temporalLayer && typeof temporalLayer !== 'number') {
throw new TypeError('if given, temporalLayer must be a number');
}
const builder = this.#channel.bufferBuilder;
const preferredLayersOffset =
FbsConsumer.ConsumerLayers.createConsumerLayers(
builder,
spatialLayer,
temporalLayer ?? null
);
const requestOffset =
FbsConsumer.SetPreferredLayersRequest.createSetPreferredLayersRequest(
builder,
preferredLayersOffset
);
const response = await this.#channel.request(
FbsRequest.Method.CONSUMER_SET_PREFERRED_LAYERS,
FbsRequest.Body.Consumer_SetPreferredLayersRequest,
requestOffset,
this.#internal.consumerId
);
/* Decode Response. */
const data = new FbsConsumer.SetPreferredLayersResponse();
let preferredLayers: ConsumerLayers | undefined;
// Response is empty for non Simulcast Consumers.
if (response.body(data)) {
const status = data.unpack();
if (status.preferredLayers) {
preferredLayers = {
spatialLayer: status.preferredLayers.spatialLayer,
temporalLayer: status.preferredLayers.temporalLayer ?? undefined,
};
}
}
this.#preferredLayers = preferredLayers;
}
async setPriority(priority: number): Promise<void> {
logger.debug('setPriority()');
if (typeof priority !== 'number' || priority < 0) {
throw new TypeError('priority must be a positive number');
}
const requestOffset =
FbsConsumer.SetPriorityRequest.createSetPriorityRequest(
this.#channel.bufferBuilder,
priority
);
const response = await this.#channel.request(
FbsRequest.Method.CONSUMER_SET_PRIORITY,
FbsRequest.Body.Consumer_SetPriorityRequest,
requestOffset,
this.#internal.consumerId
);
const data = new FbsConsumer.SetPriorityResponse();
response.body(data);
const status = data.unpack();
this.#priority = status.priority;
}
async unsetPriority(): Promise<void> {
logger.debug('unsetPriority()');
await this.setPriority(1);
}
async requestKeyFrame(): Promise<void> {
logger.debug('requestKeyFrame()');
await this.#channel.request(
FbsRequest.Method.CONSUMER_REQUEST_KEY_FRAME,
undefined,
undefined,
this.#internal.consumerId
);
}
async enableTraceEvent(types: ConsumerTraceEventType[] = []): Promise<void> {
logger.debug('enableTraceEvent()');
if (!Array.isArray(types)) {
throw new TypeError('types must be an array');
}
if (types.find(type => typeof type !== 'string')) {
throw new TypeError('every type must be a string');
}
// Convert event types.
const fbsEventTypes: FbsConsumer.TraceEventType[] = [];
for (const eventType of types) {
try {
fbsEventTypes.push(consumerTraceEventTypeToFbs(eventType));
} catch (error) {
logger.warn('enableTraceEvent() | [error:${error}]');
}
}
/* Build Request. */
const requestOffset = new FbsConsumer.EnableTraceEventRequestT(
fbsEventTypes
).pack(this.#channel.bufferBuilder);
await this.#channel.request(
FbsRequest.Method.CONSUMER_ENABLE_TRACE_EVENT,
FbsRequest.Body.Consumer_EnableTraceEventRequest,
requestOffset,
this.#internal.consumerId
);
}
private handleWorkerNotifications(): void {
this.#channel.on(
this.#internal.consumerId,
(event: Event, data?: Notification) => {
switch (event) {
case Event.CONSUMER_PRODUCER_CLOSE: {
if (this.#closed) {
break;
}
this.#closed = true;
// Remove notification subscriptions.
this.#channel.removeAllListeners(this.#internal.consumerId);
this.emit('@producerclose');
this.safeEmit('producerclose');
// Emit observer event.
this.#observer.safeEmit('close');
break;
}
case Event.CONSUMER_PRODUCER_PAUSE: {
if (this.#producerPaused) {
break;
}
this.#producerPaused = true;
this.safeEmit('producerpause');
// Emit observer event.
if (!this.#paused) {
this.#observer.safeEmit('pause');
}
break;
}
case Event.CONSUMER_PRODUCER_RESUME: {
if (!this.#producerPaused) {
break;
}
this.#producerPaused = false;
this.safeEmit('producerresume');
// Emit observer event.
if (!this.#paused) {
this.#observer.safeEmit('resume');
}
break;
}
case Event.CONSUMER_SCORE: {
const notification = new FbsConsumer.ScoreNotification();
data!.body(notification);
const score: ConsumerScore = notification.score()!.unpack();
this.#score = score;
this.safeEmit('score', score);
// Emit observer event.
this.#observer.safeEmit('score', score);
break;
}
case Event.CONSUMER_LAYERS_CHANGE: {
const notification = new FbsConsumer.LayersChangeNotification();
data!.body(notification);
const layers: ConsumerLayers | undefined = notification.layers()
? parseConsumerLayers(notification.layers()!)
: undefined;
this.#currentLayers = layers;
this.safeEmit('layerschange', layers);
// Emit observer event.
this.#observer.safeEmit('layerschange', layers);
break;
}
case Event.CONSUMER_TRACE: {
const notification = new FbsConsumer.TraceNotification();
data!.body(notification);
const trace: ConsumerTraceEventData =
parseTraceEventData(notification);
this.safeEmit('trace', trace);
// Emit observer event.
this.observer.safeEmit('trace', trace);
this.safeEmit('trace', trace);
// Emit observer event.
this.#observer.safeEmit('trace', trace);
break;
}
case Event.CONSUMER_RTP: {
if (this.#closed) {
break;
}
const notification = new FbsConsumer.RtpNotification();
data!.body(notification);
this.safeEmit('rtp', Buffer.from(notification.dataArray()!));
break;
}
default: {
logger.error(`ignoring unknown event "${event}"`);
}
}
}
);
}
private handleListenerError(): void {
this.on('listenererror', (eventName, error) => {
logger.error(
`event listener threw an error [eventName:${eventName}]:`,
error
);
});
}
}
function parseTraceEventData(
trace: FbsConsumer.TraceNotification
): ConsumerTraceEventData {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let info: any;
if (trace.infoType() !== FbsConsumer.TraceInfo.NONE) {
const accessor = trace.info.bind(trace);
info = FbsConsumerTraceInfo.unionToTraceInfo(trace.infoType(), accessor);
trace.info(info);
}
return {
type: consumerTraceEventTypeFromFbs(trace.type()),
timestamp: Number(trace.timestamp()),
direction:
trace.direction() === FbsTraceDirection.DIRECTION_IN ? 'in' : 'out',
info: info?.unpack(),
};
}
function consumerTraceEventTypeToFbs(
eventType: ConsumerTraceEventType
): FbsConsumer.TraceEventType {
switch (eventType) {
case 'keyframe': {
return FbsConsumer.TraceEventType.KEYFRAME;
}
case 'fir': {
return FbsConsumer.TraceEventType.FIR;
}
case 'nack': {
return FbsConsumer.TraceEventType.NACK;
}
case 'pli': {
return FbsConsumer.TraceEventType.PLI;
}
case 'rtp': {
return FbsConsumer.TraceEventType.RTP;
}
default: {
throw new TypeError(`invalid ConsumerTraceEventType: ${eventType}`);
}
}
}
function consumerTraceEventTypeFromFbs(
traceType: FbsConsumer.TraceEventType
): ConsumerTraceEventType {
switch (traceType) {
case FbsConsumer.TraceEventType.KEYFRAME: {
return 'keyframe';
}
case FbsConsumer.TraceEventType.FIR: {
return 'fir';
}
case FbsConsumer.TraceEventType.NACK: {
return 'nack';
}
case FbsConsumer.TraceEventType.PLI: {
return 'pli';
}
case FbsConsumer.TraceEventType.RTP: {
return 'rtp';
}
default: {
throw new TypeError(`invalid FbsConsumer.TraceEventType: ${traceType}`);
}
}
}
function parseConsumerLayers(data: FbsConsumer.ConsumerLayers): ConsumerLayers {
const spatialLayer = data.spatialLayer();
const temporalLayer =
data.temporalLayer() !== null ? data.temporalLayer()! : undefined;
return {
spatialLayer,
temporalLayer,
};
}
function parseRtpStream(data: FbsRtpStream.Dump): RtpStreamDump {
const params = parseRtpStreamParameters(data.params()!);
let rtxStream: RtxStreamDump | undefined;
if (data.rtxStream()) {
rtxStream = parseRtxStream(data.rtxStream()!);
}
return {
params,
score: data.score(),
rtxStream,
};
}
function parseRtpStreamParameters(
data: FbsRtpStream.Params
): RtpStreamParametersDump {
return {
encodingIdx: data.encodingIdx(),
ssrc: data.ssrc(),
payloadType: data.payloadType(),
mimeType: data.mimeType()!,
clockRate: data.clockRate(),
rid: data.rid()!.length > 0 ? data.rid()! : undefined,
cname: data.cname()!,
rtxSsrc: data.rtxSsrc() !== null ? data.rtxSsrc()! : undefined,
rtxPayloadType:
data.rtxPayloadType() !== null ? data.rtxPayloadType()! : undefined,
useNack: data.useNack(),
usePli: data.usePli(),
useFir: data.useFir(),
useInBandFec: data.useInBandFec(),
useDtx: data.useDtx(),
spatialLayers: data.spatialLayers(),
temporalLayers: data.temporalLayers(),
};
}
function parseRtxStream(data: FbsRtxStream.RtxDump): RtxStreamDump {
const params = parseRtxStreamParameters(data.params()!);
return {
params,
};
}
function parseRtxStreamParameters(
data: FbsRtxStream.Params
): RtxStreamParameters {
return {
ssrc: data.ssrc(),
payloadType: data.payloadType(),
mimeType: data.mimeType()!,
clockRate: data.clockRate(),
rrid: data.rrid()!.length > 0 ? data.rrid()! : undefined,
cname: data.cname()!,
};
}
function parseBaseConsumerDump(
data: FbsConsumer.BaseConsumerDump
): BaseConsumerDump {
return {
id: data.id()!,
producerId: data.producerId()!,
kind: data.kind() === FbsRtpParameters.MediaKind.AUDIO ? 'audio' : 'video',
rtpParameters: parseRtpParameters(data.rtpParameters()!),
consumableRtpEncodings:
data.consumableRtpEncodingsLength() > 0
? fbsUtils.parseVector(
data,
'consumableRtpEncodings',
parseRtpEncodingParameters
)
: undefined,
traceEventTypes: fbsUtils.parseVector(
data,
'traceEventTypes',
consumerTraceEventTypeFromFbs
),
supportedCodecPayloadTypes: fbsUtils.parseVector(
data,
'supportedCodecPayloadTypes'
),
paused: data.paused(),
producerPaused: data.producerPaused(),
priority: data.priority(),
};
}
function parseSimpleConsumerDump(
data: FbsConsumer.ConsumerDump
): SimpleConsumerDump {
const base = parseBaseConsumerDump(data.base()!);
const rtpStream = parseRtpStream(data.rtpStreams(0)!);
return {
...base,
type: 'simple',
rtpStream,
};
}
function parseSimulcastConsumerDump(
data: FbsConsumer.ConsumerDump
): SimulcastConsumerDump {
const base = parseBaseConsumerDump(data.base()!);
const rtpStream = parseRtpStream(data.rtpStreams(0)!);
return {
...base,
type: 'simulcast',
rtpStream,
preferredSpatialLayer: data.preferredSpatialLayer()!,
targetSpatialLayer: data.targetSpatialLayer()!,
currentSpatialLayer: data.currentSpatialLayer()!,
preferredTemporalLayer: data.preferredTemporalLayer()!,
targetTemporalLayer: data.targetTemporalLayer()!,
currentTemporalLayer: data.currentTemporalLayer()!,
};
}
function parseSvcConsumerDump(data: FbsConsumer.ConsumerDump): SvcConsumerDump {
const dump = parseSimulcastConsumerDump(data);
dump.type = 'svc';
return dump;
}
function parsePipeConsumerDump(
data: FbsConsumer.ConsumerDump
): PipeConsumerDump {
const base = parseBaseConsumerDump(data.base()!);
const rtpStreams = fbsUtils.parseVector(data, 'rtpStreams', parseRtpStream);
return {
...base,
type: 'pipe',
rtpStreams,
};
}
function parseConsumerDumpResponse(
data: FbsConsumer.DumpResponse
): ConsumerDump {
const type = data.data()!.base()!.type();
switch (type) {
case FbsRtpParametersType.SIMPLE: {
const dump = new FbsConsumer.ConsumerDump();
data.data(dump);
return parseSimpleConsumerDump(dump);
}
case FbsRtpParametersType.SIMULCAST: {
const dump = new FbsConsumer.ConsumerDump();
data.data(dump);
return parseSimulcastConsumerDump(dump);
}
case FbsRtpParametersType.SVC: {
const dump = new FbsConsumer.ConsumerDump();
data.data(dump);
return parseSvcConsumerDump(dump);
}
case FbsRtpParametersType.PIPE: {
const dump = new FbsConsumer.ConsumerDump();
data.data(dump);
return parsePipeConsumerDump(dump);
}
default: {
throw new TypeError(`invalid Consumer type: ${type}`);
}
}
}
function parseConsumerStats(
binary: FbsConsumer.GetStatsResponse
): (ConsumerStat | ProducerStat)[] {
return fbsUtils.parseVector(binary, 'stats', parseRtpStreamStats);
}
================================================
FILE: node/src/ConsumerTypes.ts
================================================
import type { EnhancedEventEmitter } from './enhancedEvents';
import type { ProducerStat } from './ProducerTypes';
import type {
MediaKind,
RtpCapabilities,
RtpEncodingParameters,
RtpParameters,
} from './rtpParametersTypes';
import type { RtpStreamSendStats } from './rtpStreamStatsTypes';
import type { AppData } from './types';
export type ConsumerOptions<ConsumerAppData extends AppData = AppData> = {
/**
* The id of the Producer to consume.
*/
producerId: string;
/**
* RTP capabilities of the consuming endpoint.
*/
rtpCapabilities: RtpCapabilities;
/**
* Whether the consumer must start in paused mode. Default false.
*
* When creating a video Consumer, it's recommended to set paused to true,
* then transmit the Consumer parameters to the consuming endpoint and, once
* the consuming endpoint has created its local side Consumer, unpause the
* server side Consumer using the resume() method. This is an optimization
* to make it possible for the consuming endpoint to render the video as far
* as possible. If the server side Consumer was created with paused: false,
* mediasoup will immediately request a key frame to the remote Producer and
* suych a key frame may reach the consuming endpoint even before it's ready
* to consume it, generating “black” video until the device requests a keyframe
* by itself.
*/
paused?: boolean;
/**
* The MID for the Consumer. If not specified, a sequentially growing
* number will be assigned.
*/
mid?: string;
/**
* Preferred spatial and temporal layer for simulcast or SVC media sources.
* If unset, the highest ones are selected.
*/
preferredLayers?: ConsumerLayers;
/**
* Whether this Consumer should enable RTP retransmissions, storing sent RTP
* and processing the incoming RTCP NACK from the remote Consumer. If not set
* it's true by default for video codecs and false for audio codecs. If set
* to true, NACK will be enabled if both endpoints (mediasoup and the remote
* Consumer) support NACK for this codec. When it comes to audio codecs, just
* OPUS supports NACK.
*/
enableRtx?: boolean;
/**
* Whether this Consumer should ignore DTX packets (only valid for Opus codec).
* If set, DTX packets are not forwarded to the remote Consumer.
*/
ignoreDtx?: boolean;
/**
* Whether this Consumer should consume all RTP streams generated by the
* Producer.
*/
pipe?: boolean;
/**
* Custom application data.
*/
appData?: ConsumerAppData;
};
/**
* Consumer type.
*/
export type ConsumerType = 'simple' | 'simulcast' | 'svc' | 'pipe';
export type ConsumerScore = {
/**
* The score of the RTP stream of the consumer.
*/
score: number;
/**
* The score of the currently selected RTP stream of the producer.
*/
producerScore: number;
/**
* The scores of all RTP streams in the producer ordered by encoding (just
* useful when the producer uses simulcast).
*/
producerScores: number[];
};
export type ConsumerLayers = {
/**
* The spatial layer index (from 0 to N).
*/
spatialLayer: number;
/**
* The temporal layer index (from 0 to N).
*/
temporalLayer?: number;
};
export type ConsumerDump =
| SimpleConsumerDump
| SimulcastConsumerDump
| SvcConsumerDump
| PipeConsumerDump;
export type SimpleConsumerDump = BaseConsumerDump & {
type: string;
rtpStream: RtpStreamDump;
};
export type SimulcastConsumerDump = BaseConsumerDump & {
type: string;
rtpStream: RtpStreamDump;
preferredSpatialLayer: number;
targetSpatialLayer: number;
currentSpatialLayer: number;
preferredTemporalLayer: number;
targetTemporalLayer: number;
currentTemporalLayer: number;
};
export type SvcConsumerDump = SimulcastConsumerDump;
export type PipeConsumerDump = BaseConsumerDump & {
type: string;
rtpStreams: RtpStreamDump[];
};
export type BaseConsumerDump = {
id: string;
producerId: string;
kind: MediaKind;
rtpParameters: RtpP
gitextract_nw9bolxa/
├── .editorconfig
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── Bug_Report.md
│ │ ├── Feature_Request.md
│ │ └── config.yml
│ └── workflows/
│ ├── mediasoup-codeql.yaml
│ ├── mediasoup-node.yaml
│ ├── mediasoup-rust.yaml
│ ├── mediasoup-worker-clang-tidy.yaml
│ ├── mediasoup-worker-fuzzer.yaml
│ ├── mediasoup-worker-prebuild.yaml
│ └── mediasoup-worker.yaml
├── .gitignore
├── .npmrc
├── .prettierrc.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── README.md
├── doc/
│ ├── Building.md
│ ├── Charts.md
│ ├── Closures.md
│ ├── Fuzzer.md
│ ├── README.md
│ ├── RTCP.md
│ └── Rust-crates.md
├── eslint.config.mjs
├── jest.config.mjs
├── knip.config.mjs
├── node/
│ └── src/
│ ├── ActiveSpeakerObserver.ts
│ ├── ActiveSpeakerObserverTypes.ts
│ ├── AudioLevelObserver.ts
│ ├── AudioLevelObserverTypes.ts
│ ├── Channel.ts
│ ├── Consumer.ts
│ ├── ConsumerTypes.ts
│ ├── DataConsumer.ts
│ ├── DataConsumerTypes.ts
│ ├── DataProducer.ts
│ ├── DataProducerTypes.ts
│ ├── DirectTransport.ts
│ ├── DirectTransportTypes.ts
│ ├── Logger.ts
│ ├── PipeTransport.ts
│ ├── PipeTransportTypes.ts
│ ├── PlainTransport.ts
│ ├── PlainTransportTypes.ts
│ ├── Producer.ts
│ ├── ProducerTypes.ts
│ ├── Router.ts
│ ├── RouterTypes.ts
│ ├── RtpObserver.ts
│ ├── RtpObserverTypes.ts
│ ├── Transport.ts
│ ├── TransportTypes.ts
│ ├── WebRtcServer.ts
│ ├── WebRtcServerTypes.ts
│ ├── WebRtcTransport.ts
│ ├── WebRtcTransportTypes.ts
│ ├── Worker.ts
│ ├── WorkerTypes.ts
│ ├── enhancedEvents.ts
│ ├── errors.ts
│ ├── extras.ts
│ ├── fbsUtils.ts
│ ├── index.ts
│ ├── indexTypes.ts
│ ├── ortc.ts
│ ├── rtpParametersFbsUtils.ts
│ ├── rtpParametersTypes.ts
│ ├── rtpStreamStatsFbsUtils.ts
│ ├── rtpStreamStatsTypes.ts
│ ├── scalabilityModesTypes.ts
│ ├── scalabilityModesUtils.ts
│ ├── sctpParametersFbsUtils.ts
│ ├── sctpParametersTypes.ts
│ ├── srtpParametersFbsUtils.ts
│ ├── srtpParametersTypes.ts
│ ├── supportedRtpCapabilities.ts
│ ├── test/
│ │ ├── data/
│ │ │ ├── dtls-cert.pem
│ │ │ └── dtls-key.pem
│ │ ├── test-ActiveSpeakerObserver.ts
│ │ ├── test-AudioLevelObserver.ts
│ │ ├── test-Consumer.ts
│ │ ├── test-DataConsumer.ts
│ │ ├── test-DataProducer.ts
│ │ ├── test-DirectTransport.ts
│ │ ├── test-PipeTransport.ts
│ │ ├── test-PlainTransport.ts
│ │ ├── test-Producer.ts
│ │ ├── test-Router.ts
│ │ ├── test-WebRtcServer.ts
│ │ ├── test-WebRtcTransport.ts
│ │ ├── test-Worker.ts
│ │ ├── test-mediasoup.ts
│ │ ├── test-multiopus.ts
│ │ ├── test-ortc.ts
│ │ └── test-werift-sctp.ts
│ ├── types.ts
│ └── utils.ts
├── npm-scripts.mjs
├── package.json
├── rust/
│ ├── CHANGELOG.md
│ ├── Cargo.toml
│ ├── benches/
│ │ ├── direct_data.rs
│ │ └── producer.rs
│ ├── examples/
│ │ ├── echo.rs
│ │ ├── multiopus.rs
│ │ ├── readme.md
│ │ ├── svc-simulcast.rs
│ │ └── videoroom.rs
│ ├── examples-frontend/
│ │ ├── echo/
│ │ │ ├── .eslintrc.js
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── index.ts
│ │ │ ├── tsconfig.json
│ │ │ └── webpack.config.js
│ │ ├── multiopus/
│ │ │ ├── .eslintrc.js
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── index.ts
│ │ │ ├── tsconfig.json
│ │ │ └── webpack.config.js
│ │ ├── readme.md
│ │ ├── svc-simulcast/
│ │ │ ├── .eslintrc.js
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── src/
│ │ │ │ └── index.ts
│ │ │ ├── tsconfig.json
│ │ │ └── webpack.config.js
│ │ └── videoroom/
│ │ ├── .eslintrc.js
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ ├── tsconfig.json
│ │ └── webpack.config.js
│ ├── src/
│ │ ├── data_structures.rs
│ │ ├── fbs.rs
│ │ ├── lib.rs
│ │ ├── macros.rs
│ │ ├── messages.rs
│ │ ├── ortc/
│ │ │ └── tests.rs
│ │ ├── ortc.rs
│ │ ├── prelude.rs
│ │ ├── router/
│ │ │ ├── active_speaker_observer/
│ │ │ │ └── tests.rs
│ │ │ ├── active_speaker_observer.rs
│ │ │ ├── audio_level_observer/
│ │ │ │ └── tests.rs
│ │ │ ├── audio_level_observer.rs
│ │ │ ├── consumer/
│ │ │ │ └── tests.rs
│ │ │ ├── consumer.rs
│ │ │ ├── data_consumer/
│ │ │ │ └── tests.rs
│ │ │ ├── data_consumer.rs
│ │ │ ├── data_producer/
│ │ │ │ └── tests.rs
│ │ │ ├── data_producer.rs
│ │ │ ├── direct_transport/
│ │ │ │ └── tests.rs
│ │ │ ├── direct_transport.rs
│ │ │ ├── pipe_transport/
│ │ │ │ └── tests.rs
│ │ │ ├── pipe_transport.rs
│ │ │ ├── plain_transport/
│ │ │ │ └── tests.rs
│ │ │ ├── plain_transport.rs
│ │ │ ├── producer/
│ │ │ │ └── tests.rs
│ │ │ ├── producer.rs
│ │ │ ├── rtp_observer.rs
│ │ │ ├── tests.rs
│ │ │ ├── transport.rs
│ │ │ ├── webrtc_transport/
│ │ │ │ └── tests.rs
│ │ │ └── webrtc_transport.rs
│ │ ├── router.rs
│ │ ├── rtp_parameters.rs
│ │ ├── scalability_modes.rs
│ │ ├── sctp_parameters.rs
│ │ ├── srtp_parameters.rs
│ │ ├── supported_rtp_capabilities.rs
│ │ ├── webrtc_server/
│ │ │ └── tests.rs
│ │ ├── webrtc_server.rs
│ │ ├── worker/
│ │ │ ├── channel.rs
│ │ │ ├── common.rs
│ │ │ ├── utils/
│ │ │ │ ├── channel_read_fn.rs
│ │ │ │ └── channel_write_fn.rs
│ │ │ └── utils.rs
│ │ ├── worker.rs
│ │ ├── worker_manager/
│ │ │ └── tests.rs
│ │ └── worker_manager.rs
│ ├── tests/
│ │ └── integration/
│ │ ├── active_speaker_observer.rs
│ │ ├── audio_level_observer.rs
│ │ ├── consumer.rs
│ │ ├── data/
│ │ │ ├── dtls-cert.pem
│ │ │ └── dtls-key.pem
│ │ ├── data_consumer.rs
│ │ ├── data_producer.rs
│ │ ├── direct_transport.rs
│ │ ├── main.rs
│ │ ├── multiopus.rs
│ │ ├── pipe_transport.rs
│ │ ├── plain_transport.rs
│ │ ├── producer.rs
│ │ ├── router.rs
│ │ ├── smoke.rs
│ │ ├── webrtc_server.rs
│ │ ├── webrtc_transport.rs
│ │ └── worker.rs
│ └── types/
│ ├── CHANGELOG.md
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── data_structures/
│ │ └── tests.rs
│ ├── data_structures.rs
│ ├── lib.rs
│ ├── rtp_parameters/
│ │ └── tests.rs
│ ├── rtp_parameters.rs
│ ├── scalability_modes/
│ │ └── tests.rs
│ ├── scalability_modes.rs
│ ├── sctp_parameters.rs
│ └── srtp_parameters.rs
├── rust-toolchain.toml
├── tsconfig.json
└── worker/
├── .clang-format
├── .clang-tidy
├── .clangd
├── Cargo.toml
├── Dockerfile
├── Dockerfile.386
├── Dockerfile.alpine
├── Makefile
├── build.rs
├── deps/
│ ├── libwebrtc/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── README.md
│ │ ├── libwebrtc/
│ │ │ ├── api/
│ │ │ │ ├── bitrate_constraints.h
│ │ │ │ ├── network_state_predictor.cc
│ │ │ │ ├── network_state_predictor.h
│ │ │ │ ├── transport/
│ │ │ │ │ ├── bitrate_settings.cc
│ │ │ │ │ ├── bitrate_settings.h
│ │ │ │ │ ├── field_trial_based_config.cc
│ │ │ │ │ ├── field_trial_based_config.h
│ │ │ │ │ ├── goog_cc_factory.cc
│ │ │ │ │ ├── goog_cc_factory.h
│ │ │ │ │ ├── network_control.h
│ │ │ │ │ ├── network_types.cc
│ │ │ │ │ ├── network_types.h
│ │ │ │ │ └── webrtc_key_value_config.h
│ │ │ │ └── units/
│ │ │ │ ├── data_rate.cc
│ │ │ │ ├── data_rate.h
│ │ │ │ ├── data_size.cc
│ │ │ │ ├── data_size.h
│ │ │ │ ├── frequency.cc
│ │ │ │ ├── frequency.h
│ │ │ │ ├── time_delta.cc
│ │ │ │ ├── time_delta.h
│ │ │ │ ├── timestamp.cc
│ │ │ │ └── timestamp.h
│ │ │ ├── call/
│ │ │ │ ├── rtp_transport_controller_send.cc
│ │ │ │ ├── rtp_transport_controller_send.h
│ │ │ │ └── rtp_transport_controller_send_interface.h
│ │ │ ├── mediasoup_helpers.h
│ │ │ ├── modules/
│ │ │ │ ├── bitrate_controller/
│ │ │ │ │ ├── loss_based_bandwidth_estimation.cc
│ │ │ │ │ ├── loss_based_bandwidth_estimation.h
│ │ │ │ │ ├── send_side_bandwidth_estimation.cc
│ │ │ │ │ └── send_side_bandwidth_estimation.h
│ │ │ │ ├── congestion_controller/
│ │ │ │ │ ├── goog_cc/
│ │ │ │ │ │ ├── acknowledged_bitrate_estimator.cc
│ │ │ │ │ │ ├── acknowledged_bitrate_estimator.h
│ │ │ │ │ │ ├── alr_detector.cc
│ │ │ │ │ │ ├── alr_detector.h
│ │ │ │ │ │ ├── bitrate_estimator.cc
│ │ │ │ │ │ ├── bitrate_estimator.h
│ │ │ │ │ │ ├── congestion_window_pushback_controller.cc
│ │ │ │ │ │ ├── congestion_window_pushback_controller.h
│ │ │ │ │ │ ├── delay_based_bwe.cc
│ │ │ │ │ │ ├── delay_based_bwe.h
│ │ │ │ │ │ ├── delay_increase_detector_interface.h
│ │ │ │ │ │ ├── goog_cc_network_control.cc
│ │ │ │ │ │ ├── goog_cc_network_control.h
│ │ │ │ │ │ ├── link_capacity_estimator.cc
│ │ │ │ │ │ ├── link_capacity_estimator.h
│ │ │ │ │ │ ├── median_slope_estimator.cc
│ │ │ │ │ │ ├── median_slope_estimator.h
│ │ │ │ │ │ ├── probe_bitrate_estimator.cc
│ │ │ │ │ │ ├── probe_bitrate_estimator.h
│ │ │ │ │ │ ├── probe_controller.cc
│ │ │ │ │ │ ├── probe_controller.h
│ │ │ │ │ │ ├── trendline_estimator.cc
│ │ │ │ │ │ └── trendline_estimator.h
│ │ │ │ │ └── rtp/
│ │ │ │ │ ├── control_handler.cc
│ │ │ │ │ ├── control_handler.h
│ │ │ │ │ ├── send_time_history.cc
│ │ │ │ │ ├── send_time_history.h
│ │ │ │ │ ├── transport_feedback_adapter.cc
│ │ │ │ │ └── transport_feedback_adapter.h
│ │ │ │ ├── include/
│ │ │ │ │ └── module_common_types_public.h
│ │ │ │ ├── pacing/
│ │ │ │ │ ├── bitrate_prober.cc
│ │ │ │ │ ├── bitrate_prober.h
│ │ │ │ │ ├── interval_budget.cc
│ │ │ │ │ ├── interval_budget.h
│ │ │ │ │ ├── paced_sender.cc
│ │ │ │ │ ├── paced_sender.h
│ │ │ │ │ └── packet_router.h
│ │ │ │ ├── remote_bitrate_estimator/
│ │ │ │ │ ├── aimd_rate_control.cc
│ │ │ │ │ ├── aimd_rate_control.h
│ │ │ │ │ ├── bwe_defines.cc
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── bwe_defines.h
│ │ │ │ │ │ └── remote_bitrate_estimator.h
│ │ │ │ │ ├── inter_arrival.cc
│ │ │ │ │ ├── inter_arrival.h
│ │ │ │ │ ├── overuse_detector.cc
│ │ │ │ │ ├── overuse_detector.h
│ │ │ │ │ ├── overuse_estimator.cc
│ │ │ │ │ ├── overuse_estimator.h
│ │ │ │ │ ├── remote_bitrate_estimator_abs_send_time.cc
│ │ │ │ │ └── remote_bitrate_estimator_abs_send_time.h
│ │ │ │ └── rtp_rtcp/
│ │ │ │ ├── include/
│ │ │ │ │ ├── rtp_rtcp_defines.cc
│ │ │ │ │ └── rtp_rtcp_defines.h
│ │ │ │ └── source/
│ │ │ │ └── rtp_packet/
│ │ │ │ └── transport_feedback.h
│ │ │ ├── rtc_base/
│ │ │ │ ├── constructor_magic.h
│ │ │ │ ├── experiments/
│ │ │ │ │ ├── alr_experiment.cc
│ │ │ │ │ ├── alr_experiment.h
│ │ │ │ │ ├── field_trial_parser.cc
│ │ │ │ │ ├── field_trial_parser.h
│ │ │ │ │ ├── field_trial_units.cc
│ │ │ │ │ ├── field_trial_units.h
│ │ │ │ │ ├── rate_control_settings.cc
│ │ │ │ │ └── rate_control_settings.h
│ │ │ │ ├── network/
│ │ │ │ │ ├── sent_packet.cc
│ │ │ │ │ └── sent_packet.h
│ │ │ │ ├── numerics/
│ │ │ │ │ ├── percentile_filter.h
│ │ │ │ │ ├── safe_compare.h
│ │ │ │ │ ├── safe_conversions.h
│ │ │ │ │ ├── safe_conversions_impl.h
│ │ │ │ │ └── safe_minmax.h
│ │ │ │ ├── rate_statistics.cc
│ │ │ │ ├── rate_statistics.h
│ │ │ │ ├── system/
│ │ │ │ │ └── unused.h
│ │ │ │ ├── type_traits.h
│ │ │ │ └── units/
│ │ │ │ └── unit_base.h
│ │ │ └── system_wrappers/
│ │ │ └── source/
│ │ │ ├── field_trial.cc
│ │ │ └── field_trial.h
│ │ ├── libwebrtc.gyp
│ │ └── meson.build
│ └── webrtc-fuzzer-corpora/
│ ├── README.md
│ ├── add_sha1.sh
│ ├── corpora/
│ │ ├── agc-corpus/
│ │ │ ├── agc-1
│ │ │ ├── agc-2
│ │ │ ├── agc-3
│ │ │ └── agc-4
│ │ ├── audio_processing-corpus/
│ │ │ ├── audio-processing-0
│ │ │ ├── audio-processing-1
│ │ │ ├── audio-processing-2
│ │ │ └── audio-processing-3
│ │ ├── mdns-corpus/
│ │ │ ├── 1.mdns
│ │ │ ├── 10.mdns
│ │ │ ├── 11.mdns
│ │ │ ├── 12.mdns
│ │ │ ├── 13.mdns
│ │ │ ├── 14.mdns
│ │ │ ├── 15.mdns
│ │ │ ├── 16.mdns
│ │ │ ├── 17.mdns
│ │ │ ├── 18.mdns
│ │ │ ├── 19.mdns
│ │ │ ├── 2.mdns
│ │ │ ├── 20.mdns
│ │ │ ├── 3.mdns
│ │ │ ├── 4.mdns
│ │ │ ├── 5.mdns
│ │ │ ├── 6.mdns
│ │ │ ├── 7.mdns
│ │ │ ├── 8.mdns
│ │ │ └── 9.mdns
│ │ ├── pseudotcp-corpus/
│ │ │ └── 785b96587d0eb44dd5d75b7a886f37e2ac504511
│ │ ├── rtcp-corpus/
│ │ │ ├── 0.rtcp
│ │ │ ├── 1.rtcp
│ │ │ ├── 10.rtcp
│ │ │ ├── 11.rtcp
│ │ │ ├── 12.rtcp
│ │ │ ├── 13.rtcp
│ │ │ ├── 14.rtcp
│ │ │ ├── 15.rtcp
│ │ │ ├── 16.rtcp
│ │ │ ├── 17.rtcp
│ │ │ ├── 18.rtcp
│ │ │ ├── 19.rtcp
│ │ │ ├── 2.rtcp
│ │ │ ├── 20.rtcp
│ │ │ ├── 21.rtcp
│ │ │ ├── 22.rtcp
│ │ │ ├── 23.rtcp
│ │ │ ├── 24.rtcp
│ │ │ ├── 25.rtcp
│ │ │ ├── 26.rtcp
│ │ │ ├── 27.rtcp
│ │ │ ├── 28.rtcp
│ │ │ ├── 29.rtcp
│ │ │ ├── 3.rtcp
│ │ │ ├── 30.rtcp
│ │ │ ├── 31.rtcp
│ │ │ ├── 32.rtcp
│ │ │ ├── 33.rtcp
│ │ │ ├── 34.rtcp
│ │ │ ├── 35.rtcp
│ │ │ ├── 36.rtcp
│ │ │ ├── 37.rtcp
│ │ │ ├── 38.rtcp
│ │ │ ├── 39.rtcp
│ │ │ ├── 4.rtcp
│ │ │ ├── 40.rtcp
│ │ │ ├── 41.rtcp
│ │ │ ├── 42.rtcp
│ │ │ ├── 43.rtcp
│ │ │ ├── 44.rtcp
│ │ │ ├── 45.rtcp
│ │ │ ├── 46.rtcp
│ │ │ ├── 47.rtcp
│ │ │ ├── 48.rtcp
│ │ │ ├── 49.rtcp
│ │ │ ├── 5.rtcp
│ │ │ ├── 50.rtcp
│ │ │ ├── 51.rtcp
│ │ │ ├── 52.rtcp
│ │ │ ├── 53.rtcp
│ │ │ ├── 54.rtcp
│ │ │ ├── 55.rtcp
│ │ │ ├── 56.rtcp
│ │ │ ├── 57.rtcp
│ │ │ ├── 58.rtcp
│ │ │ ├── 59.rtcp
│ │ │ ├── 6.rtcp
│ │ │ ├── 60.rtcp
│ │ │ ├── 61.rtcp
│ │ │ ├── 62.rtcp
│ │ │ ├── 63.rtcp
│ │ │ ├── 64.rtcp
│ │ │ ├── 65.rtcp
│ │ │ ├── 66.rtcp
│ │ │ ├── 7.rtcp
│ │ │ ├── 8.rtcp
│ │ │ ├── 9.rtcp
│ │ │ ├── fir.rtcp
│ │ │ ├── pli.rtcp
│ │ │ ├── remb.rtcp
│ │ │ ├── rr-remb.rtcp
│ │ │ ├── rr-sdes-bye.rtcp
│ │ │ ├── rr.rtcp
│ │ │ ├── sr-sdes.rtcp
│ │ │ └── twcc-feedback.rtcp
│ │ ├── rtp-corpus/
│ │ │ ├── rtp-0
│ │ │ ├── rtp-1
│ │ │ ├── rtp-2
│ │ │ ├── rtp-3
│ │ │ ├── rtp-4
│ │ │ ├── rtp-5
│ │ │ ├── rtp-6
│ │ │ └── rtp-7
│ │ ├── sdp-corpus/
│ │ │ ├── 10.sdp
│ │ │ ├── 11.sdp
│ │ │ ├── 12.sdp
│ │ │ ├── 13.sdp
│ │ │ ├── 14.sdp
│ │ │ ├── 15.sdp
│ │ │ ├── 16.sdp
│ │ │ ├── 17.sdp
│ │ │ ├── 18.sdp
│ │ │ ├── 19.sdp
│ │ │ ├── 2.sdp
│ │ │ ├── 20.sdp
│ │ │ ├── 21.sdp
│ │ │ ├── 22.sdp
│ │ │ ├── 23.sdp
│ │ │ ├── 24.sdp
│ │ │ ├── 25.sdp
│ │ │ ├── 26.sdp
│ │ │ ├── 27.sdp
│ │ │ ├── 28.sdp
│ │ │ ├── 29.sdp
│ │ │ ├── 3.sdp
│ │ │ ├── 30.sdp
│ │ │ ├── 31.sdp
│ │ │ ├── 32.sdp
│ │ │ ├── 33.sdp
│ │ │ ├── 34.sdp
│ │ │ ├── 35.sdp
│ │ │ ├── 36.sdp
│ │ │ ├── 37.sdp
│ │ │ ├── 38.sdp
│ │ │ ├── 39.sdp
│ │ │ ├── 4.sdp
│ │ │ ├── 40.sdp
│ │ │ ├── 41.sdp
│ │ │ ├── 42.sdp
│ │ │ ├── 43.sdp
│ │ │ ├── 44.sdp
│ │ │ ├── 45.sdp
│ │ │ ├── 46.sdp
│ │ │ ├── 47.sdp
│ │ │ ├── 48.sdp
│ │ │ ├── 49.sdp
│ │ │ ├── 5.sdp
│ │ │ ├── 50.sdp
│ │ │ ├── 51.sdp
│ │ │ ├── 52.sdp
│ │ │ ├── 53.sdp
│ │ │ ├── 54.sdp
│ │ │ ├── 55.sdp
│ │ │ ├── 6.sdp
│ │ │ ├── 7.sdp
│ │ │ ├── 8.sdp
│ │ │ ├── 9.sdp
│ │ │ ├── firefox-1.sdp
│ │ │ ├── firefox-2.sdp
│ │ │ ├── opera-1.sdp
│ │ │ ├── opera-2.sdp
│ │ │ ├── unittest-1.sdp
│ │ │ ├── unittest-2.sdp
│ │ │ ├── unittest-3.sdp
│ │ │ ├── unittest-4.sdp
│ │ │ ├── unittest-5.sdp
│ │ │ ├── unittest-6.sdp
│ │ │ ├── unittest-7.sdp
│ │ │ ├── unittest-8.sdp
│ │ │ └── unittest-9.sdp
│ │ └── stun-corpus/
│ │ ├── 0.stun
│ │ ├── 1.stun
│ │ ├── 10.stun
│ │ ├── 11.stun
│ │ ├── 12.stun
│ │ ├── 13.stun
│ │ ├── 14.stun
│ │ ├── 15.stun
│ │ ├── 16.stun
│ │ ├── 17.stun
│ │ ├── 2.stun
│ │ ├── 3.stun
│ │ ├── 4.stun
│ │ ├── 5.stun
│ │ ├── 6.stun
│ │ ├── 7.stun
│ │ ├── 8.stun
│ │ ├── 9.stun
│ │ └── validator-crash-1.stun
│ └── reports/
│ ├── crashes/
│ │ ├── .placeholder
│ │ ├── rtcp/
│ │ │ ├── crash-1640b2f21ba20409d930e9653052d579d450073a
│ │ │ ├── crash-16b8706455b637b7696aeb56ed40dad8f90d81d0
│ │ │ ├── crash-17ccf761d298d6a703f71627197c5f1adcf57140
│ │ │ ├── crash-3762f3b9f11328e939e577de46e20a3fb0ccc324
│ │ │ ├── crash-461a0e9201a7ea5ea6a43511571bdafce10b8185
│ │ │ ├── crash-7257232c6e9efe6362b921117ad3cd5d8170ec0d
│ │ │ ├── crash-75a5a7739802ac20cbe2937d6206348ffde23605
│ │ │ ├── crash-85b6e5d82d61837df67df0e333cb2392044a47c6
│ │ │ ├── crash-c7a1f348bd6f9422caeb41079e46331551fd2587
│ │ │ └── crash-daf57e58c2552e5cf091b0b92aa9f4ab2d4a5b4a
│ │ └── rtp/
│ │ ├── crash-15d89650c0a728a6431c10c3adeb8e9a2484af83
│ │ ├── crash-1e7e56a8894a7dc2c735a0732429930f4e4a9232
│ │ ├── crash-42df1e99b29f5c2e2a881c257a31ab3a3e76c650
│ │ ├── crash-5b35219e5f366ac6577599c82bc54cc33f7bbba4
│ │ ├── crash-6d9f1846dbb7acbe5dcb70623e5ac9ade871de1a
│ │ ├── crash-7e2d460edd5d5d7f5548922f10489f468d1638bf
│ │ ├── crash-7e3b3351f85a64bf0932a9ec7faca66717991c0f
│ │ ├── crash-9b6dfaedb1a8baca07492a8be205582db2e81ae3
│ │ ├── crash-af6dff495b4c6b06250561160b019a33de972478
│ │ ├── crash-b9a848d594a7b1d0a0d698d10d2fed4f2f96c038
│ │ ├── crash-ba25a83b65e08f750cf832e205e16f1d298ea614
│ │ └── crash-c14c0b082685dee2e98ab564c39883932f869cdd
│ ├── memory-leaks/
│ │ └── .placeholder
│ └── timeouts/
│ └── .placeholder
├── fbs/
│ ├── activeSpeakerObserver.fbs
│ ├── audioLevelObserver.fbs
│ ├── common.fbs
│ ├── consumer.fbs
│ ├── dataConsumer.fbs
│ ├── dataProducer.fbs
│ ├── directTransport.fbs
│ ├── liburing.fbs
│ ├── log.fbs
│ ├── meson.build
│ ├── message.fbs
│ ├── notification.fbs
│ ├── pipeTransport.fbs
│ ├── plainTransport.fbs
│ ├── producer.fbs
│ ├── request.fbs
│ ├── response.fbs
│ ├── router.fbs
│ ├── rtpObserver.fbs
│ ├── rtpPacket.fbs
│ ├── rtpParameters.fbs
│ ├── rtpStream.fbs
│ ├── rtxStream.fbs
│ ├── sctpAssociation.fbs
│ ├── sctpParameters.fbs
│ ├── srtpParameters.fbs
│ ├── transport.fbs
│ ├── webRtcServer.fbs
│ ├── webRtcTransport.fbs
│ └── worker.fbs
├── fuzzer/
│ ├── include/
│ │ ├── FuzzerUtils.hpp
│ │ └── RTC/
│ │ ├── FuzzerDtlsTransport.hpp
│ │ ├── FuzzerRateCalculator.hpp
│ │ ├── FuzzerSeqManager.hpp
│ │ ├── FuzzerTrendCalculator.hpp
│ │ ├── ICE/
│ │ │ └── FuzzerStunPacket.hpp
│ │ ├── RTCP/
│ │ │ ├── FuzzerBye.hpp
│ │ │ ├── FuzzerFeedbackPs.hpp
│ │ │ ├── FuzzerFeedbackPsAfb.hpp
│ │ │ ├── FuzzerFeedbackPsFir.hpp
│ │ │ ├── FuzzerFeedbackPsLei.hpp
│ │ │ ├── FuzzerFeedbackPsPli.hpp
│ │ │ ├── FuzzerFeedbackPsRemb.hpp
│ │ │ ├── FuzzerFeedbackPsRpsi.hpp
│ │ │ ├── FuzzerFeedbackPsSli.hpp
│ │ │ ├── FuzzerFeedbackPsTst.hpp
│ │ │ ├── FuzzerFeedbackPsVbcm.hpp
│ │ │ ├── FuzzerFeedbackRtp.hpp
│ │ │ ├── FuzzerFeedbackRtpEcn.hpp
│ │ │ ├── FuzzerFeedbackRtpNack.hpp
│ │ │ ├── FuzzerFeedbackRtpSrReq.hpp
│ │ │ ├── FuzzerFeedbackRtpTllei.hpp
│ │ │ ├── FuzzerFeedbackRtpTmmb.hpp
│ │ │ ├── FuzzerFeedbackRtpTransport.hpp
│ │ │ ├── FuzzerPacket.hpp
│ │ │ ├── FuzzerReceiverReport.hpp
│ │ │ ├── FuzzerSdes.hpp
│ │ │ ├── FuzzerSenderReport.hpp
│ │ │ └── FuzzerXr.hpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── FuzzerAV1.hpp
│ │ │ │ ├── FuzzerDependencyDescriptor.hpp
│ │ │ │ ├── FuzzerH264.hpp
│ │ │ │ ├── FuzzerOpus.hpp
│ │ │ │ ├── FuzzerVP8.hpp
│ │ │ │ └── FuzzerVP9.hpp
│ │ │ ├── FuzzerPacket.hpp
│ │ │ ├── FuzzerProbationGenerator.hpp
│ │ │ ├── FuzzerRetransmissionBuffer.hpp
│ │ │ └── FuzzerRtpStreamSend.hpp
│ │ └── SCTP/
│ │ ├── FuzzerStateCookie.hpp
│ │ └── packet/
│ │ └── FuzzerPacket.hpp
│ ├── new-corpus/
│ │ └── .placeholder
│ ├── reports/
│ │ ├── .placeholder
│ │ ├── crash-058a4c1cc23eb6852d2d239a5596b10c572faa7b
│ │ ├── crash-082d8c1a727f57b415a81ea68d8dd0c21804a4a1
│ │ ├── crash-2d204ea940d313bbdb69874f035ec5e7664b7181
│ │ ├── crash-572450c78229fbb005891235ad020c4374d44f82
│ │ ├── crash-6cfd7698f02bb829e64f926e2d8ce86596562843
│ │ ├── crash-732ced16c38f8a29b621a590e243782f2102e771
│ │ ├── crash-7e7caf72377ad55d353719f28febb5238eadfc9e
│ │ ├── crash-89d745213ab3a50a7bd6c0bfaa3caf3dd5b81c96
│ │ ├── crash-91572165de5ef12fe8415b150e40457eccca0362
│ │ ├── crash-92e8ac42827b4da15e94289879d56a44c70ee4ec
│ │ ├── crash-9401450d2dad5c11b31f93d7c69660e28ae6a1d6
│ │ ├── crash-9cc885b84ba02d766f422c6512ead3808ded0189
│ │ ├── crash-ac5d03e5d918b7f714c0452a59ad9c0e1ca3e501
│ │ ├── crash-b1dc07dd80d43d55c727cbf97e3db1285502bc39
│ │ ├── crash-b75c1208384621922270e954b4902442592c3ca9
│ │ ├── crash-c079dea0539424a1e986de88801b6a11005509c6
│ │ ├── crash-cb8c8802d60e3501cbf36d5e88b6882b8dfb76c9
│ │ ├── crash-cfd568c4ff6705458b0f431bf5e6fc89d7aa6883
│ │ ├── crash-da39a3ee5e6b4b0d3255bfef95601890afd80709
│ │ ├── crash-dcfd05592934ab472c98a1813256aabb9bb43bfb
│ │ ├── crash-ddfab2c0dd845e8d3e8f8d27e1f4cb49d92d279a
│ │ └── crash-f7c53b8c190ca20d0a3ab04b51a075e2e29bb4c6
│ └── src/
│ ├── FuzzerUtils.cpp
│ ├── RTC/
│ │ ├── FuzzerDtlsTransport.cpp
│ │ ├── FuzzerRateCalculator.cpp
│ │ ├── FuzzerSeqManager.cpp
│ │ ├── FuzzerTrendCalculator.cpp
│ │ ├── ICE/
│ │ │ └── FuzzerStunPacket.cpp
│ │ ├── RTCP/
│ │ │ ├── FuzzerBye.cpp
│ │ │ ├── FuzzerFeedbackPs.cpp
│ │ │ ├── FuzzerFeedbackPsAfb.cpp
│ │ │ ├── FuzzerFeedbackPsFir.cpp
│ │ │ ├── FuzzerFeedbackPsLei.cpp
│ │ │ ├── FuzzerFeedbackPsPli.cpp
│ │ │ ├── FuzzerFeedbackPsRemb.cpp
│ │ │ ├── FuzzerFeedbackPsRpsi.cpp
│ │ │ ├── FuzzerFeedbackPsSli.cpp
│ │ │ ├── FuzzerFeedbackPsTst.cpp
│ │ │ ├── FuzzerFeedbackPsVbcm.cpp
│ │ │ ├── FuzzerFeedbackRtp.cpp
│ │ │ ├── FuzzerFeedbackRtpEcn.cpp
│ │ │ ├── FuzzerFeedbackRtpNack.cpp
│ │ │ ├── FuzzerFeedbackRtpSrReq.cpp
│ │ │ ├── FuzzerFeedbackRtpTllei.cpp
│ │ │ ├── FuzzerFeedbackRtpTmmb.cpp
│ │ │ ├── FuzzerFeedbackRtpTransport.cpp
│ │ │ ├── FuzzerPacket.cpp
│ │ │ ├── FuzzerReceiverReport.cpp
│ │ │ ├── FuzzerSdes.cpp
│ │ │ ├── FuzzerSenderReport.cpp
│ │ │ └── FuzzerXr.cpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── FuzzerAV1.cpp
│ │ │ │ ├── FuzzerDependencyDescriptor.cpp
│ │ │ │ ├── FuzzerH264.cpp
│ │ │ │ ├── FuzzerOpus.cpp
│ │ │ │ ├── FuzzerVP8.cpp
│ │ │ │ └── FuzzerVP9.cpp
│ │ │ ├── FuzzerPacket.cpp
│ │ │ ├── FuzzerProbationGenerator.cpp
│ │ │ ├── FuzzerRetransmissionBuffer.cpp
│ │ │ └── FuzzerRtpStreamSend.cpp
│ │ └── SCTP/
│ │ ├── association/
│ │ │ └── FuzzerStateCookie.cpp
│ │ └── packet/
│ │ └── FuzzerPacket.cpp
│ └── fuzzer.cpp
├── include/
│ ├── Channel/
│ │ ├── ChannelMessageRegistrator.hpp
│ │ ├── ChannelMessageRegistratorInterface.hpp
│ │ ├── ChannelNotification.hpp
│ │ ├── ChannelNotifier.hpp
│ │ ├── ChannelRequest.hpp
│ │ └── ChannelSocket.hpp
│ ├── DepLibSRTP.hpp
│ ├── DepLibUV.hpp
│ ├── DepLibUring.hpp
│ ├── DepLibWebRTC.hpp
│ ├── DepOpenSSL.hpp
│ ├── DepUsrSCTP.hpp
│ ├── LogLevel.hpp
│ ├── Logger.hpp
│ ├── MediaSoupErrors.hpp
│ ├── RTC/
│ │ ├── ActiveSpeakerObserver.hpp
│ │ ├── AudioLevelObserver.hpp
│ │ ├── BweType.hpp
│ │ ├── Consts.hpp
│ │ ├── Consumer.hpp
│ │ ├── ConsumerTypes.hpp
│ │ ├── DataConsumer.hpp
│ │ ├── DataProducer.hpp
│ │ ├── DirectTransport.hpp
│ │ ├── DtlsTransport.hpp
│ │ ├── ICE/
│ │ │ ├── IceCandidate.hpp
│ │ │ ├── IceServer.hpp
│ │ │ └── StunPacket.hpp
│ │ ├── KeyFrameRequestManager.hpp
│ │ ├── NackGenerator.hpp
│ │ ├── Parameters.hpp
│ │ ├── PipeConsumer.hpp
│ │ ├── PipeTransport.hpp
│ │ ├── PlainTransport.hpp
│ │ ├── PortManager.hpp
│ │ ├── Producer.hpp
│ │ ├── RTCP/
│ │ │ ├── Bye.hpp
│ │ │ ├── CompoundPacket.hpp
│ │ │ ├── Feedback.hpp
│ │ │ ├── FeedbackItem.hpp
│ │ │ ├── FeedbackPs.hpp
│ │ │ ├── FeedbackPsAfb.hpp
│ │ │ ├── FeedbackPsFir.hpp
│ │ │ ├── FeedbackPsLei.hpp
│ │ │ ├── FeedbackPsPli.hpp
│ │ │ ├── FeedbackPsRemb.hpp
│ │ │ ├── FeedbackPsRpsi.hpp
│ │ │ ├── FeedbackPsSli.hpp
│ │ │ ├── FeedbackPsTst.hpp
│ │ │ ├── FeedbackPsVbcm.hpp
│ │ │ ├── FeedbackRtp.hpp
│ │ │ ├── FeedbackRtpEcn.hpp
│ │ │ ├── FeedbackRtpNack.hpp
│ │ │ ├── FeedbackRtpSrReq.hpp
│ │ │ ├── FeedbackRtpTllei.hpp
│ │ │ ├── FeedbackRtpTmmb.hpp
│ │ │ ├── FeedbackRtpTransport.hpp
│ │ │ ├── Packet.hpp
│ │ │ ├── ReceiverReport.hpp
│ │ │ ├── Sdes.hpp
│ │ │ ├── SenderReport.hpp
│ │ │ ├── XR.hpp
│ │ │ ├── XrDelaySinceLastRr.hpp
│ │ │ └── XrReceiverReferenceTime.hpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── AV1.hpp
│ │ │ │ ├── DependencyDescriptor.hpp
│ │ │ │ ├── H264.hpp
│ │ │ │ ├── Opus.hpp
│ │ │ │ ├── PayloadDescriptorHandler.hpp
│ │ │ │ ├── Tools.hpp
│ │ │ │ ├── VP8.hpp
│ │ │ │ └── VP9.hpp
│ │ │ ├── HeaderExtensionIds.hpp
│ │ │ ├── Packet.hpp
│ │ │ ├── ProbationGenerator.hpp
│ │ │ ├── RetransmissionBuffer.hpp
│ │ │ ├── RtpStream.hpp
│ │ │ ├── RtpStreamRecv.hpp
│ │ │ ├── RtpStreamSend.hpp
│ │ │ ├── RtxStream.hpp
│ │ │ └── SharedPacket.hpp
│ │ ├── RateCalculator.hpp
│ │ ├── Router.hpp
│ │ ├── RtcLogger.hpp
│ │ ├── RtpDictionaries.hpp
│ │ ├── RtpListener.hpp
│ │ ├── RtpObserver.hpp
│ │ ├── SCTP/
│ │ │ ├── TODO_SCTP.md
│ │ │ ├── association/
│ │ │ │ ├── Association.hpp
│ │ │ │ ├── AssociationListenerDeferrer.hpp
│ │ │ │ ├── HeartbeatHandler.hpp
│ │ │ │ ├── NegotiatedCapabilities.hpp
│ │ │ │ ├── PacketSender.hpp
│ │ │ │ ├── StateCookie.hpp
│ │ │ │ ├── StreamResetHandler.hpp
│ │ │ │ ├── TransmissionControlBlock.hpp
│ │ │ │ └── TransmissionControlBlockContextInterface.hpp
│ │ │ ├── packet/
│ │ │ │ ├── Chunk.hpp
│ │ │ │ ├── ErrorCause.hpp
│ │ │ │ ├── Packet.hpp
│ │ │ │ ├── Parameter.hpp
│ │ │ │ ├── TLV.hpp
│ │ │ │ ├── UserData.hpp
│ │ │ │ ├── chunks/
│ │ │ │ │ ├── AbortAssociationChunk.hpp
│ │ │ │ │ ├── AnyDataChunk.hpp
│ │ │ │ │ ├── AnyForwardTsnChunk.hpp
│ │ │ │ │ ├── AnyInitChunk.hpp
│ │ │ │ │ ├── CookieAckChunk.hpp
│ │ │ │ │ ├── CookieEchoChunk.hpp
│ │ │ │ │ ├── DataChunk.hpp
│ │ │ │ │ ├── ForwardTsnChunk.hpp
│ │ │ │ │ ├── HeartbeatAckChunk.hpp
│ │ │ │ │ ├── HeartbeatRequestChunk.hpp
│ │ │ │ │ ├── IDataChunk.hpp
│ │ │ │ │ ├── IForwardTsnChunk.hpp
│ │ │ │ │ ├── InitAckChunk.hpp
│ │ │ │ │ ├── InitChunk.hpp
│ │ │ │ │ ├── OperationErrorChunk.hpp
│ │ │ │ │ ├── ReConfigChunk.hpp
│ │ │ │ │ ├── SackChunk.hpp
│ │ │ │ │ ├── ShutdownAckChunk.hpp
│ │ │ │ │ ├── ShutdownChunk.hpp
│ │ │ │ │ ├── ShutdownCompleteChunk.hpp
│ │ │ │ │ └── UnknownChunk.hpp
│ │ │ │ ├── errorCauses/
│ │ │ │ │ ├── CookieReceivedWhileShuttingDownErrorCause.hpp
│ │ │ │ │ ├── InvalidMandatoryParameterErrorCause.hpp
│ │ │ │ │ ├── InvalidStreamIdentifierErrorCause.hpp
│ │ │ │ │ ├── MissingMandatoryParameterErrorCause.hpp
│ │ │ │ │ ├── NoUserDataErrorCause.hpp
│ │ │ │ │ ├── OutOfResourceErrorCause.hpp
│ │ │ │ │ ├── ProtocolViolationErrorCause.hpp
│ │ │ │ │ ├── RestartOfAnAssociationWithNewAddressesErrorCause.hpp
│ │ │ │ │ ├── StaleCookieErrorCause.hpp
│ │ │ │ │ ├── UnknownErrorCause.hpp
│ │ │ │ │ ├── UnrecognizedChunkTypeErrorCause.hpp
│ │ │ │ │ ├── UnrecognizedParametersErrorCause.hpp
│ │ │ │ │ ├── UnresolvableAddressErrorCause.hpp
│ │ │ │ │ └── UserInitiatedAbortErrorCause.hpp
│ │ │ │ └── parameters/
│ │ │ │ ├── AddIncomingStreamsRequestParameter.hpp
│ │ │ │ ├── AddOutgoingStreamsRequestParameter.hpp
│ │ │ │ ├── CookiePreservativeParameter.hpp
│ │ │ │ ├── ForwardTsnSupportedParameter.hpp
│ │ │ │ ├── HeartbeatInfoParameter.hpp
│ │ │ │ ├── IPv4AddressParameter.hpp
│ │ │ │ ├── IPv6AddressParameter.hpp
│ │ │ │ ├── IncomingSsnResetRequestParameter.hpp
│ │ │ │ ├── OutgoingSsnResetRequestParameter.hpp
│ │ │ │ ├── ReconfigurationResponseParameter.hpp
│ │ │ │ ├── SsnTsnResetRequestParameter.hpp
│ │ │ │ ├── StateCookieParameter.hpp
│ │ │ │ ├── SupportedAddressTypesParameter.hpp
│ │ │ │ ├── SupportedExtensionsParameter.hpp
│ │ │ │ ├── UnknownParameter.hpp
│ │ │ │ ├── UnrecognizedParameterParameter.hpp
│ │ │ │ └── ZeroChecksumAcceptableParameter.hpp
│ │ │ ├── public/
│ │ │ │ ├── AssociationInterface.hpp
│ │ │ │ ├── AssociationListenerInterface.hpp
│ │ │ │ ├── AssociationMetrics.hpp
│ │ │ │ ├── Message.hpp
│ │ │ │ ├── SctpOptions.hpp
│ │ │ │ └── SctpTypes.hpp
│ │ │ ├── rx/
│ │ │ │ ├── DataTracker.hpp
│ │ │ │ ├── InterleavedReassemblyStreams.hpp
│ │ │ │ ├── ReassemblyQueue.hpp
│ │ │ │ ├── ReassemblyStreamsInterface.hpp
│ │ │ │ └── TraditionalReassemblyStreams.hpp
│ │ │ └── tx/
│ │ │ ├── OutstandingData.hpp
│ │ │ ├── RetransmissionErrorCounter.hpp
│ │ │ ├── RetransmissionQueue.hpp
│ │ │ ├── RetransmissionTimeout.hpp
│ │ │ ├── RoundRobinSendQueue.hpp
│ │ │ ├── SendQueueInterface.hpp
│ │ │ └── StreamScheduler.hpp
│ │ ├── SctpAssociation.hpp
│ │ ├── SctpDictionaries.hpp
│ │ ├── SctpListener.hpp
│ │ ├── SenderBandwidthEstimator.hpp
│ │ ├── SeqManager.hpp
│ │ ├── Serializable.hpp
│ │ ├── SimpleConsumer.hpp
│ │ ├── SimulcastConsumer.hpp
│ │ ├── SrtpSession.hpp
│ │ ├── SvcConsumer.hpp
│ │ ├── TcpConnection.hpp
│ │ ├── TcpServer.hpp
│ │ ├── Transport.hpp
│ │ ├── TransportCongestionControlClient.hpp
│ │ ├── TransportCongestionControlServer.hpp
│ │ ├── TransportTuple.hpp
│ │ ├── TrendCalculator.hpp
│ │ ├── UdpSocket.hpp
│ │ ├── WebRtcServer.hpp
│ │ └── WebRtcTransport.hpp
│ ├── Settings.hpp
│ ├── Shared.hpp
│ ├── SharedInterface.hpp
│ ├── Utils/
│ │ └── UnwrappedSequenceNumber.hpp
│ ├── Utils.hpp
│ ├── Worker.hpp
│ ├── common.hpp
│ ├── handles/
│ │ ├── BackoffTimerHandle.hpp
│ │ ├── BackoffTimerHandleInterface.hpp
│ │ ├── SignalHandle.hpp
│ │ ├── TcpConnectionHandle.hpp
│ │ ├── TcpServerHandle.hpp
│ │ ├── TimerHandle.hpp
│ │ ├── TimerHandleInterface.hpp
│ │ ├── UdpSocketHandle.hpp
│ │ └── UnixStreamSocketHandle.hpp
│ └── lib.hpp
├── meson.build
├── meson_options.txt
├── mocks/
│ ├── include/
│ │ ├── Channel/
│ │ │ └── MockChannelMessageRegistrator.hpp
│ │ ├── MockShared.hpp
│ │ ├── RTC/
│ │ │ └── SCTP/
│ │ │ ├── association/
│ │ │ │ ├── MockAssociationListener.hpp
│ │ │ │ └── MockTransmissionControlBlockContext.hpp
│ │ │ └── tx/
│ │ │ └── MockSendQueue.hpp
│ │ ├── handles/
│ │ │ ├── MockBackoffTimerHandle.hpp
│ │ │ └── MockTimerHandle.hpp
│ │ └── mockTypes.hpp
│ └── src/
│ ├── Channel/
│ │ └── MockChannelMessageRegistrator.cpp
│ ├── MockShared.cpp
│ ├── RTC/
│ │ └── SCTP/
│ │ └── association/
│ │ └── MockTransmissionControlBlockContext.cpp
│ └── handles/
│ └── MockBackoffTimerHandle.cpp
├── scripts/
│ ├── .npmrc
│ ├── clang-scripts.mjs
│ ├── get-dep.sh
│ ├── package.json
│ └── run-fuzzer.sh
├── src/
│ ├── Channel/
│ │ ├── ChannelMessageRegistrator.cpp
│ │ ├── ChannelNotification.cpp
│ │ ├── ChannelNotifier.cpp
│ │ ├── ChannelRequest.cpp
│ │ └── ChannelSocket.cpp
│ ├── DepLibSRTP.cpp
│ ├── DepLibUV.cpp
│ ├── DepLibUring.cpp
│ ├── DepLibWebRTC.cpp
│ ├── DepOpenSSL.cpp
│ ├── DepUsrSCTP.cpp
│ ├── Logger.cpp
│ ├── MediaSoupErrors.cpp
│ ├── RTC/
│ │ ├── ActiveSpeakerObserver.cpp
│ │ ├── AudioLevelObserver.cpp
│ │ ├── Consumer.cpp
│ │ ├── DataConsumer.cpp
│ │ ├── DataProducer.cpp
│ │ ├── DirectTransport.cpp
│ │ ├── DtlsTransport.cpp
│ │ ├── ICE/
│ │ │ ├── IceCandidate.cpp
│ │ │ ├── IceServer.cpp
│ │ │ └── StunPacket.cpp
│ │ ├── KeyFrameRequestManager.cpp
│ │ ├── NackGenerator.cpp
│ │ ├── PipeConsumer.cpp
│ │ ├── PipeTransport.cpp
│ │ ├── PlainTransport.cpp
│ │ ├── PortManager.cpp
│ │ ├── Producer.cpp
│ │ ├── RTCP/
│ │ │ ├── Bye.cpp
│ │ │ ├── CompoundPacket.cpp
│ │ │ ├── Feedback.cpp
│ │ │ ├── FeedbackPs.cpp
│ │ │ ├── FeedbackPsAfb.cpp
│ │ │ ├── FeedbackPsFir.cpp
│ │ │ ├── FeedbackPsLei.cpp
│ │ │ ├── FeedbackPsPli.cpp
│ │ │ ├── FeedbackPsRemb.cpp
│ │ │ ├── FeedbackPsRpsi.cpp
│ │ │ ├── FeedbackPsSli.cpp
│ │ │ ├── FeedbackPsTst.cpp
│ │ │ ├── FeedbackPsVbcm.cpp
│ │ │ ├── FeedbackRtp.cpp
│ │ │ ├── FeedbackRtpEcn.cpp
│ │ │ ├── FeedbackRtpNack.cpp
│ │ │ ├── FeedbackRtpSrReq.cpp
│ │ │ ├── FeedbackRtpTllei.cpp
│ │ │ ├── FeedbackRtpTmmb.cpp
│ │ │ ├── FeedbackRtpTransport.cpp
│ │ │ ├── Packet.cpp
│ │ │ ├── ReceiverReport.cpp
│ │ │ ├── Sdes.cpp
│ │ │ ├── SenderReport.cpp
│ │ │ ├── XR.cpp
│ │ │ ├── XrDelaySinceLastRr.cpp
│ │ │ └── XrReceiverReferenceTime.cpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── AV1.cpp
│ │ │ │ ├── DependencyDescriptor.cpp
│ │ │ │ ├── H264.cpp
│ │ │ │ ├── Opus.cpp
│ │ │ │ ├── VP8.cpp
│ │ │ │ └── VP9.cpp
│ │ │ ├── Packet.cpp
│ │ │ ├── ProbationGenerator.cpp
│ │ │ ├── RetransmissionBuffer.cpp
│ │ │ ├── RtpStream.cpp
│ │ │ ├── RtpStreamRecv.cpp
│ │ │ ├── RtpStreamSend.cpp
│ │ │ ├── RtxStream.cpp
│ │ │ └── SharedPacket.cpp
│ │ ├── RateCalculator.cpp
│ │ ├── Router.cpp
│ │ ├── RtcLogger.cpp
│ │ ├── RtpDictionaries/
│ │ │ ├── Parameters.cpp
│ │ │ ├── RtcpFeedback.cpp
│ │ │ ├── RtcpParameters.cpp
│ │ │ ├── RtpCodecMimeType.cpp
│ │ │ ├── RtpCodecParameters.cpp
│ │ │ ├── RtpEncodingParameters.cpp
│ │ │ ├── RtpHeaderExtensionParameters.cpp
│ │ │ ├── RtpHeaderExtensionUri.cpp
│ │ │ ├── RtpParameters.cpp
│ │ │ └── RtpRtxParameters.cpp
│ │ ├── RtpListener.cpp
│ │ ├── RtpObserver.cpp
│ │ ├── SCTP/
│ │ │ ├── association/
│ │ │ │ ├── Association.cpp
│ │ │ │ ├── AssociationListenerDeferrer.cpp
│ │ │ │ ├── HeartbeatHandler.cpp
│ │ │ │ ├── NegotiatedCapabilities.cpp
│ │ │ │ ├── PacketSender.cpp
│ │ │ │ ├── StateCookie.cpp
│ │ │ │ ├── StreamResetHandler.cpp
│ │ │ │ └── TransmissionControlBlock.cpp
│ │ │ ├── packet/
│ │ │ │ ├── Chunk.cpp
│ │ │ │ ├── ErrorCause.cpp
│ │ │ │ ├── Packet.cpp
│ │ │ │ ├── Parameter.cpp
│ │ │ │ ├── TLV.cpp
│ │ │ │ ├── UserData.cpp
│ │ │ │ ├── chunks/
│ │ │ │ │ ├── AbortAssociationChunk.cpp
│ │ │ │ │ ├── CookieAckChunk.cpp
│ │ │ │ │ ├── CookieEchoChunk.cpp
│ │ │ │ │ ├── DataChunk.cpp
│ │ │ │ │ ├── ForwardTsnChunk.cpp
│ │ │ │ │ ├── HeartbeatAckChunk.cpp
│ │ │ │ │ ├── HeartbeatRequestChunk.cpp
│ │ │ │ │ ├── IDataChunk.cpp
│ │ │ │ │ ├── IForwardTsnChunk.cpp
│ │ │ │ │ ├── InitAckChunk.cpp
│ │ │ │ │ ├── InitChunk.cpp
│ │ │ │ │ ├── OperationErrorChunk.cpp
│ │ │ │ │ ├── ReConfigChunk.cpp
│ │ │ │ │ ├── SackChunk.cpp
│ │ │ │ │ ├── ShutdownAckChunk.cpp
│ │ │ │ │ ├── ShutdownChunk.cpp
│ │ │ │ │ ├── ShutdownCompleteChunk.cpp
│ │ │ │ │ └── UnknownChunk.cpp
│ │ │ │ ├── errorCauses/
│ │ │ │ │ ├── CookieReceivedWhileShuttingDownErrorCause.cpp
│ │ │ │ │ ├── InvalidMandatoryParameterErrorCause.cpp
│ │ │ │ │ ├── InvalidStreamIdentifierErrorCause.cpp
│ │ │ │ │ ├── MissingMandatoryParameterErrorCause.cpp
│ │ │ │ │ ├── NoUserDataErrorCause.cpp
│ │ │ │ │ ├── OutOfResourceErrorCause.cpp
│ │ │ │ │ ├── ProtocolViolationErrorCause.cpp
│ │ │ │ │ ├── RestartOfAnAssociationWithNewAddressesErrorCause.cpp
│ │ │ │ │ ├── StaleCookieErrorCause.cpp
│ │ │ │ │ ├── UnknownErrorCause.cpp
│ │ │ │ │ ├── UnrecognizedChunkTypeErrorCause.cpp
│ │ │ │ │ ├── UnrecognizedParametersErrorCause.cpp
│ │ │ │ │ ├── UnresolvableAddressErrorCause.cpp
│ │ │ │ │ └── UserInitiatedAbortErrorCause.cpp
│ │ │ │ └── parameters/
│ │ │ │ ├── AddIncomingStreamsRequestParameter.cpp
│ │ │ │ ├── AddOutgoingStreamsRequestParameter.cpp
│ │ │ │ ├── CookiePreservativeParameter.cpp
│ │ │ │ ├── ForwardTsnSupportedParameter.cpp
│ │ │ │ ├── HeartbeatInfoParameter.cpp
│ │ │ │ ├── IPv4AddressParameter.cpp
│ │ │ │ ├── IPv6AddressParameter.cpp
│ │ │ │ ├── IncomingSsnResetRequestParameter.cpp
│ │ │ │ ├── OutgoingSsnResetRequestParameter.cpp
│ │ │ │ ├── ReconfigurationResponseParameter.cpp
│ │ │ │ ├── SsnTsnResetRequestParameter.cpp
│ │ │ │ ├── StateCookieParameter.cpp
│ │ │ │ ├── SupportedAddressTypesParameter.cpp
│ │ │ │ ├── SupportedExtensionsParameter.cpp
│ │ │ │ ├── UnknownParameter.cpp
│ │ │ │ ├── UnrecognizedParameterParameter.cpp
│ │ │ │ └── ZeroChecksumAcceptableParameter.cpp
│ │ │ ├── public/
│ │ │ │ ├── AssociationMetrics.cpp
│ │ │ │ └── Message.cpp
│ │ │ ├── rx/
│ │ │ │ ├── DataTracker.cpp
│ │ │ │ ├── InterleavedReassemblyStreams.cpp
│ │ │ │ ├── ReassemblyQueue.cpp
│ │ │ │ └── TraditionalReassemblyStreams.cpp
│ │ │ └── tx/
│ │ │ ├── OutstandingData.cpp
│ │ │ ├── RetransmissionErrorCounter.cpp
│ │ │ ├── RetransmissionQueue.cpp
│ │ │ ├── RetransmissionTimeout.cpp
│ │ │ ├── RoundRobinSendQueue.cpp
│ │ │ └── StreamScheduler.cpp
│ │ ├── SctpAssociation.cpp
│ │ ├── SctpDictionaries/
│ │ │ └── SctpStreamParameters.cpp
│ │ ├── SctpListener.cpp
│ │ ├── SenderBandwidthEstimator.cpp
│ │ ├── SeqManager.cpp
│ │ ├── Serializable.cpp
│ │ ├── SimpleConsumer.cpp
│ │ ├── SimulcastConsumer.cpp
│ │ ├── SrtpSession.cpp
│ │ ├── SvcConsumer.cpp
│ │ ├── TcpConnection.cpp
│ │ ├── TcpServer.cpp
│ │ ├── Transport.cpp
│ │ ├── TransportCongestionControlClient.cpp
│ │ ├── TransportCongestionControlServer.cpp
│ │ ├── TransportTuple.cpp
│ │ ├── TrendCalculator.cpp
│ │ ├── UdpSocket.cpp
│ │ ├── WebRtcServer.cpp
│ │ └── WebRtcTransport.cpp
│ ├── Settings.cpp
│ ├── Shared.cpp
│ ├── Utils/
│ │ ├── BitStream.cpp
│ │ ├── Crypto.cpp
│ │ ├── File.cpp
│ │ ├── IP.cpp
│ │ ├── README_BASE64_UTILS
│ │ └── String.cpp
│ ├── Worker.cpp
│ ├── handles/
│ │ ├── BackoffTimerHandle.cpp
│ │ ├── SignalHandle.cpp
│ │ ├── TcpConnectionHandle.cpp
│ │ ├── TcpServerHandle.cpp
│ │ ├── TimerHandle.cpp
│ │ ├── UdpSocketHandle.cpp
│ │ └── UnixStreamSocketHandle.cpp
│ ├── lib.cpp
│ ├── lib.rs
│ └── main.cpp
├── subprojects/
│ ├── .clang-tidy
│ ├── abseil-cpp.wrap
│ ├── catch2.wrap
│ ├── flatbuffers.wrap
│ ├── libsrtp3.wrap
│ ├── liburing.wrap
│ ├── libuv.wrap
│ ├── openssl.wrap
│ ├── usrsctp.wrap
│ └── wingetopt.wrap
├── tasks.py
├── test/
│ ├── data/
│ │ ├── H264_SVC/
│ │ │ └── naluInfo/
│ │ │ ├── naluInfo.264
│ │ │ └── naluInfo.csv
│ │ ├── packet1.info
│ │ ├── packet1.raw
│ │ ├── packet2.info
│ │ ├── packet2.raw
│ │ ├── packet3.info
│ │ ├── packet3.raw
│ │ └── rtp-stream-1.txt
│ ├── include/
│ │ ├── RTC/
│ │ │ ├── ICE/
│ │ │ │ └── iceCommon.hpp
│ │ │ ├── RTP/
│ │ │ │ └── rtpCommon.hpp
│ │ │ └── SCTP/
│ │ │ └── sctpCommon.hpp
│ │ ├── catch2Macros.hpp
│ │ └── testHelpers.hpp
│ └── src/
│ ├── RTC/
│ │ ├── ICE/
│ │ │ ├── TestStunPacket.cpp
│ │ │ └── iceCommon.cpp
│ │ ├── RTCP/
│ │ │ ├── TestBye.cpp
│ │ │ ├── TestFeedbackPsAfb.cpp
│ │ │ ├── TestFeedbackPsFir.cpp
│ │ │ ├── TestFeedbackPsLei.cpp
│ │ │ ├── TestFeedbackPsPli.cpp
│ │ │ ├── TestFeedbackPsRemb.cpp
│ │ │ ├── TestFeedbackPsRpsi.cpp
│ │ │ ├── TestFeedbackPsSli.cpp
│ │ │ ├── TestFeedbackPsTst.cpp
│ │ │ ├── TestFeedbackPsVbcm.cpp
│ │ │ ├── TestFeedbackRtpEcn.cpp
│ │ │ ├── TestFeedbackRtpNack.cpp
│ │ │ ├── TestFeedbackRtpSrReq.cpp
│ │ │ ├── TestFeedbackRtpTllei.cpp
│ │ │ ├── TestFeedbackRtpTmmb.cpp
│ │ │ ├── TestFeedbackRtpTransport.cpp
│ │ │ ├── TestPacket.cpp
│ │ │ ├── TestReceiverReport.cpp
│ │ │ ├── TestSdes.cpp
│ │ │ ├── TestSenderReport.cpp
│ │ │ └── TestXr.cpp
│ │ ├── RTP/
│ │ │ ├── Codecs/
│ │ │ │ ├── TestDependencyDescriptor.cpp
│ │ │ │ ├── TestH264.cpp
│ │ │ │ ├── TestVP8.cpp
│ │ │ │ └── TestVP9.cpp
│ │ │ ├── TestPacket.cpp
│ │ │ ├── TestProbationGenerator.cpp
│ │ │ ├── TestRetransmissionBuffer.cpp
│ │ │ ├── TestRtpStreamRecv.cpp
│ │ │ ├── TestRtpStreamSend.cpp
│ │ │ ├── TestSharedPacket.cpp
│ │ │ └── rtpCommon.cpp
│ │ ├── SCTP/
│ │ │ ├── association/
│ │ │ │ ├── TestHeartbeatHandler.cpp
│ │ │ │ ├── TestNegotiatedCapabilities.cpp
│ │ │ │ └── TestStateCookie.cpp
│ │ │ ├── packet/
│ │ │ │ ├── TestChunk.cpp
│ │ │ │ ├── TestErrorCause.cpp
│ │ │ │ ├── TestPacket.cpp
│ │ │ │ ├── TestParameter.cpp
│ │ │ │ ├── chunks/
│ │ │ │ │ ├── TestAbortAssociationChunk.cpp
│ │ │ │ │ ├── TestCookieAckChunk.cpp
│ │ │ │ │ ├── TestCookieEchoChunk.cpp
│ │ │ │ │ ├── TestDataChunk.cpp
│ │ │ │ │ ├── TestForwardTsnChunk.cpp
│ │ │ │ │ ├── TestHeartbeatAckChunk.cpp
│ │ │ │ │ ├── TestHeartbeatRequestChunk.cpp
│ │ │ │ │ ├── TestIDataChunk.cpp
│ │ │ │ │ ├── TestIForwardTsnChunk.cpp
│ │ │ │ │ ├── TestInitAckChunk.cpp
│ │ │ │ │ ├── TestInitChunk.cpp
│ │ │ │ │ ├── TestOperationErrorChunk.cpp
│ │ │ │ │ ├── TestReConfigChunk.cpp
│ │ │ │ │ ├── TestSackChunk.cpp
│ │ │ │ │ ├── TestShutdownAckChunk.cpp
│ │ │ │ │ ├── TestShutdownChunk.cpp
│ │ │ │ │ ├── TestShutdownCompleteChunk.cpp
│ │ │ │ │ └── TestUnknownChunk.cpp
│ │ │ │ ├── errorCauses/
│ │ │ │ │ ├── TestCookieReceivedWhileShuttingDownErrorCause.cpp
│ │ │ │ │ ├── TestInvalidMandatoryParameterErrorCause.cpp
│ │ │ │ │ ├── TestInvalidStreamIdentifierErrorCause.cpp
│ │ │ │ │ ├── TestMissingMandatoryParameterErrorCause.cpp
│ │ │ │ │ ├── TestNoUserDataErrorCause.cpp
│ │ │ │ │ ├── TestOutOfResourceErrorCause.cpp
│ │ │ │ │ ├── TestProtocolViolationErrorCause.cpp
│ │ │ │ │ ├── TestRestartOfAnAssociationWithNewAddressesErrorCause.cpp
│ │ │ │ │ ├── TestStaleCookieErrorCause.cpp
│ │ │ │ │ ├── TestUnknownErrorCause.cpp
│ │ │ │ │ ├── TestUnrecognizedChunkTypeErrorCause.cpp
│ │ │ │ │ ├── TestUnrecognizedParametersErrorCause.cpp
│ │ │ │ │ ├── TestUnresolvableAddressErrorCause.cpp
│ │ │ │ │ └── TestUserInitiatedAbortErrorCause.cpp
│ │ │ │ └── parameters/
│ │ │ │ ├── TestAddIncomingStreamsRequestParameter.cpp
│ │ │ │ ├── TestAddOutgoingStreamsRequestParameter.cpp
│ │ │ │ ├── TestCookiePreservativeParameter.cpp
│ │ │ │ ├── TestForwardTsnSupportedParameter.cpp
│ │ │ │ ├── TestHeartbeatInfoParameter.cpp
│ │ │ │ ├── TestIPv4AddressParameter.cpp
│ │ │ │ ├── TestIPv6AddressParameter.cpp
│ │ │ │ ├── TestIncomingSsnResetRequestParameter.cpp
│ │ │ │ ├── TestOutgoingSsnResetRequestParameter.cpp
│ │ │ │ ├── TestReconfigurationResponseParameter.cpp
│ │ │ │ ├── TestSsnTsnResetRequestParameter.cpp
│ │ │ │ ├── TestStateCookieParameter.cpp
│ │ │ │ ├── TestSupportedAddressTypesParameter.cpp
│ │ │ │ ├── TestSupportedExtensionsParameter.cpp
│ │ │ │ ├── TestUnknownParameter.cpp
│ │ │ │ ├── TestUnrecognizedParameterParameter.cpp
│ │ │ │ └── TestZeroChecksumAcceptableParameter.cpp
│ │ │ ├── rx/
│ │ │ │ ├── TestDataTracker.cpp
│ │ │ │ ├── TestInterleavedReassemblyStreams.cpp
│ │ │ │ ├── TestReassemblyQueue.cpp
│ │ │ │ └── TestTraditionalReassemblyStreams.cpp
│ │ │ ├── sctpCommon.cpp
│ │ │ └── tx/
│ │ │ ├── TestOutstandingData.cpp
│ │ │ ├── TestRetransmissionErrorCounter.cpp
│ │ │ ├── TestRetransmissionQueue.cpp
│ │ │ ├── TestRetransmissionTimeout.cpp
│ │ │ ├── TestRoundRobinSendQueue.cpp
│ │ │ └── TestStreamScheduler.cpp
│ │ ├── TestKeyFrameRequestManager.cpp
│ │ ├── TestNackGenerator.cpp
│ │ ├── TestRateCalculator.cpp
│ │ ├── TestRtpEncodingParameters.cpp
│ │ ├── TestSeqManager.cpp
│ │ ├── TestSimpleConsumer.cpp
│ │ ├── TestTransportCongestionControlServer.cpp
│ │ ├── TestTransportTuple.cpp
│ │ └── TestTrendCalculator.cpp
│ ├── Utils/
│ │ ├── TestBits.cpp
│ │ ├── TestByte.cpp
│ │ ├── TestCrypto.cpp
│ │ ├── TestIP.cpp
│ │ ├── TestNumber.cpp
│ │ ├── TestString.cpp
│ │ ├── TestTime.cpp
│ │ └── TestUnwrappedSequenceNumber.cpp
│ ├── testHelpers.cpp
│ └── tests.cpp
└── ubsan_suppressions.txt
Showing preview only (507K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6147 symbols across 738 files)
FILE: node/src/ActiveSpeakerObserver.ts
type RtpObserverObserverConstructorOptions (line 16) | type RtpObserverObserverConstructorOptions<ActiveSpeakerObserverAppData> =
class ActiveSpeakerObserverImpl (line 21) | class ActiveSpeakerObserverImpl<
method constructor (line 31) | constructor(
method type (line 43) | get type(): 'activespeaker' {
method observer (line 47) | override get observer(): ActiveSpeakerObserverObserver {
method handleWorkerNotifications (line 51) | private handleWorkerNotifications(): void {
method handleListenerError (line 86) | private handleListenerError(): void {
FILE: node/src/ActiveSpeakerObserverTypes.ts
type ActiveSpeakerObserverOptions (line 10) | type ActiveSpeakerObserverOptions<
type ActiveSpeakerObserverDominantSpeaker (line 21) | type ActiveSpeakerObserverDominantSpeaker = {
type ActiveSpeakerObserverEvents (line 28) | type ActiveSpeakerObserverEvents = RtpObserverEvents & {
type ActiveSpeakerObserverObserver (line 32) | type ActiveSpeakerObserverObserver =
type ActiveSpeakerObserverObserverEvents (line 35) | type ActiveSpeakerObserverObserverEvents = RtpObserverObserverEvents & {
type ActiveSpeakerObserver (line 39) | interface ActiveSpeakerObserver<
FILE: node/src/AudioLevelObserver.ts
type AudioLevelObserverConstructorOptions (line 18) | type AudioLevelObserverConstructorOptions<AudioLevelObserverAppData> =
class AudioLevelObserverImpl (line 23) | class AudioLevelObserverImpl<
method constructor (line 33) | constructor(
method type (line 45) | get type(): 'audiolevel' {
method observer (line 49) | override get observer(): AudioLevelObserverObserver {
method handleWorkerNotifications (line 53) | private handleWorkerNotifications(): void {
method handleListenerError (line 109) | private handleListenerError(): void {
function parseVolume (line 119) | function parseVolume(binary: FbsAudioLevelObserver.Volume): {
FILE: node/src/AudioLevelObserverTypes.ts
type AudioLevelObserverOptions (line 10) | type AudioLevelObserverOptions<
type AudioLevelObserverVolume (line 35) | type AudioLevelObserverVolume = {
type AudioLevelObserverEvents (line 48) | type AudioLevelObserverEvents = RtpObserverEvents & {
type AudioLevelObserverObserver (line 53) | type AudioLevelObserverObserver =
type AudioLevelObserverObserverEvents (line 56) | type AudioLevelObserverObserverEvents = RtpObserverObserverEvents & {
type AudioLevelObserver (line 61) | interface AudioLevelObserver<
FILE: node/src/Channel.ts
constant IS_LITTLE_ENDIAN (line 18) | const IS_LITTLE_ENDIAN = os.endianness() === 'LE';
type Sent (line 22) | type Sent = {
constant MESSAGE_MAX_LEN (line 31) | const MESSAGE_MAX_LEN = 4194308;
constant PAYLOAD_MAX_LEN (line 32) | const PAYLOAD_MAX_LEN = 4194304;
class Channel (line 34) | class Channel extends EnhancedEventEmitter {
method constructor (line 56) | constructor({
method bufferBuilder (line 196) | get bufferBuilder(): flatbuffers.Builder {
method close (line 200) | close(): void {
method notify (line 233) | notify(
method request (line 301) | async request(
method processResponse (line 401) | private processResponse(response: Response): void {
method processNotification (line 441) | private processNotification(notification: Notification): void {
method processLog (line 453) | private processLog(pid: number, log: Log): void {
FILE: node/src/Consumer.ts
type ConsumerInternal (line 47) | type ConsumerInternal = TransportInternal & {
type ConsumerData (line 51) | type ConsumerData = {
class ConsumerImpl (line 60) | class ConsumerImpl<ConsumerAppData extends AppData = AppData>
method constructor (line 101) | constructor({
method id (line 137) | get id(): string {
method producerId (line 141) | get producerId(): string {
method closed (line 145) | get closed(): boolean {
method kind (line 149) | get kind(): MediaKind {
method rtpParameters (line 153) | get rtpParameters(): RtpParameters {
method type (line 157) | get type(): ConsumerType {
method paused (line 161) | get paused(): boolean {
method producerPaused (line 165) | get producerPaused(): boolean {
method priority (line 169) | get priority(): number {
method score (line 173) | get score(): ConsumerScore {
method preferredLayers (line 177) | get preferredLayers(): ConsumerLayers | undefined {
method currentLayers (line 181) | get currentLayers(): ConsumerLayers | undefined {
method appData (line 185) | get appData(): ConsumerAppData {
method appData (line 189) | set appData(appData: ConsumerAppData) {
method observer (line 193) | get observer(): ConsumerObserver {
method channelForTesting (line 202) | get channelForTesting(): Channel {
method close (line 206) | close(): void {
method transportClosed (line 238) | transportClosed(): void {
method dump (line 256) | async dump(): Promise<ConsumerDump> {
method getStats (line 274) | async getStats(): Promise<(ConsumerStat | ProducerStat)[]> {
method pause (line 292) | async pause(): Promise<void> {
method resume (line 312) | async resume(): Promise<void> {
method setPreferredLayers (line 332) | async setPreferredLayers({
method setPriority (line 386) | async setPriority(priority: number): Promise<void> {
method unsetPriority (line 415) | async unsetPriority(): Promise<void> {
method requestKeyFrame (line 421) | async requestKeyFrame(): Promise<void> {
method enableTraceEvent (line 432) | async enableTraceEvent(types: ConsumerTraceEventType[] = []): Promise<...
method handleWorkerNotifications (line 466) | private handleWorkerNotifications(): void {
method handleListenerError (line 603) | private handleListenerError(): void {
function parseTraceEventData (line 613) | function parseTraceEventData(
function consumerTraceEventTypeToFbs (line 636) | function consumerTraceEventTypeToFbs(
function consumerTraceEventTypeFromFbs (line 666) | function consumerTraceEventTypeFromFbs(
function parseConsumerLayers (line 696) | function parseConsumerLayers(data: FbsConsumer.ConsumerLayers): Consumer...
function parseRtpStream (line 707) | function parseRtpStream(data: FbsRtpStream.Dump): RtpStreamDump {
function parseRtpStreamParameters (line 723) | function parseRtpStreamParameters(
function parseRtxStream (line 747) | function parseRtxStream(data: FbsRtxStream.RtxDump): RtxStreamDump {
function parseRtxStreamParameters (line 755) | function parseRtxStreamParameters(
function parseBaseConsumerDump (line 768) | function parseBaseConsumerDump(
function parseSimpleConsumerDump (line 799) | function parseSimpleConsumerDump(
function parseSimulcastConsumerDump (line 812) | function parseSimulcastConsumerDump(
function parseSvcConsumerDump (line 831) | function parseSvcConsumerDump(data: FbsConsumer.ConsumerDump): SvcConsum...
function parsePipeConsumerDump (line 839) | function parsePipeConsumerDump(
function parseConsumerDumpResponse (line 852) | function parseConsumerDumpResponse(
function parseConsumerStats (line 896) | function parseConsumerStats(
FILE: node/src/ConsumerTypes.ts
type ConsumerOptions (line 12) | type ConsumerOptions<ConsumerAppData extends AppData = AppData> = {
type ConsumerType (line 82) | type ConsumerType = 'simple' | 'simulcast' | 'svc' | 'pipe';
type ConsumerScore (line 84) | type ConsumerScore = {
type ConsumerLayers (line 102) | type ConsumerLayers = {
type ConsumerDump (line 114) | type ConsumerDump =
type SimpleConsumerDump (line 120) | type SimpleConsumerDump = BaseConsumerDump & {
type SimulcastConsumerDump (line 125) | type SimulcastConsumerDump = BaseConsumerDump & {
type SvcConsumerDump (line 136) | type SvcConsumerDump = SimulcastConsumerDump;
type PipeConsumerDump (line 138) | type PipeConsumerDump = BaseConsumerDump & {
type BaseConsumerDump (line 143) | type BaseConsumerDump = {
type RtpStreamDump (line 156) | type RtpStreamDump = {
type RtpStreamParametersDump (line 162) | type RtpStreamParametersDump = {
type RtxStreamDump (line 181) | type RtxStreamDump = {
type RtxStreamParameters (line 185) | type RtxStreamParameters = {
type ConsumerStat (line 194) | type ConsumerStat = RtpStreamSendStats;
type ConsumerTraceEventType (line 199) | type ConsumerTraceEventType =
type ConsumerTraceEventData (line 209) | type ConsumerTraceEventData = {
type ConsumerEvents (line 231) | type ConsumerEvents = {
type ConsumerObserver (line 245) | type ConsumerObserver = EnhancedEventEmitter<ConsumerObserverEvents>;
type ConsumerObserverEvents (line 247) | type ConsumerObserverEvents = {
type Consumer (line 256) | interface Consumer<
FILE: node/src/DataConsumer.ts
type DataConsumerInternal (line 24) | type DataConsumerInternal = TransportInternal & {
type DataConsumerData (line 28) | type DataConsumerData = {
class DataConsumerImpl (line 39) | class DataConsumerImpl<DataConsumerAppData extends AppData = AppData>
method constructor (line 71) | constructor({
method id (line 104) | get id(): string {
method dataProducerId (line 108) | get dataProducerId(): string {
method closed (line 112) | get closed(): boolean {
method type (line 116) | get type(): DataConsumerType {
method sctpStreamParameters (line 120) | get sctpStreamParameters(): SctpStreamParameters | undefined {
method label (line 124) | get label(): string {
method protocol (line 128) | get protocol(): string {
method paused (line 132) | get paused(): boolean {
method dataProducerPaused (line 136) | get dataProducerPaused(): boolean {
method subchannels (line 140) | get subchannels(): number[] {
method appData (line 144) | get appData(): DataConsumerAppData {
method appData (line 148) | set appData(appData: DataConsumerAppData) {
method observer (line 152) | get observer(): DataConsumerObserver {
method close (line 156) | close(): void {
method transportClosed (line 188) | transportClosed(): void {
method dump (line 206) | async dump(): Promise<DataConsumerDump> {
method getStats (line 224) | async getStats(): Promise<DataConsumerStat[]> {
method pause (line 242) | async pause(): Promise<void> {
method resume (line 262) | async resume(): Promise<void> {
method setBufferedAmountLowThreshold (line 282) | async setBufferedAmountLowThreshold(threshold: number): Promise<void> {
method getBufferedAmount (line 300) | async getBufferedAmount(): Promise<number> {
method send (line 317) | async send(message: string | Buffer, ppid?: number): Promise<void> {
method setSubchannels (line 381) | async setSubchannels(subchannels: number[]): Promise<void> {
method addSubchannel (line 405) | async addSubchannel(subchannel: number): Promise<void> {
method removeSubchannel (line 431) | async removeSubchannel(subchannel: number): Promise<void> {
method handleWorkerNotifications (line 457) | private handleWorkerNotifications(): void {
method handleListenerError (line 560) | private handleListenerError(): void {
function dataConsumerTypeToFbs (line 570) | function dataConsumerTypeToFbs(
function dataConsumerTypeFromFbs (line 588) | function dataConsumerTypeFromFbs(type: FbsDataProducer.Type): DataConsum...
function parseDataConsumerDumpResponse (line 600) | function parseDataConsumerDumpResponse(
function parseDataConsumerStats (line 620) | function parseDataConsumerStats(
FILE: node/src/DataConsumerTypes.ts
type DataConsumerOptions (line 5) | type DataConsumerOptions<DataConsumerAppData extends AppData = AppData> =
type DataConsumerType (line 57) | type DataConsumerType = 'sctp' | 'direct';
type DataConsumerDump (line 59) | type DataConsumerDump = {
type DataConsumerStat (line 72) | type DataConsumerStat = {
type DataConsumerEvents (line 82) | type DataConsumerEvents = {
type DataConsumerObserver (line 95) | type DataConsumerObserver =
type DataConsumerObserverEvents (line 98) | type DataConsumerObserverEvents = {
type DataConsumer (line 104) | interface DataConsumer<
FILE: node/src/DataProducer.ts
type DataProducerInternal (line 22) | type DataProducerInternal = TransportInternal & {
type DataProducerData (line 26) | type DataProducerData = {
class DataProducerImpl (line 35) | class DataProducerImpl<DataProducerAppData extends AppData = AppData>
method constructor (line 61) | constructor({
method id (line 88) | get id(): string {
method closed (line 92) | get closed(): boolean {
method type (line 96) | get type(): DataProducerType {
method sctpStreamParameters (line 100) | get sctpStreamParameters(): SctpStreamParameters | undefined {
method label (line 104) | get label(): string {
method protocol (line 108) | get protocol(): string {
method paused (line 112) | get paused(): boolean {
method appData (line 116) | get appData(): DataProducerAppData {
method appData (line 120) | set appData(appData: DataProducerAppData) {
method observer (line 124) | get observer(): DataProducerObserver {
method close (line 128) | close(): void {
method transportClosed (line 160) | transportClosed(): void {
method dump (line 178) | async dump(): Promise<DataProducerDump> {
method getStats (line 196) | async getStats(): Promise<DataProducerStat[]> {
method pause (line 214) | async pause(): Promise<void> {
method resume (line 234) | async resume(): Promise<void> {
method send (line 254) | send(
method handleWorkerNotifications (line 332) | private handleWorkerNotifications(): void {
method handleListenerError (line 336) | private handleListenerError(): void {
function dataProducerTypeToFbs (line 346) | function dataProducerTypeToFbs(
function dataProducerTypeFromFbs (line 364) | function dataProducerTypeFromFbs(type: FbsDataProducer.Type): DataProduc...
function parseDataProducerDumpResponse (line 376) | function parseDataProducerDumpResponse(
function parseDataProducerStats (line 392) | function parseDataProducerStats(
FILE: node/src/DataProducerTypes.ts
type DataProducerOptions (line 5) | type DataProducerOptions<DataProducerAppData extends AppData = AppData> =
type DataProducerType (line 42) | type DataProducerType = 'sctp' | 'direct';
type DataProducerDump (line 44) | type DataProducerDump = {
type DataProducerStat (line 53) | type DataProducerStat = {
type DataProducerEvents (line 62) | type DataProducerEvents = {
type DataProducerObserver (line 68) | type DataProducerObserver =
type DataProducerObserverEvents (line 71) | type DataProducerObserverEvents = {
type DataProducer (line 77) | interface DataProducer<
FILE: node/src/DirectTransport.ts
type DirectTransportConstructorOptions (line 28) | type DirectTransportConstructorOptions<DirectTransportAppData> =
type DirectTransportData (line 33) | type DirectTransportData = {
class DirectTransportImpl (line 39) | class DirectTransportImpl<
method constructor (line 53) | constructor(
method type (line 71) | get type(): 'direct' {
method observer (line 75) | override get observer(): DirectTransportObserver {
method close (line 79) | override close(): void {
method routerClosed (line 87) | override routerClosed(): void {
method dump (line 95) | async dump(): Promise<DirectTransportDump> {
method getStats (line 113) | async getStats(): Promise<DirectTransportStat[]> {
method connect (line 132) | async connect(): Promise<void> {
method setMaxIncomingBitrate (line 137) | override async setMaxIncomingBitrate(bitrate: number): Promise<void> {
method setMaxOutgoingBitrate (line 144) | override async setMaxOutgoingBitrate(bitrate: number): Promise<void> {
method setMinOutgoingBitrate (line 151) | override async setMinOutgoingBitrate(bitrate: number): Promise<void> {
method sendRtcp (line 157) | sendRtcp(rtcpPacket: Buffer): void {
method handleWorkerNotifications (line 181) | private handleWorkerNotifications(): void {
method handleListenerError (line 223) | private handleListenerError(): void {
function parseDirectTransportDumpResponse (line 233) | function parseDirectTransportDumpResponse(
function parseGetStatsResponse (line 239) | function parseGetStatsResponse(
FILE: node/src/DirectTransportTypes.ts
type DirectTransportOptions (line 11) | type DirectTransportOptions<
type DirectTransportDump (line 26) | type DirectTransportDump = BaseTransportDump;
type DirectTransportStat (line 28) | type DirectTransportStat = BaseTransportStats & {
type DirectTransportEvents (line 32) | type DirectTransportEvents = TransportEvents & {
type DirectTransportObserver (line 36) | type DirectTransportObserver =
type DirectTransportObserverEvents (line 39) | type DirectTransportObserverEvents = TransportObserverEvents & {
type DirectTransport (line 43) | interface DirectTransport<
FILE: node/src/Logger.ts
constant APP_NAME (line 9) | const APP_NAME = 'mediasoup';
type LoggerEmitterEvents (line 11) | type LoggerEmitterEvents = {
type LoggerEmitter (line 17) | type LoggerEmitter = EnhancedEventEmitter<LoggerEmitterEvents>;
class Logger (line 19) | class Logger {
method setEmitters (line 28) | static setEmitters(
method constructor (line 38) | constructor(prefix?: string) {
method debug (line 54) | debug(log: string): void {
method warn (line 60) | warn(log: string): void {
method error (line 66) | error(log: string, error?: Error): void {
FILE: node/src/PipeTransport.ts
type PipeTransportConstructorOptions (line 47) | type PipeTransportConstructorOptions<PipeTransportAppData> =
type PipeTransportData (line 52) | type PipeTransportData = {
class PipeTransportImpl (line 62) | class PipeTransportImpl<PipeTransportAppData extends AppData = AppData>
method constructor (line 73) | constructor(options: PipeTransportConstructorOptions<PipeTransportAppD...
method type (line 95) | get type(): 'pipe' {
method observer (line 99) | override get observer(): PipeTransportObserver {
method tuple (line 103) | get tuple(): TransportTuple {
method sctpParameters (line 107) | get sctpParameters(): SctpParameters | undefined {
method sctpState (line 111) | get sctpState(): SctpState | undefined {
method srtpParameters (line 115) | get srtpParameters(): SrtpParameters | undefined {
method close (line 119) | override close(): void {
method routerClosed (line 131) | override routerClosed(): void {
method dump (line 143) | async dump(): Promise<PipeTransportDump> {
method getStats (line 161) | async getStats(): Promise<PipeTransportStat[]> {
method connect (line 179) | async connect({
method consume (line 216) | override async consume<ConsumerAppData extends AppData = AppData>({
method handleWorkerNotifications (line 292) | private handleWorkerNotifications(): void {
method handleListenerError (line 337) | private handleListenerError(): void {
function parsePipeTransportDumpResponse (line 351) | function parsePipeTransportDumpResponse(
function parseGetStatsResponse (line 374) | function parseGetStatsResponse(
function createConsumeRequest (line 386) | function createConsumeRequest({
function createConnectRequest (line 433) | function createConnectRequest({
FILE: node/src/PipeTransportTypes.ts
type PipeTransportOptions (line 18) | type PipeTransportOptions<
type PipeTransportListen (line 63) | type PipeTransportListen = Either<
type PipeTransportListenInfo (line 68) | type PipeTransportListenInfo = {
type PipeTransportListenIp (line 75) | type PipeTransportListenIp = {
type PipeConsumerOptions (line 88) | type PipeConsumerOptions<ConsumerAppData extends AppData = AppData> = {
type PipeTransportDump (line 100) | type PipeTransportDump = BaseTransportDump & {
type PipeTransportStat (line 106) | type PipeTransportStat = BaseTransportStats & {
type PipeTransportEvents (line 111) | type PipeTransportEvents = TransportEvents & {
type PipeTransportObserver (line 115) | type PipeTransportObserver =
type PipeTransportObserverEvents (line 118) | type PipeTransportObserverEvents = TransportObserverEvents & {
type PipeTransport (line 122) | interface PipeTransport<
FILE: node/src/PlainTransport.ts
type PlainTransportConstructorOptions (line 34) | type PlainTransportConstructorOptions<PlainTransportAppData> =
type PlainTransportData (line 39) | type PlainTransportData = {
class PlainTransportImpl (line 51) | class PlainTransportImpl<PlainTransportAppData extends AppData = AppData>
method constructor (line 62) | constructor(
method type (line 88) | get type(): 'plain' {
method observer (line 92) | override get observer(): PlainTransportObserver {
method tuple (line 96) | get tuple(): TransportTuple {
method rtcpTuple (line 100) | get rtcpTuple(): TransportTuple | undefined {
method sctpParameters (line 104) | get sctpParameters(): SctpParameters | undefined {
method sctpState (line 108) | get sctpState(): SctpState | undefined {
method srtpParameters (line 112) | get srtpParameters(): SrtpParameters | undefined {
method close (line 116) | override close(): void {
method routerClosed (line 128) | override routerClosed(): void {
method dump (line 140) | async dump(): Promise<PlainTransportDump> {
method getStats (line 158) | async getStats(): Promise<PlainTransportStat[]> {
method connect (line 176) | async connect({
method handleWorkerNotifications (line 224) | private handleWorkerNotifications(): void {
method handleListenerError (line 303) | private handleListenerError(): void {
function parsePlainTransportDumpResponse (line 313) | function parsePlainTransportDumpResponse(
function parseGetStatsResponse (line 345) | function parseGetStatsResponse(
function createConnectRequest (line 360) | function createConnectRequest({
FILE: node/src/PlainTransportTypes.ts
type PlainTransportOptions (line 17) | type PlainTransportOptions<
type PlainTransportListen (line 73) | type PlainTransportListen = Either<
type PlainTransportListenInfo (line 78) | type PlainTransportListenInfo = {
type PlainTransportListenIp (line 90) | type PlainTransportListenIp = {
type PlainTransportDump (line 103) | type PlainTransportDump = BaseTransportDump & {
type PlainTransportStat (line 111) | type PlainTransportStat = BaseTransportStats & {
type PlainTransportEvents (line 119) | type PlainTransportEvents = TransportEvents & {
type PlainTransportObserver (line 125) | type PlainTransportObserver =
type PlainTransportObserverEvents (line 128) | type PlainTransportObserverEvents = TransportObserverEvents & {
type PlainTransport (line 134) | interface PlainTransport<
FILE: node/src/Producer.ts
type ProducerInternal (line 32) | type ProducerInternal = TransportInternal & {
type ProducerData (line 38) | type ProducerData = {
class ProducerImpl (line 45) | class ProducerImpl<ProducerAppData extends AppData = AppData>
method constructor (line 74) | constructor({
method id (line 101) | get id(): string {
method closed (line 105) | get closed(): boolean {
method kind (line 109) | get kind(): MediaKind {
method rtpParameters (line 113) | get rtpParameters(): RtpParameters {
method type (line 117) | get type(): ProducerType {
method consumableRtpParameters (line 121) | get consumableRtpParameters(): RtpParameters {
method paused (line 125) | get paused(): boolean {
method score (line 129) | get score(): ProducerScore[] {
method appData (line 133) | get appData(): ProducerAppData {
method appData (line 137) | set appData(appData: ProducerAppData) {
method observer (line 141) | get observer(): ProducerObserver {
method channelForTesting (line 150) | get channelForTesting(): Channel {
method close (line 154) | close(): void {
method transportClosed (line 186) | transportClosed(): void {
method dump (line 204) | async dump(): Promise<ProducerDump> {
method getStats (line 222) | async getStats(): Promise<ProducerStat[]> {
method pause (line 240) | async pause(): Promise<void> {
method resume (line 260) | async resume(): Promise<void> {
method enableTraceEvent (line 280) | async enableTraceEvent(types: ProducerTraceEventType[] = []): Promise<...
method send (line 314) | send(rtpPacket: Buffer): void {
method handleWorkerNotifications (line 335) | private handleWorkerNotifications(): void {
method handleListenerError (line 402) | private handleListenerError(): void {
function producerTypeFromFbs (line 412) | function producerTypeFromFbs(type: FbsRtpParameters.Type): ProducerType {
function producerTypeToFbs (line 432) | function producerTypeToFbs(type: ProducerType): FbsRtpParameters.Type {
function producerTraceEventTypeToFbs (line 452) | function producerTraceEventTypeToFbs(
function producerTraceEventTypeFromFbs (line 486) | function producerTraceEventTypeFromFbs(
function parseProducerDump (line 516) | function parseProducerDump(data: FbsProducer.DumpResponse): ProducerDump {
function parseProducerStats (line 542) | function parseProducerStats(
function parseProducerScore (line 548) | function parseProducerScore(binary: FbsProducer.Score): ProducerScore {
function parseTraceEventData (line 557) | function parseTraceEventData(
FILE: node/src/ProducerTypes.ts
type ProducerOptions (line 6) | type ProducerOptions<ProducerAppData extends AppData = AppData> = {
type ProducerType (line 48) | type ProducerType = 'simple' | 'simulcast' | 'svc';
type ProducerScore (line 50) | type ProducerScore = {
type ProducerVideoOrientation (line 72) | type ProducerVideoOrientation = {
type ProducerDump (line 89) | type ProducerDump = {
type ProducerStat (line 100) | type ProducerStat = RtpStreamRecvStats;
type ProducerTraceEventType (line 105) | type ProducerTraceEventType =
type ProducerTraceEventData (line 116) | type ProducerTraceEventData = {
type ProducerEvents (line 138) | type ProducerEvents = {
type ProducerObserver (line 147) | type ProducerObserver = EnhancedEventEmitter<ProducerObserverEvents>;
type ProducerObserverEvents (line 149) | type ProducerObserverEvents = {
type Producer (line 158) | interface Producer<
FILE: node/src/Router.ts
type RouterInternal (line 87) | type RouterInternal = {
type RouterData (line 91) | type RouterData = {
class RouterImpl (line 97) | class RouterImpl<RouterAppData extends AppData = AppData>
method constructor (line 139) | constructor({
method id (line 162) | get id(): string {
method closed (line 166) | get closed(): boolean {
method rtpCapabilities (line 170) | get rtpCapabilities(): RtpCapabilities {
method appData (line 174) | get appData(): RouterAppData {
method appData (line 178) | set appData(appData: RouterAppData) {
method observer (line 182) | get observer(): RouterObserver {
method transportsForTesting (line 191) | get transportsForTesting(): Map<string, Transport> {
method close (line 195) | close(): void {
method workerClosed (line 240) | workerClosed(): void {
method dump (line 273) | async dump(): Promise<RouterDump> {
method createWebRtcTransport (line 292) | async createWebRtcTransport<
method createPlainTransport (line 524) | async createPlainTransport<PlainTransportAppData extends AppData = App...
method createPipeTransport (line 691) | async createPipeTransport<PipeTransportAppData extends AppData = AppDa...
method createDirectTransport (line 829) | async createDirectTransport<DirectTransportAppData extends AppData = A...
method pipeToRouter (line 923) | async pipeToRouter({
method addPipeTransportPair (line 1188) | addPipeTransportPair(
method createActiveSpeakerObserver (line 1222) | async createActiveSpeakerObserver<
method createAudioLevelObserver (line 1279) | async createAudioLevelObserver<
method canConsume (line 1352) | canConsume({
method updateMediaCodecs (line 1382) | updateMediaCodecs(mediaCodecs: RouterRtpCodecCapability[]): void {
method handleListenerError (line 1397) | private handleListenerError(): void {
function parseRouterDumpResponse (line 1407) | function parseRouterDumpResponse(binary: FbsRouter.DumpResponse): Router...
FILE: node/src/RouterTypes.ts
type RouterOptions (line 40) | type RouterOptions<RouterAppData extends AppData = AppData> = {
type PipeToRouterOptions (line 52) | type PipeToRouterOptions = {
type PipeToRouterListen (line 99) | type PipeToRouterListen = Either<PipeToRouterListenInfo, PipeToRouterLis...
type PipeToRouterListenInfo (line 101) | type PipeToRouterListenInfo = {
type PipeToRouterListenIp (line 105) | type PipeToRouterListenIp = {
type PipeToRouterResult (line 112) | type PipeToRouterResult = {
type PipeTransportPair (line 134) | type PipeTransportPair = {
type RouterDump (line 138) | type RouterDump = {
type RouterEvents (line 173) | type RouterEvents = {
type RouterObserver (line 179) | type RouterObserver = EnhancedEventEmitter<RouterObserverEvents>;
type RouterObserverEvents (line 181) | type RouterObserverEvents = {
type Router (line 187) | interface Router<
FILE: node/src/RtpObserver.ts
type RtpObserverConstructorOptions (line 15) | type RtpObserverConstructorOptions<RtpObserverAppData> = {
type RtpObserverObserverInternal (line 22) | type RtpObserverObserverInternal = RouterInternal & {
method constructor (line 56) | protected constructor(
method id (line 76) | get id(): string {
method closed (line 80) | get closed(): boolean {
method paused (line 84) | get paused(): boolean {
method appData (line 88) | get appData(): RtpObserverAppData {
method appData (line 92) | set appData(appData: RtpObserverAppData) {
method observer (line 96) | get observer(): Observer {
method close (line 100) | close(): void {
method routerClosed (line 132) | routerClosed(): void {
method pause (line 150) | async pause(): Promise<void> {
method resume (line 170) | async resume(): Promise<void> {
method addProducer (line 190) | async addProducer({ producerId }: { producerId: string }): Promise<void> {
method removeProducer (line 214) | async removeProducer({ producerId }: { producerId: string }): Promise<vo...
FILE: node/src/RtpObserverTypes.ts
type RtpObserverType (line 8) | type RtpObserverType = 'audiolevel' | 'activespeaker';
type RtpObserverEvents (line 10) | type RtpObserverEvents = {
type RtpObserverObserver (line 16) | type RtpObserverObserver =
type RtpObserverObserverEvents (line 19) | type RtpObserverObserverEvents = {
type RtpObserver (line 27) | interface RtpObserver<
FILE: node/src/Transport.ts
type TransportConstructorOptions (line 93) | type TransportConstructorOptions<TransportAppData> = {
type TransportInternal (line 103) | type TransportInternal = RouterInternal & {
type TransportData (line 107) | type TransportData =
method constructor (line 178) | protected constructor(
method id (line 204) | get id(): string {
method closed (line 208) | get closed(): boolean {
method appData (line 214) | get appData(): TransportAppData {
method appData (line 218) | set appData(appData: TransportAppData) {
method observer (line 222) | get observer(): Observer {
method channelForTesting (line 229) | get channelForTesting(): Channel {
method close (line 233) | close(): void {
method routerClosed (line 295) | routerClosed(): void {
method listenServerClosed (line 343) | listenServerClosed(): void {
method setMaxIncomingBitrate (line 402) | async setMaxIncomingBitrate(bitrate: number): Promise<void> {
method setMaxOutgoingBitrate (line 420) | async setMaxOutgoingBitrate(bitrate: number): Promise<void> {
method setMinOutgoingBitrate (line 436) | async setMinOutgoingBitrate(bitrate: number): Promise<void> {
method produce (line 452) | async produce<ProducerAppData extends AppData = AppData>({
method consume (line 579) | async consume<ConsumerAppData extends AppData = AppData>({
method produceData (line 705) | async produceData<DataProducerAppData extends AppData = AppData>({
method consumeData (line 808) | async consumeData<DataConsumerAppData extends AppData = AppData>({
method enableTraceEvent (line 965) | async enableTraceEvent(types: TransportTraceEventType[] = []): Promise<v...
method getNextSctpStreamId (line 998) | private getNextSctpStreamId(): number {
function portRangeToFbs (line 1029) | function portRangeToFbs(
function socketFlagsToFbs (line 1035) | function socketFlagsToFbs(
function parseSctpState (line 1044) | function parseSctpState(fbsSctpState: FbsSctpState): SctpState {
function parseProtocol (line 1068) | function parseProtocol(
function serializeProtocol (line 1082) | function serializeProtocol(
function parseTuple (line 1096) | function parseTuple(binary: FbsTransport.Tuple): TransportTuple {
function parseBaseTransportDump (line 1108) | function parseBaseTransportDump(
function parseBaseTransportStats (line 1186) | function parseBaseTransportStats(
function parseTransportTraceEventData (line 1243) | function parseTransportTraceEventData(
function parseRecvRtpHeaderExtensions (line 1273) | function parseRecvRtpHeaderExtensions(
function transportTraceEventTypeToFbs (line 1289) | function transportTraceEventTypeToFbs(
function transportTraceEventTypeFromFbs (line 1303) | function transportTraceEventTypeFromFbs(
function parseBweTraceInfo (line 1317) | function parseBweTraceInfo(binary: FbsTransport.BweTraceInfo): {
function createConsumeRequest (line 1342) | function createConsumeRequest({
function createProduceRequest (line 1426) | function createProduceRequest({
function createProduceDataRequest (line 1470) | function createProduceDataRequest({
function createConsumeDataRequest (line 1521) | function createConsumeDataRequest({
function parseRtpListenerDump (line 1588) | function parseRtpListenerDump(
function parseSctpListenerDump (line 1605) | function parseSctpListenerDump(
FILE: node/src/TransportTypes.ts
type TransportType (line 12) | type TransportType = 'webrtc' | 'plain' | 'pipe' | 'direct';
type TransportListenInfo (line 14) | type TransportListenInfo = {
type TransportListenIp (line 76) | type TransportListenIp = {
type TransportProtocol (line 92) | type TransportProtocol = 'udp' | 'tcp';
type TransportPortRange (line 97) | type TransportPortRange = {
type TransportSocketFlags (line 111) | type TransportSocketFlags = {
type TransportTuple (line 123) | type TransportTuple = {
type SctpState (line 133) | type SctpState =
type RtpListenerDump (line 140) | type RtpListenerDump = {
type SctpListenerDump (line 146) | type SctpListenerDump = {
type RecvRtpHeaderExtensions (line 150) | type RecvRtpHeaderExtensions = {
type BaseTransportDump (line 158) | type BaseTransportDump = {
type BaseTransportStats (line 175) | type BaseTransportStats = {
type TransportTraceEventType (line 205) | type TransportTraceEventType = 'probation' | 'bwe';
type TransportTraceEventData (line 210) | type TransportTraceEventData = {
type TransportEvents (line 232) | type TransportEvents = {
type TransportObserver (line 245) | type TransportObserver = EnhancedEventEmitter<TransportObserverEvents>;
type TransportObserverEvents (line 247) | type TransportObserverEvents = {
type Transport (line 256) | interface Transport<
FILE: node/src/WebRtcServer.ts
type WebRtcServerInternal (line 21) | type WebRtcServerInternal = {
class WebRtcServerImpl (line 27) | class WebRtcServerImpl<WebRtcServerAppData extends AppData = AppData>
method constructor (line 50) | constructor({
method id (line 70) | get id(): string {
method closed (line 74) | get closed(): boolean {
method appData (line 78) | get appData(): WebRtcServerAppData {
method appData (line 82) | set appData(appData: WebRtcServerAppData) {
method observer (line 86) | get observer(): WebRtcServerObserver {
method webRtcTransportsForTesting (line 93) | get webRtcTransportsForTesting(): Map<string, WebRtcTransport> {
method close (line 97) | close(): void {
method workerClosed (line 134) | workerClosed(): void {
method dump (line 153) | async dump(): Promise<WebRtcServerDump> {
method handleWebRtcTransport (line 171) | handleWebRtcTransport(webRtcTransport: WebRtcTransport): void {
method handleListenerError (line 185) | private handleListenerError(): void {
function parseIpPort (line 195) | function parseIpPort(binary: FbsWebRtcServer.IpPort): IpPort {
function parseIceUserNameFragment (line 202) | function parseIceUserNameFragment(
function parseTupleHash (line 211) | function parseTupleHash(binary: FbsWebRtcServer.TupleHash): TupleHash {
function parseWebRtcServerDump (line 218) | function parseWebRtcServerDump(
FILE: node/src/WebRtcServerTypes.ts
type WebRtcServerOptions (line 6) | type WebRtcServerOptions<WebRtcServerAppData extends AppData = AppData> =
type WebRtcServerListenInfo (line 22) | type WebRtcServerListenInfo = TransportListenInfo;
type IpPort (line 24) | type IpPort = {
type IceUserNameFragment (line 29) | type IceUserNameFragment = {
type TupleHash (line 34) | type TupleHash = {
type WebRtcServerDump (line 39) | type WebRtcServerDump = {
type WebRtcServerEvents (line 48) | type WebRtcServerEvents = {
type WebRtcServerObserver (line 54) | type WebRtcServerObserver =
type WebRtcServerObserverEvents (line 57) | type WebRtcServerObserverEvents = {
type WebRtcServer (line 63) | interface WebRtcServer<
FILE: node/src/WebRtcTransport.ts
type WebRtcTransportConstructorOptions (line 49) | type WebRtcTransportConstructorOptions<WebRtcTransportAppData> =
type WebRtcTransportData (line 54) | type WebRtcTransportData = {
class WebRtcTransportImpl (line 69) | class WebRtcTransportImpl<
method constructor (line 82) | constructor(
method type (line 111) | get type(): 'webrtc' {
method observer (line 115) | override get observer(): WebRtcTransportObserver {
method iceRole (line 119) | get iceRole(): 'controlled' {
method iceParameters (line 123) | get iceParameters(): IceParameters {
method iceCandidates (line 127) | get iceCandidates(): IceCandidate[] {
method iceState (line 131) | get iceState(): IceState {
method iceSelectedTuple (line 135) | get iceSelectedTuple(): TransportTuple | undefined {
method dtlsParameters (line 139) | get dtlsParameters(): DtlsParameters {
method dtlsState (line 143) | get dtlsState(): DtlsState {
method dtlsRemoteCert (line 147) | get dtlsRemoteCert(): string | undefined {
method sctpParameters (line 151) | get sctpParameters(): SctpParameters | undefined {
method sctpState (line 155) | get sctpState(): SctpState | undefined {
method close (line 159) | override close(): void {
method routerClosed (line 175) | override routerClosed(): void {
method listenServerClosed (line 191) | override listenServerClosed(): void {
method dump (line 207) | async dump(): Promise<WebRtcTransportDump> {
method getStats (line 225) | async getStats(): Promise<WebRtcTransportStat[]> {
method connect (line 243) | async connect({
method restartIce (line 272) | async restartIce(): Promise<IceParameters> {
method handleWorkerNotifications (line 298) | private handleWorkerNotifications(): void {
method handleListenerError (line 401) | private handleListenerError(): void {
function iceStateFromFbs (line 411) | function iceStateFromFbs(fbsIceState: FbsIceState): IceState {
function iceRoleFromFbs (line 431) | function iceRoleFromFbs(role: FbsIceRole): IceRole {
function iceCandidateTypeFromFbs (line 443) | function iceCandidateTypeFromFbs(type: FbsIceCandidateType): IceCandidat...
function iceCandidateTcpTypeFromFbs (line 451) | function iceCandidateTcpTypeFromFbs(
function dtlsStateFromFbs (line 461) | function dtlsStateFromFbs(fbsDtlsState: FbsDtlsState): DtlsState {
function dtlsRoleFromFbs (line 485) | function dtlsRoleFromFbs(role: FbsDtlsRole): DtlsRole {
function fingerprintAlgorithmsFromFbs (line 501) | function fingerprintAlgorithmsFromFbs(
function fingerprintAlgorithmToFbs (line 527) | function fingerprintAlgorithmToFbs(
function dtlsRoleToFbs (line 557) | function dtlsRoleToFbs(role: DtlsRole): FbsDtlsRole {
function parseWebRtcTransportDumpResponse (line 577) | function parseWebRtcTransportDumpResponse(
function createConnectRequest (line 606) | function createConnectRequest({
function parseGetStatsResponse (line 622) | function parseGetStatsResponse(
function parseIceCandidate (line 639) | function parseIceCandidate(
function parseIceParameters (line 657) | function parseIceParameters(
function parseDtlsParameters (line 667) | function parseDtlsParameters(
function serializeDtlsParameters (line 688) | function serializeDtlsParameters(
FILE: node/src/WebRtcTransportTypes.ts
type WebRtcTransportOptions (line 18) | type WebRtcTransportOptions<
type WebRtcTransportOptionsBase (line 22) | type WebRtcTransportOptionsBase<WebRtcTransportAppData> = {
type WebRtcTransportListen (line 81) | type WebRtcTransportListen = Either<
type WebRtcTransportListenIndividualListenInfo (line 89) | type WebRtcTransportListenIndividualListenInfo = {
type WebRtcTransportListenIndividualListenIp (line 96) | type WebRtcTransportListenIndividualListenIp = {
type WebRtcTransportListenServer (line 110) | type WebRtcTransportListenServer = {
type IceParameters (line 117) | type IceParameters = {
type IceCandidate (line 123) | type IceCandidate = {
type DtlsParameters (line 135) | type DtlsParameters = {
type FingerprintAlgorithm (line 144) | type FingerprintAlgorithm =
type DtlsFingerprint (line 156) | type DtlsFingerprint = {
type IceRole (line 161) | type IceRole = 'controlled' | 'controlling';
type IceState (line 163) | type IceState =
type IceCandidateType (line 170) | type IceCandidateType = 'host';
type IceCandidateTcpType (line 172) | type IceCandidateTcpType = 'passive';
type DtlsRole (line 174) | type DtlsRole = 'auto' | 'client' | 'server';
type DtlsState (line 176) | type DtlsState =
type WebRtcTransportDump (line 183) | type WebRtcTransportDump = BaseTransportDump & {
type WebRtcTransportStat (line 194) | type WebRtcTransportStat = BaseTransportStats & {
type WebRtcTransportEvents (line 202) | type WebRtcTransportEvents = TransportEvents & {
type WebRtcTransportObserver (line 209) | type WebRtcTransportObserver =
type WebRtcTransportObserverEvents (line 212) | type WebRtcTransportObserverEvents = TransportObserverEvents & {
type WebRtcTransport (line 219) | interface WebRtcTransport<
FILE: node/src/Worker.ts
class WorkerImpl (line 43) | class WorkerImpl<WorkerAppData extends AppData = AppData>
method constructor (line 78) | constructor({
method pid (line 311) | get pid(): number {
method closed (line 315) | get closed(): boolean {
method died (line 319) | get died(): boolean {
method subprocessClosed (line 323) | get subprocessClosed(): boolean {
method appData (line 327) | get appData(): WorkerAppData {
method appData (line 331) | set appData(appData: WorkerAppData) {
method observer (line 335) | get observer(): WorkerObserver {
method webRtcServersForTesting (line 342) | get webRtcServersForTesting(): Set<WebRtcServer> {
method routersForTesting (line 349) | get routersForTesting(): Set<Router> {
method close (line 353) | close(): void {
method dump (line 387) | async dump(): Promise<WorkerDump> {
method getResourceUsage (line 401) | async getResourceUsage(): Promise<WorkerResourceUsage> {
method updateSettings (line 435) | async updateSettings({
method createWebRtcServer (line 454) | async createWebRtcServer<WebRtcServerAppData extends AppData = AppData>({
method createRouter (line 517) | async createRouter<RouterAppData extends AppData = AppData>({
method workerDied (line 568) | private workerDied(error: Error): void {
method handleListenerError (line 603) | private handleListenerError(): void {
function parseWorkerDumpResponse (line 622) | function parseWorkerDumpResponse(binary: FbsWorker.DumpResponse): Worker...
function getDefaultWorkerBin (line 650) | function getDefaultWorkerBin(): string {
FILE: node/src/WorkerTypes.ts
type WorkerLogLevel (line 6) | type WorkerLogLevel = 'debug' | 'warn' | 'error' | 'none';
type WorkerLogTag (line 8) | type WorkerLogTag =
type WorkerSettings (line 23) | type WorkerSettings<WorkerAppData extends AppData = AppData> = {
type WorkerUpdateableSettings (line 94) | type WorkerUpdateableSettings<T extends AppData = AppData> = Pick<
type WorkerResourceUsage (line 105) | type WorkerResourceUsage = {
type WorkerDump (line 187) | type WorkerDump = {
type WorkerEvents (line 202) | type WorkerEvents = {
type WorkerObserver (line 210) | type WorkerObserver = EnhancedEventEmitter<WorkerObserverEvents>;
type WorkerObserverEvents (line 212) | type WorkerObserverEvents = {
type Worker (line 218) | interface Worker<
FILE: node/src/enhancedEvents.ts
type Events (line 5) | type Events = Record<string, any[]>;
class EnhancedEventEmitter (line 7) | class EnhancedEventEmitter<
method constructor (line 14) | constructor() {
method emit (line 20) | override emit<K extends keyof E2 & string>(
method safeEmit (line 30) | safeEmit<K extends keyof E2 & string>(eventName: K, ...args: E2[K]): b...
method on (line 44) | override on<K extends keyof E2 & string>(
method off (line 53) | override off<K extends keyof E2 & string>(
method addListener (line 62) | override addListener<K extends keyof E2 & string>(
method prependListener (line 71) | override prependListener<K extends keyof E2 & string>(
method once (line 80) | override once<K extends keyof E2 & string>(
method prependOnceListener (line 89) | override prependOnceListener<K extends keyof E2 & string>(
method removeListener (line 98) | override removeListener<K extends keyof E2 & string>(
method removeAllListeners (line 107) | override removeAllListeners<K extends keyof E2 & string>(
method listenerCount (line 115) | override listenerCount<K extends keyof E2 & string>(eventName: K): num...
method listeners (line 119) | override listeners<K extends keyof E2 & string>(
method rawListeners (line 125) | override rawListeners<K extends keyof E2 & string>(
function enhancedOnce (line 141) | async function enhancedOnce<E extends Events = Events>(
FILE: node/src/errors.ts
class UnsupportedError (line 4) | class UnsupportedError extends Error {
method constructor (line 5) | constructor(message: string) {
class InvalidStateError (line 22) | class InvalidStateError extends Error {
method constructor (line 23) | constructor(message: string) {
FILE: node/src/fbsUtils.ts
function parseVector (line 4) | function parseVector<T>(
function parseStringStringVector (line 27) | function parseStringStringVector(
function parseStringUint8Vector (line 46) | function parseStringUint8Vector(
function parseUint16StringVector (line 65) | function parseUint16StringVector(
function parseUint32StringVector (line 84) | function parseUint32StringVector(
function parseStringStringArrayVector (line 103) | function parseStringStringArrayVector(
FILE: node/src/index.ts
function setLogEventListeners (line 63) | function setLogEventListeners(listeners?: LogEventListeners): void {
function createWorker (line 94) | async function createWorker<WorkerAppData extends AppData = AppData>({
function getSupportedRtpCapabilities (line 143) | function getSupportedRtpCapabilities(): RouterRtpCapabilities {
FILE: node/src/indexTypes.ts
type ObserverEvents (line 7) | type ObserverEvents = {
type Observer (line 11) | type Observer = EnhancedEventEmitter<ObserverEvents>;
type LogEventListeners (line 16) | type LogEventListeners = {
type Index (line 22) | interface Index {
FILE: node/src/ortc.ts
type RtpCodecsEncodingsMapping (line 24) | type RtpCodecsEncodingsMapping = {
type Cache (line 47) | type Cache = {
function validateAndNormalizeRtpCapabilities (line 60) | function validateAndNormalizeRtpCapabilities(
function validateAndNormalizeRtpParameters (line 95) | function validateAndNormalizeRtpParameters(params: RtpParameters): void {
function validateAndNormalizeSctpStreamParameters (line 156) | function validateAndNormalizeSctpStreamParameters(
function generateRouterRtpCapabilities (line 216) | function generateRouterRtpCapabilities(
function getProducerRtpParametersMapping (line 353) | function getProducerRtpParametersMapping(
function getConsumableRtpParameters (line 451) | function getConsumableRtpParameters(
function canConsume (line 559) | function canConsume(
function getConsumerRtpParameters (line 595) | function getConsumerRtpParameters({
function getPipeConsumerRtpParameters (line 790) | function getPipeConsumerRtpParameters({
function serializeRtpMapping (line 874) | function serializeRtpMapping(
function isRtxCodec (line 920) | function isRtxCodec(codec: RtpCodecCapability | RtpCodecParameters): boo...
function matchCodecs (line 924) | function matchCodecs(
function validateAndNormalizeRtpCodecCapability (line 1024) | function validateAndNormalizeRtpCodecCapability(
function validateAndNormalizeRtcpFeedback (line 1111) | function validateAndNormalizeRtcpFeedback(fb: RtcpFeedback): void {
function validateAndNormalizeRtpHeaderExtension (line 1132) | function validateAndNormalizeRtpHeaderExtension(ext: RtpHeaderExtension)...
function validateAndNormalizeRtpCodecParameters (line 1171) | function validateAndNormalizeRtpCodecParameters(
function validateAndNormalizeRtpHeaderExtensionParameters (line 1253) | function validateAndNormalizeRtpHeaderExtensionParameters(
function validateAndNormalizeRtpEncodingParameters (line 1301) | function validateAndNormalizeRtpEncodingParameters(
function validateAndNormalizeRtcpParameters (line 1347) | function validateAndNormalizeRtcpParameters(rtcp: RtcpParameters): void {
FILE: node/src/rtpParametersFbsUtils.ts
function serializeRtpParameters (line 30) | function serializeRtpParameters(
function serializeRtpEncodingParameters (line 135) | function serializeRtpEncodingParameters(
function serializeParameters (line 208) | function serializeParameters(
function parseRtcpFeedback (line 280) | function parseRtcpFeedback(data: FbsRtcpFeedback): RtcpFeedback {
function parseParameters (line 288) | function parseParameters(data: any): Record<string, unknown> {
function parseRtpCodecParameters (line 345) | function parseRtpCodecParameters(
function rtpHeaderExtensionUriFromFbs (line 370) | function rtpHeaderExtensionUriFromFbs(
function rtpHeaderExtensionUriToFbs (line 424) | function rtpHeaderExtensionUriToFbs(
function parseRtpHeaderExtensionParameters (line 482) | function parseRtpHeaderExtensionParameters(
function parseRtpEncodingParameters (line 493) | function parseRtpEncodingParameters(
function parseRtpParameters (line 508) | function parseRtpParameters(data: FbsRtpParameters): RtpParameters {
FILE: node/src/rtpParametersTypes.ts
type MediaKind (line 4) | type MediaKind = 'audio' | 'video';
type RtpCapabilities (line 10) | type RtpCapabilities = {
type RouterRtpCapabilities (line 26) | type RouterRtpCapabilities = Omit<RtpCapabilities, 'codecs'> & {
type RtpCodecCapability (line 47) | type RtpCodecCapability = {
type RouterRtpCodecCapability (line 94) | type RouterRtpCodecCapability = Omit<
type RtpHeaderExtensionDirection (line 104) | type RtpHeaderExtensionDirection =
type RtpHeaderExtension (line 120) | type RtpHeaderExtension = {
type RtpParameters (line 182) | type RtpParameters = {
type RtpCodecParameters (line 220) | type RtpCodecParameters = {
type RtcpFeedback (line 261) | type RtcpFeedback = {
type RtpEncodingParameters (line 277) | type RtpEncodingParameters = {
type RtpHeaderExtensionUri (line 320) | type RtpHeaderExtensionUri =
type RtpHeaderExtensionParameters (line 342) | type RtpHeaderExtensionParameters = {
type RtcpParameters (line 373) | type RtcpParameters = {
FILE: node/src/rtpStreamStatsFbsUtils.ts
function parseRtpStreamStats (line 10) | function parseRtpStreamStats(
function parseRtpStreamRecvStats (line 20) | function parseRtpStreamRecvStats(
function parseSendStreamStats (line 41) | function parseSendStreamStats(
function parseBaseStreamStats (line 61) | function parseBaseStreamStats(
function parseBitrateByLayer (line 90) | function parseBitrateByLayer(binary: FbsRtpStream.RecvStats): BitrateByL...
FILE: node/src/rtpStreamStatsTypes.ts
type RtpStreamRecvStats (line 1) | type RtpStreamRecvStats = BaseRtpStreamStats & {
type RtpStreamSendStats (line 9) | type RtpStreamSendStats = BaseRtpStreamStats & {
type BaseRtpStreamStats (line 16) | type BaseRtpStreamStats = {
type BitrateByLayer (line 38) | type BitrateByLayer = { [key: string]: number };
FILE: node/src/scalabilityModesTypes.ts
type ScalabilityMode (line 1) | type ScalabilityMode = {
FILE: node/src/scalabilityModesUtils.ts
function parseScalabilityMode (line 7) | function parseScalabilityMode(
FILE: node/src/sctpParametersFbsUtils.ts
function parseSctpParametersDump (line 8) | function parseSctpParametersDump(
function serializeSctpStreamParameters (line 22) | function serializeSctpStreamParameters(
function parseSctpStreamParameters (line 39) | function parseSctpStreamParameters(
FILE: node/src/sctpParametersTypes.ts
type SctpCapabilities (line 1) | type SctpCapabilities = {
type NumSctpStreams (line 17) | type NumSctpStreams = {
type SctpParameters (line 29) | type SctpParameters = {
type SctpStreamParameters (line 58) | type SctpStreamParameters = {
type SctpParametersDump (line 83) | type SctpParametersDump = {
FILE: node/src/srtpParametersFbsUtils.ts
function cryptoSuiteFromFbs (line 5) | function cryptoSuiteFromFbs(
function cryptoSuiteToFbs (line 27) | function cryptoSuiteToFbs(
function parseSrtpParameters (line 53) | function parseSrtpParameters(
function serializeSrtpParameters (line 62) | function serializeSrtpParameters(
FILE: node/src/srtpParametersTypes.ts
type SrtpParameters (line 4) | type SrtpParameters = {
type SrtpCryptoSuite (line 19) | type SrtpCryptoSuite =
FILE: node/src/test/test-ActiveSpeakerObserver.ts
type TestContext (line 6) | type TestContext = {
FILE: node/src/test/test-AudioLevelObserver.ts
type TestContext (line 6) | type TestContext = {
FILE: node/src/test/test-Consumer.ts
type TestContext (line 15) | type TestContext = {
FILE: node/src/test/test-DataConsumer.ts
type TestContext (line 6) | type TestContext = {
FILE: node/src/test/test-DataProducer.ts
type TestContext (line 6) | type TestContext = {
FILE: node/src/test/test-DirectTransport.ts
type TestContext (line 6) | type TestContext = {
function sendNextMessage (line 130) | async function sendNextMessage(): Promise<void> {
FILE: node/src/test/test-PipeTransport.ts
type TestContext (line 12) | type TestContext = {
FILE: node/src/test/test-PlainTransport.ts
constant IS_WINDOWS (line 8) | const IS_WINDOWS = os.platform() === 'win32';
constant USE_BUILD_IN_SCTP_STACK (line 9) | const USE_BUILD_IN_SCTP_STACK = false;
type TestContext (line 11) | type TestContext = {
FILE: node/src/test/test-Producer.ts
type TestContext (line 15) | type TestContext = {
FILE: node/src/test/test-Router.ts
type TestContext (line 8) | type TestContext = {
FILE: node/src/test/test-WebRtcServer.ts
type TestContext (line 10) | type TestContext = {
FILE: node/src/test/test-WebRtcTransport.ts
constant USE_BUILD_IN_SCTP_STACK (line 18) | const USE_BUILD_IN_SCTP_STACK = false;
type TestContext (line 20) | type TestContext = {
FILE: node/src/test/test-mediasoup.ts
constant PKG (line 7) | const PKG = JSON.parse(
FILE: node/src/test/test-multiopus.ts
type TestContext (line 7) | type TestContext = {
FILE: node/src/test/test-werift-sctp.ts
type TestContext (line 12) | type TestContext = {
function sendNextMessage (line 134) | function sendNextMessage(): void {
FILE: node/src/types.ts
type Only (line 24) | type Only<T, U> = {
type Either (line 30) | type Either<T, U> = Only<T, U> | Only<U, T>;
type AppData (line 32) | type AppData = {
FILE: node/src/utils.ts
function clone (line 6) | function clone<T>(value: T): T {
function generateUUIDv4 (line 22) | function generateUUIDv4(): string {
function generateRandomNumber (line 29) | function generateRandomNumber(): number {
function deepFreeze (line 37) | function deepFreeze<T>(data: T): T {
FILE: npm-scripts.mjs
constant IS_WINDOWS (line 10) | const IS_WINDOWS = os.platform() === 'win32';
constant MAYOR_VERSION (line 11) | const MAYOR_VERSION = pkg.version.split('.')[0];
constant PYTHON (line 12) | const PYTHON = getPython();
constant PIP_INVOKE_DIR (line 13) | const PIP_INVOKE_DIR = path.resolve('worker/pip_invoke');
constant WORKER_RELEASE_DIR (line 14) | const WORKER_RELEASE_DIR = 'worker/out/Release';
constant WORKER_RELEASE_BIN (line 15) | const WORKER_RELEASE_BIN = IS_WINDOWS
constant WORKER_RELEASE_BIN_PATH (line 18) | const WORKER_RELEASE_BIN_PATH = `${WORKER_RELEASE_DIR}/${WORKER_RELEASE_...
constant WORKER_PREBUILD_DIR (line 19) | const WORKER_PREBUILD_DIR = 'worker/prebuild';
constant GH_OWNER (line 20) | const GH_OWNER = 'versatica';
constant GH_REPO (line 21) | const GH_REPO = 'mediasoup';
constant ESLINT_PATHS (line 24) | const ESLINT_PATHS = [
constant ESLINT_IGNORE_PATHS (line 34) | const ESLINT_IGNORE_PATHS = ['node/src/fbs'];
constant PRETTIER_PATHS (line 39) | const PRETTIER_PATHS = [
function run (line 71) | async function run() {
function getPython (line 255) | function getPython() {
function getWorkerPrebuildTarName (line 271) | function getWorkerPrebuildTarName() {
function installInvoke (line 291) | function installInvoke() {
function deleteNodeLib (line 305) | function deleteNodeLib() {
function buildTypescript (line 315) | function buildTypescript({ force }) {
function watchTypescript (line 327) | function watchTypescript() {
function buildWorker (line 335) | function buildWorker() {
function cleanWorkerArtifacts (line 343) | function cleanWorkerArtifacts() {
function lintNode (line 358) | function lintNode() {
function lintWorker (line 381) | function lintWorker() {
function formatNode (line 389) | function formatNode() {
function formatWorker (line 397) | function formatWorker() {
function tidyWorker (line 405) | function tidyWorker({ fix }) {
function flatcNode (line 417) | async function flatcNode() {
function flatcWorker (line 471) | function flatcWorker() {
function testNode (line 479) | function testNode() {
function testWorker (line 485) | function testWorker() {
function coverageNode (line 493) | function coverageNode() {
function installNodeDeps (line 500) | function installNodeDeps() {
function checkRelease (line 514) | async function checkRelease() {
function release (line 527) | async function release() {
function ensureDir (line 562) | function ensureDir(dir) {
function prebuildWorker (line 570) | async function prebuildWorker() {
function downloadPrebuiltWorker (line 610) | async function downloadPrebuiltWorker() {
function getOctokit (line 729) | async function getOctokit() {
function getVersionChanges (line 744) | async function getVersionChanges() {
function executeCmd (line 769) | function executeCmd(command) {
function executeInteractiveCmd (line 781) | function executeInteractiveCmd(command) {
function logInfo (line 793) | function logInfo(...args) {
function logWarn (line 798) | function logWarn(...args) {
function logError (line 803) | function logError(...args) {
function exitWithError (line 808) | function exitWithError() {
FILE: rust/benches/direct_data.rs
function create_data_producer_consumer_pair (line 6) | async fn create_data_producer_consumer_pair(
function criterion_benchmark (line 28) | pub fn criterion_benchmark(c: &mut Criterion) {
FILE: rust/benches/producer.rs
function create_ssrc (line 7) | fn create_ssrc() -> u32 {
function media_codecs (line 11) | fn media_codecs() -> Vec<RtpCodecCapability> {
function init (line 43) | async fn init() -> (Worker, Router, WebRtcTransport, WebRtcTransport) {
function audio_producer_options (line 90) | fn audio_producer_options() -> ProducerOptions {
function video_producer_options (line 131) | fn video_producer_options() -> ProducerOptions {
function criterion_benchmark (line 211) | pub fn criterion_benchmark(c: &mut Criterion) {
FILE: rust/examples-frontend/echo/src/index.ts
type Brand (line 7) | type Brand<K, T> = K & { __brand: T };
type ConsumerId (line 9) | type ConsumerId = Brand<string, 'ConsumerId'>;
type ProducerId (line 10) | type ProducerId = Brand<string, 'ProducerId'>;
type ServerInit (line 12) | interface ServerInit {
type ServerConnectedProducerTransport (line 19) | interface ServerConnectedProducerTransport {
type ServerProduced (line 23) | interface ServerProduced {
type ServerConnectedConsumerTransport (line 28) | interface ServerConnectedConsumerTransport {
type ServerConsumed (line 32) | interface ServerConsumed {
type ServerMessage (line 39) | type ServerMessage =
type ClientInit (line 46) | interface ClientInit {
type ClientConnectProducerTransport (line 51) | interface ClientConnectProducerTransport {
type ClientConnectConsumerTransport (line 56) | interface ClientConnectConsumerTransport {
type ClientProduce (line 61) | interface ClientProduce {
type ClientConsume (line 67) | interface ClientConsume {
type ClientConsumerResume (line 72) | interface ClientConsumerResume {
type ClientMessage (line 77) | type ClientMessage =
function init (line 85) | async function init()
FILE: rust/examples-frontend/multiopus/src/index.ts
type Brand (line 8) | type Brand<K, T> = K & { __brand: T };
type ConsumerId (line 10) | type ConsumerId = Brand<string, 'ConsumerId'>;
type ProducerId (line 11) | type ProducerId = Brand<string, 'ProducerId'>;
type ServerInit (line 13) | interface ServerInit {
type ServerConnectedConsumerTransport (line 20) | interface ServerConnectedConsumerTransport {
type ServerConsumed (line 24) | interface ServerConsumed {
type ServerMessage (line 31) | type ServerMessage =
type ClientInit (line 36) | interface ClientInit {
type ClientConnectConsumerTransport (line 41) | interface ClientConnectConsumerTransport {
type ClientConsume (line 46) | interface ClientConsume {
type ClientMessage (line 51) | type ClientMessage =
function init (line 56) | async function init()
FILE: rust/examples-frontend/svc-simulcast/src/index.ts
type Brand (line 8) | type Brand<K, T> = K & { __brand: T };
type ConsumerId (line 10) | type ConsumerId = Brand<string, 'ConsumerId'>;
type ProducerId (line 11) | type ProducerId = Brand<string, 'ProducerId'>;
type ServerInit (line 13) | interface ServerInit {
type ServerConnectedProducerTransport (line 20) | interface ServerConnectedProducerTransport {
type ServerProduced (line 24) | interface ServerProduced {
type ServerConnectedConsumerTransport (line 29) | interface ServerConnectedConsumerTransport {
type ServerConsumed (line 33) | interface ServerConsumed {
type ServerMessage (line 40) | type ServerMessage =
type ClientInit (line 47) | interface ClientInit {
type ClientConnectProducerTransport (line 52) | interface ClientConnectProducerTransport {
type ClientConnectConsumerTransport (line 57) | interface ClientConnectConsumerTransport {
type ClientProduce (line 62) | interface ClientProduce {
type ClientConsume (line 68) | interface ClientConsume {
type ClientConsumerResume (line 73) | interface ClientConsumerResume {
type ClientSetConsumerPreferredLayers (line 78) | interface ClientSetConsumerPreferredLayers {
type ClientMessage (line 87) | type ClientMessage =
function init (line 96) | async function init()
FILE: rust/examples-frontend/videoroom/src/index.ts
type Brand (line 7) | type Brand<K, T> = K & { __brand: T };
type RoomId (line 9) | type RoomId = Brand<string, 'RoomId'>;
type ParticipantId (line 10) | type ParticipantId = Brand<string, 'ParticipantId'>;
type ConsumerId (line 11) | type ConsumerId = Brand<string, 'ConsumerId'>;
type ProducerId (line 12) | type ProducerId = Brand<string, 'ProducerId'>;
type ServerInit (line 14) | interface ServerInit {
type ServerProducerAdded (line 22) | interface ServerProducerAdded {
type ServerProducerRemoved (line 28) | interface ServerProducerRemoved {
type ServerConnectedProducerTransport (line 34) | interface ServerConnectedProducerTransport {
type ServerProduced (line 38) | interface ServerProduced {
type ServerConnectedConsumerTransport (line 43) | interface ServerConnectedConsumerTransport {
type ServerConsumed (line 47) | interface ServerConsumed {
type ServerMessage (line 54) | type ServerMessage =
type ClientInit (line 63) | interface ClientInit {
type ClientConnectProducerTransport (line 68) | interface ClientConnectProducerTransport {
type ClientConnectConsumerTransport (line 73) | interface ClientConnectConsumerTransport {
type ClientProduce (line 78) | interface ClientProduce {
type ClientConsume (line 84) | interface ClientConsume {
type ClientConsumerResume (line 89) | interface ClientConsumerResume {
type ClientMessage (line 94) | type ClientMessage =
class Participant (line 102) | class Participant
method constructor (line 108) | constructor(
method addTrack (line 133) | public addTrack(track: MediaStreamTrack): void
method deleteTrack (line 140) | public deleteTrack(track: MediaStreamTrack): void
method hasTracks (line 147) | public hasTracks(): boolean
method destroy (line 152) | public destroy(): void
class Participants (line 159) | class Participants
method addTrack (line 164) | public addTrack(
method deleteTrack (line 173) | public deleteTrack(participantId: ParticipantId, producerId: ProducerId)
method getOrCreateParticipant (line 192) | getOrCreateParticipant(id: ParticipantId): Participant
function init (line 206) | async function init()
FILE: rust/examples/echo.rs
function media_codecs (line 13) | fn media_codecs() -> Vec<RtpCodecCapability> {
type TransportOptions (line 43) | struct TransportOptions {
type ServerMessage (line 55) | enum ServerMessage {
type ClientMessage (line 89) | enum ClientMessage {
type InternalMessage (line 117) | enum InternalMessage {
type Transports (line 127) | struct Transports {
type EchoConnection (line 136) | struct EchoConnection {
method new (line 151) | async fn new(worker_manager: &WorkerManager) -> Result<Self, String> {
method handle (line 253) | fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx:...
type Result (line 286) | type Result = ();
method handle (line 288) | fn handle(&mut self, message: ClientMessage, ctx: &mut Self::Context) {
type Result (line 434) | type Result = ();
method handle (line 436) | fn handle(&mut self, message: ServerMessage, ctx: &mut Self::Context) {
type Result (line 445) | type Result = ();
method handle (line 447) | fn handle(&mut self, message: InternalMessage, ctx: &mut Self::Context) {
type Context (line 220) | type Context = ws::WebsocketContext<Self>;
method started (line 222) | fn started(&mut self, ctx: &mut Self::Context) {
method stopped (line 247) | fn stopped(&mut self, _ctx: &mut Self::Context) {
function ws_index (line 466) | async fn ws_index(
function main (line 482) | async fn main() -> std::io::Result<()> {
FILE: rust/examples/multiopus.rs
function media_codecs (line 14) | fn media_codecs() -> Vec<RtpCodecCapability> {
type TransportOptions (line 34) | struct TransportOptions {
type ServerMessage (line 45) | enum ServerMessage {
type ClientMessage (line 72) | enum ClientMessage {
type InternalMessage (line 88) | enum InternalMessage {
type EchoConnection (line 99) | struct EchoConnection {
method new (line 115) | async fn new(worker_manager: &WorkerManager) -> Result<Self, String> {
method handle (line 290) | fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx:...
type Result (line 323) | type Result = ();
method handle (line 325) | fn handle(&mut self, message: ClientMessage, ctx: &mut Self::Context) {
type Result (line 398) | type Result = ();
method handle (line 400) | fn handle(&mut self, message: ServerMessage, ctx: &mut Self::Context) {
type Result (line 409) | type Result = ();
method handle (line 411) | fn handle(&mut self, message: InternalMessage, ctx: &mut Self::Context) {
type Context (line 262) | type Context = ws::WebsocketContext<Self>;
method started (line 264) | fn started(&mut self, ctx: &mut Self::Context) {
method stopped (line 284) | fn stopped(&mut self, _ctx: &mut Self::Context) {
function ws_index (line 426) | async fn ws_index(
function main (line 442) | async fn main() -> std::io::Result<()> {
FILE: rust/examples/svc-simulcast.rs
function media_codecs (line 13) | fn media_codecs() -> Vec<RtpCodecCapability> {
type TransportOptions (line 56) | struct TransportOptions {
type ServerMessage (line 68) | enum ServerMessage {
type ClientMessage (line 102) | enum ClientMessage {
type InternalMessage (line 136) | enum InternalMessage {
type Transports (line 146) | struct Transports {
type SvcSimulcastConnection (line 155) | struct SvcSimulcastConnection {
method new (line 170) | async fn new(worker_manager: &WorkerManager) -> Result<Self, String> {
method handle (line 273) | fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx:...
type Result (line 306) | type Result = ();
method handle (line 308) | fn handle(&mut self, message: ClientMessage, ctx: &mut Self::Context) {
type Result (line 480) | type Result = ();
method handle (line 482) | fn handle(&mut self, message: ServerMessage, ctx: &mut Self::Context) {
type Result (line 491) | type Result = ();
method handle (line 493) | fn handle(&mut self, message: InternalMessage, ctx: &mut Self::Context) {
type Context (line 240) | type Context = ws::WebsocketContext<Self>;
method started (line 242) | fn started(&mut self, ctx: &mut Self::Context) {
method stopped (line 267) | fn stopped(&mut self, _ctx: &mut Self::Context) {
function ws_index (line 512) | async fn ws_index(
function main (line 528) | async fn main() -> std::io::Result<()> {
FILE: rust/examples/videoroom.rs
type RoomId (line 24) | pub struct RoomId(Uuid);
method fmt (line 27) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 33) | pub fn new() -> Self {
type Handlers (line 40) | struct Handlers {
type Inner (line 48) | struct Inner {
method fmt (line 56) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method drop (line 66) | fn drop(&mut self) {
type Room (line 76) | pub struct Room {
method new (line 82) | pub async fn new(worker_manager: &WorkerManager) -> Result<Self, Strin...
method new_with_id (line 87) | pub async fn new_with_id(
method id (line 133) | pub fn id(&self) -> RoomId {
method router (line 138) | pub fn router(&self) -> &Router {
method add_producer (line 144) | pub fn add_producer(&self, participant_id: ParticipantId, producer: Pr...
method remove_participant (line 159) | pub fn remove_participant(&self, participant_id: &ParticipantId) {
method get_all_producers (line 173) | pub fn get_all_producers(&self) -> Vec<(ParticipantId, ProducerId)> {
method on_producer_add (line 188) | pub fn on_producer_add<F: Fn(&ParticipantId, &Producer) + Send + Sync ...
method on_producer_remove (line 196) | pub fn on_producer_remove<F: Fn(&ParticipantId, &ProducerId) + Send + ...
method on_close (line 204) | pub fn on_close<F: FnOnce() + Send + 'static>(&self, callback: F) -> H...
method downgrade (line 210) | pub fn downgrade(&self) -> WeakRoom {
type WeakRoom (line 219) | pub struct WeakRoom {
method upgrade (line 225) | pub fn upgrade(&self) -> Option<Room> {
type RoomsRegistry (line 240) | pub struct RoomsRegistry {
method get_or_create_room (line 248) | pub async fn get_or_create_room(
method create_room (line 298) | pub async fn create_room(&self, worker_manager: &WorkerManager) -> Res...
type TransportOptions (line 346) | pub struct TransportOptions {
type ServerMessage (line 358) | pub enum ServerMessage {
type ClientMessage (line 406) | pub enum ClientMessage {
type InternalMessage (line 434) | pub enum InternalMessage {
type ParticipantId (line 445) | pub struct ParticipantId(Uuid);
method fmt (line 448) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 454) | fn new() -> Self {
type Transports (line 460) | struct Transports {
type ParticipantConnection (line 469) | pub struct ParticipantConnection {
method new (line 494) | pub async fn new(room: Room) -> Result<Self, String> {
method handle (line 613) | fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx:...
type Result (line 646) | type Result = ();
method handle (line 648) | fn handle(&mut self, message: ClientMessage, ctx: &mut Self::Context) {
type Result (line 821) | type Result = ();
method handle (line 823) | fn handle(&mut self, message: ServerMessage, ctx: &mut Self::Context) {
type Result (line 832) | type Result = ();
method handle (line 834) | fn handle(&mut self, message: InternalMessage, ctx: &mut Self::Context) {
method drop (line 487) | fn drop(&mut self) {
type Context (line 538) | type Context = ws::WebsocketContext<Self>;
method started (line 540) | fn started(&mut self, ctx: &mut Self::Context) {
method stopped (line 607) | fn stopped(&mut self, _ctx: &mut Self::Context) {
function media_codecs (line 852) | fn media_codecs() -> Vec<RtpCodecCapability> {
type QueryParameters (line 880) | struct QueryParameters {
function ws_index (line 887) | async fn ws_index(
function main (line 923) | async fn main() -> std::io::Result<()> {
FILE: rust/src/data_structures.rs
type FbsType (line 11) | type FbsType = transport::ListenInfo;
method to_fbs (line 13) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 41) | type FbsType = transport::SocketFlags;
method to_fbs (line 43) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 52) | type FbsType = web_rtc_transport::DtlsRole;
method to_fbs (line 54) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 64) | type FbsType = web_rtc_transport::DtlsRole;
method from_fbs (line 66) | fn from_fbs(role: &Self::FbsType) -> Self {
type FbsType (line 76) | type FbsType = web_rtc_transport::DtlsState;
method from_fbs (line 78) | fn from_fbs(state: &Self::FbsType) -> Self {
type FbsType (line 90) | type FbsType = web_rtc_transport::DtlsParameters;
method to_fbs (line 92) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 105) | type FbsType = web_rtc_transport::DtlsParameters;
method from_fbs (line 107) | fn from_fbs(parameters: &Self::FbsType) -> Self {
type FbsType (line 120) | type FbsType = web_rtc_transport::Fingerprint;
method to_fbs (line 122) | fn to_fbs(&self) -> Self::FbsType {
function hex_as_bytes (line 149) | fn hex_as_bytes<const N: usize>(input: &str) -> [u8; N] {
type FbsType (line 161) | type FbsType = web_rtc_transport::Fingerprint;
method from_fbs (line 163) | fn from_fbs(fingerprint: &Self::FbsType) -> Self {
type FbsType (line 205) | type FbsType = web_rtc_transport::IceRole;
method from_fbs (line 207) | fn from_fbs(role: &Self::FbsType) -> Self {
type FbsType (line 216) | type FbsType = web_rtc_transport::IceParameters;
method from_fbs (line 218) | fn from_fbs(parameters: &Self::FbsType) -> Self {
type FbsType (line 228) | type FbsType = sctp_association::SctpState;
method from_fbs (line 230) | fn from_fbs(state: &Self::FbsType) -> Self {
type FbsType (line 242) | type FbsType = web_rtc_transport::IceCandidateType;
method from_fbs (line 244) | fn from_fbs(candidate_type: &Self::FbsType) -> Self {
type FbsType (line 252) | type FbsType = web_rtc_transport::IceCandidate;
method from_fbs (line 254) | fn from_fbs(candidate: &Self::FbsType) -> Self {
type FbsType (line 268) | type FbsType = web_rtc_transport::IceCandidateTcpType;
method from_fbs (line 270) | fn from_fbs(candidate_type: &Self::FbsType) -> Self {
type FbsType (line 278) | type FbsType = web_rtc_transport::IceState;
method from_fbs (line 280) | fn from_fbs(state: &Self::FbsType) -> Self {
type FbsType (line 291) | type FbsType = transport::Protocol;
method from_fbs (line 293) | fn from_fbs(protocol: &Self::FbsType) -> Self {
type FbsType (line 302) | type FbsType = transport::Tuple;
method from_fbs (line 304) | fn from_fbs(tuple: &Self::FbsType) -> Self {
type FbsType (line 334) | type FbsType = common::TraceDirection;
method from_fbs (line 336) | fn from_fbs(event_type: &Self::FbsType) -> Self {
type FbsType (line 345) | type FbsType = producer::SrTraceInfo;
method from_fbs (line 347) | fn from_fbs(info: &Self::FbsType) -> Self {
type FbsType (line 360) | type FbsType = transport::BweType;
method from_fbs (line 362) | fn from_fbs(info: &Self::FbsType) -> Self {
type FbsType (line 371) | type FbsType = transport::BweTraceInfo;
method from_fbs (line 373) | fn from_fbs(info: &Self::FbsType) -> Self {
type FbsType (line 388) | type FbsType = rtp_packet::Dump;
method from_fbs (line 390) | fn from_fbs(rtp_packet: &Self::FbsType) -> Self {
FILE: rust/src/fbs.rs
type TryFromFbs (line 3) | pub(crate) trait TryFromFbs<'a>: Sized {
method try_from_fbs (line 7) | fn try_from_fbs(fbs: Self::FbsType) -> Result<Self, Self::Error>;
type FromFbs (line 10) | pub(crate) trait FromFbs: Sized {
method from_fbs (line 13) | fn from_fbs(fbs: &Self::FbsType) -> Self;
type FbsType (line 38) | type FbsType = Option<T::FbsType>;
method from_fbs (line 40) | fn from_fbs(value: &Self::FbsType) -> Self {
type FbsType (line 49) | type FbsType = Vec<T::FbsType>;
method from_fbs (line 51) | fn from_fbs(fbs: &Self::FbsType) -> Self {
type FbsType (line 20) | type FbsType = Vec<T::FbsType>;
type Error (line 21) | type Error = T::Error;
function try_from_fbs (line 23) | fn try_from_fbs(fbs: Self::FbsType) -> Result<Self, Self::Error> {
type ToFbs (line 28) | pub(crate) trait ToFbs: Sized {
method to_fbs (line 31) | fn to_fbs(&self) -> Self::FbsType;
type FbsType (line 60) | type FbsType = Vec<T::FbsType>;
method to_fbs (line 62) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 71) | type FbsType = Option<T::FbsType>;
method to_fbs (line 73) | fn to_fbs(&self) -> Self::FbsType {
FILE: rust/src/messages.rs
type Request (line 48) | pub(crate) trait Request
constant METHOD (line 53) | const METHOD: request::Method;
method into_bytes (line 58) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8>;
method default_for_soft_error (line 62) | fn default_for_soft_error() -> Option<Self::Response> {
method convert_response (line 67) | fn convert_response(
constant METHOD (line 85) | const METHOD: request::Method = request::Method::WorkerDump;
type HandlerId (line 86) | type HandlerId = &'static str;
type Response (line 87) | type Response = WorkerDump;
method into_bytes (line 89) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 105) | fn convert_response(
constant METHOD (line 154) | const METHOD: request::Method = request::Method::WorkerUpdateSettings;
type HandlerId (line 155) | type HandlerId = &'static str;
type Response (line 156) | type Response = ();
method into_bytes (line 158) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 187) | fn convert_response(
constant METHOD (line 201) | const METHOD: request::Method = request::Method::WorkerCreateWebrtcser...
type HandlerId (line 202) | type HandlerId = &'static str;
type Response (line 203) | type Response = ();
method into_bytes (line 205) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 227) | fn convert_response(
constant METHOD (line 263) | const METHOD: request::Method = request::Method::WorkerWebrtcserverClose;
type HandlerId (line 264) | type HandlerId = &'static str;
type Response (line 265) | type Response = ();
method into_bytes (line 267) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 289) | fn convert_response(
constant METHOD (line 300) | const METHOD: request::Method = request::Method::WebrtcserverDump;
type HandlerId (line 301) | type HandlerId = WebRtcServerId;
type Response (line 302) | type Response = WebRtcServerDump;
method into_bytes (line 304) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 320) | fn convert_response(
constant METHOD (line 381) | const METHOD: request::Method = request::Method::WorkerCreateRouter;
type HandlerId (line 382) | type HandlerId = &'static str;
type Response (line 383) | type Response = ();
method into_bytes (line 385) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 402) | fn convert_response(
constant METHOD (line 415) | const METHOD: request::Method = request::Method::WorkerCloseRouter;
type HandlerId (line 416) | type HandlerId = &'static str;
type Response (line 417) | type Response = ();
method into_bytes (line 419) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 437) | fn convert_response(
constant METHOD (line 448) | const METHOD: request::Method = request::Method::RouterDump;
type HandlerId (line 449) | type HandlerId = RouterId;
type Response (line 450) | type Response = RouterDump;
method into_bytes (line 452) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 468) | fn convert_response(
constant METHOD (line 591) | const METHOD: request::Method = request::Method::RouterCreateDirecttra...
type HandlerId (line 592) | type HandlerId = RouterId;
type Response (line 593) | type Response = ();
method into_bytes (line 595) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 617) | fn convert_response(
constant METHOD (line 758) | const METHOD: request::Method = request::Method::RouterCreateWebrtctra...
type HandlerId (line 759) | type HandlerId = RouterId;
type Response (line 760) | type Response = WebRtcTransportData;
method into_bytes (line 762) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 789) | fn convert_response(
constant METHOD (line 825) | const METHOD: request::Method = request::Method::RouterCreateWebrtctra...
type HandlerId (line 826) | type HandlerId = RouterId;
type Response (line 827) | type Response = WebRtcTransportData;
method into_bytes (line 829) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 858) | fn convert_response(
constant METHOD (line 961) | const METHOD: request::Method = request::Method::RouterCreatePlaintran...
type HandlerId (line 962) | type HandlerId = RouterId;
type Response (line 963) | type Response = PlainTransportData;
method into_bytes (line 965) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 987) | fn convert_response(
constant METHOD (line 1087) | const METHOD: request::Method = request::Method::RouterCreatePipetrans...
type HandlerId (line 1088) | type HandlerId = RouterId;
type Response (line 1089) | type Response = PipeTransportData;
method into_bytes (line 1091) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1113) | fn convert_response(
constant METHOD (line 1176) | const METHOD: request::Method = request::Method::RouterCreateAudioleve...
type HandlerId (line 1177) | type HandlerId = RouterId;
type Response (line 1178) | type Response = ();
method into_bytes (line 1180) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1210) | fn convert_response(
constant METHOD (line 1243) | const METHOD: request::Method = request::Method::RouterCreateActivespe...
type HandlerId (line 1244) | type HandlerId = RouterId;
type Response (line 1245) | type Response = ();
method into_bytes (line 1247) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1275) | fn convert_response(
constant METHOD (line 1286) | const METHOD: request::Method = request::Method::TransportDump;
type HandlerId (line 1287) | type HandlerId = TransportId;
type Response (line 1288) | type Response = response::Body;
method into_bytes (line 1290) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1306) | fn convert_response(
constant METHOD (line 1321) | const METHOD: request::Method = request::Method::TransportGetStats;
type HandlerId (line 1322) | type HandlerId = TransportId;
type Response (line 1323) | type Response = response::Body;
method into_bytes (line 1325) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1341) | fn convert_response(
constant METHOD (line 1359) | const METHOD: request::Method = request::Method::RouterCloseTransport;
type HandlerId (line 1360) | type HandlerId = RouterId;
type Response (line 1361) | type Response = ();
method into_bytes (line 1363) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1382) | fn convert_response(
constant METHOD (line 1400) | const METHOD: request::Method = request::Method::WebrtctransportConnect;
type HandlerId (line 1401) | type HandlerId = TransportId;
type Response (line 1402) | type Response = WebRtcTransportConnectResponse;
method into_bytes (line 1404) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1423) | fn convert_response(
constant METHOD (line 1451) | const METHOD: request::Method = request::Method::PipetransportConnect;
type HandlerId (line 1452) | type HandlerId = TransportId;
type Response (line 1453) | type Response = PipeTransportConnectResponse;
method into_bytes (line 1455) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1477) | fn convert_response(
constant METHOD (line 1508) | const METHOD: request::Method = request::Method::PlaintransportConnect;
type HandlerId (line 1509) | type HandlerId = TransportId;
type Response (line 1510) | type Response = PlainTransportConnectResponse;
method into_bytes (line 1512) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1536) | fn convert_response(
constant METHOD (line 1563) | const METHOD: request::Method = request::Method::TransportSetMaxIncomi...
type HandlerId (line 1564) | type HandlerId = TransportId;
type Response (line 1565) | type Response = ();
method into_bytes (line 1567) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1586) | fn convert_response(
constant METHOD (line 1599) | const METHOD: request::Method = request::Method::TransportSetMaxOutgoi...
type HandlerId (line 1600) | type HandlerId = TransportId;
type Response (line 1601) | type Response = ();
method into_bytes (line 1603) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1622) | fn convert_response(
constant METHOD (line 1635) | const METHOD: request::Method = request::Method::TransportSetMinOutgoi...
type HandlerId (line 1636) | type HandlerId = TransportId;
type Response (line 1637) | type Response = ();
method into_bytes (line 1639) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1658) | fn convert_response(
constant METHOD (line 1669) | const METHOD: request::Method = request::Method::TransportRestartIce;
type HandlerId (line 1670) | type HandlerId = TransportId;
type Response (line 1671) | type Response = IceParameters;
method into_bytes (line 1673) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1688) | fn convert_response(
constant METHOD (line 1722) | const METHOD: request::Method = request::Method::TransportProduce;
type HandlerId (line 1723) | type HandlerId = TransportId;
type Response (line 1724) | type Response = TransportProduceResponse;
method into_bytes (line 1726) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1752) | fn convert_response(
constant METHOD (line 1789) | const METHOD: request::Method = request::Method::TransportConsume;
type HandlerId (line 1790) | type HandlerId = TransportId;
type Response (line 1791) | type Response = TransportConsumeResponse;
method into_bytes (line 1793) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1822) | fn convert_response(
constant METHOD (line 1863) | const METHOD: request::Method = request::Method::TransportProduceData;
type HandlerId (line 1864) | type HandlerId = TransportId;
type Response (line 1865) | type Response = TransportProduceDataResponse;
method into_bytes (line 1867) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1903) | fn convert_response(
constant METHOD (line 1951) | const METHOD: request::Method = request::Method::TransportConsumeData;
type HandlerId (line 1952) | type HandlerId = TransportId;
type Response (line 1953) | type Response = TransportConsumeDataResponse;
method into_bytes (line 1955) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 1993) | fn convert_response(
constant METHOD (line 2025) | const METHOD: request::Method = request::Method::TransportEnableTraceE...
type HandlerId (line 2026) | type HandlerId = TransportId;
type Response (line 2027) | type Response = ();
method into_bytes (line 2029) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2050) | fn convert_response(
method default_for_soft_error (line 2056) | fn default_for_soft_error() -> Option<Self::Response> {
constant METHOD (line 2097) | const METHOD: request::Method = request::Method::TransportCloseProducer;
type HandlerId (line 2098) | type HandlerId = TransportId;
type Response (line 2099) | type Response = ();
method into_bytes (line 2101) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2121) | fn convert_response(
constant METHOD (line 2132) | const METHOD: request::Method = request::Method::ProducerDump;
type HandlerId (line 2133) | type HandlerId = ProducerId;
type Response (line 2134) | type Response = ProducerDump;
method into_bytes (line 2136) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2152) | fn convert_response(
constant METHOD (line 2167) | const METHOD: request::Method = request::Method::ProducerGetStats;
type HandlerId (line 2168) | type HandlerId = ProducerId;
type Response (line 2169) | type Response = response::Body;
method into_bytes (line 2171) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2187) | fn convert_response(
constant METHOD (line 2203) | const METHOD: request::Method = request::Method::ProducerPause;
type HandlerId (line 2204) | type HandlerId = ProducerId;
type Response (line 2205) | type Response = ();
method into_bytes (line 2207) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2223) | fn convert_response(
constant METHOD (line 2234) | const METHOD: request::Method = request::Method::ProducerResume;
type HandlerId (line 2235) | type HandlerId = ProducerId;
type Response (line 2236) | type Response = ();
method into_bytes (line 2238) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2254) | fn convert_response(
constant METHOD (line 2267) | const METHOD: request::Method = request::Method::ProducerEnableTraceEv...
type HandlerId (line 2268) | type HandlerId = ProducerId;
type Response (line 2269) | type Response = ();
method into_bytes (line 2271) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2292) | fn convert_response(
method default_for_soft_error (line 2298) | fn default_for_soft_error() -> Option<Self::Response> {
constant METHOD (line 2339) | const METHOD: request::Method = request::Method::TransportCloseConsumer;
type HandlerId (line 2340) | type HandlerId = TransportId;
type Response (line 2341) | type Response = ();
method into_bytes (line 2343) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2363) | fn convert_response(
constant METHOD (line 2374) | const METHOD: request::Method = request::Method::ConsumerDump;
type HandlerId (line 2375) | type HandlerId = ConsumerId;
type Response (line 2376) | type Response = ConsumerDump;
method into_bytes (line 2378) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2394) | fn convert_response(
constant METHOD (line 2409) | const METHOD: request::Method = request::Method::ConsumerGetStats;
type HandlerId (line 2410) | type HandlerId = ConsumerId;
type Response (line 2411) | type Response = response::Body;
method into_bytes (line 2413) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2429) | fn convert_response(
constant METHOD (line 2445) | const METHOD: request::Method = request::Method::ConsumerPause;
type HandlerId (line 2446) | type HandlerId = ConsumerId;
type Response (line 2447) | type Response = ();
method into_bytes (line 2449) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2465) | fn convert_response(
constant METHOD (line 2476) | const METHOD: request::Method = request::Method::ConsumerResume;
type HandlerId (line 2477) | type HandlerId = ConsumerId;
type Response (line 2478) | type Response = ();
method into_bytes (line 2480) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2496) | fn convert_response(
constant METHOD (line 2509) | const METHOD: request::Method = request::Method::ConsumerSetPreferredL...
type HandlerId (line 2510) | type HandlerId = ConsumerId;
type Response (line 2511) | type Response = Option<ConsumerLayers>;
method into_bytes (line 2513) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2536) | fn convert_response(
constant METHOD (line 2563) | const METHOD: request::Method = request::Method::ConsumerSetPriority;
type HandlerId (line 2564) | type HandlerId = ConsumerId;
type Response (line 2565) | type Response = ConsumerSetPriorityResponse;
method into_bytes (line 2567) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2586) | fn convert_response(
constant METHOD (line 2605) | const METHOD: request::Method = request::Method::ConsumerRequestKeyFrame;
type HandlerId (line 2606) | type HandlerId = ConsumerId;
type Response (line 2607) | type Response = ();
method into_bytes (line 2609) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2624) | fn convert_response(
constant METHOD (line 2637) | const METHOD: request::Method = request::Method::ConsumerEnableTraceEv...
type HandlerId (line 2638) | type HandlerId = ConsumerId;
type Response (line 2639) | type Response = ();
method into_bytes (line 2641) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2662) | fn convert_response(
method default_for_soft_error (line 2668) | fn default_for_soft_error() -> Option<Self::Response> {
constant METHOD (line 2679) | const METHOD: request::Method = request::Method::TransportCloseDatapro...
type HandlerId (line 2680) | type HandlerId = TransportId;
type Response (line 2681) | type Response = ();
method into_bytes (line 2683) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2705) | fn convert_response(
constant METHOD (line 2716) | const METHOD: request::Method = request::Method::DataproducerDump;
type HandlerId (line 2717) | type HandlerId = DataProducerId;
type Response (line 2718) | type Response = response::Body;
method into_bytes (line 2720) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2736) | fn convert_response(
constant METHOD (line 2752) | const METHOD: request::Method = request::Method::DataproducerGetStats;
type HandlerId (line 2753) | type HandlerId = DataProducerId;
type Response (line 2754) | type Response = response::Body;
method into_bytes (line 2756) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2772) | fn convert_response(
constant METHOD (line 2788) | const METHOD: request::Method = request::Method::DataproducerPause;
type HandlerId (line 2789) | type HandlerId = DataProducerId;
type Response (line 2790) | type Response = ();
method into_bytes (line 2792) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2808) | fn convert_response(
constant METHOD (line 2819) | const METHOD: request::Method = request::Method::DataproducerResume;
type HandlerId (line 2820) | type HandlerId = DataProducerId;
type Response (line 2821) | type Response = ();
method into_bytes (line 2823) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2839) | fn convert_response(
constant METHOD (line 2890) | const METHOD: request::Method = request::Method::TransportCloseDatacon...
type HandlerId (line 2891) | type HandlerId = TransportId;
type Response (line 2892) | type Response = ();
method into_bytes (line 2894) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2916) | fn convert_response(
constant METHOD (line 2927) | const METHOD: request::Method = request::Method::DataconsumerDump;
type HandlerId (line 2928) | type HandlerId = DataConsumerId;
type Response (line 2929) | type Response = response::Body;
method into_bytes (line 2931) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2947) | fn convert_response(
constant METHOD (line 2963) | const METHOD: request::Method = request::Method::DataconsumerGetStats;
type HandlerId (line 2964) | type HandlerId = DataConsumerId;
type Response (line 2965) | type Response = response::Body;
method into_bytes (line 2967) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 2983) | fn convert_response(
constant METHOD (line 2999) | const METHOD: request::Method = request::Method::DataconsumerPause;
type HandlerId (line 3000) | type HandlerId = DataConsumerId;
type Response (line 3001) | type Response = ();
method into_bytes (line 3003) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3019) | fn convert_response(
constant METHOD (line 3030) | const METHOD: request::Method = request::Method::DataconsumerResume;
type HandlerId (line 3031) | type HandlerId = DataConsumerId;
type Response (line 3032) | type Response = ();
method into_bytes (line 3034) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3050) | fn convert_response(
constant METHOD (line 3066) | const METHOD: request::Method = request::Method::DataconsumerGetBuffer...
type HandlerId (line 3067) | type HandlerId = DataConsumerId;
type Response (line 3068) | type Response = DataConsumerGetBufferedAmountResponse;
method into_bytes (line 3070) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3086) | fn convert_response(
constant METHOD (line 3107) | const METHOD: request::Method = request::Method::DataconsumerSetBuffer...
type HandlerId (line 3108) | type HandlerId = DataConsumerId;
type Response (line 3109) | type Response = ();
method into_bytes (line 3111) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3137) | fn convert_response(
constant METHOD (line 3152) | const METHOD: request::Method = request::Method::DataconsumerSend;
type HandlerId (line 3153) | type HandlerId = DataConsumerId;
type Response (line 3154) | type Response = ();
method into_bytes (line 3156) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3175) | fn convert_response(
constant METHOD (line 3199) | const METHOD: request::Method = request::Method::DataconsumerSetSubcha...
type HandlerId (line 3200) | type HandlerId = DataConsumerId;
type Response (line 3201) | type Response = DataConsumerSetSubchannelsResponse;
method into_bytes (line 3203) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3223) | fn convert_response(
constant METHOD (line 3249) | const METHOD: request::Method = request::Method::DataconsumerAddSubcha...
type HandlerId (line 3250) | type HandlerId = DataConsumerId;
type Response (line 3251) | type Response = DataConsumerAddSubchannelResponse;
method into_bytes (line 3253) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3273) | fn convert_response(
constant METHOD (line 3299) | const METHOD: request::Method = request::Method::DataconsumerRemoveSub...
type HandlerId (line 3300) | type HandlerId = DataConsumerId;
type Response (line 3301) | type Response = DataConsumerRemoveSubchannelResponse;
method into_bytes (line 3303) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3323) | fn convert_response(
constant METHOD (line 3344) | const METHOD: request::Method = request::Method::RouterCloseRtpobserver;
type HandlerId (line 3345) | type HandlerId = RouterId;
type Response (line 3346) | type Response = ();
method into_bytes (line 3348) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3368) | fn convert_response(
constant METHOD (line 3379) | const METHOD: request::Method = request::Method::RtpobserverPause;
type HandlerId (line 3380) | type HandlerId = RtpObserverId;
type Response (line 3381) | type Response = ();
method into_bytes (line 3383) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3398) | fn convert_response(
constant METHOD (line 3409) | const METHOD: request::Method = request::Method::RtpobserverResume;
type HandlerId (line 3410) | type HandlerId = RtpObserverId;
type Response (line 3411) | type Response = ();
method into_bytes (line 3413) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3428) | fn convert_response(
constant METHOD (line 3442) | const METHOD: request::Method = request::Method::RtpobserverAddProducer;
type HandlerId (line 3443) | type HandlerId = RtpObserverId;
type Response (line 3444) | type Response = ();
method into_bytes (line 3446) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3467) | fn convert_response(
constant METHOD (line 3481) | const METHOD: request::Method = request::Method::RtpobserverRemoveProd...
type HandlerId (line 3482) | type HandlerId = RtpObserverId;
type Response (line 3483) | type Response = ();
method into_bytes (line 3485) | fn into_bytes(self, id: u32, handler_id: Self::HandlerId) -> Vec<u8> {
method convert_response (line 3506) | fn convert_response(
type Notification (line 72) | pub(crate) trait Notification: Debug {
constant EVENT (line 74) | const EVENT: notification::Event;
method into_bytes (line 78) | fn into_bytes(self, handler_id: Self::HandlerId) -> Vec<u8>;
constant EVENT (line 238) | const EVENT: notification::Event = notification::Event::WorkerClose;
type HandlerId (line 239) | type HandlerId = &'static str;
method into_bytes (line 241) | fn into_bytes(self, handler_id: Self::HandlerId) -> Vec<u8> {
constant EVENT (line 2068) | const EVENT: notification::Event = notification::Event::TransportSendR...
type HandlerId (line 2069) | type HandlerId = TransportId;
method into_bytes (line 2071) | fn into_bytes(self, handler_id: Self::HandlerId) -> Vec<u8> {
constant EVENT (line 2310) | const EVENT: notification::Event = notification::Event::ProducerSend;
type HandlerId (line 2311) | type HandlerId = ProducerId;
method into_bytes (line 2313) | fn into_bytes(self, handler_id: Self::HandlerId) -> Vec<u8> {
constant EVENT (line 2855) | const EVENT: notification::Event = notification::Event::DataproducerSend;
type HandlerId (line 2856) | type HandlerId = DataProducerId;
method into_bytes (line 2858) | fn into_bytes(self, handler_id: Self::HandlerId) -> Vec<u8> {
type WorkerDumpRequest (line 82) | pub(crate) struct WorkerDumpRequest {}
type WorkerUpdateSettingsRequest (line 149) | pub(crate) struct WorkerUpdateSettingsRequest {
type WorkerCreateWebRtcServerRequest (line 195) | pub(crate) struct WorkerCreateWebRtcServerRequest {
type WorkerCloseNotification (line 235) | pub(crate) struct WorkerCloseNotification {}
type WebRtcServerCloseRequest (line 258) | pub(crate) struct WebRtcServerCloseRequest {
type WebRtcServerDumpRequest (line 297) | pub(crate) struct WebRtcServerDumpRequest {}
type WorkerCreateRouterRequest (line 376) | pub(crate) struct WorkerCreateRouterRequest {
type RouterCloseRequest (line 410) | pub(crate) struct RouterCloseRequest {
type RouterDumpRequest (line 445) | pub(crate) struct RouterDumpRequest {}
type RouterCreateDirectTransportData (line 547) | pub(crate) struct RouterCreateDirectTransportData {
method from_options (line 554) | pub(crate) fn from_options(
type FbsType (line 567) | type FbsType = direct_transport::DirectTransportOptions;
method to_fbs (line 569) | fn to_fbs(&self) -> Self::FbsType {
type RouterCreateDirectTransportRequest (line 586) | pub(crate) struct RouterCreateDirectTransportRequest {
type RouterCreateWebrtcTransportListen (line 626) | enum RouterCreateWebrtcTransportListen {
type FbsType (line 638) | type FbsType = web_rtc_transport::Listen;
method to_fbs (line 640) | fn to_fbs(&self) -> Self::FbsType {
type RouterCreateWebrtcTransportData (line 660) | pub(crate) struct RouterCreateWebrtcTransportData {
method from_options (line 678) | pub(crate) fn from_options(
type FbsType (line 713) | type FbsType = web_rtc_transport::WebRtcTransportOptions;
method to_fbs (line 715) | fn to_fbs(&self) -> Self::FbsType {
type WebRtcTransportData (line 739) | pub(crate) struct WebRtcTransportData {
type RouterCreateWebRtcTransportRequest (line 753) | pub(crate) struct RouterCreateWebRtcTransportRequest {
type RouterCreateWebRtcTransportWithServerRequest (line 820) | pub(crate) struct RouterCreateWebRtcTransportWithServerRequest {
type RouterCreatePlainTransportData (line 890) | pub(crate) struct RouterCreatePlainTransportData {
method from_options (line 906) | pub(crate) fn from_options(
type FbsType (line 928) | type FbsType = plain_transport::PlainTransportOptions;
method to_fbs (line 930) | fn to_fbs(&self) -> Self::FbsType {
type RouterCreatePlainTransportRequest (line 956) | pub(crate) struct RouterCreatePlainTransportRequest {
type PlainTransportData (line 1015) | pub(crate) struct PlainTransportData {
type RouterCreatePipeTransportData (line 1028) | pub(crate) struct RouterCreatePipeTransportData {
method from_options (line 1041) | pub(crate) fn from_options(
type FbsType (line 1060) | type FbsType = pipe_transport::PipeTransportOptions;
method to_fbs (line 1062) | fn to_fbs(&self) -> Self::FbsType {
type RouterCreatePipeTransportRequest (line 1082) | pub(crate) struct RouterCreatePipeTransportRequest {
type PipeTransportData (line 1138) | pub(crate) struct PipeTransportData {
type RouterCreateAudioLevelObserverRequest (line 1148) | pub(crate) struct RouterCreateAudioLevelObserverRequest {
type RouterCreateAudioLevelObserverData (line 1154) | pub(crate) struct RouterCreateAudioLevelObserverData {
method from_options (line 1162) | pub(crate) fn from_options(
type RouterCreateActiveSpeakerObserverRequest (line 1219) | pub(crate) struct RouterCreateActiveSpeakerObserverRequest {
type RouterCreateActiveSpeakerObserverData (line 1225) | pub(crate) struct RouterCreateActiveSpeakerObserverData {
method from_options (line 1231) | pub(crate) fn from_options(
type TransportDumpRequest (line 1283) | pub(crate) struct TransportDumpRequest {}
type TransportGetStatsRequest (line 1318) | pub(crate) struct TransportGetStatsRequest {}
type TransportCloseRequest (line 1354) | pub(crate) struct TransportCloseRequest {
type WebRtcTransportConnectResponse (line 1390) | pub(crate) struct WebRtcTransportConnectResponse {
type WebRtcTransportConnectRequest (line 1395) | pub(crate) struct WebRtcTransportConnectRequest {
type PipeTransportConnectResponse (line 1439) | pub(crate) struct PipeTransportConnectResponse {
type PipeTransportConnectRequest (line 1444) | pub(crate) struct PipeTransportConnectRequest {
type PlainTransportConnectResponse (line 1493) | pub(crate) struct PlainTransportConnectResponse {
type TransportConnectPlainRequest (line 1500) | pub(crate) struct TransportConnectPlainRequest {
type TransportSetMaxIncomingBitrateRequest (line 1558) | pub(crate) struct TransportSetMaxIncomingBitrateRequest {
type TransportSetMaxOutgoingBitrateRequest (line 1594) | pub(crate) struct TransportSetMaxOutgoingBitrateRequest {
type TransportSetMinOutgoingBitrateRequest (line 1630) | pub(crate) struct TransportSetMinOutgoingBitrateRequest {
type TransportRestartIceRequest (line 1666) | pub(crate) struct TransportRestartIceRequest {}
type TransportProduceRequest (line 1706) | pub(crate) struct TransportProduceRequest {
type TransportProduceResponse (line 1717) | pub(crate) struct TransportProduceResponse {
type TransportConsumeRequest (line 1768) | pub(crate) struct TransportConsumeRequest {
type TransportConsumeResponse (line 1781) | pub(crate) struct TransportConsumeResponse {
type TransportProduceDataRequest (line 1843) | pub(crate) struct TransportProduceDataRequest {
type TransportProduceDataResponse (line 1854) | pub(crate) struct TransportProduceDataResponse {
type TransportConsumeDataRequest (line 1928) | pub(crate) struct TransportConsumeDataRequest {
type TransportConsumeDataResponse (line 1940) | pub(crate) struct TransportConsumeDataResponse {
type TransportEnableTraceEventRequest (line 2020) | pub(crate) struct TransportEnableTraceEventRequest {
type TransportSendRtcpNotification (line 2063) | pub(crate) struct TransportSendRtcpNotification {
type ProducerCloseRequest (line 2092) | pub(crate) struct ProducerCloseRequest {
type ProducerDumpRequest (line 2129) | pub(crate) struct ProducerDumpRequest {}
type ProducerGetStatsRequest (line 2164) | pub(crate) struct ProducerGetStatsRequest {}
type ProducerPauseRequest (line 2200) | pub(crate) struct ProducerPauseRequest {}
type ProducerResumeRequest (line 2231) | pub(crate) struct ProducerResumeRequest {}
type ProducerEnableTraceEventRequest (line 2262) | pub(crate) struct ProducerEnableTraceEventRequest {
type ProducerSendNotification (line 2305) | pub(crate) struct ProducerSendNotification {
type ConsumerCloseRequest (line 2334) | pub(crate) struct ConsumerCloseRequest {
type ConsumerDumpRequest (line 2371) | pub(crate) struct ConsumerDumpRequest {}
type ConsumerGetStatsRequest (line 2406) | pub(crate) struct ConsumerGetStatsRequest {}
type ConsumerPauseRequest (line 2442) | pub(crate) struct ConsumerPauseRequest {}
type ConsumerResumeRequest (line 2473) | pub(crate) struct ConsumerResumeRequest {}
type ConsumerSetPreferredLayersRequest (line 2504) | pub(crate) struct ConsumerSetPreferredLayersRequest {
type ConsumerSetPriorityRequest (line 2553) | pub(crate) struct ConsumerSetPriorityRequest {
type ConsumerSetPriorityResponse (line 2558) | pub(crate) struct ConsumerSetPriorityResponse {
type ConsumerRequestKeyFrameRequest (line 2602) | pub(crate) struct ConsumerRequestKeyFrameRequest {}
type ConsumerEnableTraceEventRequest (line 2632) | pub(crate) struct ConsumerEnableTraceEventRequest {
type DataProducerCloseRequest (line 2674) | pub(crate) struct DataProducerCloseRequest {
type DataProducerDumpRequest (line 2713) | pub(crate) struct DataProducerDumpRequest {}
type DataProducerGetStatsRequest (line 2749) | pub(crate) struct DataProducerGetStatsRequest {}
type DataProducerPauseRequest (line 2785) | pub(crate) struct DataProducerPauseRequest {}
type DataProducerResumeRequest (line 2816) | pub(crate) struct DataProducerResumeRequest {}
type DataProducerSendNotification (line 2847) | pub(crate) struct DataProducerSendNotification {
type DataConsumerCloseRequest (line 2885) | pub(crate) struct DataConsumerCloseRequest {
type DataConsumerDumpRequest (line 2924) | pub(crate) struct DataConsumerDumpRequest {}
type DataConsumerGetStatsRequest (line 2960) | pub(crate) struct DataConsumerGetStatsRequest {}
type DataConsumerPauseRequest (line 2996) | pub(crate) struct DataConsumerPauseRequest {}
type DataConsumerResumeRequest (line 3027) | pub(crate) struct DataConsumerResumeRequest {}
type DataConsumerGetBufferedAmountRequest (line 3058) | pub(crate) struct DataConsumerGetBufferedAmountRequest {}
type DataConsumerGetBufferedAmountResponse (line 3061) | pub(crate) struct DataConsumerGetBufferedAmountResponse {
type DataConsumerSetBufferedAmountLowThresholdRequest (line 3102) | pub(crate) struct DataConsumerSetBufferedAmountLowThresholdRequest {
type DataConsumerSendRequest (line 3146) | pub(crate) struct DataConsumerSendRequest {
function from (line 3183) | fn from(request: DataConsumerSendRequest) -> Self {
type DataConsumerSetSubchannelsRequest (line 3189) | pub(crate) struct DataConsumerSetSubchannelsRequest {
type DataConsumerSetSubchannelsResponse (line 3194) | pub(crate) struct DataConsumerSetSubchannelsResponse {
type DataConsumerAddSubchannelRequest (line 3239) | pub(crate) struct DataConsumerAddSubchannelRequest {
type DataConsumerAddSubchannelResponse (line 3244) | pub(crate) struct DataConsumerAddSubchannelResponse {
type DataConsumerRemoveSubchannelRequest (line 3289) | pub(crate) struct DataConsumerRemoveSubchannelRequest {
type DataConsumerRemoveSubchannelResponse (line 3294) | pub(crate) struct DataConsumerRemoveSubchannelResponse {
type RtpObserverCloseRequest (line 3339) | pub(crate) struct RtpObserverCloseRequest {
type RtpObserverPauseRequest (line 3376) | pub(crate) struct RtpObserverPauseRequest {}
type RtpObserverResumeRequest (line 3406) | pub(crate) struct RtpObserverResumeRequest {}
type RtpObserverAddProducerRequest (line 3437) | pub(crate) struct RtpObserverAddProducerRequest {
type RtpObserverRemoveProducerRequest (line 3476) | pub(crate) struct RtpObserverRemoveProducerRequest {
FILE: rust/src/ortc.rs
constant DYNAMIC_PAYLOAD_TYPES (line 27) | const DYNAMIC_PAYLOAD_TYPES: &[u8] = &[
type Cache (line 36) | struct Cache {
type RtpMappingCodec (line 50) | pub struct RtpMappingCodec {
type RtpMappingEncoding (line 58) | pub struct RtpMappingEncoding {
type RtpMapping (line 70) | pub struct RtpMapping {
type FbsType (line 76) | type FbsType = rtp_parameters::RtpMappingRef<'a>;
type Error (line 77) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 79) | fn try_from_fbs(mapping: Self::FbsType) -> Result<Self, Self::Error> {
type FbsType (line 112) | type FbsType = rtp_parameters::RtpMapping;
method to_fbs (line 114) | fn to_fbs(&self) -> Self::FbsType {
type RtpParametersError (line 140) | pub enum RtpParametersError {
type RtpCapabilitiesError (line 148) | pub enum RtpCapabilitiesError {
type RtpParametersMappingError (line 168) | pub enum RtpParametersMappingError {
type ConsumerRtpParametersError (line 193) | pub enum ConsumerRtpParametersError {
function generate_ssrc (line 202) | fn generate_ssrc() -> u32 {
function validate_rtp_parameters (line 207) | pub(crate) fn validate_rtp_parameters(
function validate_rtp_codec_parameters (line 218) | fn validate_rtp_codec_parameters(codec: &RtpCodecParameters) -> Result<(...
function validate_rtp_codec_capability (line 237) | fn validate_rtp_codec_capability(codec: &RtpCodecCapability) -> Result<(...
function validate_rtp_capabilities (line 256) | pub(crate) fn validate_rtp_capabilities(
function generate_router_rtp_capabilities (line 268) | pub(crate) fn generate_router_rtp_capabilities(
function get_producer_rtp_parameters_mapping (line 428) | pub(crate) fn get_producer_rtp_parameters_mapping(
function get_consumable_rtp_parameters (line 555) | pub(crate) fn get_consumable_rtp_parameters(
function can_consume (line 720) | pub(crate) fn can_consume(
function get_consumer_rtp_parameters (line 750) | pub(crate) fn get_consumer_rtp_parameters(
function get_pipe_consumer_rtp_parameters (line 929) | pub(crate) fn get_pipe_consumer_rtp_parameters(
type CodecToMatch (line 1009) | struct CodecToMatch<'a> {
function from (line 1017) | fn from(rtp_codec_capability: &'a RtpCodecCapability) -> Self {
function from (line 1047) | fn from(rtp_codec_capability: &'a RtpCodecCapabilityFinalized) -> Self {
function from (line 1077) | fn from(rtp_codec_parameters: &'a RtpCodecParameters) -> Self {
function match_codecs (line 1107) | fn match_codecs(
FILE: rust/src/ortc/tests.rs
function generate_router_rtp_capabilities_succeeds (line 6) | fn generate_router_rtp_capabilities_succeeds() {
function generate_router_rtp_capabilities_unsupported (line 109) | fn generate_router_rtp_capabilities_unsupported() {
function generate_router_rtp_capabilities_too_many_codecs (line 124) | fn generate_router_rtp_capabilities_too_many_codecs() {
function get_producer_rtp_parameters_mapping_get_consumable_rtp_parameters_get_consumer_rtp_parameters_get_pipe_consumer_rtp_parameters_succeeds (line 145) | fn get_producer_rtp_parameters_mapping_get_consumable_rtp_parameters_get...
function get_producer_rtp_parameters_mapping_unsupported (line 659) | fn get_producer_rtp_parameters_mapping_unsupported() {
FILE: rust/src/router.rs
type RouterOptions (line 90) | pub struct RouterOptions {
method new (line 100) | pub fn new(media_codecs: Vec<RtpCodecCapability>) -> Self {
method default (line 109) | fn default() -> Self {
type PipeToRouterOptions (line 119) | pub struct PipeToRouterOptions {
method new (line 152) | pub fn new(router: Router) -> Self {
type PipeProducerToRouterPair (line 184) | pub struct PipeProducerToRouterPair {
type PipeProducerToRouterError (line 194) | pub enum PipeProducerToRouterError {
method from (line 213) | fn from(error: RequestError) -> Self {
method from (line 219) | fn from(error: ConsumeError) -> Self {
method from (line 225) | fn from(error: ProduceError) -> Self {
type PipeDataProducerToRouterPair (line 240) | pub struct PipeDataProducerToRouterPair {
type PipeDataProducerToRouterError (line 250) | pub enum PipeDataProducerToRouterError {
method from (line 269) | fn from(error: RequestError) -> Self {
method from (line 275) | fn from(error: ConsumeDataError) -> Self {
method from (line 281) | fn from(error: ProduceDataError) -> Self {
type UpdateMediaCodecsError (line 288) | pub enum UpdateMediaCodecsError {
type RouterDump (line 298) | pub struct RouterDump {
type NewTransport (line 312) | pub enum NewTransport<'a> {
type Target (line 324) | type Target = dyn Transport;
method deref (line 326) | fn deref(&self) -> &Self::Target {
type NewRtpObserver (line 338) | pub enum NewRtpObserver<'a> {
type Target (line 346) | type Target = dyn RtpObserver;
method deref (line 348) | fn deref(&self) -> &Self::Target {
type PipeTransportPair (line 356) | struct PipeTransportPair {
method downgrade (line 362) | fn downgrade(&self) -> WeakPipeTransportPair {
type WeakPipeTransportPair (line 371) | struct WeakPipeTransportPair {
method upgrade (line 377) | fn upgrade(&self) -> Option<PipeTransportPair> {
type Handlers (line 386) | struct Handlers {
type Inner (line 393) | struct Inner {
method close (line 420) | fn close(&self) {
method drop (line 412) | fn drop(&mut self) {
type Router (line 455) | pub struct Router {
method fmt (line 460) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 474) | pub(super) fn new(
method id (line 526) | pub fn id(&self) -> RouterId {
method worker (line 531) | pub fn worker(&self) -> &Worker {
method app_data (line 537) | pub fn app_data(&self) -> &AppData {
method closed (line 543) | pub fn closed(&self) -> bool {
method rtp_capabilities (line 556) | pub fn rtp_capabilities(&self) -> RtpCapabilitiesFinalized {
method dump (line 562) | pub async fn dump(&self) -> Result<RouterDump, RequestError> {
method create_direct_transport (line 584) | pub async fn create_direct_transport(
method create_webrtc_transport (line 652) | pub async fn create_webrtc_transport(
method create_pipe_transport (line 741) | pub async fn create_pipe_transport(
method create_plain_transport (line 809) | pub async fn create_plain_transport(
method create_audio_level_observer (line 873) | pub async fn create_audio_level_observer(
method create_active_speaker_observer (line 933) | pub async fn create_active_speaker_observer(
method pipe_producer_to_router (line 1087) | pub async fn pipe_producer_to_router(
method pipe_data_producer_to_router (line 1308) | pub async fn pipe_data_producer_to_router(
method can_consume (line 1424) | pub fn can_consume(
method update_media_codecs (line 1448) | pub fn update_media_codecs(
method on_new_transport (line 1464) | pub fn on_new_transport<F: Fn(NewTransport<'_>) + Send + Sync + 'static>(
method on_new_rtp_observer (line 1472) | pub fn on_new_rtp_observer<F: Fn(NewRtpObserver<'_>) + Send + Sync + '...
method on_worker_close (line 1482) | pub fn on_worker_close<F: FnOnce() + Send + 'static>(&self, callback: ...
method on_close (line 1489) | pub fn on_close<F: FnOnce() + Send + 'static>(&self, callback: F) -> H...
method get_or_create_pipe_transport_pair (line 1497) | async fn get_or_create_pipe_transport_pair(
method create_pipe_transport_pair (line 1536) | async fn create_pipe_transport_pair(
method after_transport_creation (line 1615) | fn after_transport_creation(&self, transport: &impl TransportGeneric) {
method has_producer (line 1662) | fn has_producer(&self, producer_id: &ProducerId) -> bool {
method get_producer (line 1666) | fn get_producer(&self, producer_id: &ProducerId) -> Option<Producer> {
method has_data_producer (line 1670) | fn has_data_producer(&self, data_producer_id: &DataProducerId) -> bool {
method get_data_producer (line 1677) | fn get_data_producer(&self, data_producer_id: &DataProducerId) -> Opti...
method close (line 1686) | fn close(&self) {
FILE: rust/src/router/active_speaker_observer.rs
type ActiveSpeakerObserverOptions (line 28) | pub struct ActiveSpeakerObserverOptions {
method default (line 37) | fn default() -> Self {
type ActiveSpeakerObserverDominantSpeaker (line 47) | pub struct ActiveSpeakerObserverDominantSpeaker {
type Handlers (line 54) | struct Handlers {
type DominantSpeakerNotification (line 69) | struct DominantSpeakerNotification {
type Notification (line 75) | enum Notification {
type FbsType (line 80) | type FbsType = notification::NotificationRef<'a>;
type Error (line 81) | type Error = NotificationParseError;
method try_from_fbs (line 83) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Inner (line 103) | struct Inner {
method close (line 128) | fn close(&self, close_request: bool) {
method drop (line 120) | fn drop(&mut self) {
type ActiveSpeakerObserver (line 168) | pub struct ActiveSpeakerObserver {
method fmt (line 173) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 312) | pub(super) fn new(
method on_dominant_speaker (line 387) | pub fn on_dominant_speaker<
method downgrade (line 398) | pub fn downgrade(&self) -> WeakActiveSpeakerObserver {
method id (line 185) | fn id(&self) -> RtpObserverId {
method router (line 189) | fn router(&self) -> &Router {
method paused (line 193) | fn paused(&self) -> bool {
method app_data (line 197) | fn app_data(&self) -> &AppData {
method closed (line 201) | fn closed(&self) -> bool {
method pause (line 205) | async fn pause(&self) -> Result<(), RequestError> {
method resume (line 222) | async fn resume(&self) -> Result<(), RequestError> {
method add_producer (line 239) | async fn add_producer(
method remove_producer (line 259) | async fn remove_producer(&self, producer_id: ProducerId) -> Result<(), R...
method on_pause (line 276) | fn on_pause(&self, callback: Box<dyn Fn() + Send + Sync + 'static>) -> H...
method on_resume (line 280) | fn on_resume(&self, callback: Box<dyn Fn() + Send + Sync + 'static>) -> ...
method on_add_producer (line 284) | fn on_add_producer(
method on_remove_producer (line 291) | fn on_remove_producer(
method on_router_close (line 298) | fn on_router_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) ...
method on_close (line 302) | fn on_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) -> Hand...
type WeakActiveSpeakerObserver (line 411) | pub struct WeakActiveSpeakerObserver {
method fmt (line 416) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 425) | pub fn upgrade(&self) -> Option<ActiveSpeakerObserver> {
FILE: rust/src/router/active_speaker_observer/tests.rs
function init (line 9) | async fn init() -> Worker {
function router_close_event (line 27) | fn router_close_event() {
FILE: rust/src/router/audio_level_observer.rs
type AudioLevelObserverOptions (line 29) | pub struct AudioLevelObserverOptions {
method default (line 44) | fn default() -> Self {
type AudioLevelObserverVolume (line 56) | pub struct AudioLevelObserverVolume {
type Handlers (line 65) | struct Handlers {
type VolumeNotification (line 78) | struct VolumeNotification {
type Notification (line 85) | enum Notification {
type FbsType (line 91) | type FbsType = notification::NotificationRef<'a>;
type Error (line 92) | type Error = NotificationParseError;
method try_from_fbs (line 94) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Inner (line 125) | struct Inner {
method close (line 150) | fn close(&self, close_request: bool) {
method drop (line 142) | fn drop(&mut self) {
type AudioLevelObserver (line 190) | pub struct AudioLevelObserver {
method fmt (line 195) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 334) | pub(super) fn new(
method on_volumes (line 418) | pub fn on_volumes<F: Fn(&[AudioLevelObserverVolume]) + Send + Sync + '...
method on_silence (line 427) | pub fn on_silence<F: Fn() + Send + Sync + 'static>(&self, callback: F)...
method downgrade (line 433) | pub fn downgrade(&self) -> WeakAudioLevelObserver {
method id (line 207) | fn id(&self) -> RtpObserverId {
method router (line 211) | fn router(&self) -> &Router {
method paused (line 215) | fn paused(&self) -> bool {
method app_data (line 219) | fn app_data(&self) -> &AppData {
method closed (line 223) | fn closed(&self) -> bool {
method pause (line 227) | async fn pause(&self) -> Result<(), RequestError> {
method resume (line 244) | async fn resume(&self) -> Result<(), RequestError> {
method add_producer (line 261) | async fn add_producer(
method remove_producer (line 281) | async fn remove_producer(&self, producer_id: ProducerId) -> Result<(), R...
method on_pause (line 298) | fn on_pause(&self, callback: Box<dyn Fn() + Send + Sync + 'static>) -> H...
method on_resume (line 302) | fn on_resume(&self, callback: Box<dyn Fn() + Send + Sync + 'static>) -> ...
method on_add_producer (line 306) | fn on_add_producer(
method on_remove_producer (line 313) | fn on_remove_producer(
method on_router_close (line 320) | fn on_router_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) ...
method on_close (line 324) | fn on_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) -> Hand...
type WeakAudioLevelObserver (line 446) | pub struct WeakAudioLevelObserver {
method fmt (line 451) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 460) | pub fn upgrade(&self) -> Option<AudioLevelObserver> {
FILE: rust/src/router/audio_level_observer/tests.rs
function init (line 9) | async fn init() -> Worker {
function router_close_event (line 27) | fn router_close_event() {
FILE: rust/src/router/consumer.rs
type ConsumerLayers (line 42) | pub struct ConsumerLayers {
type FbsType (line 50) | type FbsType = consumer::ConsumerLayers;
method to_fbs (line 52) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 61) | type FbsType = consumer::ConsumerLayers;
method from_fbs (line 63) | fn from_fbs(consumer_layers: &Self::FbsType) -> Self {
type ConsumerScore (line 74) | pub struct ConsumerScore {
type FbsType (line 87) | type FbsType = consumer::ConsumerScore;
method from_fbs (line 89) | fn from_fbs(consumer_score: &Self::FbsType) -> Self {
type ConsumerOptions (line 101) | pub struct ConsumerOptions {
method new (line 140) | pub fn new(producer_id: ProducerId, rtp_capabilities: RtpCapabilities)...
type RtpStreamParams (line 158) | pub struct RtpStreamParams {
type FbsType (line 177) | type FbsType = rtp_stream::ParamsRef<'a>;
type Error (line 178) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 180) | fn try_from_fbs(params: Self::FbsType) -> Result<Self, Self::Error> {
type RtxStreamParams (line 204) | pub struct RtxStreamParams {
type FbsType (line 214) | type FbsType = rtx_stream::ParamsRef<'a>;
type Error (line 215) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 217) | fn try_from_fbs(params: Self::FbsType) -> Result<Self, Self::Error> {
type RtpStream (line 232) | pub struct RtpStream {
type FbsType (line 238) | type FbsType = rtp_stream::DumpRef<'a>;
type Error (line 239) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 241) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type RtpRtxParameters (line 252) | pub struct RtpRtxParameters {
type ConsumerDump (line 260) | pub struct ConsumerDump {
type FbsType (line 288) | type FbsType = consumer::DumpResponseRef<'a>;
type Error (line 289) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 291) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type ConsumerType (line 338) | pub enum ConsumerType {
method from (line 351) | fn from(producer_type: ProducerType) -> Self {
type FbsType (line 361) | type FbsType = rtp_parameters::Type;
method to_fbs (line 363) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 374) | type FbsType = rtp_parameters::Type;
method from_fbs (line 376) | fn from_fbs(r#type: &Self::FbsType) -> Self {
type ConsumerStat (line 391) | pub struct ConsumerStat {
type FbsType (line 418) | type FbsType = rtp_stream::Stats;
method from_fbs (line 420) | fn from_fbs(stats: &Self::FbsType) -> Self {
type ConsumerStats (line 459) | pub enum ConsumerStats {
method consumer_stats (line 470) | pub fn consumer_stats(&self) -> &ConsumerStat {
type ConsumerTraceEventData (line 482) | pub enum ConsumerTraceEventData {
type FbsType (line 529) | type FbsType = consumer::TraceNotification;
method from_fbs (line 531) | fn from_fbs(data: &Self::FbsType) -> Self {
type ConsumerTraceEventType (line 594) | pub enum ConsumerTraceEventType {
type FbsType (line 608) | type FbsType = consumer::TraceEventType;
method to_fbs (line 610) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 622) | type FbsType = consumer::TraceEventType;
method from_fbs (line 624) | fn from_fbs(event_type: &Self::FbsType) -> Self {
type Notification (line 637) | enum Notification {
type FbsType (line 648) | type FbsType = notification::NotificationRef<'a>;
type Error (line 649) | type Error = NotificationParseError;
method try_from_fbs (line 651) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Handlers (line 715) | struct Handlers {
type Inner (line 730) | struct Inner {
method close (line 763) | fn close(&self, close_request: bool) {
method drop (line 755) | fn drop(&mut self) {
type Consumer (line 803) | pub struct Consumer {
method fmt (line 808) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 829) | pub(super) fn new(
method id (line 981) | pub fn id(&self) -> ConsumerId {
method producer_id (line 987) | pub fn producer_id(&self) -> ProducerId {
method transport (line 992) | pub fn transport(&self) -> &Arc<dyn Transport> {
method kind (line 998) | pub fn kind(&self) -> MediaKind {
method rtp_parameters (line 1008) | pub fn rtp_parameters(&self) -> &RtpParameters {
method r#type (line 1014) | pub fn r#type(&self) -> ConsumerType {
method paused (line 1021) | pub fn paused(&self) -> bool {
method producer_paused (line 1027) | pub fn producer_paused(&self) -> bool {
method priority (line 1033) | pub fn priority(&self) -> u8 {
method score (line 1039) | pub fn score(&self) -> ConsumerScore {
method preferred_layers (line 1046) | pub fn preferred_layers(&self) -> Option<ConsumerLayers> {
method current_layers (line 1054) | pub fn current_layers(&self) -> Option<ConsumerLayers> {
method app_data (line 1060) | pub fn app_data(&self) -> &AppData {
method closed (line 1066) | pub fn closed(&self) -> bool {
method dump (line 1072) | pub async fn dump(&self) -> Result<ConsumerDump, RequestError> {
method get_stats (line 1085) | pub async fn get_stats(&self) -> Result<ConsumerStats, RequestError> {
method pause (line 1128) | pub async fn pause(&self) -> Result<(), RequestError> {
method resume (line 1152) | pub async fn resume(&self) -> Result<(), RequestError> {
method set_preferred_layers (line 1177) | pub async fn set_preferred_layers(
method set_priority (line 1202) | pub async fn set_priority(&self, priority: u8) -> Result<(), RequestEr...
method unset_priority (line 1217) | pub async fn unset_priority(&self) -> Result<(), RequestError> {
method request_key_frame (line 1234) | pub async fn request_key_frame(&self) -> Result<(), RequestError> {
method enable_trace_event (line 1244) | pub async fn enable_trace_event(
method on_rtp (line 1262) | pub fn on_rtp<F: Fn(&[u8]) + Send + Sync + 'static>(&self, callback: F...
method on_pause (line 1268) | pub fn on_pause<F: Fn() + Send + Sync + 'static>(&self, callback: F) -...
method on_resume (line 1274) | pub fn on_resume<F: Fn() + Send + Sync + 'static>(&self, callback: F) ...
method on_producer_pause (line 1279) | pub fn on_producer_pause<F: Fn() + Send + Sync + 'static>(&self, callb...
method on_producer_resume (line 1284) | pub fn on_producer_resume<F: Fn() + Send + Sync + 'static>(&self, call...
method on_score (line 1289) | pub fn on_score<F: Fn(&ConsumerScore) + Send + Sync + 'static>(
method on_layers_change (line 1313) | pub fn on_layers_change<F: Fn(&Option<ConsumerLayers>) + Send + Sync +...
method on_trace (line 1321) | pub fn on_trace<F: Fn(&ConsumerTraceEventData) + Send + Sync + 'static>(
method on_producer_close (line 1330) | pub fn on_producer_close<F: FnOnce() + Send + 'static>(&self, callback...
method on_transport_close (line 1336) | pub fn on_transport_close<F: FnOnce() + Send + 'static>(&self, callbac...
method on_close (line 1343) | pub fn on_close<F: FnOnce() + Send + 'static>(&self, callback: F) -> H...
method downgrade (line 1353) | pub fn downgrade(&self) -> WeakConsumer {
type WeakConsumer (line 1365) | pub struct WeakConsumer {
method fmt (line 1370) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 1379) | pub fn upgrade(&self) -> Option<Consumer> {
FILE: rust/src/router/consumer/tests.rs
function media_codecs (line 20) | fn media_codecs() -> Vec<RtpCodecCapability> {
function audio_producer_options (line 31) | fn audio_producer_options() -> ProducerOptions {
function consumer_device_capabilities (line 49) | fn consumer_device_capabilities() -> RtpCapabilities {
function init (line 63) | async fn init() -> (Router, WebRtcTransport, WebRtcTransport) {
function producer_close_event (line 111) | fn producer_close_event() {
function transport_close_event (line 151) | fn transport_close_event() {
FILE: rust/src/router/data_consumer.rs
type DataConsumerOptions (line 40) | pub struct DataConsumerOptions {
method new_sctp (line 73) | pub fn new_sctp(data_producer_id: DataProducerId) -> Self {
method new_direct (line 87) | pub fn new_direct(data_producer_id: DataProducerId, subchannels: Optio...
method new_sctp_ordered (line 101) | pub fn new_sctp_ordered(data_producer_id: DataProducerId) -> Self {
method new_sctp_unordered_with_life_time (line 116) | pub fn new_sctp_unordered_with_life_time(
method new_sctp_unordered_with_retransmits (line 133) | pub fn new_sctp_unordered_with_retransmits(
type DataConsumerDump (line 153) | pub struct DataConsumerDump {
type FbsType (line 167) | type FbsType = data_consumer::DumpResponse;
type Error (line 168) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 170) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type DataConsumerStat (line 198) | pub struct DataConsumerStat {
type FbsType (line 209) | type FbsType = data_consumer::GetStatsResponse;
method from_fbs (line 211) | fn from_fbs(stats: &Self::FbsType) -> Self {
type DataConsumerType (line 226) | pub enum DataConsumerType {
type Notification (line 235) | enum Notification {
type FbsType (line 251) | type FbsType = notification::NotificationRef<'a>;
type Error (line 252) | type Error = NotificationParseError;
method try_from_fbs (line 254) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Handlers (line 299) | struct Handlers {
type Inner (line 312) | struct Inner {
method close (line 345) | fn close(&self, close_request: bool) {
method drop (line 337) | fn drop(&mut self) {
type RegularDataConsumer (line 383) | pub struct RegularDataConsumer {
method fmt (line 388) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type DirectDataConsumer (line 414) | pub struct DirectDataConsumer {
method fmt (line 419) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method send (line 968) | pub async fn send(&self, message: WebRtcMessage<'_>) -> Result<(), Req...
type DataConsumer (line 452) | pub enum DataConsumer {
method from (line 406) | fn from(producer: RegularDataConsumer) -> Self {
method from (line 437) | fn from(producer: DirectDataConsumer) -> Self {
method fmt (line 461) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 471) | pub(super) fn new(
method id (line 620) | pub fn id(&self) -> DataConsumerId {
method data_producer_id (line 626) | pub fn data_producer_id(&self) -> DataProducerId {
method transport (line 631) | pub fn transport(&self) -> &Arc<dyn Transport> {
method r#type (line 637) | pub fn r#type(&self) -> DataConsumerType {
method paused (line 644) | pub fn paused(&self) -> bool {
method producer_paused (line 650) | pub fn producer_paused(&self) -> bool {
method sctp_stream_parameters (line 656) | pub fn sctp_stream_parameters(&self) -> Option<SctpStreamParameters> {
method label (line 662) | pub fn label(&self) -> &String {
method protocol (line 668) | pub fn protocol(&self) -> &String {
method subchannels (line 674) | pub fn subchannels(&self) -> Vec<u16> {
method app_data (line 680) | pub fn app_data(&self) -> &AppData {
method closed (line 686) | pub fn closed(&self) -> bool {
method dump (line 692) | pub async fn dump(&self) -> Result<DataConsumerDump, RequestError> {
method get_stats (line 712) | pub async fn get_stats(&self) -> Result<Vec<DataConsumerStat>, Request...
method pause (line 729) | pub async fn pause(&self) -> Result<(), RequestError> {
method resume (line 749) | pub async fn resume(&self) -> Result<(), RequestError> {
method get_buffered_amount (line 775) | pub async fn get_buffered_amount(&self) -> Result<u32, RequestError> {
method set_buffered_amount_low_threshold (line 789) | pub async fn set_buffered_amount_low_threshold(
method set_subchannels (line 808) | pub async fn set_subchannels(&self, subchannels: Vec<u16>) -> Result<(...
method add_subchannel (line 821) | pub async fn add_subchannel(&self, subchannel: u16) -> Result<(), Requ...
method remove_subchannel (line 834) | pub async fn remove_subchannel(&self, subchannel: u16) -> Result<(), R...
method on_message (line 854) | pub fn on_message<F: Fn(&WebRtcMessage<'_>) + Send + Sync + 'static>(
method on_sctp_send_buffer_full (line 862) | pub fn on_sctp_send_buffer_full<F: Fn() + Send + Sync + 'static>(
method on_buffered_amount_low (line 877) | pub fn on_buffered_amount_low<F: Fn(u32) + Send + Sync + 'static>(
method on_data_producer_close (line 889) | pub fn on_data_producer_close<F: FnOnce() + Send + 'static>(&self, cal...
method on_pause (line 898) | pub fn on_pause<F: Fn() + Send + Sync + 'static>(&self, callback: F) -...
method on_resume (line 904) | pub fn on_resume<F: Fn() + Send + Sync + 'static>(&self, callback: F) ...
method on_data_producer_pause (line 909) | pub fn on_data_producer_pause<F: Fn() + Send + Sync + 'static>(
method on_data_producer_resume (line 920) | pub fn on_data_producer_resume<F: Fn() + Send + Sync + 'static>(
method on_transport_close (line 932) | pub fn on_transport_close<F: FnOnce() + Send + 'static>(&self, callbac...
method on_close (line 942) | pub fn on_close<F: FnOnce() + Send + 'static>(&self, callback: F) -> H...
method downgrade (line 952) | pub fn downgrade(&self) -> WeakDataConsumer {
method inner (line 958) | fn inner(&self) -> &Arc<Inner> {
type WeakDataConsumer (line 989) | pub struct WeakDataConsumer {
method fmt (line 994) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 1003) | pub fn upgrade(&self) -> Option<DataConsumer> {
FILE: rust/src/router/data_consumer/tests.rs
function init (line 15) | async fn init() -> (Router, DataProducer) {
function data_producer_close_event (line 69) | fn data_producer_close_event() {
function transport_close_event (line 125) | fn transport_close_event() {
FILE: rust/src/router/data_producer.rs
type DataProducerOptions (line 34) | pub struct DataProducerOptions {
method new_pipe_transport (line 55) | pub(super) fn new_pipe_transport(
method new_sctp (line 71) | pub fn new_sctp(sctp_stream_parameters: SctpStreamParameters) -> Self {
method new_direct (line 84) | pub fn new_direct() -> Self {
type DataProducerType (line 99) | pub enum DataProducerType {
type DataProducerDump (line 110) | pub struct DataProducerDump {
type FbsType (line 120) | type FbsType = data_producer::DumpResponse;
type Error (line 121) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 123) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type DataProducerStat (line 146) | pub struct DataProducerStat {
type FbsType (line 156) | type FbsType = data_producer::GetStatsResponse;
method from_fbs (line 158) | fn from_fbs(stats: &Self::FbsType) -> Self {
type Handlers (line 171) | struct Handlers {
type Inner (line 178) | struct Inner {
method close (line 204) | fn close(&self, close_request: bool) {
method drop (line 196) | fn drop(&mut self) {
type RegularDataProducer (line 240) | pub struct RegularDataProducer {
method fmt (line 245) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type DirectDataProducer (line 268) | pub struct DirectDataProducer {
method fmt (line 273) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method send (line 560) | pub fn send(
type DataProducer (line 302) | pub enum DataProducer {
method from (line 260) | fn from(producer: RegularDataProducer) -> Self {
method from (line 288) | fn from(producer: DirectDataProducer) -> Self {
method fmt (line 311) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 321) | pub(super) fn new(
method id (line 378) | pub fn id(&self) -> DataProducerId {
method transport (line 383) | pub fn transport(&self) -> &Arc<dyn Transport> {
method r#type (line 389) | pub fn r#type(&self) -> DataProducerType {
method sctp_stream_parameters (line 395) | pub fn sctp_stream_parameters(&self) -> Option<SctpStreamParameters> {
method paused (line 401) | pub fn paused(&self) -> bool {
method label (line 407) | pub fn label(&self) -> &String {
method protocol (line 413) | pub fn protocol(&self) -> &String {
method app_data (line 419) | pub fn app_data(&self) -> &AppData {
method closed (line 425) | pub fn closed(&self) -> bool {
method dump (line 431) | pub async fn dump(&self) -> Result<DataProducerDump, RequestError> {
method get_stats (line 451) | pub async fn get_stats(&self) -> Result<Vec<DataProducerStat>, Request...
method pause (line 470) | pub async fn pause(&self) -> Result<(), RequestError> {
method resume (line 490) | pub async fn resume(&self) -> Result<(), RequestError> {
method on_transport_close (line 510) | pub fn on_transport_close<F: FnOnce() + Send + 'static>(&self, callbac...
method on_pause (line 518) | pub fn on_pause<F: Fn() + Send + Sync + 'static>(&self, callback: F) -...
method on_resume (line 523) | pub fn on_resume<F: Fn() + Send + Sync + 'static>(&self, callback: F) ...
method on_close (line 530) | pub fn on_close<F: FnOnce() + Send + 'static>(&self, callback: F) -> H...
method close (line 538) | pub(super) fn close(&self) {
method downgrade (line 544) | pub fn downgrade(&self) -> WeakDataProducer {
method inner (line 550) | fn inner(&self) -> &Arc<Inner> {
type NonClosingDataProducer (line 584) | pub struct NonClosingDataProducer {
method fmt (line 590) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 608) | pub(crate) fn new<F: FnOnce(DataProducer) + Send + 'static>(
method into_inner (line 620) | pub fn into_inner(mut self) -> DataProducer {
method drop (line 598) | fn drop(&mut self) {
type WeakDataProducer (line 631) | pub struct WeakDataProducer {
method fmt (line 636) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 645) | pub fn upgrade(&self) -> Option<DataProducer> {
FILE: rust/src/router/data_producer/tests.rs
function init (line 15) | async fn init() -> (Router, WebRtcTransport) {
function transport_close_event (line 62) | fn transport_close_event() {
FILE: rust/src/router/direct_transport.rs
type DirectTransportOptions (line 38) | pub struct DirectTransportOptions {
method default (line 47) | fn default() -> Self {
type DirectTransportDump (line 59) | pub struct DirectTransportDump {
type FbsType (line 79) | type FbsType = direct_transport::DumpResponse;
type Error (line 80) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 82) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type DirectTransportStat (line 147) | pub struct DirectTransportStat {
type FbsType (line 180) | type FbsType = direct_transport::GetStatsResponse;
type Error (line 181) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 183) | fn try_from_fbs(stats: Self::FbsType) -> Result<Self, Self::Error> {
type Handlers (line 215) | struct Handlers {
type Notification (line 228) | enum Notification {
type FbsType (line 234) | type FbsType = notification::NotificationRef<'a>;
type Error (line 235) | type Error = NotificationParseError;
method try_from_fbs (line 237) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Inner (line 268) | struct Inner {
method close (line 294) | fn close(&self, close_request: bool) {
method drop (line 286) | fn drop(&mut self) {
type DirectTransport (line 343) | pub struct DirectTransport {
method fmt (line 348) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 564) | pub(super) fn new(
method send_rtcp (line 635) | pub fn send_rtcp(&self, rtcp_packet: Vec<u8>) -> Result<(), Notificati...
method on_rtcp (line 642) | pub fn on_rtcp<F: Fn(&[u8]) + Send + Sync + 'static>(&self, callback: ...
method downgrade (line 648) | pub fn downgrade(&self) -> WeakDirectTransport {
method id (line 362) | fn id(&self) -> TransportId {
method router (line 366) | fn router(&self) -> &Router {
method app_data (line 370) | fn app_data(&self) -> &AppData {
method closed (line 374) | fn closed(&self) -> bool {
method produce (line 378) | async fn produce(&self, producer_options: ProducerOptions) -> Result<Pro...
method consume (line 390) | async fn consume(&self, consumer_options: ConsumerOptions) -> Result<Con...
method produce_data (line 402) | async fn produce_data(
method consume_data (line 424) | async fn consume_data(
method enable_trace_event (line 446) | async fn enable_trace_event(
method on_new_producer (line 455) | fn on_new_producer(
method on_new_consumer (line 462) | fn on_new_consumer(
method on_new_data_producer (line 469) | fn on_new_data_producer(
method on_new_data_consumer (line 476) | fn on_new_data_consumer(
method on_trace (line 483) | fn on_trace(
method on_router_close (line 490) | fn on_router_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) ...
method on_close (line 494) | fn on_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) -> Hand...
type Dump (line 505) | type Dump = DirectTransportDump;
type Stat (line 506) | type Stat = DirectTransportStat;
method dump (line 510) | async fn dump(&self) -> Result<Self::Dump, RequestError> {
method get_stats (line 527) | async fn get_stats(&self) -> Result<Vec<Self::Stat>, RequestError> {
method channel (line 542) | fn channel(&self) -> &Channel {
method executor (line 546) | fn executor(&self) -> &Arc<Executor<'static>> {
method next_mid_for_consumers (line 550) | fn next_mid_for_consumers(&self) -> &AtomicUsize {
method used_sctp_stream_ids (line 554) | fn used_sctp_stream_ids(&self) -> &Mutex<IntMap<u16, bool>> {
method cname_for_producers (line 558) | fn cname_for_producers(&self) -> &Mutex<Option<String>> {
type WeakDirectTransport (line 660) | pub struct WeakDirectTransport {
method fmt (line 665) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 674) | pub fn upgrade(&self) -> Option<DirectTransport> {
FILE: rust/src/router/direct_transport/tests.rs
function init (line 9) | async fn init() -> (Router, DirectTransport) {
function router_close_event (line 39) | fn router_close_event() {
FILE: rust/src/router/pipe_transport.rs
type PipeTransportOptions (line 38) | pub struct PipeTransportOptions {
method new (line 68) | pub fn new(listen_info: ListenInfo) -> Self {
type PipeTransportDump (line 86) | pub struct PipeTransportDump {
type FbsType (line 110) | type FbsType = pipe_transport::DumpResponse;
type Error (line 111) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 113) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type PipeTransportStat (line 185) | pub struct PipeTransportStat {
type FbsType (line 221) | type FbsType = pipe_transport::GetStatsResponse;
type Error (line 222) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 224) | fn try_from_fbs(stats: Self::FbsType) -> Result<Self, Self::Error> {
type PipeTransportRemoteParameters (line 259) | pub struct PipeTransportRemoteParameters {
type Handlers (line 270) | struct Handlers {
type Notification (line 284) | enum Notification {
type FbsType (line 293) | type FbsType = notification::NotificationRef<'a>;
type Error (line 294) | type Error = NotificationParseError;
method try_from_fbs (line 296) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Inner (line 326) | struct Inner {
method close (line 353) | fn close(&self, close_request: bool) {
method drop (line 345) | fn drop(&mut self) {
type PipeTransport (line 395) | pub struct PipeTransport {
method fmt (line 400) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 611) | pub(super) fn new(
method connect (line 694) | pub async fn connect(
method set_max_incoming_bitrate (line 720) | pub async fn set_max_incoming_bitrate(&self, bitrate: u32) -> Result<(...
method tuple (line 735) | pub fn tuple(&self) -> TransportTuple {
method sctp_parameters (line 741) | pub fn sctp_parameters(&self) -> Option<SctpParameters> {
method sctp_state (line 747) | pub fn sctp_state(&self) -> Option<SctpState> {
method srtp_parameters (line 755) | pub fn srtp_parameters(&self) -> Option<SrtpParameters> {
method on_tuple (line 761) | pub fn on_tuple<F: Fn(&TransportTuple) + Send + Sync + 'static>(
method on_sctp_state_change (line 769) | pub fn on_sctp_state_change<F: Fn(SctpState) + Send + Sync + 'static>(
method downgrade (line 781) | pub fn downgrade(&self) -> WeakPipeTransport {
method id (line 414) | fn id(&self) -> TransportId {
method router (line 418) | fn router(&self) -> &Router {
method app_data (line 422) | fn app_data(&self) -> &AppData {
method closed (line 426) | fn closed(&self) -> bool {
method produce (line 430) | async fn produce(&self, producer_options: ProducerOptions) -> Result<Pro...
method consume (line 442) | async fn consume(&self, consumer_options: ConsumerOptions) -> Result<Con...
method produce_data (line 454) | async fn produce_data(
method consume_data (line 476) | async fn consume_data(
method enable_trace_event (line 498) | async fn enable_trace_event(
method on_new_producer (line 507) | fn on_new_producer(
method on_new_consumer (line 514) | fn on_new_consumer(
method on_new_data_producer (line 521) | fn on_new_data_producer(
method on_new_data_consumer (line 528) | fn on_new_data_consumer(
method on_trace (line 535) | fn on_trace(
method on_router_close (line 542) | fn on_router_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) ...
method on_close (line 546) | fn on_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) -> Hand...
type Dump (line 557) | type Dump = PipeTransportDump;
type Stat (line 558) | type Stat = PipeTransportStat;
method dump (line 561) | async fn dump(&self) -> Result<Self::Dump, RequestError> {
method get_stats (line 574) | async fn get_stats(&self) -> Result<Vec<Self::Stat>, RequestError> {
method channel (line 589) | fn channel(&self) -> &Channel {
method executor (line 593) | fn executor(&self) -> &Arc<Executor<'static>> {
method next_mid_for_consumers (line 597) | fn next_mid_for_consumers(&self) -> &AtomicUsize {
method used_sctp_stream_ids (line 601) | fn used_sctp_stream_ids(&self) -> &Mutex<IntMap<u16, bool>> {
method cname_for_producers (line 605) | fn cname_for_producers(&self) -> &Mutex<Option<String>> {
type WeakPipeTransport (line 793) | pub struct WeakPipeTransport {
method fmt (line 798) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 807) | pub fn upgrade(&self) -> Option<PipeTransport> {
FILE: rust/src/router/pipe_transport/tests.rs
function media_codecs (line 26) | fn media_codecs() -> Vec<RtpCodecCapability> {
function video_producer_options (line 36) | fn video_producer_options() -> ProducerOptions {
function data_producer_options (line 53) | fn data_producer_options() -> DataProducerOptions {
function consumer_device_capabilities (line 59) | fn consumer_device_capabilities() -> RtpCapabilities {
function init (line 72) | async fn init() -> (Router, Router, WebRtcTransport, WebRtcTransport) {
function producer_close_is_transmitted_to_pipe_consumer (line 131) | fn producer_close_is_transmitted_to_pipe_consumer() {
function data_producer_close_is_transmitted_to_pipe_data_consumer (line 175) | fn data_producer_close_is_transmitted_to_pipe_data_consumer() {
FILE: rust/src/router/plain_transport.rs
type PlainTransportOptions (line 47) | pub struct PlainTransportOptions {
method new (line 84) | pub fn new(listen_info: ListenInfo) -> Self {
type PlainTransportDump (line 105) | pub struct PlainTransportDump {
type FbsType (line 131) | type FbsType = plain_transport::DumpResponse;
type Error (line 132) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 134) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type PlainTransportStat (line 215) | pub struct PlainTransportStat {
type FbsType (line 254) | type FbsType = plain_transport::GetStatsResponse;
type Error (line 255) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 257) | fn try_from_fbs(stats: Self::FbsType) -> Result<Self, Self::Error> {
type PlainTransportRemoteParameters (line 297) | pub struct PlainTransportRemoteParameters {
type Handlers (line 316) | struct Handlers {
type Notification (line 331) | enum Notification {
type FbsType (line 347) | type FbsType = notification::NotificationRef<'a>;
type Error (line 348) | type Error = NotificationParseError;
method try_from_fbs (line 350) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Inner (line 404) | struct Inner {
method close (line 431) | fn close(&self, close_request: bool) {
method drop (line 423) | fn drop(&mut self) {
type PlainTransport (line 466) | pub struct PlainTransport {
method fmt (line 471) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 682) | pub(super) fn new(
method connect (line 870) | pub async fn connect(
method set_max_incoming_bitrate (line 909) | pub async fn set_max_incoming_bitrate(&self, bitrate: u32) -> Result<(...
method tuple (line 925) | pub fn tuple(&self) -> TransportTuple {
method rtcp_tuple (line 939) | pub fn rtcp_tuple(&self) -> Option<TransportTuple> {
method sctp_parameters (line 945) | pub fn sctp_parameters(&self) -> Option<SctpParameters> {
method sctp_state (line 951) | pub fn sctp_state(&self) -> Option<SctpState> {
method srtp_parameters (line 960) | pub fn srtp_parameters(&self) -> Option<SrtpParameters> {
method on_tuple (line 966) | pub fn on_tuple<F: Fn(&TransportTuple) + Send + Sync + 'static>(
method on_rtcp_tuple (line 975) | pub fn on_rtcp_tuple<F: Fn(&TransportTuple) + Send + Sync + 'static>(
method on_sctp_state_change (line 983) | pub fn on_sctp_state_change<F: Fn(SctpState) + Send + Sync + 'static>(
method downgrade (line 995) | pub fn downgrade(&self) -> WeakPlainTransport {
method id (line 485) | fn id(&self) -> TransportId {
method router (line 489) | fn router(&self) -> &Router {
method app_data (line 493) | fn app_data(&self) -> &AppData {
method closed (line 497) | fn closed(&self) -> bool {
method produce (line 501) | async fn produce(&self, producer_options: ProducerOptions) -> Result<Pro...
method consume (line 513) | async fn consume(&self, consumer_options: ConsumerOptions) -> Result<Con...
method produce_data (line 525) | async fn produce_data(
method consume_data (line 547) | async fn consume_data(
method enable_trace_event (line 569) | async fn enable_trace_event(
method on_new_producer (line 578) | fn on_new_producer(
method on_new_consumer (line 585) | fn on_new_consumer(
method on_new_data_producer (line 592) | fn on_new_data_producer(
method on_new_data_consumer (line 599) | fn on_new_data_consumer(
method on_trace (line 606) | fn on_trace(
method on_router_close (line 613) | fn on_router_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) ...
method on_close (line 617) | fn on_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) -> Hand...
type Dump (line 628) | type Dump = PlainTransportDump;
type Stat (line 629) | type Stat = PlainTransportStat;
method dump (line 632) | async fn dump(&self) -> Result<Self::Dump, RequestError> {
method get_stats (line 645) | async fn get_stats(&self) -> Result<Vec<Self::Stat>, RequestError> {
method channel (line 660) | fn channel(&self) -> &Channel {
method executor (line 664) | fn executor(&self) -> &Arc<Executor<'static>> {
method next_mid_for_consumers (line 668) | fn next_mid_for_consumers(&self) -> &AtomicUsize {
method used_sctp_stream_ids (line 672) | fn used_sctp_stream_ids(&self) -> &Mutex<IntMap<u16, bool>> {
method cname_for_producers (line 676) | fn cname_for_producers(&self) -> &Mutex<Option<String>> {
type WeakPlainTransport (line 1007) | pub struct WeakPlainTransport {
method fmt (line 1012) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 1021) | pub fn upgrade(&self) -> Option<PlainTransport> {
FILE: rust/src/router/plain_transport/tests.rs
function init (line 11) | async fn init() -> Router {
function router_close_event (line 34) | fn router_close_event() {
FILE: rust/src/router/producer.rs
type ProducerOptions (line 46) | pub struct ProducerOptions {
method new_pipe_transport (line 69) | pub fn new_pipe_transport(
method new (line 87) | pub fn new(kind: MediaKind, rtp_parameters: RtpParameters) -> Self {
type RtxStream (line 103) | pub struct RtxStream {
type RtpStreamRecv (line 110) | pub struct RtpStreamRecv {
type FbsType (line 117) | type FbsType = rtp_stream::DumpRef<'a>;
type Error (line 118) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 120) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type ProducerDump (line 139) | pub struct ProducerDump {
type FbsType (line 151) | type FbsType = producer::DumpResponseRef<'a>;
type Error (line 152) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 154) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type ProducerType (line 182) | pub enum ProducerType {
type FbsType (line 192) | type FbsType = rtp_parameters::Type;
method from_fbs (line 194) | fn from_fbs(producer_type: &Self::FbsType) -> Self {
type ProducerScore (line 209) | pub struct ProducerScore {
type FbsType (line 221) | type FbsType = producer::Score;
method from_fbs (line 223) | fn from_fbs(producer_score: &producer::Score) -> Self {
type Rotation (line 236) | pub enum Rotation {
type ProducerVideoOrientation (line 250) | pub struct ProducerVideoOrientation {
type FbsType (line 260) | type FbsType = producer::VideoOrientationChangeNotification;
method from_fbs (line 262) | fn from_fbs(video_orientation: &Self::FbsType) -> Self {
type BitrateByLayer (line 282) | pub struct BitrateByLayer {
type ProducerStat (line 292) | pub struct ProducerStat {
type FbsType (line 322) | type FbsType = rtp_stream::Stats;
method from_fbs (line 324) | fn from_fbs(stats: &rtp_stream::Stats) -> Self {
type ProducerTraceEventData (line 371) | pub enum ProducerTraceEventData {
type FbsType (line 427) | type FbsType = producer::TraceNotification;
method from_fbs (line 429) | fn from_fbs(data: &Self::FbsType) -> Self {
type ProducerTraceEventType (line 503) | pub enum ProducerTraceEventType {
type FbsType (line 519) | type FbsType = producer::TraceEventType;
method to_fbs (line 521) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 534) | type FbsType = producer::TraceEventType;
method from_fbs (line 536) | fn from_fbs(event_type: &Self::FbsType) -> Self {
type Notification (line 550) | enum Notification {
type FbsType (line 557) | type FbsType = notification::NotificationRef<'a>;
type Error (line 558) | type Error = NotificationParseError;
method try_from_fbs (line 560) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Handlers (line 612) | struct Handlers {
type Inner (line 622) | struct Inner {
method close (line 651) | fn close(&self, close_request: bool) {
method drop (line 643) | fn drop(&mut self) {
type RegularProducer (line 686) | pub struct RegularProducer {
method fmt (line 691) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type DirectProducer (line 718) | pub struct DirectProducer {
method fmt (line 723) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method send (line 1089) | pub fn send(&self, rtp_packet: Vec<u8>) -> Result<(), NotificationErro...
type Producer (line 752) | pub enum Producer {
method from (line 710) | fn from(producer: RegularProducer) -> Self {
method from (line 742) | fn from(producer: DirectProducer) -> Self {
method fmt (line 761) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 771) | pub(super) async fn new(
method id (line 860) | pub fn id(&self) -> ProducerId {
method transport (line 865) | pub fn transport(&self) -> &Arc<dyn Transport> {
method kind (line 871) | pub fn kind(&self) -> MediaKind {
method rtp_parameters (line 881) | pub fn rtp_parameters(&self) -> &RtpParameters {
method r#type (line 887) | pub fn r#type(&self) -> ProducerType {
method paused (line 893) | pub fn paused(&self) -> bool {
method score (line 899) | pub fn score(&self) -> Vec<ProducerScore> {
method app_data (line 905) | pub fn app_data(&self) -> &AppData {
method closed (line 911) | pub fn closed(&self) -> bool {
method dump (line 917) | pub async fn dump(&self) -> Result<ProducerDump, RequestError> {
method get_stats (line 930) | pub async fn get_stats(&self) -> Result<Vec<ProducerStat>, RequestErro...
method pause (line 949) | pub async fn pause(&self) -> Result<(), RequestError> {
method resume (line 969) | pub async fn resume(&self) -> Result<(), RequestError> {
method enable_trace_event (line 987) | pub async fn enable_trace_event(
method on_score (line 1000) | pub fn on_score<F: Fn(&[ProducerScore]) + Send + Sync + 'static>(
method on_video_orientation_change (line 1010) | pub fn on_video_orientation_change<F: Fn(ProducerVideoOrientation) + S...
method on_pause (line 1021) | pub fn on_pause<F: Fn() + Send + Sync + 'static>(&self, callback: F) -...
method on_resume (line 1026) | pub fn on_resume<F: Fn() + Send + Sync + 'static>(&self, callback: F) ...
method on_trace (line 1031) | pub fn on_trace<F: Fn(&ProducerTraceEventData) + Send + Sync + 'static>(
method on_transport_close (line 1041) | pub fn on_transport_close<F: FnOnce() + Send + 'static>(&self, callbac...
method on_close (line 1051) | pub fn on_close<F: FnOnce() + Send + 'static>(&self, callback: F) -> H...
method consumable_rtp_parameters (line 1063) | pub fn consumable_rtp_parameters(&self) -> &RtpParameters {
method close (line 1067) | pub(super) fn close(&self) {
method downgrade (line 1073) | pub fn downgrade(&self) -> WeakProducer {
method inner (line 1079) | fn inner(&self) -> &Arc<Inner> {
type PipedProducer (line 1104) | pub struct PipedProducer {
method fmt (line 1110) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 1128) | pub(crate) fn new<F: FnOnce(Producer) + Send + 'static>(
method into_inner (line 1139) | pub fn into_inner(mut self) -> Producer {
method drop (line 1118) | fn drop(&mut self) {
type WeakProducer (line 1150) | pub struct WeakProducer {
method fmt (line 1155) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 1164) | pub fn upgrade(&self) -> Option<Producer> {
FILE: rust/src/router/producer/tests.rs
function media_codecs (line 19) | fn media_codecs() -> Vec<RtpCodecCapability> {
function audio_producer_options (line 30) | fn audio_producer_options() -> ProducerOptions {
function init (line 48) | async fn init() -> (Router, WebRtcTransport) {
function transport_close_event (line 91) | fn transport_close_event() {
FILE: rust/src/router/rtp_observer.rs
type RtpObserverAddProducerOptions (line 17) | pub struct RtpObserverAddProducerOptions {
method new (line 25) | pub fn new(producer_id: ProducerId) -> Self {
type RtpObserver (line 36) | pub trait RtpObserver {
method id (line 39) | fn id(&self) -> RtpObserverId;
method router (line 42) | fn router(&self) -> &Router;
method paused (line 46) | fn paused(&self) -> bool;
method app_data (line 50) | fn app_data(&self) -> &AppData;
method closed (line 54) | fn closed(&self) -> bool;
method pause (line 57) | async fn pause(&self) -> Result<(), RequestError>;
method resume (line 60) | async fn resume(&self) -> Result<(), RequestError>;
method add_producer (line 63) | async fn add_producer(
method remove_producer (line 69) | async fn remove_producer(&self, producer_id: ProducerId) -> Result<(),...
method on_pause (line 72) | fn on_pause(&self, callback: Box<dyn Fn() + Send + Sync + 'static>) ->...
method on_resume (line 75) | fn on_resume(&self, callback: Box<dyn Fn() + Send + Sync + 'static>) -...
method on_add_producer (line 78) | fn on_add_producer(
method on_remove_producer (line 84) | fn on_remove_producer(
method on_router_close (line 91) | fn on_router_close(&self, callback: Box<dyn FnOnce() + Send + 'static>...
method on_close (line 96) | fn on_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) -> Ha...
FILE: rust/src/router/tests.rs
function init (line 7) | async fn init() -> Worker {
function worker_close_event (line 28) | fn worker_close_event() {
FILE: rust/src/router/transport.rs
type TransportTraceEventData (line 49) | pub enum TransportTraceEventData {
type FbsType (line 71) | type FbsType = transport::TraceNotification;
method from_fbs (line 72) | fn from_fbs(data: &Self::FbsType) -> Self {
type TransportTraceEventType (line 93) | pub enum TransportTraceEventType {
type FbsType (line 101) | type FbsType = transport::TraceEventType;
method to_fbs (line 103) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 112) | type FbsType = transport::TraceEventType;
method from_fbs (line 114) | fn from_fbs(event_type: &transport::TraceEventType) -> Self {
type RtpListener (line 125) | pub struct RtpListener {
type FbsType (line 135) | type FbsType = transport::RtpListener;
type Error (line 136) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 138) | fn try_from_fbs(rtp_listener: Self::FbsType) -> Result<Self, Self::Err...
type RecvRtpHeaderExtensions (line 162) | pub struct RecvRtpHeaderExtensions {
type FbsType (line 171) | type FbsType = transport::RecvRtpHeaderExtensions;
method from_fbs (line 173) | fn from_fbs(extensions: &Self::FbsType) -> Self {
type SctpListener (line 187) | pub struct SctpListener {
type FbsType (line 193) | type FbsType = transport::SctpListener;
type Error (line 194) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 196) | fn try_from_fbs(listener: Self::FbsType) -> Result<Self, Self::Error> {
type TransportType (line 208) | pub(super) enum TransportType {
type Transport (line 227) | pub trait Transport: Debug + Send + Sync {
method id (line 230) | fn id(&self) -> TransportId;
method router (line 233) | fn router(&self) -> &Router;
method app_data (line 237) | fn app_data(&self) -> &AppData;
method closed (line 241) | fn closed(&self) -> bool;
method produce (line 251) | async fn produce(&self, producer_options: ProducerOptions) -> Result<P...
method consume (line 280) | async fn consume(&self, consumer_options: ConsumerOptions) -> Result<C...
method produce_data (line 288) | async fn produce_data(
method consume_data (line 299) | async fn consume_data(
method enable_trace_event (line 305) | async fn enable_trace_event(
method on_new_producer (line 311) | fn on_new_producer(
method on_new_consumer (line 317) | fn on_new_consumer(
method on_new_data_producer (line 323) | fn on_new_data_producer(
method on_new_data_consumer (line 329) | fn on_new_data_consumer(
method on_trace (line 335) | fn on_trace(
method on_router_close (line 343) | fn on_router_close(&self, callback: Box<dyn FnOnce() + Send + 'static>...
method on_close (line 348) | fn on_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) -> Ha...
type TransportGeneric (line 353) | pub trait TransportGeneric: Transport + Clone + 'static {
method dump (line 361) | async fn dump(&self) -> Result<Self::Dump, RequestError>;
method get_stats (line 365) | async fn get_stats(&self) -> Result<Vec<Self::Stat>, RequestError>;
type ProduceError (line 370) | pub enum ProduceError {
type ConsumeError (line 387) | pub enum ConsumeError {
type ProduceDataError (line 404) | pub enum ProduceDataError {
type ConsumeDataError (line 418) | pub enum ConsumeDataError {
type TransportImpl (line 431) | pub(super) trait TransportImpl: TransportGeneric {
method channel (line 432) | fn channel(&self) -> &Channel;
method executor (line 434) | fn executor(&self) -> &Arc<Executor<'static>>;
method next_mid_for_consumers (line 436) | fn next_mid_for_consumers(&self) -> &AtomicUsize;
method used_sctp_stream_ids (line 438) | fn used_sctp_stream_ids(&self) -> &Mutex<IntMap<u16, bool>>;
method cname_for_producers (line 440) | fn cname_for_producers(&self) -> &Mutex<Option<String>>;
method allocate_sctp_stream_id (line 442) | fn allocate_sctp_stream_id(&self) -> Option<u16> {
method deallocate_sctp_stream_id (line 455) | fn deallocate_sctp_stream_id(&self, sctp_stream_id: u16) {
method dump_impl (line 462) | async fn dump_impl(&self) -> Result<response::Body, RequestError> {
method get_stats_impl (line 468) | async fn get_stats_impl(&self) -> Result<response::Body, RequestError> {
method set_max_incoming_bitrate_impl (line 474) | async fn set_max_incoming_bitrate_impl(&self, bitrate: u32) -> Result<...
method set_max_outgoing_bitrate_impl (line 480) | async fn set_max_outgoing_bitrate_impl(&self, bitrate: u32) -> Result<...
method enable_trace_event_impl (line 486) | async fn enable_trace_event_impl(
method set_min_outgoing_bitrate_impl (line 495) | async fn set_min_outgoing_bitrate_impl(&self, bitrate: u32) -> Result<...
method produce_impl (line 501) | async fn produce_impl(
method consume_impl (line 602) | async fn consume_impl(
method produce_data_impl (line 705) | async fn produce_data_impl(
method consume_data_impl (line 776) | async fn consume_data_impl(
FILE: rust/src/router/webrtc_transport.rs
type WebRtcTransportListenInfos (line 45) | pub struct WebRtcTransportListenInfos(Vec<ListenInfo>);
method new (line 50) | pub fn new(listen_info: ListenInfo) -> Self {
method insert (line 56) | pub fn insert(mut self, listen_info: ListenInfo) -> Self {
type Error (line 76) | type Error = EmptyListError;
method try_from (line 78) | fn try_from(listen_infos: Vec<ListenInfo>) -> Result<Self, Self::Error> {
type Target (line 63) | type Target = Vec<ListenInfo>;
method deref (line 65) | fn deref(&self) -> &Self::Target {
type EmptyListError (line 73) | pub struct EmptyListError;
type WebRtcTransportListen (line 95) | pub enum WebRtcTransportListen {
type WebRtcTransportOptions (line 115) | pub struct WebRtcTransportOptions {
method new (line 154) | pub fn new(listen_infos: WebRtcTransportListenInfos) -> Self {
method new_with_server (line 172) | pub fn new_with_server(webrtc_server: WebRtcServer) -> Self {
type WebRtcTransportDump (line 194) | pub struct WebRtcTransportDump {
type FbsType (line 222) | type FbsType = web_rtc_transport::DumpResponse;
type Error (line 223) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 225) | fn try_from_fbs(dump: Self::FbsType) -> Result<Self, Self::Error> {
type WebRtcTransportStat (line 310) | pub struct WebRtcTransportStat {
type FbsType (line 350) | type FbsType = web_rtc_transport::GetStatsResponse;
type Error (line 351) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 353) | fn try_from_fbs(stats: Self::FbsType) -> Result<Self, Self::Error> {
type WebRtcTransportRemoteParameters (line 392) | pub struct WebRtcTransportRemoteParameters {
type Handlers (line 399) | struct Handlers {
type Notification (line 416) | enum Notification {
type FbsType (line 438) | type FbsType = notification::NotificationRef<'a>;
type Error (line 439) | type Error = NotificationParseError;
method try_from_fbs (line 441) | fn try_from_fbs(notification: Self::FbsType) -> Result<Self, Self::Err...
type Inner (line 512) | struct Inner {
method close (line 542) | fn close(&self, close_request: bool) {
method drop (line 534) | fn drop(&mut self) {
type WebRtcTransport (line 585) | pub struct WebRtcTransport {
method fmt (line 590) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 804) | pub(super) fn new(
method connect (line 967) | pub async fn connect(
method webrtc_server (line 990) | pub fn webrtc_server(&self) -> &Option<WebRtcServer> {
method set_max_incoming_bitrate (line 996) | pub async fn set_max_incoming_bitrate(&self, bitrate: u32) -> Result<(...
method set_max_outgoing_bitrate (line 1004) | pub async fn set_max_outgoing_bitrate(&self, bitrate: u32) -> Result<(...
method set_min_outgoing_bitrate (line 1012) | pub async fn set_min_outgoing_bitrate(&self, bitrate: u32) -> Result<(...
method ice_role (line 1020) | pub fn ice_role(&self) -> IceRole {
method ice_parameters (line 1026) | pub fn ice_parameters(&self) -> &IceParameters {
method ice_candidates (line 1032) | pub fn ice_candidates(&self) -> &Vec<IceCandidate> {
method ice_state (line 1038) | pub fn ice_state(&self) -> IceState {
method ice_selected_tuple (line 1045) | pub fn ice_selected_tuple(&self) -> Option<TransportTuple> {
method dtls_parameters (line 1051) | pub fn dtls_parameters(&self) -> DtlsParameters {
method dtls_state (line 1057) | pub fn dtls_state(&self) -> DtlsState {
method dtls_remote_cert (line 1067) | pub fn dtls_remote_cert(&self) -> Option<String> {
method sctp_parameters (line 1073) | pub fn sctp_parameters(&self) -> Option<SctpParameters> {
method sctp_state (line 1079) | pub fn sctp_state(&self) -> Option<SctpState> {
method restart_ice (line 1085) | pub async fn restart_ice(&self) -> Result<IceParameters, RequestError> {
method on_webrtc_server_close (line 1098) | pub fn on_webrtc_server_close(
method on_ice_state_change (line 1106) | pub fn on_ice_state_change<F: Fn(IceState) + Send + Sync + 'static>(
method on_ice_selected_tuple_change (line 1115) | pub fn on_ice_selected_tuple_change<F: Fn(&TransportTuple) + Send + Sy...
method on_dtls_state_change (line 1126) | pub fn on_dtls_state_change<F: Fn(DtlsState) + Send + Sync + 'static>(
method on_sctp_state_change (line 1137) | pub fn on_sctp_state_change<F: Fn(SctpState) + Send + Sync + 'static>(
method downgrade (line 1149) | pub fn downgrade(&self) -> WeakWebRtcTransport {
method id (line 604) | fn id(&self) -> TransportId {
method router (line 608) | fn router(&self) -> &Router {
method app_data (line 612) | fn app_data(&self) -> &AppData {
method closed (line 616) | fn closed(&self) -> bool {
method produce (line 620) | async fn produce(&self, producer_options: ProducerOptions) -> Result<Pro...
method consume (line 632) | async fn consume(&self, consumer_options: ConsumerOptions) -> Result<Con...
method produce_data (line 644) | async fn produce_data(
method consume_data (line 666) | async fn consume_data(
method enable_trace_event (line 688) | async fn enable_trace_event(
method on_new_producer (line 697) | fn on_new_producer(
method on_new_consumer (line 704) | fn on_new_consumer(
method on_new_data_producer (line 711) | fn on_new_data_producer(
method on_new_data_consumer (line 718) | fn on_new_data_consumer(
method on_trace (line 725) | fn on_trace(
method on_router_close (line 732) | fn on_router_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) ...
method on_close (line 736) | fn on_close(&self, callback: Box<dyn FnOnce() + Send + 'static>) -> Hand...
type Dump (line 747) | type Dump = WebRtcTransportDump;
type Stat (line 748) | type Stat = WebRtcTransportStat;
method dump (line 751) | async fn dump(&self) -> Result<Self::Dump, RequestError> {
method get_stats (line 764) | async fn get_stats(&self) -> Result<Vec<Self::Stat>, RequestError> {
method channel (line 781) | fn channel(&self) -> &Channel {
method executor (line 785) | fn executor(&self) -> &Arc<Executor<'static>> {
method next_mid_for_consumers (line 789) | fn next_mid_for_consumers(&self) -> &AtomicUsize {
method used_sctp_stream_ids (line 793) | fn used_sctp_stream_ids(&self) -> &Mutex<IntMap<u16, bool>> {
method cname_for_producers (line 797) | fn cname_for_producers(&self) -> &Mutex<Option<String>> {
type WeakWebRtcTransport (line 1162) | pub struct WeakWebRtcTransport {
method fmt (line 1167) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method upgrade (line 1176) | pub fn upgrade(&self) -> Option<WebRtcTransport> {
FILE: rust/src/router/webrtc_transport/tests.rs
function init (line 21) | async fn init() -> (Worker, Router) {
function create_with_webrtc_server_succeeds (line 46) | fn create_with_webrtc_server_succeeds() {
function router_close_event (line 231) | fn router_close_event() {
function webrtc_server_close_event (line 272) | fn webrtc_server_close_event() {
FILE: rust/src/rtp_parameters.rs
type FbsType (line 12) | type FbsType = rtp_parameters::RtpParametersRef<'a>;
type Error (line 13) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 15) | fn try_from_fbs(rtp_parameters: Self::FbsType) -> Result<Self, Self::Err...
type FbsType (line 134) | type FbsType = rtp_parameters::RtpEncodingParametersRef<'a>;
type Error (line 135) | type Error = Box<dyn Error + Send + Sync>;
method try_from_fbs (line 137) | fn try_from_fbs(encoding_parameters: Self::FbsType) -> Result<Self, Self...
type FbsType (line 164) | type FbsType = rtp_parameters::MediaKind;
method from_fbs (line 166) | fn from_fbs(kind: &Self::FbsType) -> Self {
type FbsType (line 175) | type FbsType = rtp_parameters::MediaKind;
method to_fbs (line 177) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 186) | type FbsType = rtp_parameters::RtpHeaderExtensionUri;
method from_fbs (line 188) | fn from_fbs(uri: &Self::FbsType) -> Self {
type FbsType (line 227) | type FbsType = rtp_parameters::RtpHeaderExtensionUri;
method to_fbs (line 229) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 269) | type FbsType = rtp_parameters::RtpParameters;
method to_fbs (line 271) | fn to_fbs(&self) -> rtp_parameters::RtpParameters {
type FbsType (line 364) | type FbsType = rtp_parameters::RtpEncodingParameters;
method to_fbs (line 366) | fn to_fbs(&self) -> Self::FbsType {
FILE: rust/src/scalability_modes.rs
type ScalabilityMode (line 16) | pub enum ScalabilityMode {
method fmt (line 185) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method is_none (line 192) | pub fn is_none(&self) -> bool {
method spatial_layers (line 197) | pub fn spatial_layers(&self) -> NonZeroU8 {
method temporal_layers (line 241) | pub fn temporal_layers(&self) -> NonZeroU8 {
method ksvc (line 289) | pub fn ksvc(&self) -> bool {
method as_str (line 306) | pub fn as_str(&self) -> &str {
method deserialize (line 355) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
method default (line 109) | fn default() -> Self {
type ParseScalabilityModeError (line 116) | pub enum ParseScalabilityModeError {
type Err (line 123) | type Err = ParseScalabilityModeError;
method from_str (line 125) | fn from_str(scalability_mode: &str) -> Result<Self, Self::Err> {
method serialize (line 389) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
FILE: rust/src/sctp_parameters.rs
type FbsType (line 8) | type FbsType = sctp_parameters::NumSctpStreams;
method to_fbs (line 10) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 19) | type FbsType = sctp_parameters::SctpParameters;
method from_fbs (line 21) | fn from_fbs(parameters: &Self::FbsType) -> Self {
type FbsType (line 32) | type FbsType = sctp_parameters::SctpStreamParameters;
method from_fbs (line 34) | fn from_fbs(stream_parameters: &Self::FbsType) -> Self {
type FbsType (line 45) | type FbsType = sctp_parameters::SctpStreamParameters;
method to_fbs (line 47) | fn to_fbs(&self) -> Self::FbsType {
FILE: rust/src/srtp_parameters.rs
type FbsType (line 8) | type FbsType = srtp_parameters::SrtpParameters;
method from_fbs (line 10) | fn from_fbs(tuple: &Self::FbsType) -> Self {
type FbsType (line 19) | type FbsType = srtp_parameters::SrtpParameters;
method to_fbs (line 21) | fn to_fbs(&self) -> Self::FbsType {
type FbsType (line 30) | type FbsType = srtp_parameters::SrtpCryptoSuite;
method from_fbs (line 32) | fn from_fbs(crypto_suite: &Self::FbsType) -> Self {
type FbsType (line 43) | type FbsType = srtp_parameters::SrtpCryptoSuite;
method to_fbs (line 45) | fn to_fbs(&self) -> Self::FbsType {
FILE: rust/src/supported_rtp_capabilities.rs
function get_supported_rtp_capabilities (line 20) | pub fn get_supported_rtp_capabilities() -> RtpCapabilities {
FILE: rust/src/webrtc_server.rs
type WebRtcServerIpPort (line 39) | pub struct WebRtcServerIpPort {
type WebRtcServerIceUsernameFragment (line 47) | pub struct WebRtcServerIceUsernameFragment {
type WebRtcServerTupleHash (line 56) | pub struct WebRtcServerTupleHash {
type WebRtcServerDump (line 66) | pub struct WebRtcServerDump {
type WebRtcServerListenInfos (line 78) | pub struct WebRtcServerListenInfos(Vec<ListenInfo>);
method new (line 83) | pub fn new(listen_info: ListenInfo) -> Self {
method insert (line 89) | pub fn insert(mut self, listen_info: ListenInfo) -> Self {
type Error (line 109) | type Error = EmptyListError;
method try_from (line 111) | fn try_from(listen_infos: Vec<ListenInfo>) -> Result<Self, Self::Error> {
type Target (line 96) | type Target = Vec<ListenInfo>;
method deref (line 98) | fn deref(&self) -> &Self::Target {
type EmptyListError (line 106) | pub struct EmptyListError;
type WebRtcServerOptions (line 123) | pub struct WebRtcServerOptions {
method new (line 132) | pub fn new(listen_infos: WebRtcServerListenInfos) -> Self {
type Handlers (line 142) | struct Handlers {
type Inner (line 148) | struct Inner {
method close (line 168) | fn close(&self) {
method drop (line 160) | fn drop(&mut self) {
type WebRtcServer (line 207) | pub struct WebRtcServer {
method fmt (line 212) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 222) | pub(crate) fn new(
method id (line 262) | pub fn id(&self) -> WebRtcServerId {
method worker (line 267) | pub fn worker(&self) -> &Worker {
method app_data (line 273) | pub fn app_data(&self) -> &AppData {
method closed (line 279) | pub fn closed(&self) -> bool {
method dump (line 285) | pub async fn dump(&self) -> Result<WebRtcServerDump, RequestError> {
method on_worker_close (line 298) | pub fn on_worker_close<F: FnOnce() + Send + 'static>(&self, callback: ...
method on_new_webrtc_transport (line 303) | pub fn on_new_webrtc_transport<F>(&self, callback: F) -> HandlerId
method on_close (line 316) | pub fn on_close<F: FnOnce() + Send + 'static>(&self, callback: F) -> H...
method notify_new_webrtc_transport (line 324) | pub(crate) fn notify_new_webrtc_transport(&self, webrtc_transport: &We...
method close (line 332) | pub(crate) fn close(&self) {
FILE: rust/src/webrtc_server/tests.rs
function init (line 10) | async fn init() -> Worker {
function worker_close_event (line 28) | fn worker_close_event() {
FILE: rust/src/worker.rs
type RequestError (line 46) | pub enum RequestError {
type WorkerLogLevel (line 81) | pub enum WorkerLogLevel {
method as_str (line 94) | pub(crate) fn as_str(self) -> &'static str {
type WorkerLogTag (line 108) | pub enum WorkerLogTag {
method as_str (line 138) | pub(crate) fn as_str(self) -> &'static str {
type WorkerDtlsFiles (line 159) | pub struct WorkerDtlsFiles {
type WorkerSettings (line 169) | pub struct WorkerSettings {
method fmt (line 237) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method default (line 207) | fn default() -> Self {
type WorkerUpdateSettings (line 271) | pub struct WorkerUpdateSettings {
type ChannelMessageHandlers (line 286) | pub struct ChannelMessageHandlers {
type LibUringDump (line 293) | pub struct LibUringDump {
type WorkerDump (line 303) | pub struct WorkerDump {
type CreateWebRtcServerError (line 314) | pub enum CreateWebRtcServerError {
type CreateRouterError (line 322) | pub enum CreateRouterError {
type Handlers (line 333) | struct Handlers {
type Inner (line 341) | struct Inner {
method new (line 361) | async fn new<OE: FnOnce() + Send + 'static>(
method wait_for_worker_ready (line 509) | async fn wait_for_worker_ready(
method setup_message_handling (line 545) | fn setup_message_handling(&mut self) {
method close (line 572) | fn close(&self) {
method drop (line 353) | fn drop(&mut self) {
type Worker (line 596) | pub struct Worker {
method fmt (line 601) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 610) | pub(super) async fn new<OE: FnOnce() + Send + 'static>(
method id (line 623) | pub fn id(&self) -> WorkerId {
method worker_manager (line 628) | pub fn worker_manager(&self) -> &WorkerManager {
method app_data (line 634) | pub fn app_data(&self) -> &AppData {
method closed (line 640) | pub fn closed(&self) -> bool {
method dump (line 646) | pub async fn dump(&self) -> Result<WorkerDump, RequestError> {
method update_settings (line 653) | pub async fn update_settings(&self, data: WorkerUpdateSettings) -> Res...
method create_webrtc_server (line 670) | pub async fn create_webrtc_server(
method create_router (line 719) | pub async fn create_router(
method on_new_webrtc_server (line 758) | pub fn on_new_webrtc_server<F: Fn(&WebRtcServer) + Send + Sync + 'stat...
method on_new_router (line 769) | pub fn on_new_router<F: Fn(&Router) + Send + Sync + 'static>(&self, ca...
method on_dead (line 774) | pub fn on_dead<F: FnOnce(Result<(), ExitError>) + Send + Sync + 'static>(
method on_close (line 784) | pub fn on_close<F: FnOnce() + Send + 'static>(&self, callback: F) -> H...
method close (line 793) | pub(crate) fn close(&self) {
FILE: rust/src/worker/channel.rs
type InternalMessage (line 25) | pub(super) enum InternalMessage {
type NotificationError (line 44) | pub enum NotificationError {
type NotificationParseError (line 51) | pub enum NotificationParseError {
type BufferMessagesGuard (line 58) | pub(crate) struct BufferMessagesGuard {
method drop (line 66) | fn drop(&mut self) {
type ChannelReceiveMessage (line 88) | enum ChannelReceiveMessage<'a> {
function unprefix_message (line 96) | fn unprefix_message(bytes: &[u8]) -> &[u8] {
function deserialize_message (line 100) | fn deserialize_message(bytes: &[u8]) -> ChannelReceiveMessage<'_> {
type ResponseError (line 131) | struct ResponseError {
type FBSResponseResult (line 135) | type FBSResponseResult = Result<Option<Vec<u8>>, ResponseError>;
type RequestDropGuard (line 137) | struct RequestDropGuard<'a> {
method drop (line 145) | fn drop(&mut self) {
function remove (line 160) | fn remove(mut self) {
type FBSRequestsContainer (line 166) | struct FBSRequestsContainer {
type OutgoingMessageBuffer (line 171) | struct OutgoingMessageBuffer {
type Inner (line 178) | struct Inner {
method drop (line 190) | fn drop(&mut self) {
type Channel (line 196) | pub(crate) struct Channel {
method new (line 201) | pub(super) fn new(
method get_internal_message_receiver (line 330) | pub(super) fn get_internal_message_receiver(&self) -> async_channel::R...
method buffer_messages_for (line 336) | pub(crate) fn buffer_messages_for(&self, target_id: SubscriptionTarget...
method request (line 350) | pub(crate) async fn request<R, HandlerId>(
method notify (line 465) | pub(crate) fn notify<N, HandlerId>(
method subscribe_to_notifications (line 507) | pub(crate) fn subscribe_to_notifications<F>(
FILE: rust/src/worker/common.rs
type EventHandlersList (line 9) | struct EventHandlersList<F> {
method default (line 15) | fn default() -> Self {
type EventHandlers (line 24) | pub(super) struct EventHandlers<F> {
function new (line 29) | pub(super) fn new() -> Self {
function add (line 34) | pub(super) fn add(&self, target_id: SubscriptionTarget, callback: F) -> ...
function downgrade (line 74) | pub(super) fn downgrade(&self) -> WeakEventHandlers<F> {
function call_callbacks_with_single_value (line 82) | pub(super) fn call_callbacks_with_single_value(
type WeakEventHandlers (line 97) | pub(super) struct WeakEventHandlers<F> {
function upgrade (line 102) | pub(super) fn upgrade(&self) -> Option<EventHandlers<F>> {
type SubscriptionTarget (line 111) | pub(crate) enum SubscriptionTarget {
type SubscriptionHandler (line 117) | pub(crate) struct SubscriptionHandler {
method new (line 122) | fn new(remove_callback: Box<dyn FnOnce() + Send + Sync>) -> Self {
method drop (line 130) | fn drop(&mut self) {
FILE: rust/src/worker/utils.rs
type ExitError (line 16) | pub enum ExitError {
type WorkerRunResult (line 34) | pub(super) struct WorkerRunResult {
function run_worker_with_channels (line 39) | pub(super) fn run_worker_with_channels<OE>(
FILE: rust/src/worker/utils/channel_read_fn.rs
function free_vec (line 6) | unsafe extern "C" fn free_vec(message: *mut u8, message_len: u32, messag...
type ChannelReadCallback (line 11) | pub(super) struct ChannelReadCallback {
method new (line 17) | pub(super) fn new(
type PreparedChannelRead (line 24) | pub(crate) struct PreparedChannelRead {
method deconstruct (line 35) | pub(super) unsafe fn deconstruct(self) -> (ChannelReadFn, ChannelReadC...
function prepare_channel_read_fn (line 48) | pub(crate) fn prepare_channel_read_fn<F>(read_callback: F) -> PreparedCh...
FILE: rust/src/worker/utils/channel_write_fn.rs
type CallbackType (line 6) | type CallbackType = Box<dyn FnMut(&[u8]) + Send + 'static>;
type ChannelReadCallback (line 8) | pub(super) struct ChannelReadCallback {
method new (line 14) | pub(super) fn new(_callback: CallbackType) -> Self {
type PreparedChannelWrite (line 19) | pub(crate) struct PreparedChannelWrite {
method deconstruct (line 32) | pub(super) unsafe fn deconstruct(
function prepare_channel_write_fn (line 47) | pub(crate) fn prepare_channel_write_fn<F>(read_callback: F) -> PreparedC...
FILE: rust/src/worker_manager.rs
type Handlers (line 21) | struct Handlers {
type Inner (line 25) | struct Inner {
method drop (line 36) | fn drop(&mut self) {
type WorkerManager (line 69) | pub struct WorkerManager {
method fmt (line 74) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 87) | pub fn new() -> Self {
method with_executor (line 111) | pub fn with_executor(executor: Arc<Executor<'static>>) -> Self {
method create_worker (line 127) | pub async fn create_worker(&self, worker_settings: WorkerSettings) -> ...
method on_new_worker (line 160) | pub fn on_new_worker<F: Fn(&Worker) + Send + Sync + 'static>(&self, ca...
method default (line 80) | fn default() -> Self {
FILE: rust/src/worker_manager/tests.rs
function init (line 4) | fn init() {
function worker_manager_test (line 15) | fn worker_manager_test() {
FILE: rust/tests/integration/active_speaker_observer.rs
function media_codecs (line 17) | fn media_codecs() -> Vec<RtpCodecCapability> {
function init (line 31) | async fn init() -> Worker {
function create (line 49) | fn create() {
function weak (line 89) | fn weak() {
function pause_resume (line 114) | fn pause_r
Condensed preview — 1274 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,464K chars).
[
{
"path": ".editorconfig",
"chars": 329,
"preview": "# EditorConfig is awesome: https://editorconfig.org\n\nroot = true\n\n[*]\nindent_style = tab\nend_of_line = lf\ncharset = utf-"
},
{
"path": ".github/FUNDING.yml",
"chars": 647,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/ISSUE_TEMPLATE/Bug_Report.md",
"chars": 695,
"preview": "---\nname: 🐍 Bug Report\nabout: Report a bug in mediasoup\nlabels: bug\n---\n\n# Bug Report\n\n**IMPORTANT:** We primarily use G"
},
{
"path": ".github/ISSUE_TEMPLATE/Feature_Request.md",
"chars": 119,
"preview": "---\nname: 🚀 Feature Request\nabout: Suggest an idea or improvement for mediasoup\nlabels: feature\n---\n\n# Feature Request\n"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 434,
"preview": "blank_issues_enabled: true\ncontact_links:\n - name: 🙈 Support Question\n url: https://mediasoup.discourse.group\n ab"
},
{
"path": ".github/workflows/mediasoup-codeql.yaml",
"chars": 2697,
"preview": "name: mediasoup-codeql\n\non:\n push:\n branches: [v3]\n paths:\n - 'worker/**'\n - 'node/src/**'\n - 'rus"
},
{
"path": ".github/workflows/mediasoup-node.yaml",
"chars": 4103,
"preview": "name: mediasoup-node\n\non:\n push:\n branches: [v3]\n paths:\n - 'node/**'\n - 'worker/**'\n - 'package.j"
},
{
"path": ".github/workflows/mediasoup-rust.yaml",
"chars": 2233,
"preview": "name: mediasoup-rust\n\non:\n push:\n branches: [v3]\n paths:\n - 'rust/**'\n - 'worker/**'\n - 'Cargo.tom"
},
{
"path": ".github/workflows/mediasoup-worker-clang-tidy.yaml",
"chars": 2114,
"preview": "name: mediasoup-worker-clang-tidy\n\non:\n pull_request:\n paths:\n - 'worker/src/**/*.cpp'\n - 'worker/include/"
},
{
"path": ".github/workflows/mediasoup-worker-fuzzer.yaml",
"chars": 1914,
"preview": "name: mediasoup-worker-fuzzer\n\non:\n push:\n branches: [v3]\n paths:\n - 'worker/**'\n - '.github/workflows/"
},
{
"path": ".github/workflows/mediasoup-worker-prebuild.yaml",
"chars": 2000,
"preview": "name: mediasoup-worker-prebuild\n\n# Only trigger on GitHub releases.\non:\n release:\n types: [published]\n\njobs:\n ci:\n "
},
{
"path": ".github/workflows/mediasoup-worker.yaml",
"chars": 7763,
"preview": "name: mediasoup-worker\n\non:\n push:\n branches: [v3]\n paths:\n - 'worker/**'\n - 'worker/scripts/package.js"
},
{
"path": ".gitignore",
"chars": 736,
"preview": "## Meson.\n/worker/out\n/worker/subprojects/*\n!/worker/subprojects/*.wrap\n!/worker/subprojects/.clang-tidy\n\n## Node.\n/node"
},
{
"path": ".npmrc",
"chars": 117,
"preview": "# Generate package-lock.json.\npackage-lock=true\n# For bad node/npm version to throw actual error.\nengine-strict=true\n"
},
{
"path": ".prettierrc.json",
"chars": 171,
"preview": "{\n\t\"useTabs\": true,\n\t\"tabWidth\": 2,\n\t\"arrowParens\": \"avoid\",\n\t\"bracketSpacing\": true,\n\t\"semi\": true,\n\t\"singleQuote\": tru"
},
{
"path": "CHANGELOG.md",
"chars": 76533,
"preview": "# Changelog\n\n### NEXT\n\n- Node: Update TypeScript to v6 ([PR #1790](https://github.com/versatica/mediasoup/pull/1790)).\n\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 2584,
"preview": "# Contributing to mediasoup\n\nThanks for taking the time to contribute to mediasoup! 🎉👍\n\n## License\n\nBy contributing to m"
},
{
"path": "Cargo.toml",
"chars": 84,
"preview": "[workspace]\nresolver = \"2\"\nmembers = [\n \"rust\",\n \"rust/types\",\n \"worker\"\n]\n"
},
{
"path": "LICENSE",
"chars": 764,
"preview": "ISC License\n\nCopyright © 2015, Iñaki Baz Castillo <ibc@aliax.net>\n\nPermission to use, copy, modify, and/or distribute th"
},
{
"path": "README.md",
"chars": 5471,
"preview": "# mediasoup v3\n\n[![][mediasoup-banner]][mediasoup-website]\n\n[![][npm-shield-mediasoup]][npm-mediasoup]\n[![][crates-shiel"
},
{
"path": "doc/Building.md",
"chars": 13442,
"preview": "# Building\n\nThis document is intended for mediasoup developers.\n\n## NPM scripts\n\nThe `package.json` file in the main fol"
},
{
"path": "doc/Charts.md",
"chars": 623,
"preview": "# Charts\n\n## Broadcasting\n\nmediasoup **v2** (a room uses a single media worker subprocess by design, so a single CPU).\n\n"
},
{
"path": "doc/Closures.md",
"chars": 6202,
"preview": "# Closures\n\nSome considerations:\n\n- Any JS `xxxxx.yyyyyClosed()` method is equivalent to the corresponding C++ `~Xxxxx()"
},
{
"path": "doc/Fuzzer.md",
"chars": 5020,
"preview": "# Fuzzer\n\nOnce we have built the `mediasoup-worker-fuzzer` target in a Linux environment with `fuzzer` capable clang (se"
},
{
"path": "doc/README.md",
"chars": 313,
"preview": "# Internal Documentation\n\n**NOTE:** Internal documentation for developing purposes. Get the mediasoup public documentati"
},
{
"path": "doc/RTCP.md",
"chars": 5511,
"preview": "# RTCP\n\nThis documentation describes how RTCP packets are processed in mediasoup.\n\nBeing a SFU, some received RTCP packe"
},
{
"path": "doc/Rust-crates.md",
"chars": 2631,
"preview": "# Rust crates\n\nThere are 3 crates: `mediasoup`, `mediasoup-sys` and `mediasoup-types`:\n\n- `mediasoup-sys` crate wraps C+"
},
{
"path": "eslint.config.mjs",
"chars": 4957,
"preview": "import eslint from '@eslint/js';\nimport tsEslint from 'typescript-eslint';\nimport jestEslint from 'eslint-plugin-jest';\n"
},
{
"path": "jest.config.mjs",
"chars": 639,
"preview": "const config = {\n\tverbose: true,\n\ttestEnvironment: 'node',\n\ttestRegex: 'node/src/test/test-.*\\\\.ts',\n\ttransform: {\n\t\t// "
},
{
"path": "knip.config.mjs",
"chars": 467,
"preview": "const config = {\n\t$schema: 'https://unpkg.com/knip@5/schema.json',\n\tproject: ['node/src/**/*.ts'],\n\tignore: [\n\t\t'node/sr"
},
{
"path": "node/src/ActiveSpeakerObserver.ts",
"chars": 2550,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tActiveSpeaker"
},
{
"path": "node/src/ActiveSpeakerObserverTypes.ts",
"chars": 1350,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tRtpObserver,\n\tRtpObserverEvents,\n\tRtpObserv"
},
{
"path": "node/src/AudioLevelObserver.ts",
"chars": 3278,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tAudioLevelObs"
},
{
"path": "node/src/AudioLevelObserverTypes.ts",
"chars": 1719,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tRtpObserver,\n\tRtpObserverEvents,\n\tRtpObserv"
},
{
"path": "node/src/Channel.ts",
"chars": 11168,
"preview": "import * as os from 'node:os';\nimport type { Duplex } from 'node:stream';\nimport { info, warn } from 'node:console';\nimp"
},
{
"path": "node/src/Consumer.ts",
"chars": 19877,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tConsumer,\n\tCo"
},
{
"path": "node/src/ConsumerTypes.ts",
"chars": 7841,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { ProducerStat } from './ProducerTypes';\nimpor"
},
{
"path": "node/src/DataConsumer.ts",
"chars": 14516,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tDataConsumer,"
},
{
"path": "node/src/DataConsumerTypes.ts",
"chars": 4700,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { SctpStreamParameters } from './sctpParameter"
},
{
"path": "node/src/DataProducer.ts",
"chars": 8799,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tDataProducer,"
},
{
"path": "node/src/DataProducerTypes.ts",
"chars": 3031,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { SctpStreamParameters } from './sctpParameter"
},
{
"path": "node/src/DirectTransport.ts",
"chars": 6002,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tDirectTranspo"
},
{
"path": "node/src/DirectTransportTypes.ts",
"chars": 1635,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tTransport,\n\tBaseTransportDump,\n\tBaseTranspo"
},
{
"path": "node/src/Logger.ts",
"chars": 1837,
"preview": "import {\n\tdebug as consoleDebug,\n\twarn as consoleWarn,\n\terror as consoleError,\n} from 'node:console';\nimport debug from "
},
{
"path": "node/src/PipeTransport.ts",
"chars": 11206,
"preview": "import type * as flatbuffers from 'flatbuffers';\nimport { Logger } from './Logger';\nimport { EnhancedEventEmitter } from"
},
{
"path": "node/src/PipeTransportTypes.ts",
"chars": 3985,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tTransport,\n\tTransportListenInfo,\n\tTransport"
},
{
"path": "node/src/PlainTransport.ts",
"chars": 9118,
"preview": "import type * as flatbuffers from 'flatbuffers';\nimport { Logger } from './Logger';\nimport { EnhancedEventEmitter } from"
},
{
"path": "node/src/PlainTransportTypes.ts",
"chars": 4147,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tTransport,\n\tTransportListenInfo,\n\tTransport"
},
{
"path": "node/src/Producer.ts",
"chars": 12687,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tProducer,\n\tPr"
},
{
"path": "node/src/ProducerTypes.ts",
"chars": 4396,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { MediaKind, RtpParameters } from './rtpParame"
},
{
"path": "node/src/Router.ts",
"chars": 39553,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport * as ortc from './ort"
},
{
"path": "node/src/RouterTypes.ts",
"chars": 6994,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tTransport,\n\tTransportListenInfo,\n\tTransport"
},
{
"path": "node/src/RtpObserver.ts",
"chars": 5259,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tRtpObserverEv"
},
{
"path": "node/src/RtpObserverTypes.ts",
"chars": 1891,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { Producer } from './ProducerTypes';\nimport ty"
},
{
"path": "node/src/Transport.ts",
"chars": 42345,
"preview": "import type * as flatbuffers from 'flatbuffers';\nimport { Logger } from './Logger';\nimport { EnhancedEventEmitter } from"
},
{
"path": "node/src/TransportTypes.ts",
"chars": 8366,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { Producer, ProducerOptions } from './Producer"
},
{
"path": "node/src/WebRtcServer.ts",
"chars": 5353,
"preview": "import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type { Channel } from"
},
{
"path": "node/src/WebRtcServerTypes.ts",
"chars": 2107,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { TransportListenInfo } from './TransportTypes"
},
{
"path": "node/src/WebRtcTransport.ts",
"chars": 16492,
"preview": "import type * as flatbuffers from 'flatbuffers';\nimport { Logger } from './Logger';\nimport { EnhancedEventEmitter } from"
},
{
"path": "node/src/WebRtcTransportTypes.ts",
"chars": 6203,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type {\n\tTransport,\n\tTransportListenInfo,\n\tTransport"
},
{
"path": "node/src/Worker.ts",
"chars": 17737,
"preview": "// NOTE: Must import `process` using default import otherwise we get the\n// `process` namespace and it doesn't have `rem"
},
{
"path": "node/src/WorkerTypes.ts",
"chars": 5507,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { WebRtcServer, WebRtcServerOptions } from './"
},
{
"path": "node/src/enhancedEvents.ts",
"chars": 3318,
"preview": "/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { EventEmitter, once } from 'node:events';\n\ntype Events "
},
{
"path": "node/src/errors.ts",
"chars": 758,
"preview": "/**\n * Error indicating not support for something.\n */\nexport class UnsupportedError extends Error {\n\tconstructor(messag"
},
{
"path": "node/src/extras.ts",
"chars": 71,
"preview": "export { EnhancedEventEmitter, enhancedOnce } from './enhancedEvents';\n"
},
{
"path": "node/src/fbsUtils.ts",
"chars": 3092,
"preview": "/**\n * Parse flatbuffers vector into an array of the given T.\n */\nexport function parseVector<T>(\n\t// eslint-disable-nex"
},
{
"path": "node/src/index.ts",
"chars": 4356,
"preview": "import { Logger, LoggerEmitter } from './Logger';\nimport { EnhancedEventEmitter } from './enhancedEvents';\nimport type {"
},
{
"path": "node/src/indexTypes.ts",
"chars": 1114,
"preview": "import type { EnhancedEventEmitter } from './enhancedEvents';\nimport type { Worker, WorkerSettings } from './WorkerTypes"
},
{
"path": "node/src/ortc.ts",
"chars": 36124,
"preview": "import * as h264 from 'h264-profile-level-id';\nimport type * as flatbuffers from 'flatbuffers';\nimport { supportedRtpCap"
},
{
"path": "node/src/rtpParametersFbsUtils.ts",
"chars": 13892,
"preview": "import type * as flatbuffers from 'flatbuffers';\nimport type {\n\tRtpParameters,\n\tRtpCodecParameters,\n\tRtcpFeedback,\n\tRtpE"
},
{
"path": "node/src/rtpParametersTypes.ts",
"chars": 10797,
"preview": "/**\n * Media kind ('audio' or 'video').\n */\nexport type MediaKind = 'audio' | 'video';\n\n/**\n * The RTP capabilities defi"
},
{
"path": "node/src/rtpStreamStatsFbsUtils.ts",
"chars": 2967,
"preview": "import {\n\tRtpStreamRecvStats,\n\tRtpStreamSendStats,\n\tBaseRtpStreamStats,\n\tBitrateByLayer,\n} from './rtpStreamStatsTypes';"
},
{
"path": "node/src/rtpStreamStatsTypes.ts",
"chars": 803,
"preview": "export type RtpStreamRecvStats = BaseRtpStreamStats & {\n\ttype: string;\n\tpacketCount: number;\n\tbyteCount: number;\n\tbitrat"
},
{
"path": "node/src/scalabilityModesTypes.ts",
"chars": 100,
"preview": "export type ScalabilityMode = {\n\tspatialLayers: number;\n\ttemporalLayers: number;\n\tksvc: boolean;\n};\n"
},
{
"path": "node/src/scalabilityModesUtils.ts",
"chars": 524,
"preview": "import { ScalabilityMode } from './scalabilityModesTypes';\n\nconst ScalabilityModeRegex = new RegExp(\n\t'^[LS]([1-9]\\\\d{0,"
},
{
"path": "node/src/sctpParametersFbsUtils.ts",
"chars": 1448,
"preview": "import type * as flatbuffers from 'flatbuffers';\nimport type {\n\tSctpStreamParameters,\n\tSctpParametersDump,\n} from './sct"
},
{
"path": "node/src/sctpParametersTypes.ts",
"chars": 2227,
"preview": "export type SctpCapabilities = {\n\tnumStreams: NumSctpStreams;\n};\n\n/**\n * Both OS and MIS are part of the SCTP INIT+ACK h"
},
{
"path": "node/src/srtpParametersFbsUtils.ts",
"chars": 1896,
"preview": "import type * as flatbuffers from 'flatbuffers';\nimport type { SrtpParameters, SrtpCryptoSuite } from './srtpParametersT"
},
{
"path": "node/src/srtpParametersTypes.ts",
"chars": 413,
"preview": "/**\n * SRTP parameters.\n */\nexport type SrtpParameters = {\n\t/**\n\t * Encryption and authentication transforms to be used."
},
{
"path": "node/src/supportedRtpCapabilities.ts",
"chars": 7264,
"preview": "import type { RouterRtpCapabilities } from './rtpParametersTypes';\n\nconst supportedRtpCapabilities: RouterRtpCapabilitie"
},
{
"path": "node/src/test/data/dtls-cert.pem",
"chars": 1939,
"preview": "-----BEGIN CERTIFICATE-----\nMIIFazCCA1OgAwIBAgIUXy3udbf5+Rvhx3MaNGn7vj+zi+UwDQYJKoZIhvcNAQEL\nBQAwRTELMAkGA1UEBhMCQVUxEzA"
},
{
"path": "node/src/test/data/dtls-key.pem",
"chars": 3272,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDLXJlS6702GKmS\nsfOFWzMP2+NvlgNySLiqnAf6bBu"
},
{
"path": "node/src/test/test-ActiveSpeakerObserver.ts",
"chars": 3689,
"preview": "import * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents';\nimport type { WorkerEvents, ActiveSp"
},
{
"path": "node/src/test/test-AudioLevelObserver.ts",
"chars": 3920,
"preview": "import * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents';\nimport type { WorkerEvents, AudioLev"
},
{
"path": "node/src/test/test-Consumer.ts",
"chars": 34953,
"preview": "import * as flatbuffers from 'flatbuffers';\nimport * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedE"
},
{
"path": "node/src/test/test-DataConsumer.ts",
"chars": 15527,
"preview": "import * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents';\nimport type { WorkerEvents, DataCons"
},
{
"path": "node/src/test/test-DataProducer.ts",
"chars": 10760,
"preview": "import * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents';\nimport type { WorkerEvents, DataProd"
},
{
"path": "node/src/test/test-DirectTransport.ts",
"chars": 12025,
"preview": "import * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents';\nimport type { DirectTransportEvents "
},
{
"path": "node/src/test/test-PipeTransport.ts",
"chars": 32472,
"preview": "import { pickPort } from 'pick-port';\nimport * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents'"
},
{
"path": "node/src/test/test-PlainTransport.ts",
"chars": 16292,
"preview": "import * as os from 'node:os';\nimport { pickPort } from 'pick-port';\nimport * as mediasoup from '../';\nimport { enhanced"
},
{
"path": "node/src/test/test-Producer.ts",
"chars": 22457,
"preview": "import * as flatbuffers from 'flatbuffers';\nimport * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedE"
},
{
"path": "node/src/test/test-Router.ts",
"chars": 5645,
"preview": "import * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents';\nimport type { WorkerImpl } from '../"
},
{
"path": "node/src/test/test-WebRtcServer.ts",
"chars": 17843,
"preview": "import { pickPort } from 'pick-port';\nimport * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents'"
},
{
"path": "node/src/test/test-WebRtcTransport.ts",
"chars": 27554,
"preview": "import { pickPort } from 'pick-port';\nimport * as flatbuffers from 'flatbuffers';\nimport * as mediasoup from '../';\nimpo"
},
{
"path": "node/src/test/test-Worker.ts",
"chars": 9442,
"preview": "import * as os from 'node:os';\nimport * as process from 'node:process';\nimport * as path from 'node:path';\nimport * as m"
},
{
"path": "node/src/test/test-mediasoup.ts",
"chars": 2640,
"preview": "import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { enhancedOnce } from '../enhancedEvents';\nimpo"
},
{
"path": "node/src/test/test-multiopus.ts",
"chars": 5483,
"preview": "import * as mediasoup from '../';\nimport { enhancedOnce } from '../enhancedEvents';\nimport type { WorkerEvents } from '."
},
{
"path": "node/src/test/test-ortc.ts",
"chars": 13600,
"preview": "import * as mediasoup from '../';\nimport * as ortc from '../ortc';\nimport { UnsupportedError } from '../errors';\n\ntest('"
},
{
"path": "node/src/test/test-werift-sctp.ts",
"chars": 6046,
"preview": "import { createSocket } from 'node:dgram';\nimport {\n\tSCTP,\n\tSCTP_STATE,\n\tWEBRTC_PPID,\n\tcreateUdpTransport as createSctpU"
},
{
"path": "node/src/types.ts",
"chars": 1101,
"preview": "export type * from './indexTypes';\nexport type * from './WorkerTypes';\nexport type * from './WebRtcServerTypes';\nexport "
},
{
"path": "node/src/utils.ts",
"chars": 1326,
"preview": "import { randomUUID, randomInt } from 'node:crypto';\n\n/**\n * Clones the given value.\n */\nexport function clone<T>(value:"
},
{
"path": "npm-scripts.mjs",
"chars": 18095,
"preview": "import * as process from 'node:process';\nimport * as os from 'node:os';\nimport * as fs from 'node:fs';\nimport * as path "
},
{
"path": "package.json",
"chars": 3942,
"preview": "{\n\t\"name\": \"mediasoup\",\n\t\"version\": \"3.19.22\",\n\t\"description\": \"Cutting Edge WebRTC Video Conferencing\",\n\t\"contributors\""
},
{
"path": "rust/CHANGELOG.md",
"chars": 10343,
"preview": "# Changelog\n\n### NEXT\n\n- Worker: Add `use_built_in_sctp_stack` setting (defaults to `false`) to enable mediasoup built-i"
},
{
"path": "rust/Cargo.toml",
"chars": 1899,
"preview": "[package]\nname = \"mediasoup\"\nversion = \"0.21.0\"\ndescription = \"Cutting Edge WebRTC Video Conferencing in Rust\"\ncategorie"
},
{
"path": "rust/benches/direct_data.rs",
"chars": 2050,
"preview": "use criterion::{criterion_group, criterion_main, Criterion};\nuse mediasoup::prelude::*;\nuse std::borrow::Cow;\nuse std::s"
},
{
"path": "rust/benches/producer.rs",
"chars": 10278,
"preview": "use criterion::{criterion_group, criterion_main, Criterion};\nuse mediasoup::prelude::*;\nuse std::env;\nuse std::net::{IpA"
},
{
"path": "rust/examples/echo.rs",
"chars": 21032,
"preview": "use actix::prelude::*;\nuse actix_web::web::{Data, Payload};\nuse actix_web::{web, App, Error, HttpRequest, HttpResponse, "
},
{
"path": "rust/examples/multiopus.rs",
"chars": 18924,
"preview": "use actix::prelude::*;\nuse actix_web::web::{Data, Payload};\nuse actix_web::{web, App, Error, HttpRequest, HttpResponse, "
},
{
"path": "rust/examples/readme.md",
"chars": 2081,
"preview": "# Examples\nThis directory contains examples of using mediasoup Rust library.\n\nNOTE: These examples are simplified and pr"
},
{
"path": "rust/examples/svc-simulcast.rs",
"chars": 22973,
"preview": "use actix::prelude::*;\nuse actix_web::web::{Data, Payload};\nuse actix_web::{web, App, Error, HttpRequest, HttpResponse, "
},
{
"path": "rust/examples/videoroom.rs",
"chars": 38670,
"preview": "use crate::participant::ParticipantConnection;\nuse crate::room::RoomId;\nuse crate::rooms_registry::RoomsRegistry;\nuse ac"
},
{
"path": "rust/examples-frontend/echo/.eslintrc.js",
"chars": 148,
"preview": "module.exports = {\n\tenv : {\n\t\tbrowser : true,\n\t\tes6 : true\n\t},\n\tparserOptions : {\n\t\tproject : 'tsconfig.json',\n\t\t"
},
{
"path": "rust/examples-frontend/echo/index.html",
"chars": 554,
"preview": "<!doctype html>\n<style>\n body {\n margin: 0;\n }\n\n #container {\n display: flex;\n }\n\n figure {"
},
{
"path": "rust/examples-frontend/echo/package.json",
"chars": 421,
"preview": "{\n \"version\": \"0.0.0\",\n \"private\": true,\n \"engines\": {\n \"node\": \">=14.8\"\n },\n \"scripts\": {\n \"start\": \"webpack"
},
{
"path": "rust/examples-frontend/echo/src/index.ts",
"chars": 7882,
"preview": "/* eslint-disable no-console */\nimport { Device } from 'mediasoup-client';\nimport { MediaKind, RtpCapabilities, RtpParam"
},
{
"path": "rust/examples-frontend/echo/tsconfig.json",
"chars": 551,
"preview": "{\n \"compilerOptions\": {\n \"module\": \"es6\",\n \"target\": \"es2018\",\n \"sourceMap\": true,\n \"forceConsistentCasingI"
},
{
"path": "rust/examples-frontend/echo/webpack.config.js",
"chars": 474,
"preview": "const path = require('path');\n\nmodule.exports = {\n\tmode : 'development',\n\tentry : './src/index.ts',\n\tmodule : {\n\t\trul"
},
{
"path": "rust/examples-frontend/multiopus/.eslintrc.js",
"chars": 148,
"preview": "module.exports = {\n\tenv : {\n\t\tbrowser : true,\n\t\tes6 : true\n\t},\n\tparserOptions : {\n\t\tproject : 'tsconfig.json',\n\t\t"
},
{
"path": "rust/examples-frontend/multiopus/index.html",
"chars": 730,
"preview": "<!doctype html>\n<style>\n body {\n margin: 0;\n }\n\n #container {\n display: flex;\n }\n\n button {"
},
{
"path": "rust/examples-frontend/multiopus/package.json",
"chars": 421,
"preview": "{\n \"version\": \"0.0.0\",\n \"private\": true,\n \"engines\": {\n \"node\": \">=14.8\"\n },\n \"scripts\": {\n \"start\": \"webpack"
},
{
"path": "rust/examples-frontend/multiopus/src/index.ts",
"chars": 6630,
"preview": "/* eslint-disable no-console */\nimport { Device } from 'mediasoup-client';\nimport { MediaKind, RtpCapabilities, RtpParam"
},
{
"path": "rust/examples-frontend/multiopus/tsconfig.json",
"chars": 551,
"preview": "{\n \"compilerOptions\": {\n \"module\": \"es6\",\n \"target\": \"es2018\",\n \"sourceMap\": true,\n \"forceConsistentCasingI"
},
{
"path": "rust/examples-frontend/multiopus/webpack.config.js",
"chars": 474,
"preview": "const path = require('path');\n\nmodule.exports = {\n\tmode : 'development',\n\tentry : './src/index.ts',\n\tmodule : {\n\t\trul"
},
{
"path": "rust/examples-frontend/readme.md",
"chars": 488,
"preview": "# Examples\nThis directory contains complementary frontend examples of using mediasoup Rust library.\n\nNOTE: These example"
},
{
"path": "rust/examples-frontend/svc-simulcast/.eslintrc.js",
"chars": 148,
"preview": "module.exports = {\n\tenv : {\n\t\tbrowser : true,\n\t\tes6 : true\n\t},\n\tparserOptions : {\n\t\tproject : 'tsconfig.json',\n\t\t"
},
{
"path": "rust/examples-frontend/svc-simulcast/index.html",
"chars": 999,
"preview": "<!doctype html>\n<style>\n body {\n margin: 0;\n }\n\n #container {\n display: flex;\n flex-direct"
},
{
"path": "rust/examples-frontend/svc-simulcast/package.json",
"chars": 421,
"preview": "{\n \"version\": \"0.0.0\",\n \"private\": true,\n \"engines\": {\n \"node\": \">=14.8\"\n },\n \"scripts\": {\n \"start\": \"webpack"
},
{
"path": "rust/examples-frontend/svc-simulcast/src/index.ts",
"chars": 12164,
"preview": "/* eslint-disable no-console */\nimport { Device, parseScalabilityMode } from 'mediasoup-client';\nimport { MediaKind, Rtp"
},
{
"path": "rust/examples-frontend/svc-simulcast/tsconfig.json",
"chars": 551,
"preview": "{\n \"compilerOptions\": {\n \"module\": \"es6\",\n \"target\": \"es2018\",\n \"sourceMap\": true,\n \"forceConsistentCasingI"
},
{
"path": "rust/examples-frontend/svc-simulcast/webpack.config.js",
"chars": 474,
"preview": "const path = require('path');\n\nmodule.exports = {\n\tmode : 'development',\n\tentry : './src/index.ts',\n\tmodule : {\n\t\trul"
},
{
"path": "rust/examples-frontend/videoroom/.eslintrc.js",
"chars": 148,
"preview": "module.exports = {\n\tenv : {\n\t\tbrowser : true,\n\t\tes6 : true\n\t},\n\tparserOptions : {\n\t\tproject : 'tsconfig.json',\n\t\t"
},
{
"path": "rust/examples-frontend/videoroom/index.html",
"chars": 409,
"preview": "<!doctype html>\n<style>\n body {\n margin: 0;\n }\n\n #container {\n display: flex;\n }\n\n figure {"
},
{
"path": "rust/examples-frontend/videoroom/package.json",
"chars": 421,
"preview": "{\n \"version\": \"0.0.0\",\n \"private\": true,\n \"engines\": {\n \"node\": \">=14.8\"\n },\n \"scripts\": {\n \"start\": \"webpack"
},
{
"path": "rust/examples-frontend/videoroom/src/index.ts",
"chars": 10787,
"preview": "/* eslint-disable no-console */\nimport { Device } from 'mediasoup-client';\nimport { MediaKind, RtpCapabilities, RtpParam"
},
{
"path": "rust/examples-frontend/videoroom/tsconfig.json",
"chars": 551,
"preview": "{\n \"compilerOptions\": {\n \"module\": \"es6\",\n \"target\": \"es2018\",\n \"sourceMap\": true,\n \"forceConsistentCasingI"
},
{
"path": "rust/examples-frontend/videoroom/webpack.config.js",
"chars": 474,
"preview": "const path = require('path');\n\nmodule.exports = {\n\tmode : 'development',\n\tentry : './src/index.ts',\n\tmodule : {\n\t\trul"
},
{
"path": "rust/src/data_structures.rs",
"chars": 13421,
"preview": "//! Miscellaneous data structures.\n\nuse mediasoup_sys::fbs::{\n common, producer, rtp_packet, sctp_association, transp"
},
{
"path": "rust/src/fbs.rs",
"chars": 1431,
"preview": "//! Traits for converting between Rust and FlatBuffers data structures.\n\npub(crate) trait TryFromFbs<'a>: Sized {\n ty"
},
{
"path": "rust/src/lib.rs",
"chars": 9952,
"preview": "#![warn(rust_2018_idioms, missing_debug_implementations, missing_docs)]\n//! Rust port of [mediasoup](https://github.com/"
},
{
"path": "rust/src/macros.rs",
"chars": 1374,
"preview": "#[doc(hidden)]\n#[macro_export]\nmacro_rules! uuid_based_wrapper_type {\n (\n $(#[$outer:meta])*\n $struct_n"
},
{
"path": "rust/src/messages.rs",
"chars": 119793,
"preview": "use crate::active_speaker_observer::ActiveSpeakerObserverOptions;\nuse crate::audio_level_observer::AudioLevelObserverOpt"
},
{
"path": "rust/src/ortc/tests.rs",
"chars": 24079,
"preview": "use super::*;\nuse mediasoup_types::rtp_parameters::{MimeTypeAudio, RtpHeaderExtension};\nuse std::iter;\n\n#[test]\nfn gener"
},
{
"path": "rust/src/ortc.rs",
"chars": 43291,
"preview": "use crate::fbs::{ToFbs, TryFromFbs};\nuse crate::supported_rtp_capabilities;\nuse mediasoup_sys::fbs::rtp_parameters;\nuse "
},
{
"path": "rust/src/prelude.rs",
"chars": 2824,
"preview": "//! mediasoup prelude.\n//!\n//! Re-exports commonly used traits and structs from this crate.\n//!\n//! # Examples\n//!\n//! I"
},
{
"path": "rust/src/router/active_speaker_observer/tests.rs",
"chars": 1861,
"preview": "use crate::active_speaker_observer::ActiveSpeakerObserverOptions;\nuse crate::router::RouterOptions;\nuse crate::rtp_obser"
},
{
"path": "rust/src/router/active_speaker_observer.rs",
"chars": 13866,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::fbs::TryFromFbs;\nuse crate::messages::{\n RtpObserverAddProducerRequest, RtpObserv"
},
{
"path": "rust/src/router/audio_level_observer/tests.rs",
"chars": 1834,
"preview": "use crate::audio_level_observer::AudioLevelObserverOptions;\nuse crate::router::RouterOptions;\nuse crate::rtp_observer::R"
},
{
"path": "rust/src/router/audio_level_observer.rs",
"chars": 15229,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::fbs::TryFromFbs;\nuse crate::messages::{\n RtpObserverAddProducerRequest, RtpObserv"
},
{
"path": "rust/src/router/consumer/tests.rs",
"chars": 5946,
"preview": "use crate::consumer::ConsumerOptions;\nuse crate::producer::ProducerOptions;\nuse crate::router::{Router, RouterOptions};\n"
},
{
"path": "rust/src/router/consumer.rs",
"chars": 50428,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::fbs::{FromFbs, ToFbs, TryFromFbs};\nuse crate::messages::{\n ConsumerCloseRequest, "
},
{
"path": "rust/src/router/data_consumer/tests.rs",
"chars": 5806,
"preview": "use crate::data_consumer::DataConsumerOptions;\nuse crate::data_producer::{DataProducer, DataProducerOptions};\nuse crate:"
},
{
"path": "rust/src/router/data_consumer.rs",
"chars": 35736,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::data_producer::{DataProducer, DataProducerId, WeakDataProducer};\nuse crate::fbs::{Fr"
},
{
"path": "rust/src/router/data_producer/tests.rs",
"chars": 2905,
"preview": "use crate::data_producer::DataProducerOptions;\nuse crate::router::{Router, RouterOptions};\nuse crate::transport::Transpo"
},
{
"path": "rust/src/router/data_producer.rs",
"chars": 21279,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::fbs::{FromFbs, TryFromFbs};\nuse crate::messages::{\n DataProducerCloseRequest, Dat"
},
{
"path": "rust/src/router/direct_transport/tests.rs",
"chars": 1821,
"preview": "use crate::direct_transport::{DirectTransport, DirectTransportOptions};\nuse crate::router::{Router, RouterOptions};\nuse "
},
{
"path": "rust/src/router/direct_transport.rs",
"chars": 24362,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::consumer::{Consumer, ConsumerId, ConsumerOptions};\nuse crate::data_consumer::{DataCo"
},
{
"path": "rust/src/router/pipe_transport/tests.rs",
"chars": 6854,
"preview": "use crate::consumer::ConsumerOptions;\nuse crate::data_consumer::DataConsumerOptions;\nuse crate::data_producer::DataProdu"
},
{
"path": "rust/src/router/pipe_transport.rs",
"chars": 28799,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::consumer::{Consumer, ConsumerId, ConsumerOptions};\nuse crate::data_consumer::{DataCo"
},
{
"path": "rust/src/router/plain_transport/tests.rs",
"chars": 2444,
"preview": "use crate::plain_transport::PlainTransportOptions;\nuse crate::router::{Router, RouterOptions};\nuse crate::transport::Tra"
},
{
"path": "rust/src/router/plain_transport.rs",
"chars": 37636,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::consumer::{Consumer, ConsumerId, ConsumerOptions};\nuse crate::data_consumer::{DataCo"
},
{
"path": "rust/src/router/producer/tests.rs",
"chars": 3770,
"preview": "use crate::producer::ProducerOptions;\nuse crate::router::{Router, RouterOptions};\nuse crate::transport::Transport;\nuse c"
},
{
"path": "rust/src/router/producer.rs",
"chars": 39499,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::consumer::{RtpStreamParams, RtxStreamParams};\nuse crate::fbs::{FromFbs, ToFbs, TryFr"
},
{
"path": "rust/src/router/rtp_observer.rs",
"chars": 3350,
"preview": "use crate::producer::{Producer, ProducerId};\nuse crate::router::Router;\nuse crate::uuid_based_wrapper_type;\nuse crate::w"
},
{
"path": "rust/src/router/tests.rs",
"chars": 1550,
"preview": "use crate::router::RouterOptions;\nuse crate::worker::{Worker, WorkerSettings};\nuse crate::worker_manager::WorkerManager;"
},
{
"path": "rust/src/router/transport.rs",
"chars": 32869,
"preview": "use crate::consumer::{Consumer, ConsumerId, ConsumerOptions, ConsumerType};\nuse crate::data_consumer::{DataConsumer, Dat"
},
{
"path": "rust/src/router/webrtc_transport/tests.rs",
"chars": 11824,
"preview": "use crate::prelude::WebRtcTransport;\nuse crate::router::{NewTransport, Router, RouterOptions};\nuse crate::transport::Tra"
},
{
"path": "rust/src/router/webrtc_transport.rs",
"chars": 42504,
"preview": "#[cfg(test)]\nmod tests;\n\nuse crate::consumer::{Consumer, ConsumerId, ConsumerOptions};\nuse crate::data_consumer::{DataCo"
},
{
"path": "rust/src/router.rs",
"chars": 59069,
"preview": "//! A router enables injection, selection and forwarding of media streams through [`Transport`]\n//! instances created on"
},
{
"path": "rust/src/rtp_parameters.rs",
"chars": 16711,
"preview": "//! Collection of RTP-related data structures that are used to specify codec parameters and\n//! capabilities of various "
},
{
"path": "rust/src/scalability_modes.rs",
"chars": 11014,
"preview": "//! Scalability mode.\n\nuse once_cell::sync::OnceCell;\nuse regex::Regex;\nuse serde::{de, Deserialize, Deserializer, Seria"
},
{
"path": "rust/src/sctp_parameters.rs",
"chars": 1554,
"preview": "//! SCTP parameters.\n\nuse crate::fbs::{FromFbs, ToFbs};\nuse mediasoup_sys::fbs::sctp_parameters;\nuse mediasoup_types::sc"
},
{
"path": "rust/src/srtp_parameters.rs",
"chars": 1840,
"preview": "//! SRTP parameters.\n\nuse crate::fbs::{FromFbs, ToFbs};\nuse mediasoup_sys::fbs::srtp_parameters;\nuse mediasoup_types::sr"
},
{
"path": "rust/src/supported_rtp_capabilities.rs",
"chars": 17546,
"preview": "//! RTP capabilities supported by mediasoup.\n\nuse mediasoup_types::rtp_parameters::{\n MediaKind, MimeTypeAudio, MimeT"
},
{
"path": "rust/src/webrtc_server/tests.rs",
"chars": 2218,
"preview": "use crate::webrtc_server::{WebRtcServerListenInfos, WebRtcServerOptions};\nuse crate::worker::{Worker, WorkerSettings};\nu"
},
{
"path": "rust/src/webrtc_server.rs",
"chars": 10472,
"preview": "//! A WebRTC server brings the ability to listen on a single UDP/TCP port for multiple\n//! `WebRtcTransport`s.\n//!\n//! A"
},
{
"path": "rust/src/worker/channel.rs",
"chars": 19268,
"preview": "use crate::messages::{Notification, Request};\nuse crate::worker::common::{EventHandlers, SubscriptionTarget, WeakEventHa"
},
{
"path": "rust/src/worker/common.rs",
"chars": 4264,
"preview": "use hash_hasher::HashedMap;\nuse mediasoup_sys::fbs::notification;\nuse nohash_hasher::IntMap;\nuse parking_lot::Mutex;\nuse"
},
{
"path": "rust/src/worker/utils/channel_read_fn.rs",
"chars": 3031,
"preview": "pub(super) use mediasoup_sys::{ChannelReadCtx, ChannelReadFn};\nuse mediasoup_sys::{ChannelReadFreeFn, UvAsyncT};\nuse std"
},
{
"path": "rust/src/worker/utils/channel_write_fn.rs",
"chars": 2317,
"preview": "pub(super) use mediasoup_sys::{ChannelWriteCtx, ChannelWriteFn};\nuse std::os::raw::c_void;\nuse std::slice;\n\n/// TypeAlia"
},
{
"path": "rust/src/worker/utils.rs",
"chars": 3489,
"preview": "mod channel_read_fn;\nmod channel_write_fn;\n\nuse crate::worker::channel::BufferMessagesGuard;\nuse crate::worker::{Channel"
},
{
"path": "rust/src/worker.rs",
"chars": 25388,
"preview": "//! A worker represents a mediasoup C++ thread that runs on a single CPU core and handles\n//! [`Router`] instances.\n\nmod"
},
{
"path": "rust/src/worker_manager/tests.rs",
"chars": 552,
"preview": "use super::*;\nuse std::env;\n\nfn init() {\n {\n let mut builder = env_logger::builder();\n if env::var(env_"
},
{
"path": "rust/src/worker_manager.rs",
"chars": 4817,
"preview": "//! Container that creates [`Worker`] instances.\n\n#[cfg(test)]\nmod tests;\n\nuse crate::worker::{Worker, WorkerId, WorkerS"
},
{
"path": "rust/tests/integration/active_speaker_observer.rs",
"chars": 6084,
"preview": "use async_io::Timer;\nuse futures_lite::future;\nuse mediasoup::active_speaker_observer::ActiveSpeakerObserverOptions;\nuse"
},
{
"path": "rust/tests/integration/audio_level_observer.rs",
"chars": 5907,
"preview": "use async_io::Timer;\nuse futures_lite::future;\nuse mediasoup::audio_level_observer::AudioLevelObserverOptions;\nuse media"
},
{
"path": "rust/tests/integration/consumer.rs",
"chars": 55494,
"preview": "use async_executor::Executor;\nuse async_io::Timer;\nuse futures_lite::future;\nuse hash_hasher::{HashedMap, HashedSet};\nus"
},
{
"path": "rust/tests/integration/data/dtls-cert.pem",
"chars": 1939,
"preview": "-----BEGIN CERTIFICATE-----\nMIIFazCCA1OgAwIBAgIUXy3udbf5+Rvhx3MaNGn7vj+zi+UwDQYJKoZIhvcNAQEL\nBQAwRTELMAkGA1UEBhMCQVUxEzA"
},
{
"path": "rust/tests/integration/data/dtls-key.pem",
"chars": 3272,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDLXJlS6702GKmS\nsfOFWzMP2+NvlgNySLiqnAf6bBu"
},
{
"path": "rust/tests/integration/data_consumer.rs",
"chars": 24452,
"preview": "use async_io::Timer;\nuse futures_lite::future;\nuse hash_hasher::{HashedMap, HashedSet};\nuse mediasoup::data_consumer::{D"
},
{
"path": "rust/tests/integration/data_producer.rs",
"chars": 18782,
"preview": "use async_io::Timer;\nuse futures_lite::future;\nuse hash_hasher::{HashedMap, HashedSet};\nuse mediasoup::data_producer::{D"
},
{
"path": "rust/tests/integration/direct_transport.rs",
"chars": 19849,
"preview": "use futures_lite::future;\nuse hash_hasher::HashedSet;\nuse mediasoup::data_consumer::DataConsumerOptions;\nuse mediasoup::"
},
{
"path": "rust/tests/integration/main.rs",
"chars": 275,
"preview": "mod active_speaker_observer;\nmod audio_level_observer;\nmod consumer;\nmod data_consumer;\nmod data_producer;\nmod direct_tr"
},
{
"path": "rust/tests/integration/multiopus.rs",
"chars": 10748,
"preview": "use futures_lite::future;\nuse mediasoup::prelude::*;\nuse mediasoup::producer::ProducerOptions;\nuse mediasoup::router::{R"
},
{
"path": "rust/tests/integration/pipe_transport.rs",
"chars": 46800,
"preview": "use futures_lite::future;\nuse mediasoup::consumer::{ConsumerOptions, ConsumerScore, ConsumerType};\nuse mediasoup::data_c"
},
{
"path": "rust/tests/integration/plain_transport.rs",
"chars": 27480,
"preview": "use futures_lite::future;\nuse hash_hasher::HashedSet;\nuse mediasoup::plain_transport::{PlainTransportOptions, PlainTrans"
},
{
"path": "rust/tests/integration/producer.rs",
"chars": 33661,
"preview": "use async_io::Timer;\nuse futures_lite::future;\nuse hash_hasher::{HashedMap, HashedSet};\nuse mediasoup::prelude::*;\nuse m"
},
{
"path": "rust/tests/integration/router.rs",
"chars": 5695,
"preview": "use futures_lite::future;\nuse hash_hasher::{HashedMap, HashedSet};\nuse mediasoup::router::RouterOptions;\nuse mediasoup::"
},
{
"path": "rust/tests/integration/smoke.rs",
"chars": 14830,
"preview": "use futures_lite::future;\nuse mediasoup::active_speaker_observer::ActiveSpeakerObserverOptions;\nuse mediasoup::audio_lev"
},
{
"path": "rust/tests/integration/webrtc_server.rs",
"chars": 13746,
"preview": "use futures_lite::future;\nuse hash_hasher::HashedSet;\nuse mediasoup::webrtc_server::{WebRtcServerIpPort, WebRtcServerLis"
}
]
// ... and 1074 more files (download for full content)
About this extraction
This page contains the full source code of the ibc/mediasoup GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1274 files (6.5 MB), approximately 1.8M tokens, and a symbol index with 6147 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.