@lakutata/webrtc 0.0.0-stage → 3.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/README.md +509 -2
- package/README.zh-CN.md +399 -0
- package/THIRD_PARTY_NOTICES.md +652 -0
- package/dist/cjs/client/SignalingConnection.d.ts +81 -0
- package/dist/cjs/client/SignalingConnection.js +67 -0
- package/dist/cjs/cluster/Cluster.d.ts +503 -0
- package/dist/cjs/cluster/Cluster.js +546 -0
- package/dist/cjs/cluster/ClusterFrames.d.ts +24 -0
- package/dist/cjs/cluster/ClusterFrames.js +90 -0
- package/dist/cjs/cluster/ClusterTURN.d.ts +63 -0
- package/dist/cjs/cluster/ClusterTURN.js +78 -0
- package/dist/cjs/cluster/Rendezvous.d.ts +8 -0
- package/dist/cjs/cluster/Rendezvous.js +23 -0
- package/dist/cjs/cluster/transports/ClusterTransport.d.ts +34 -0
- package/dist/cjs/cluster/transports/ClusterTransport.js +2 -0
- package/dist/cjs/cluster/transports/LoadClient.d.ts +6 -0
- package/dist/cjs/cluster/transports/LoadClient.js +80 -0
- package/dist/cjs/cluster/transports/MemoryClusterTransport.d.ts +13 -0
- package/dist/cjs/cluster/transports/MemoryClusterTransport.js +47 -0
- package/dist/cjs/cluster/transports/NATSClusterTransport.d.ts +23 -0
- package/dist/cjs/cluster/transports/NATSClusterTransport.js +70 -0
- package/dist/cjs/cluster/transports/RedisClusterTransport.d.ts +23 -0
- package/dist/cjs/cluster/transports/RedisClusterTransport.js +77 -0
- package/dist/cjs/exceptions/ClusterRequestException.d.ts +11 -0
- package/dist/cjs/exceptions/ClusterRequestException.js +18 -0
- package/dist/cjs/exceptions/ClusterTimeoutException.d.ts +10 -0
- package/dist/cjs/exceptions/ClusterTimeoutException.js +17 -0
- package/dist/cjs/exceptions/ClusterTransportNotFoundException.d.ts +11 -0
- package/dist/cjs/exceptions/ClusterTransportNotFoundException.js +18 -0
- package/dist/cjs/exceptions/SignalingClientRequiredException.d.ts +12 -0
- package/dist/cjs/exceptions/SignalingClientRequiredException.js +19 -0
- package/dist/cjs/exceptions/SignalingConnectionException.d.ts +12 -0
- package/dist/cjs/exceptions/SignalingConnectionException.js +19 -0
- package/dist/cjs/exceptions/SignalingDeniedException.d.ts +11 -0
- package/dist/cjs/exceptions/SignalingDeniedException.js +18 -0
- package/dist/cjs/exceptions/SignalingLimitException.d.ts +11 -0
- package/dist/cjs/exceptions/SignalingLimitException.js +18 -0
- package/dist/cjs/exceptions/SignalingNotAMemberException.d.ts +11 -0
- package/dist/cjs/exceptions/SignalingNotAMemberException.js +18 -0
- package/dist/cjs/exceptions/WHEPDeniedException.d.ts +15 -0
- package/dist/cjs/exceptions/WHEPDeniedException.js +22 -0
- package/dist/cjs/exceptions/WHEPLimitException.d.ts +15 -0
- package/dist/cjs/exceptions/WHEPLimitException.js +22 -0
- package/dist/cjs/exceptions/WHEPMediaTypeException.d.ts +15 -0
- package/dist/cjs/exceptions/WHEPMediaTypeException.js +22 -0
- package/dist/cjs/exceptions/WHEPOfferException.d.ts +16 -0
- package/dist/cjs/exceptions/WHEPOfferException.js +23 -0
- package/dist/cjs/exceptions/WHEPSessionNotFoundException.d.ts +15 -0
- package/dist/cjs/exceptions/WHEPSessionNotFoundException.js +22 -0
- package/dist/cjs/exceptions/WHIPDeniedException.d.ts +15 -0
- package/dist/cjs/exceptions/WHIPDeniedException.js +22 -0
- package/dist/cjs/exceptions/WHIPLimitException.d.ts +15 -0
- package/dist/cjs/exceptions/WHIPLimitException.js +22 -0
- package/dist/cjs/exceptions/WHIPMediaTypeException.d.ts +15 -0
- package/dist/cjs/exceptions/WHIPMediaTypeException.js +22 -0
- package/dist/cjs/exceptions/WHIPOfferException.d.ts +16 -0
- package/dist/cjs/exceptions/WHIPOfferException.js +23 -0
- package/dist/cjs/exceptions/WHIPSessionNotFoundException.d.ts +15 -0
- package/dist/cjs/exceptions/WHIPSessionNotFoundException.js +22 -0
- package/dist/cjs/exports/Client.d.ts +11 -0
- package/dist/cjs/exports/Client.js +29 -0
- package/dist/cjs/exports/WebRTC.d.ts +48 -0
- package/dist/cjs/exports/WebRTC.js +72 -0
- package/dist/cjs/lib/common/binary.d.ts +51 -0
- package/dist/cjs/lib/common/binary.js +264 -0
- package/dist/cjs/lib/common/binaryData.d.ts +116 -0
- package/dist/cjs/lib/common/binaryData.js +400 -0
- package/dist/cjs/lib/common/crc.d.ts +4 -0
- package/dist/cjs/lib/common/crc.js +122 -0
- package/dist/cjs/lib/common/deque.d.ts +36 -0
- package/dist/cjs/lib/common/deque.js +89 -0
- package/dist/cjs/lib/common/event.d.ts +48 -0
- package/dist/cjs/lib/common/event.js +207 -0
- package/dist/cjs/lib/common/index.d.ts +11 -0
- package/dist/cjs/lib/common/index.js +50 -0
- package/dist/cjs/lib/common/log.d.ts +47 -0
- package/dist/cjs/lib/common/log.js +62 -0
- package/dist/cjs/lib/common/network.d.ts +10 -0
- package/dist/cjs/lib/common/network.js +60 -0
- package/dist/cjs/lib/common/number.d.ts +13 -0
- package/dist/cjs/lib/common/number.js +43 -0
- package/dist/cjs/lib/common/promise.d.ts +21 -0
- package/dist/cjs/lib/common/promise.js +70 -0
- package/dist/cjs/lib/common/transport.d.ts +104 -0
- package/dist/cjs/lib/common/transport.js +441 -0
- package/dist/cjs/lib/common/type.d.ts +3 -0
- package/dist/cjs/lib/common/type.js +2 -0
- package/dist/cjs/lib/dtls/cipher/const.d.ts +42 -0
- package/dist/cjs/lib/dtls/cipher/const.js +33 -0
- package/dist/cjs/lib/dtls/cipher/create.d.ts +21 -0
- package/dist/cjs/lib/dtls/cipher/create.js +105 -0
- package/dist/cjs/lib/dtls/cipher/ec.d.ts +28 -0
- package/dist/cjs/lib/dtls/cipher/ec.js +44 -0
- package/dist/cjs/lib/dtls/cipher/key-exchange.d.ts +43 -0
- package/dist/cjs/lib/dtls/cipher/key-exchange.js +113 -0
- package/dist/cjs/lib/dtls/cipher/namedCurve.d.ts +7 -0
- package/dist/cjs/lib/dtls/cipher/namedCurve.js +27 -0
- package/dist/cjs/lib/dtls/cipher/prf.d.ts +17 -0
- package/dist/cjs/lib/dtls/cipher/prf.js +92 -0
- package/dist/cjs/lib/dtls/cipher/suites/abstract.d.ts +40 -0
- package/dist/cjs/lib/dtls/cipher/suites/abstract.js +41 -0
- package/dist/cjs/lib/dtls/cipher/suites/aead.d.ts +28 -0
- package/dist/cjs/lib/dtls/cipher/suites/aead.js +132 -0
- package/dist/cjs/lib/dtls/cipher/suites/null.d.ts +24 -0
- package/dist/cjs/lib/dtls/cipher/suites/null.js +41 -0
- package/dist/cjs/lib/dtls/cipher/utils.d.ts +18 -0
- package/dist/cjs/lib/dtls/cipher/utils.js +70 -0
- package/dist/cjs/lib/dtls/cipher/x509.d.ts +33 -0
- package/dist/cjs/lib/dtls/cipher/x509.js +100 -0
- package/dist/cjs/lib/dtls/client.d.ts +7 -0
- package/dist/cjs/lib/dtls/client.js +76 -0
- package/dist/cjs/lib/dtls/context/cipher.d.ts +42 -0
- package/dist/cjs/lib/dtls/context/cipher.js +87 -0
- package/dist/cjs/lib/dtls/context/dtls.d.ts +38 -0
- package/dist/cjs/lib/dtls/context/dtls.js +49 -0
- package/dist/cjs/lib/dtls/context/srtp.d.ts +5 -0
- package/dist/cjs/lib/dtls/context/srtp.js +12 -0
- package/dist/cjs/lib/dtls/context/transport.d.ts +8 -0
- package/dist/cjs/lib/dtls/context/transport.js +17 -0
- package/dist/cjs/lib/dtls/flight/client/flight1.d.ts +10 -0
- package/dist/cjs/lib/dtls/flight/client/flight1.js +26 -0
- package/dist/cjs/lib/dtls/flight/client/flight3.d.ts +8 -0
- package/dist/cjs/lib/dtls/flight/client/flight3.js +25 -0
- package/dist/cjs/lib/dtls/flight/client/flight5.d.ts +18 -0
- package/dist/cjs/lib/dtls/flight/client/flight5.js +206 -0
- package/dist/cjs/lib/dtls/flight/flight.d.ts +18 -0
- package/dist/cjs/lib/dtls/flight/flight.js +68 -0
- package/dist/cjs/lib/dtls/flight/server/flight2.d.ts +6 -0
- package/dist/cjs/lib/dtls/flight/server/flight2.js +126 -0
- package/dist/cjs/lib/dtls/flight/server/flight4.d.ts +17 -0
- package/dist/cjs/lib/dtls/flight/server/flight4.js +87 -0
- package/dist/cjs/lib/dtls/flight/server/flight6.d.ts +13 -0
- package/dist/cjs/lib/dtls/flight/server/flight6.js +111 -0
- package/dist/cjs/lib/dtls/handshake/binary.d.ts +16 -0
- package/dist/cjs/lib/dtls/handshake/binary.js +20 -0
- package/dist/cjs/lib/dtls/handshake/const.d.ts +13 -0
- package/dist/cjs/lib/dtls/handshake/const.js +17 -0
- package/dist/cjs/lib/dtls/handshake/extensions/ellipticCurves.d.ts +17 -0
- package/dist/cjs/lib/dtls/handshake/extensions/ellipticCurves.js +40 -0
- package/dist/cjs/lib/dtls/handshake/extensions/extendedMasterSecret.d.ts +3 -0
- package/dist/cjs/lib/dtls/handshake/extensions/extendedMasterSecret.js +7 -0
- package/dist/cjs/lib/dtls/handshake/extensions/renegotiationIndication.d.ts +18 -0
- package/dist/cjs/lib/dtls/handshake/extensions/renegotiationIndication.js +34 -0
- package/dist/cjs/lib/dtls/handshake/extensions/signature.d.ts +26 -0
- package/dist/cjs/lib/dtls/handshake/extensions/signature.js +39 -0
- package/dist/cjs/lib/dtls/handshake/extensions/useSrtp.d.ts +19 -0
- package/dist/cjs/lib/dtls/handshake/extensions/useSrtp.js +65 -0
- package/dist/cjs/lib/dtls/handshake/message/alert.d.ts +12 -0
- package/dist/cjs/lib/dtls/handshake/message/alert.js +24 -0
- package/dist/cjs/lib/dtls/handshake/message/certificate.d.ts +17 -0
- package/dist/cjs/lib/dtls/handshake/message/certificate.js +35 -0
- package/dist/cjs/lib/dtls/handshake/message/changeCipherSpec.d.ts +11 -0
- package/dist/cjs/lib/dtls/handshake/message/changeCipherSpec.js +24 -0
- package/dist/cjs/lib/dtls/handshake/message/client/certificateVerify.d.ts +20 -0
- package/dist/cjs/lib/dtls/handshake/message/client/certificateVerify.js +35 -0
- package/dist/cjs/lib/dtls/handshake/message/client/hello.d.ts +50 -0
- package/dist/cjs/lib/dtls/handshake/message/client/hello.js +48 -0
- package/dist/cjs/lib/dtls/handshake/message/client/keyExchange.d.ts +17 -0
- package/dist/cjs/lib/dtls/handshake/message/client/keyExchange.js +33 -0
- package/dist/cjs/lib/dtls/handshake/message/finished.d.ts +13 -0
- package/dist/cjs/lib/dtls/handshake/message/finished.js +26 -0
- package/dist/cjs/lib/dtls/handshake/message/server/certificateRequest.d.ts +31 -0
- package/dist/cjs/lib/dtls/handshake/message/server/certificateRequest.js +38 -0
- package/dist/cjs/lib/dtls/handshake/message/server/hello.d.ts +33 -0
- package/dist/cjs/lib/dtls/handshake/message/server/hello.js +57 -0
- package/dist/cjs/lib/dtls/handshake/message/server/helloDone.d.ts +12 -0
- package/dist/cjs/lib/dtls/handshake/message/server/helloDone.js +30 -0
- package/dist/cjs/lib/dtls/handshake/message/server/helloVerifyRequest.d.ts +32 -0
- package/dist/cjs/lib/dtls/handshake/message/server/helloVerifyRequest.js +42 -0
- package/dist/cjs/lib/dtls/handshake/message/server/keyExchange.d.ts +32 -0
- package/dist/cjs/lib/dtls/handshake/message/server/keyExchange.js +49 -0
- package/dist/cjs/lib/dtls/handshake/random.d.ts +13 -0
- package/dist/cjs/lib/dtls/handshake/random.js +29 -0
- package/dist/cjs/lib/dtls/helper.d.ts +4 -0
- package/dist/cjs/lib/dtls/helper.js +30 -0
- package/dist/cjs/lib/dtls/imports/common.d.ts +1 -0
- package/dist/cjs/lib/dtls/imports/common.js +17 -0
- package/dist/cjs/lib/dtls/imports/rtp.d.ts +1 -0
- package/dist/cjs/lib/dtls/imports/rtp.js +17 -0
- package/dist/cjs/lib/dtls/index.d.ts +7 -0
- package/dist/cjs/lib/dtls/index.js +117 -0
- package/dist/cjs/lib/dtls/record/antiReplayWindow.d.ts +27 -0
- package/dist/cjs/lib/dtls/record/antiReplayWindow.js +102 -0
- package/dist/cjs/lib/dtls/record/builder.d.ts +9 -0
- package/dist/cjs/lib/dtls/record/builder.js +27 -0
- package/dist/cjs/lib/dtls/record/const.d.ts +33 -0
- package/dist/cjs/lib/dtls/record/const.js +38 -0
- package/dist/cjs/lib/dtls/record/message/fragment.d.ts +26 -0
- package/dist/cjs/lib/dtls/record/message/fragment.js +96 -0
- package/dist/cjs/lib/dtls/record/message/header.d.ts +38 -0
- package/dist/cjs/lib/dtls/record/message/header.js +34 -0
- package/dist/cjs/lib/dtls/record/message/plaintext.d.ts +14 -0
- package/dist/cjs/lib/dtls/record/message/plaintext.js +63 -0
- package/dist/cjs/lib/dtls/record/receive.d.ts +9 -0
- package/dist/cjs/lib/dtls/record/receive.js +91 -0
- package/dist/cjs/lib/dtls/server.d.ts +6 -0
- package/dist/cjs/lib/dtls/server.js +78 -0
- package/dist/cjs/lib/dtls/socket.d.ts +52 -0
- package/dist/cjs/lib/dtls/socket.js +188 -0
- package/dist/cjs/lib/dtls/typings/domain.d.ts +20 -0
- package/dist/cjs/lib/dtls/typings/domain.js +2 -0
- package/dist/cjs/lib/dtls/util/binary.d.ts +2 -0
- package/dist/cjs/lib/dtls/util/binary.js +8 -0
- package/dist/cjs/lib/ice/candidate.d.ts +35 -0
- package/dist/cjs/lib/ice/candidate.js +198 -0
- package/dist/cjs/lib/ice/dns/lookup.d.ts +16 -0
- package/dist/cjs/lib/ice/dns/lookup.js +133 -0
- package/dist/cjs/lib/ice/dns/mdns.d.ts +38 -0
- package/dist/cjs/lib/ice/dns/mdns.js +145 -0
- package/dist/cjs/lib/ice/exceptions.d.ts +24 -0
- package/dist/cjs/lib/ice/exceptions.js +41 -0
- package/dist/cjs/lib/ice/helper.d.ts +17 -0
- package/dist/cjs/lib/ice/helper.js +74 -0
- package/dist/cjs/lib/ice/ice.d.ts +182 -0
- package/dist/cjs/lib/ice/ice.js +1584 -0
- package/dist/cjs/lib/ice/iceBase.d.ts +214 -0
- package/dist/cjs/lib/ice/iceBase.js +182 -0
- package/dist/cjs/lib/ice/imports/common.d.ts +1 -0
- package/dist/cjs/lib/ice/imports/common.js +17 -0
- package/dist/cjs/lib/ice/index.d.ts +12 -0
- package/dist/cjs/lib/ice/index.js +30 -0
- package/dist/cjs/lib/ice/internal/selectAddresses.d.ts +9 -0
- package/dist/cjs/lib/ice/internal/selectAddresses.js +39 -0
- package/dist/cjs/lib/ice/stun/attributes.d.ts +1 -0
- package/dist/cjs/lib/ice/stun/attributes.js +17 -0
- package/dist/cjs/lib/ice/stun/const.d.ts +8 -0
- package/dist/cjs/lib/ice/stun/const.js +25 -0
- package/dist/cjs/lib/ice/stun/message.d.ts +1 -0
- package/dist/cjs/lib/ice/stun/message.js +17 -0
- package/dist/cjs/lib/ice/stun/protocol.d.ts +30 -0
- package/dist/cjs/lib/ice/stun/protocol.js +125 -0
- package/dist/cjs/lib/ice/stun/tcpFrame.d.ts +5 -0
- package/dist/cjs/lib/ice/stun/tcpFrame.js +25 -0
- package/dist/cjs/lib/ice/stun/tcpProtocol.d.ts +57 -0
- package/dist/cjs/lib/ice/stun/tcpProtocol.js +323 -0
- package/dist/cjs/lib/ice/stun/transaction.d.ts +75 -0
- package/dist/cjs/lib/ice/stun/transaction.js +239 -0
- package/dist/cjs/lib/ice/turn/frame.d.ts +1 -0
- package/dist/cjs/lib/ice/turn/frame.js +17 -0
- package/dist/cjs/lib/ice/turn/protocol.d.ts +170 -0
- package/dist/cjs/lib/ice/turn/protocol.js +638 -0
- package/dist/cjs/lib/ice/types/model.d.ts +56 -0
- package/dist/cjs/lib/ice/types/model.js +2 -0
- package/dist/cjs/lib/ice/utils.d.ts +13 -0
- package/dist/cjs/lib/ice/utils.js +84 -0
- package/dist/cjs/lib/peer/const.d.ts +36 -0
- package/dist/cjs/lib/peer/const.js +53 -0
- package/dist/cjs/lib/peer/dataChannel.d.ts +69 -0
- package/dist/cjs/lib/peer/dataChannel.js +133 -0
- package/dist/cjs/lib/peer/errors.d.ts +11 -0
- package/dist/cjs/lib/peer/errors.js +23 -0
- package/dist/cjs/lib/peer/helper.d.ts +20 -0
- package/dist/cjs/lib/peer/helper.js +84 -0
- package/dist/cjs/lib/peer/imports/common.d.ts +1 -0
- package/dist/cjs/lib/peer/imports/common.js +17 -0
- package/dist/cjs/lib/peer/imports/dtls.d.ts +1 -0
- package/dist/cjs/lib/peer/imports/dtls.js +17 -0
- package/dist/cjs/lib/peer/imports/ice.d.ts +1 -0
- package/dist/cjs/lib/peer/imports/ice.js +17 -0
- package/dist/cjs/lib/peer/imports/rtp.d.ts +1 -0
- package/dist/cjs/lib/peer/imports/rtp.js +17 -0
- package/dist/cjs/lib/peer/index.d.ts +14 -0
- package/dist/cjs/lib/peer/index.js +30 -0
- package/dist/cjs/lib/peer/media/codec.d.ts +15 -0
- package/dist/cjs/lib/peer/media/codec.js +80 -0
- package/dist/cjs/lib/peer/media/codecCompatibility.d.ts +23 -0
- package/dist/cjs/lib/peer/media/codecCompatibility.js +137 -0
- package/dist/cjs/lib/peer/media/extension/rtcpFeedback.d.ts +6 -0
- package/dist/cjs/lib/peer/media/extension/rtcpFeedback.js +13 -0
- package/dist/cjs/lib/peer/media/extension/rtpExtension.d.ts +9 -0
- package/dist/cjs/lib/peer/media/extension/rtpExtension.js +52 -0
- package/dist/cjs/lib/peer/media/index.d.ts +12 -0
- package/dist/cjs/lib/peer/media/index.js +28 -0
- package/dist/cjs/lib/peer/media/parameters.d.ts +65 -0
- package/dist/cjs/lib/peer/media/parameters.js +60 -0
- package/dist/cjs/lib/peer/media/receiver/nack.d.ts +23 -0
- package/dist/cjs/lib/peer/media/receiver/nack.js +104 -0
- package/dist/cjs/lib/peer/media/receiver/receiverTwcc.d.ts +47 -0
- package/dist/cjs/lib/peer/media/receiver/receiverTwcc.js +179 -0
- package/dist/cjs/lib/peer/media/receiver/statistics.d.ts +22 -0
- package/dist/cjs/lib/peer/media/receiver/statistics.js +71 -0
- package/dist/cjs/lib/peer/media/router.d.ts +25 -0
- package/dist/cjs/lib/peer/media/router.js +166 -0
- package/dist/cjs/lib/peer/media/rtpReceiver.d.ts +90 -0
- package/dist/cjs/lib/peer/media/rtpReceiver.js +407 -0
- package/dist/cjs/lib/peer/media/rtpSender.d.ts +209 -0
- package/dist/cjs/lib/peer/media/rtpSender.js +826 -0
- package/dist/cjs/lib/peer/media/rtpTransceiver.d.ts +117 -0
- package/dist/cjs/lib/peer/media/rtpTransceiver.js +245 -0
- package/dist/cjs/lib/peer/media/sender/cumulativeResult.d.ts +19 -0
- package/dist/cjs/lib/peer/media/sender/cumulativeResult.js +61 -0
- package/dist/cjs/lib/peer/media/sender/senderBWE.d.ts +32 -0
- package/dist/cjs/lib/peer/media/sender/senderBWE.js +99 -0
- package/dist/cjs/lib/peer/media/stats.d.ts +293 -0
- package/dist/cjs/lib/peer/media/stats.js +90 -0
- package/dist/cjs/lib/peer/media/track.d.ts +67 -0
- package/dist/cjs/lib/peer/media/track.js +216 -0
- package/dist/cjs/lib/peer/peerConnection.d.ts +458 -0
- package/dist/cjs/lib/peer/peerConnection.js +1591 -0
- package/dist/cjs/lib/peer/sctpManager.d.ts +28 -0
- package/dist/cjs/lib/peer/sctpManager.js +138 -0
- package/dist/cjs/lib/peer/sdp.d.ts +97 -0
- package/dist/cjs/lib/peer/sdp.js +628 -0
- package/dist/cjs/lib/peer/sdpManager.d.ts +116 -0
- package/dist/cjs/lib/peer/sdpManager.js +573 -0
- package/dist/cjs/lib/peer/secureTransportManager.d.ts +96 -0
- package/dist/cjs/lib/peer/secureTransportManager.js +472 -0
- package/dist/cjs/lib/peer/transceiverManager.d.ts +151 -0
- package/dist/cjs/lib/peer/transceiverManager.js +767 -0
- package/dist/cjs/lib/peer/transport/dtls.d.ts +95 -0
- package/dist/cjs/lib/peer/transport/dtls.js +571 -0
- package/dist/cjs/lib/peer/transport/ice.d.ts +143 -0
- package/dist/cjs/lib/peer/transport/ice.js +436 -0
- package/dist/cjs/lib/peer/transport/sctp.d.ts +56 -0
- package/dist/cjs/lib/peer/transport/sctp.js +387 -0
- package/dist/cjs/lib/peer/types/domain.d.ts +5 -0
- package/dist/cjs/lib/peer/types/domain.js +19 -0
- package/dist/cjs/lib/peer/types/util.d.ts +2 -0
- package/dist/cjs/lib/peer/types/util.js +2 -0
- package/dist/cjs/lib/peer/utils.d.ts +73 -0
- package/dist/cjs/lib/peer/utils.js +306 -0
- package/dist/cjs/lib/rtp/codec/av1.d.ts +56 -0
- package/dist/cjs/lib/rtp/codec/av1.js +209 -0
- package/dist/cjs/lib/rtp/codec/base.d.ts +8 -0
- package/dist/cjs/lib/rtp/codec/base.js +15 -0
- package/dist/cjs/lib/rtp/codec/h264.d.ts +32 -0
- package/dist/cjs/lib/rtp/codec/h264.js +122 -0
- package/dist/cjs/lib/rtp/codec/index.d.ts +16 -0
- package/dist/cjs/lib/rtp/codec/index.js +84 -0
- package/dist/cjs/lib/rtp/codec/leb128.d.ts +5 -0
- package/dist/cjs/lib/rtp/codec/leb128.js +23 -0
- package/dist/cjs/lib/rtp/codec/opus.d.ts +9 -0
- package/dist/cjs/lib/rtp/codec/opus.js +25 -0
- package/dist/cjs/lib/rtp/codec/vp8.d.ts +27 -0
- package/dist/cjs/lib/rtp/codec/vp8.js +109 -0
- package/dist/cjs/lib/rtp/codec/vp9.d.ts +46 -0
- package/dist/cjs/lib/rtp/codec/vp9.js +161 -0
- package/dist/cjs/lib/rtp/const.d.ts +1 -0
- package/dist/cjs/lib/rtp/const.js +4 -0
- package/dist/cjs/lib/rtp/helper.d.ts +8 -0
- package/dist/cjs/lib/rtp/helper.js +36 -0
- package/dist/cjs/lib/rtp/imports/common.d.ts +1 -0
- package/dist/cjs/lib/rtp/imports/common.js +17 -0
- package/dist/cjs/lib/rtp/index.d.ts +25 -0
- package/dist/cjs/lib/rtp/index.js +41 -0
- package/dist/cjs/lib/rtp/rtcp/header.d.ts +13 -0
- package/dist/cjs/lib/rtp/rtcp/header.js +50 -0
- package/dist/cjs/lib/rtp/rtcp/psfb/fullIntraRequest.d.ts +16 -0
- package/dist/cjs/lib/rtp/rtcp/psfb/fullIntraRequest.js +34 -0
- package/dist/cjs/lib/rtp/rtcp/psfb/index.d.ts +14 -0
- package/dist/cjs/lib/rtp/rtcp/psfb/index.js +39 -0
- package/dist/cjs/lib/rtp/rtcp/psfb/pictureLossIndication.d.ts +10 -0
- package/dist/cjs/lib/rtp/rtcp/psfb/pictureLossIndication.js +20 -0
- package/dist/cjs/lib/rtp/rtcp/psfb/remb.d.ts +16 -0
- package/dist/cjs/lib/rtp/rtcp/psfb/remb.js +53 -0
- package/dist/cjs/lib/rtp/rtcp/rr.d.ts +32 -0
- package/dist/cjs/lib/rtp/rtcp/rr.js +73 -0
- package/dist/cjs/lib/rtp/rtcp/rtcp.d.ts +10 -0
- package/dist/cjs/lib/rtp/rtcp/rtcp.js +58 -0
- package/dist/cjs/lib/rtp/rtcp/rtpfb/const.d.ts +1 -0
- package/dist/cjs/lib/rtp/rtcp/rtpfb/const.js +4 -0
- package/dist/cjs/lib/rtp/rtcp/rtpfb/index.d.ts +14 -0
- package/dist/cjs/lib/rtp/rtcp/rtpfb/index.js +35 -0
- package/dist/cjs/lib/rtp/rtcp/rtpfb/nack.d.ts +17 -0
- package/dist/cjs/lib/rtp/rtcp/rtpfb/nack.js +77 -0
- package/dist/cjs/lib/rtp/rtcp/rtpfb/twcc.d.ts +71 -0
- package/dist/cjs/lib/rtp/rtcp/rtpfb/twcc.js +352 -0
- package/dist/cjs/lib/rtp/rtcp/sdes.d.ts +26 -0
- package/dist/cjs/lib/rtp/rtcp/sdes.js +97 -0
- package/dist/cjs/lib/rtp/rtcp/sr.d.ts +41 -0
- package/dist/cjs/lib/rtp/rtcp/sr.js +110 -0
- package/dist/cjs/lib/rtp/rtp/headerExtension.d.ts +72 -0
- package/dist/cjs/lib/rtp/rtp/headerExtension.js +117 -0
- package/dist/cjs/lib/rtp/rtp/red/encoder.d.ts +13 -0
- package/dist/cjs/lib/rtp/rtp/red/encoder.js +44 -0
- package/dist/cjs/lib/rtp/rtp/red/handler.d.ts +6 -0
- package/dist/cjs/lib/rtp/rtp/red/handler.js +59 -0
- package/dist/cjs/lib/rtp/rtp/red/packet.d.ts +26 -0
- package/dist/cjs/lib/rtp/rtp/red/packet.js +112 -0
- package/dist/cjs/lib/rtp/rtp/rtp.d.ts +44 -0
- package/dist/cjs/lib/rtp/rtp/rtp.js +271 -0
- package/dist/cjs/lib/rtp/rtp/rtx.d.ts +3 -0
- package/dist/cjs/lib/rtp/rtp/rtx.js +29 -0
- package/dist/cjs/lib/rtp/srtp/cipher/ctr.d.ts +16 -0
- package/dist/cjs/lib/rtp/srtp/cipher/ctr.js +107 -0
- package/dist/cjs/lib/rtp/srtp/cipher/gcm.d.ts +17 -0
- package/dist/cjs/lib/rtp/srtp/cipher/gcm.js +145 -0
- package/dist/cjs/lib/rtp/srtp/cipher/index.d.ts +13 -0
- package/dist/cjs/lib/rtp/srtp/cipher/index.js +24 -0
- package/dist/cjs/lib/rtp/srtp/const.d.ts +6 -0
- package/dist/cjs/lib/rtp/srtp/const.js +26 -0
- package/dist/cjs/lib/rtp/srtp/context/context.d.ts +45 -0
- package/dist/cjs/lib/rtp/srtp/context/context.js +180 -0
- package/dist/cjs/lib/rtp/srtp/context/srtcp.d.ts +8 -0
- package/dist/cjs/lib/rtp/srtp/context/srtcp.js +25 -0
- package/dist/cjs/lib/rtp/srtp/context/srtp.d.ts +9 -0
- package/dist/cjs/lib/rtp/srtp/context/srtp.js +41 -0
- package/dist/cjs/lib/rtp/srtp/error.d.ts +3 -0
- package/dist/cjs/lib/rtp/srtp/error.js +10 -0
- package/dist/cjs/lib/rtp/srtp/packet.d.ts +5 -0
- package/dist/cjs/lib/rtp/srtp/packet.js +47 -0
- package/dist/cjs/lib/rtp/srtp/session.d.ts +19 -0
- package/dist/cjs/lib/rtp/srtp/session.js +13 -0
- package/dist/cjs/lib/rtp/srtp/srtcp.d.ts +8 -0
- package/dist/cjs/lib/rtp/srtp/srtcp.js +21 -0
- package/dist/cjs/lib/rtp/srtp/srtp.d.ts +9 -0
- package/dist/cjs/lib/rtp/srtp/srtp.js +20 -0
- package/dist/cjs/lib/rtp/transport.d.ts +15 -0
- package/dist/cjs/lib/rtp/transport.js +23 -0
- package/dist/cjs/lib/rtp/util.d.ts +11 -0
- package/dist/cjs/lib/rtp/util.js +28 -0
- package/dist/cjs/lib/sctp/chunk.d.ts +164 -0
- package/dist/cjs/lib/sctp/chunk.js +542 -0
- package/dist/cjs/lib/sctp/const.d.ts +17 -0
- package/dist/cjs/lib/sctp/const.js +22 -0
- package/dist/cjs/lib/sctp/helper.d.ts +5 -0
- package/dist/cjs/lib/sctp/helper.js +14 -0
- package/dist/cjs/lib/sctp/imports/common.d.ts +1 -0
- package/dist/cjs/lib/sctp/imports/common.js +17 -0
- package/dist/cjs/lib/sctp/index.d.ts +6 -0
- package/dist/cjs/lib/sctp/index.js +20 -0
- package/dist/cjs/lib/sctp/param.d.ts +40 -0
- package/dist/cjs/lib/sctp/param.js +132 -0
- package/dist/cjs/lib/sctp/sctp.d.ts +210 -0
- package/dist/cjs/lib/sctp/sctp.js +1467 -0
- package/dist/cjs/lib/sctp/transport.d.ts +15 -0
- package/dist/cjs/lib/sctp/transport.js +28 -0
- package/dist/cjs/lib/turn/index.d.ts +9 -0
- package/dist/cjs/lib/turn/index.js +25 -0
- package/dist/cjs/lib/turn/node/server.d.ts +21 -0
- package/dist/cjs/lib/turn/node/server.js +94 -0
- package/dist/cjs/lib/turn/node/turnServer.d.ts +91 -0
- package/dist/cjs/lib/turn/node/turnServer.js +565 -0
- package/dist/cjs/lib/turn/protocol.d.ts +47 -0
- package/dist/cjs/lib/turn/protocol.js +116 -0
- package/dist/cjs/lib/turn/stun/attributes.d.ts +37 -0
- package/dist/cjs/lib/turn/stun/attributes.js +208 -0
- package/dist/cjs/lib/turn/stun/const.d.ts +28 -0
- package/dist/cjs/lib/turn/stun/const.js +87 -0
- package/dist/cjs/lib/turn/stun/ip.d.ts +12 -0
- package/dist/cjs/lib/turn/stun/ip.js +87 -0
- package/dist/cjs/lib/turn/stun/message.d.ts +37 -0
- package/dist/cjs/lib/turn/stun/message.js +180 -0
- package/dist/cjs/lib/turn/turn/auth.d.ts +1 -0
- package/dist/cjs/lib/turn/turn/auth.js +9 -0
- package/dist/cjs/lib/turn/turn/frame.d.ts +13 -0
- package/dist/cjs/lib/turn/turn/frame.js +68 -0
- package/dist/cjs/lib/turn/turn/protocol.d.ts +147 -0
- package/dist/cjs/lib/turn/turn/protocol.js +785 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/peer/Endpoints.d.ts +75 -0
- package/dist/cjs/peer/Endpoints.js +154 -0
- package/dist/cjs/peer/EngineConfig.d.ts +20 -0
- package/dist/cjs/peer/EngineConfig.js +36 -0
- package/dist/cjs/peer/EngineConnection.d.ts +22 -0
- package/dist/cjs/peer/EngineConnection.js +27 -0
- package/dist/cjs/peer/Events.d.ts +55 -0
- package/dist/cjs/peer/Events.js +85 -0
- package/dist/cjs/peer/MediaCodecs.d.ts +27 -0
- package/dist/cjs/peer/MediaCodecs.js +53 -0
- package/dist/cjs/peer/MediaTrack.d.ts +212 -0
- package/dist/cjs/peer/MediaTrack.js +313 -0
- package/dist/cjs/peer/PeerChannel.d.ts +248 -0
- package/dist/cjs/peer/PeerChannel.js +319 -0
- package/dist/cjs/peer/PeerConnection.d.ts +603 -0
- package/dist/cjs/peer/PeerConnection.js +697 -0
- package/dist/cjs/peer/PeerThreadChannel.d.ts +112 -0
- package/dist/cjs/peer/PeerThreadChannel.js +273 -0
- package/dist/cjs/peer/PeerThreadProtocol.d.ts +325 -0
- package/dist/cjs/peer/PeerThreadProtocol.js +2 -0
- package/dist/cjs/peer/PeerThreads.d.ts +114 -0
- package/dist/cjs/peer/PeerThreads.js +268 -0
- package/dist/cjs/peer/PeerWorker.d.ts +6 -0
- package/dist/cjs/peer/PeerWorker.js +461 -0
- package/dist/cjs/peer/PeerWorkerCode.d.ts +5 -0
- package/dist/cjs/peer/PeerWorkerCode.js +4 -0
- package/dist/cjs/peer/RemoteConnection.d.ts +314 -0
- package/dist/cjs/peer/RemoteConnection.js +913 -0
- package/dist/cjs/peer/RtpPacket.d.ts +112 -0
- package/dist/cjs/peer/RtpPacket.js +92 -0
- package/dist/cjs/peer/RtpTransceiver.d.ts +167 -0
- package/dist/cjs/peer/RtpTransceiver.js +235 -0
- package/dist/cjs/peer/SignalingClient.d.ts +236 -0
- package/dist/cjs/peer/SignalingClient.js +285 -0
- package/dist/cjs/protocol/SignalingProtocol.d.ts +266 -0
- package/dist/cjs/protocol/SignalingProtocol.js +65 -0
- package/dist/cjs/service/WebRTCServiceEntrypoint.d.ts +158 -0
- package/dist/cjs/service/WebRTCServiceEntrypoint.js +356 -0
- package/dist/cjs/sfu/SFU.d.ts +356 -0
- package/dist/cjs/sfu/SFU.js +763 -0
- package/dist/cjs/sfu/SFUAccess.d.ts +48 -0
- package/dist/cjs/sfu/SFUAccess.js +15 -0
- package/dist/cjs/sfu/SFUClusterLeg.d.ts +101 -0
- package/dist/cjs/sfu/SFUClusterLeg.js +106 -0
- package/dist/cjs/sfu/SFURoom.d.ts +148 -0
- package/dist/cjs/sfu/SFURoom.js +1300 -0
- package/dist/cjs/sfu/SFUWorker.d.ts +13 -0
- package/dist/cjs/sfu/SFUWorker.js +168 -0
- package/dist/cjs/sfu/SFUWorkerChannel.d.ts +204 -0
- package/dist/cjs/sfu/SFUWorkerChannel.js +105 -0
- package/dist/cjs/sfu/SFUWorkerCode.d.ts +5 -0
- package/dist/cjs/sfu/SFUWorkerCode.js +4 -0
- package/dist/cjs/sfu/SFUWorkers.d.ts +247 -0
- package/dist/cjs/sfu/SFUWorkers.js +552 -0
- package/dist/cjs/shared/ChunkedChannel.d.ts +122 -0
- package/dist/cjs/shared/ChunkedChannel.js +182 -0
- package/dist/cjs/shared/Connections.d.ts +231 -0
- package/dist/cjs/shared/Connections.js +2 -0
- package/dist/cjs/shared/Emitter.d.ts +50 -0
- package/dist/cjs/shared/Emitter.js +80 -0
- package/dist/cjs/shared/Peer.d.ts +182 -0
- package/dist/cjs/shared/Peer.js +509 -0
- package/dist/cjs/shared/PeerServiceProxy.d.ts +173 -0
- package/dist/cjs/shared/PeerServiceProxy.js +304 -0
- package/dist/cjs/shared/Room.d.ts +143 -0
- package/dist/cjs/shared/Room.js +515 -0
- package/dist/cjs/shared/SignalingError.d.ts +40 -0
- package/dist/cjs/shared/SignalingError.js +48 -0
- package/dist/cjs/shared/SignalingSession.d.ts +97 -0
- package/dist/cjs/shared/SignalingSession.js +347 -0
- package/dist/cjs/shared/Transports.d.ts +139 -0
- package/dist/cjs/shared/Transports.js +285 -0
- package/dist/cjs/signaling/MediaServers.d.ts +40 -0
- package/dist/cjs/signaling/MediaServers.js +16 -0
- package/dist/cjs/signaling/Signaling.d.ts +573 -0
- package/dist/cjs/signaling/Signaling.js +945 -0
- package/dist/cjs/signaling/SignalingController.d.ts +128 -0
- package/dist/cjs/signaling/SignalingController.js +229 -0
- package/dist/cjs/turn/TURNCredentials.d.ts +49 -0
- package/dist/cjs/turn/TURNCredentials.js +49 -0
- package/dist/cjs/turn/TURNIceServers.d.ts +11 -0
- package/dist/cjs/turn/TURNIceServers.js +25 -0
- package/dist/cjs/turn/TURNServer.d.ts +309 -0
- package/dist/cjs/turn/TURNServer.js +331 -0
- package/dist/cjs/turn/TURNWorker.d.ts +42 -0
- package/dist/cjs/turn/TURNWorker.js +52 -0
- package/dist/cjs/turn/TURNWorkerCode.d.ts +5 -0
- package/dist/cjs/turn/TURNWorkerCode.js +4 -0
- package/dist/cjs/turn/TURNWorkers.d.ts +52 -0
- package/dist/cjs/turn/TURNWorkers.js +211 -0
- package/dist/cjs/whep/WHEP.d.ts +386 -0
- package/dist/cjs/whep/WHEP.js +426 -0
- package/dist/cjs/whep/WHEPController.d.ts +134 -0
- package/dist/cjs/whep/WHEPController.js +301 -0
- package/dist/cjs/whip/WHIP.d.ts +426 -0
- package/dist/cjs/whip/WHIP.js +470 -0
- package/dist/cjs/whip/WHIPController.d.ts +132 -0
- package/dist/cjs/whip/WHIPController.js +299 -0
- package/dist/esm/client/SignalingConnection.js +63 -0
- package/dist/esm/cluster/Cluster.js +542 -0
- package/dist/esm/cluster/ClusterFrames.js +85 -0
- package/dist/esm/cluster/ClusterTURN.js +73 -0
- package/dist/esm/cluster/Rendezvous.js +20 -0
- package/dist/esm/cluster/transports/ClusterTransport.js +1 -0
- package/dist/esm/cluster/transports/LoadClient.js +44 -0
- package/dist/esm/cluster/transports/MemoryClusterTransport.js +43 -0
- package/dist/esm/cluster/transports/NATSClusterTransport.js +66 -0
- package/dist/esm/cluster/transports/RedisClusterTransport.js +73 -0
- package/dist/esm/exceptions/ClusterRequestException.js +14 -0
- package/dist/esm/exceptions/ClusterTimeoutException.js +13 -0
- package/dist/esm/exceptions/ClusterTransportNotFoundException.js +14 -0
- package/dist/esm/exceptions/SignalingClientRequiredException.js +15 -0
- package/dist/esm/exceptions/SignalingConnectionException.js +15 -0
- package/dist/esm/exceptions/SignalingDeniedException.js +14 -0
- package/dist/esm/exceptions/SignalingLimitException.js +14 -0
- package/dist/esm/exceptions/SignalingNotAMemberException.js +14 -0
- package/dist/esm/exceptions/WHEPDeniedException.js +18 -0
- package/dist/esm/exceptions/WHEPLimitException.js +18 -0
- package/dist/esm/exceptions/WHEPMediaTypeException.js +18 -0
- package/dist/esm/exceptions/WHEPOfferException.js +19 -0
- package/dist/esm/exceptions/WHEPSessionNotFoundException.js +18 -0
- package/dist/esm/exceptions/WHIPDeniedException.js +18 -0
- package/dist/esm/exceptions/WHIPLimitException.js +18 -0
- package/dist/esm/exceptions/WHIPMediaTypeException.js +18 -0
- package/dist/esm/exceptions/WHIPOfferException.js +19 -0
- package/dist/esm/exceptions/WHIPSessionNotFoundException.js +18 -0
- package/dist/esm/exports/Client.js +5 -0
- package/dist/esm/exports/WebRTC.js +41 -0
- package/dist/esm/lib/common/binary.js +244 -0
- package/dist/esm/lib/common/binaryData.js +392 -0
- package/dist/esm/lib/common/crc.js +118 -0
- package/dist/esm/lib/common/deque.js +85 -0
- package/dist/esm/lib/common/event.js +202 -0
- package/dist/esm/lib/common/index.js +11 -0
- package/dist/esm/lib/common/log.js +55 -0
- package/dist/esm/lib/common/network.js +52 -0
- package/dist/esm/lib/common/number.js +31 -0
- package/dist/esm/lib/common/promise.js +64 -0
- package/dist/esm/lib/common/transport.js +401 -0
- package/dist/esm/lib/common/type.js +1 -0
- package/dist/esm/lib/dtls/cipher/const.js +30 -0
- package/dist/esm/lib/dtls/cipher/create.js +98 -0
- package/dist/esm/lib/dtls/cipher/ec.js +37 -0
- package/dist/esm/lib/dtls/cipher/key-exchange.js +103 -0
- package/dist/esm/lib/dtls/cipher/namedCurve.js +24 -0
- package/dist/esm/lib/dtls/cipher/prf.js +79 -0
- package/dist/esm/lib/dtls/cipher/suites/abstract.js +37 -0
- package/dist/esm/lib/dtls/cipher/suites/aead.js +96 -0
- package/dist/esm/lib/dtls/cipher/suites/null.js +35 -0
- package/dist/esm/lib/dtls/cipher/utils.js +34 -0
- package/dist/esm/lib/dtls/cipher/x509.js +94 -0
- package/dist/esm/lib/dtls/client.js +72 -0
- package/dist/esm/lib/dtls/context/cipher.js +83 -0
- package/dist/esm/lib/dtls/context/dtls.js +45 -0
- package/dist/esm/lib/dtls/context/srtp.js +8 -0
- package/dist/esm/lib/dtls/context/transport.js +13 -0
- package/dist/esm/lib/dtls/flight/client/flight1.js +22 -0
- package/dist/esm/lib/dtls/flight/client/flight3.js +21 -0
- package/dist/esm/lib/dtls/flight/client/flight5.js +202 -0
- package/dist/esm/lib/dtls/flight/flight.js +64 -0
- package/dist/esm/lib/dtls/flight/server/flight2.js +122 -0
- package/dist/esm/lib/dtls/flight/server/flight4.js +83 -0
- package/dist/esm/lib/dtls/flight/server/flight6.js +107 -0
- package/dist/esm/lib/dtls/handshake/binary.js +17 -0
- package/dist/esm/lib/dtls/handshake/const.js +14 -0
- package/dist/esm/lib/dtls/handshake/extensions/ellipticCurves.js +36 -0
- package/dist/esm/lib/dtls/handshake/extensions/extendedMasterSecret.js +3 -0
- package/dist/esm/lib/dtls/handshake/extensions/renegotiationIndication.js +30 -0
- package/dist/esm/lib/dtls/handshake/extensions/signature.js +35 -0
- package/dist/esm/lib/dtls/handshake/extensions/useSrtp.js +61 -0
- package/dist/esm/lib/dtls/handshake/message/alert.js +20 -0
- package/dist/esm/lib/dtls/handshake/message/certificate.js +31 -0
- package/dist/esm/lib/dtls/handshake/message/changeCipherSpec.js +20 -0
- package/dist/esm/lib/dtls/handshake/message/client/certificateVerify.js +31 -0
- package/dist/esm/lib/dtls/handshake/message/client/hello.js +44 -0
- package/dist/esm/lib/dtls/handshake/message/client/keyExchange.js +29 -0
- package/dist/esm/lib/dtls/handshake/message/finished.js +22 -0
- package/dist/esm/lib/dtls/handshake/message/server/certificateRequest.js +34 -0
- package/dist/esm/lib/dtls/handshake/message/server/hello.js +53 -0
- package/dist/esm/lib/dtls/handshake/message/server/helloDone.js +26 -0
- package/dist/esm/lib/dtls/handshake/message/server/helloVerifyRequest.js +38 -0
- package/dist/esm/lib/dtls/handshake/message/server/keyExchange.js +45 -0
- package/dist/esm/lib/dtls/handshake/random.js +25 -0
- package/dist/esm/lib/dtls/helper.js +23 -0
- package/dist/esm/lib/dtls/imports/common.js +1 -0
- package/dist/esm/lib/dtls/imports/rtp.js +1 -0
- package/dist/esm/lib/dtls/index.js +97 -0
- package/dist/esm/lib/dtls/record/antiReplayWindow.js +98 -0
- package/dist/esm/lib/dtls/record/builder.js +22 -0
- package/dist/esm/lib/dtls/record/const.js +35 -0
- package/dist/esm/lib/dtls/record/message/fragment.js +92 -0
- package/dist/esm/lib/dtls/record/message/header.js +30 -0
- package/dist/esm/lib/dtls/record/message/plaintext.js +59 -0
- package/dist/esm/lib/dtls/record/receive.js +86 -0
- package/dist/esm/lib/dtls/server.js +74 -0
- package/dist/esm/lib/dtls/socket.js +184 -0
- package/dist/esm/lib/dtls/typings/domain.js +1 -0
- package/dist/esm/lib/dtls/util/binary.js +5 -0
- package/dist/esm/lib/ice/candidate.js +190 -0
- package/dist/esm/lib/ice/dns/lookup.js +95 -0
- package/dist/esm/lib/ice/dns/mdns.js +139 -0
- package/dist/esm/lib/ice/exceptions.js +34 -0
- package/dist/esm/lib/ice/helper.js +65 -0
- package/dist/esm/lib/ice/ice.js +1547 -0
- package/dist/esm/lib/ice/iceBase.js +172 -0
- package/dist/esm/lib/ice/imports/common.js +1 -0
- package/dist/esm/lib/ice/index.js +12 -0
- package/dist/esm/lib/ice/internal/selectAddresses.js +36 -0
- package/dist/esm/lib/ice/stun/attributes.js +1 -0
- package/dist/esm/lib/ice/stun/const.js +8 -0
- package/dist/esm/lib/ice/stun/message.js +1 -0
- package/dist/esm/lib/ice/stun/protocol.js +121 -0
- package/dist/esm/lib/ice/stun/tcpFrame.js +21 -0
- package/dist/esm/lib/ice/stun/tcpProtocol.js +318 -0
- package/dist/esm/lib/ice/stun/transaction.js +230 -0
- package/dist/esm/lib/ice/turn/frame.js +1 -0
- package/dist/esm/lib/ice/turn/protocol.js +630 -0
- package/dist/esm/lib/ice/types/model.js +1 -0
- package/dist/esm/lib/ice/utils.js +43 -0
- package/dist/esm/lib/peer/const.js +50 -0
- package/dist/esm/lib/peer/dataChannel.js +127 -0
- package/dist/esm/lib/peer/errors.js +17 -0
- package/dist/esm/lib/peer/helper.js +77 -0
- package/dist/esm/lib/peer/imports/common.js +1 -0
- package/dist/esm/lib/peer/imports/dtls.js +1 -0
- package/dist/esm/lib/peer/imports/ice.js +1 -0
- package/dist/esm/lib/peer/imports/rtp.js +1 -0
- package/dist/esm/lib/peer/index.js +14 -0
- package/dist/esm/lib/peer/media/codec.js +69 -0
- package/dist/esm/lib/peer/media/codecCompatibility.js +128 -0
- package/dist/esm/lib/peer/media/extension/rtcpFeedback.js +5 -0
- package/dist/esm/lib/peer/media/extension/rtpExtension.js +42 -0
- package/dist/esm/lib/peer/media/index.js +12 -0
- package/dist/esm/lib/peer/media/parameters.js +50 -0
- package/dist/esm/lib/peer/media/receiver/nack.js +100 -0
- package/dist/esm/lib/peer/media/receiver/receiverTwcc.js +175 -0
- package/dist/esm/lib/peer/media/receiver/statistics.js +67 -0
- package/dist/esm/lib/peer/media/router.js +162 -0
- package/dist/esm/lib/peer/media/rtpReceiver.js +403 -0
- package/dist/esm/lib/peer/media/rtpSender.js +822 -0
- package/dist/esm/lib/peer/media/rtpTransceiver.js +241 -0
- package/dist/esm/lib/peer/media/sender/cumulativeResult.js +57 -0
- package/dist/esm/lib/peer/media/sender/senderBWE.js +95 -0
- package/dist/esm/lib/peer/media/stats.js +81 -0
- package/dist/esm/lib/peer/media/track.js +208 -0
- package/dist/esm/lib/peer/peerConnection.js +1585 -0
- package/dist/esm/lib/peer/sctpManager.js +134 -0
- package/dist/esm/lib/peer/sdp.js +614 -0
- package/dist/esm/lib/peer/sdpManager.js +569 -0
- package/dist/esm/lib/peer/secureTransportManager.js +468 -0
- package/dist/esm/lib/peer/transceiverManager.js +763 -0
- package/dist/esm/lib/peer/transport/dtls.js +564 -0
- package/dist/esm/lib/peer/transport/ice.js +426 -0
- package/dist/esm/lib/peer/transport/sctp.js +382 -0
- package/dist/esm/lib/peer/types/domain.js +16 -0
- package/dist/esm/lib/peer/types/util.js +1 -0
- package/dist/esm/lib/peer/utils.js +286 -0
- package/dist/esm/lib/rtp/codec/av1.js +203 -0
- package/dist/esm/lib/rtp/codec/base.js +11 -0
- package/dist/esm/lib/rtp/codec/h264.js +118 -0
- package/dist/esm/lib/rtp/codec/index.js +66 -0
- package/dist/esm/lib/rtp/codec/leb128.js +20 -0
- package/dist/esm/lib/rtp/codec/opus.js +21 -0
- package/dist/esm/lib/rtp/codec/vp8.js +105 -0
- package/dist/esm/lib/rtp/codec/vp9.js +157 -0
- package/dist/esm/lib/rtp/const.js +1 -0
- package/dist/esm/lib/rtp/helper.js +29 -0
- package/dist/esm/lib/rtp/imports/common.js +1 -0
- package/dist/esm/lib/rtp/index.js +25 -0
- package/dist/esm/lib/rtp/rtcp/header.js +46 -0
- package/dist/esm/lib/rtp/rtcp/psfb/fullIntraRequest.js +30 -0
- package/dist/esm/lib/rtp/rtcp/psfb/index.js +35 -0
- package/dist/esm/lib/rtp/rtcp/psfb/pictureLossIndication.js +16 -0
- package/dist/esm/lib/rtp/rtcp/psfb/remb.js +49 -0
- package/dist/esm/lib/rtp/rtcp/rr.js +68 -0
- package/dist/esm/lib/rtp/rtcp/rtcp.js +53 -0
- package/dist/esm/lib/rtp/rtcp/rtpfb/const.js +1 -0
- package/dist/esm/lib/rtp/rtcp/rtpfb/index.js +31 -0
- package/dist/esm/lib/rtp/rtcp/rtpfb/nack.js +73 -0
- package/dist/esm/lib/rtp/rtcp/rtpfb/twcc.js +344 -0
- package/dist/esm/lib/rtp/rtcp/sdes.js +91 -0
- package/dist/esm/lib/rtp/rtcp/sr.js +104 -0
- package/dist/esm/lib/rtp/rtp/headerExtension.js +102 -0
- package/dist/esm/lib/rtp/rtp/red/encoder.js +40 -0
- package/dist/esm/lib/rtp/rtp/red/handler.js +55 -0
- package/dist/esm/lib/rtp/rtp/red/packet.js +107 -0
- package/dist/esm/lib/rtp/rtp/rtp.js +266 -0
- package/dist/esm/lib/rtp/rtp/rtx.js +25 -0
- package/dist/esm/lib/rtp/srtp/cipher/ctr.js +103 -0
- package/dist/esm/lib/rtp/srtp/cipher/gcm.js +141 -0
- package/dist/esm/lib/rtp/srtp/cipher/index.js +20 -0
- package/dist/esm/lib/rtp/srtp/const.js +21 -0
- package/dist/esm/lib/rtp/srtp/context/context.js +175 -0
- package/dist/esm/lib/rtp/srtp/context/srtcp.js +21 -0
- package/dist/esm/lib/rtp/srtp/context/srtp.js +37 -0
- package/dist/esm/lib/rtp/srtp/error.js +6 -0
- package/dist/esm/lib/rtp/srtp/packet.js +42 -0
- package/dist/esm/lib/rtp/srtp/session.js +9 -0
- package/dist/esm/lib/rtp/srtp/srtcp.js +17 -0
- package/dist/esm/lib/rtp/srtp/srtp.js +16 -0
- package/dist/esm/lib/rtp/transport.js +18 -0
- package/dist/esm/lib/rtp/util.js +24 -0
- package/dist/esm/lib/sctp/chunk.js +515 -0
- package/dist/esm/lib/sctp/const.js +19 -0
- package/dist/esm/lib/sctp/helper.js +10 -0
- package/dist/esm/lib/sctp/imports/common.js +1 -0
- package/dist/esm/lib/sctp/index.js +4 -0
- package/dist/esm/lib/sctp/param.js +126 -0
- package/dist/esm/lib/sctp/sctp.js +1459 -0
- package/dist/esm/lib/sctp/transport.js +23 -0
- package/dist/esm/lib/turn/index.js +9 -0
- package/dist/esm/lib/turn/node/server.js +89 -0
- package/dist/esm/lib/turn/node/turnServer.js +560 -0
- package/dist/esm/lib/turn/protocol.js +112 -0
- package/dist/esm/lib/turn/stun/attributes.js +198 -0
- package/dist/esm/lib/turn/stun/const.js +82 -0
- package/dist/esm/lib/turn/stun/ip.js +81 -0
- package/dist/esm/lib/turn/stun/message.js +174 -0
- package/dist/esm/lib/turn/turn/auth.js +6 -0
- package/dist/esm/lib/turn/turn/frame.js +61 -0
- package/dist/esm/lib/turn/turn/protocol.js +781 -0
- package/dist/esm/peer/Endpoints.js +143 -0
- package/dist/esm/peer/EngineConfig.js +33 -0
- package/dist/esm/peer/EngineConnection.js +22 -0
- package/dist/esm/peer/Events.js +81 -0
- package/dist/esm/peer/MediaCodecs.js +47 -0
- package/dist/esm/peer/MediaTrack.js +305 -0
- package/dist/esm/peer/PeerChannel.js +315 -0
- package/dist/esm/peer/PeerConnection.js +694 -0
- package/dist/esm/peer/PeerThreadChannel.js +266 -0
- package/dist/esm/peer/PeerThreadProtocol.js +1 -0
- package/dist/esm/peer/PeerThreads.js +264 -0
- package/dist/esm/peer/PeerWorker.js +458 -0
- package/dist/esm/peer/PeerWorkerCode.js +1 -0
- package/dist/esm/peer/RemoteConnection.js +905 -0
- package/dist/esm/peer/RtpPacket.js +86 -0
- package/dist/esm/peer/RtpTransceiver.js +225 -0
- package/dist/esm/peer/SignalingClient.js +249 -0
- package/dist/esm/protocol/SignalingProtocol.js +62 -0
- package/dist/esm/service/WebRTCServiceEntrypoint.js +352 -0
- package/dist/esm/sfu/SFU.js +759 -0
- package/dist/esm/sfu/SFUAccess.js +12 -0
- package/dist/esm/sfu/SFUClusterLeg.js +102 -0
- package/dist/esm/sfu/SFURoom.js +1296 -0
- package/dist/esm/sfu/SFUWorker.js +165 -0
- package/dist/esm/sfu/SFUWorkerChannel.js +101 -0
- package/dist/esm/sfu/SFUWorkerCode.js +1 -0
- package/dist/esm/sfu/SFUWorkers.js +547 -0
- package/dist/esm/shared/ChunkedChannel.js +178 -0
- package/dist/esm/shared/Connections.js +1 -0
- package/dist/esm/shared/Emitter.js +76 -0
- package/dist/esm/shared/Peer.js +505 -0
- package/dist/esm/shared/PeerServiceProxy.js +299 -0
- package/dist/esm/shared/Room.js +511 -0
- package/dist/esm/shared/SignalingError.js +43 -0
- package/dist/esm/shared/SignalingSession.js +343 -0
- package/dist/esm/shared/Transports.js +279 -0
- package/dist/esm/signaling/MediaServers.js +13 -0
- package/dist/esm/signaling/Signaling.js +941 -0
- package/dist/esm/signaling/SignalingController.js +225 -0
- package/dist/esm/turn/TURNCredentials.js +44 -0
- package/dist/esm/turn/TURNIceServers.js +22 -0
- package/dist/esm/turn/TURNServer.js +327 -0
- package/dist/esm/turn/TURNWorker.js +49 -0
- package/dist/esm/turn/TURNWorkerCode.js +1 -0
- package/dist/esm/turn/TURNWorkers.js +206 -0
- package/dist/esm/whep/WHEP.js +422 -0
- package/dist/esm/whep/WHEPController.js +298 -0
- package/dist/esm/whip/WHIP.js +466 -0
- package/dist/esm/whip/WHIPController.js +296 -0
- package/dist/types/client/SignalingConnection.d.ts +81 -0
- package/dist/types/cluster/Cluster.d.ts +503 -0
- package/dist/types/cluster/ClusterFrames.d.ts +24 -0
- package/dist/types/cluster/ClusterTURN.d.ts +63 -0
- package/dist/types/cluster/Rendezvous.d.ts +8 -0
- package/dist/types/cluster/transports/ClusterTransport.d.ts +34 -0
- package/dist/types/cluster/transports/LoadClient.d.ts +6 -0
- package/dist/types/cluster/transports/MemoryClusterTransport.d.ts +13 -0
- package/dist/types/cluster/transports/NATSClusterTransport.d.ts +23 -0
- package/dist/types/cluster/transports/RedisClusterTransport.d.ts +23 -0
- package/dist/types/exceptions/ClusterRequestException.d.ts +11 -0
- package/dist/types/exceptions/ClusterTimeoutException.d.ts +10 -0
- package/dist/types/exceptions/ClusterTransportNotFoundException.d.ts +11 -0
- package/dist/types/exceptions/SignalingClientRequiredException.d.ts +12 -0
- package/dist/types/exceptions/SignalingConnectionException.d.ts +12 -0
- package/dist/types/exceptions/SignalingDeniedException.d.ts +11 -0
- package/dist/types/exceptions/SignalingLimitException.d.ts +11 -0
- package/dist/types/exceptions/SignalingNotAMemberException.d.ts +11 -0
- package/dist/types/exceptions/WHEPDeniedException.d.ts +15 -0
- package/dist/types/exceptions/WHEPLimitException.d.ts +15 -0
- package/dist/types/exceptions/WHEPMediaTypeException.d.ts +15 -0
- package/dist/types/exceptions/WHEPOfferException.d.ts +16 -0
- package/dist/types/exceptions/WHEPSessionNotFoundException.d.ts +15 -0
- package/dist/types/exceptions/WHIPDeniedException.d.ts +15 -0
- package/dist/types/exceptions/WHIPLimitException.d.ts +15 -0
- package/dist/types/exceptions/WHIPMediaTypeException.d.ts +15 -0
- package/dist/types/exceptions/WHIPOfferException.d.ts +16 -0
- package/dist/types/exceptions/WHIPSessionNotFoundException.d.ts +15 -0
- package/dist/types/exports/Client.d.ts +11 -0
- package/dist/types/exports/WebRTC.d.ts +48 -0
- package/dist/types/lib/common/binary.d.ts +51 -0
- package/dist/types/lib/common/binaryData.d.ts +116 -0
- package/dist/types/lib/common/crc.d.ts +4 -0
- package/dist/types/lib/common/deque.d.ts +36 -0
- package/dist/types/lib/common/event.d.ts +48 -0
- package/dist/types/lib/common/index.d.ts +11 -0
- package/dist/types/lib/common/log.d.ts +47 -0
- package/dist/types/lib/common/network.d.ts +10 -0
- package/dist/types/lib/common/number.d.ts +13 -0
- package/dist/types/lib/common/promise.d.ts +21 -0
- package/dist/types/lib/common/transport.d.ts +104 -0
- package/dist/types/lib/common/type.d.ts +3 -0
- package/dist/types/lib/dtls/cipher/const.d.ts +42 -0
- package/dist/types/lib/dtls/cipher/create.d.ts +21 -0
- package/dist/types/lib/dtls/cipher/ec.d.ts +28 -0
- package/dist/types/lib/dtls/cipher/key-exchange.d.ts +43 -0
- package/dist/types/lib/dtls/cipher/namedCurve.d.ts +7 -0
- package/dist/types/lib/dtls/cipher/prf.d.ts +17 -0
- package/dist/types/lib/dtls/cipher/suites/abstract.d.ts +40 -0
- package/dist/types/lib/dtls/cipher/suites/aead.d.ts +28 -0
- package/dist/types/lib/dtls/cipher/suites/null.d.ts +24 -0
- package/dist/types/lib/dtls/cipher/utils.d.ts +18 -0
- package/dist/types/lib/dtls/cipher/x509.d.ts +33 -0
- package/dist/types/lib/dtls/client.d.ts +7 -0
- package/dist/types/lib/dtls/context/cipher.d.ts +42 -0
- package/dist/types/lib/dtls/context/dtls.d.ts +38 -0
- package/dist/types/lib/dtls/context/srtp.d.ts +5 -0
- package/dist/types/lib/dtls/context/transport.d.ts +8 -0
- package/dist/types/lib/dtls/flight/client/flight1.d.ts +10 -0
- package/dist/types/lib/dtls/flight/client/flight3.d.ts +8 -0
- package/dist/types/lib/dtls/flight/client/flight5.d.ts +18 -0
- package/dist/types/lib/dtls/flight/flight.d.ts +18 -0
- package/dist/types/lib/dtls/flight/server/flight2.d.ts +6 -0
- package/dist/types/lib/dtls/flight/server/flight4.d.ts +17 -0
- package/dist/types/lib/dtls/flight/server/flight6.d.ts +13 -0
- package/dist/types/lib/dtls/handshake/binary.d.ts +16 -0
- package/dist/types/lib/dtls/handshake/const.d.ts +13 -0
- package/dist/types/lib/dtls/handshake/extensions/ellipticCurves.d.ts +17 -0
- package/dist/types/lib/dtls/handshake/extensions/extendedMasterSecret.d.ts +3 -0
- package/dist/types/lib/dtls/handshake/extensions/renegotiationIndication.d.ts +18 -0
- package/dist/types/lib/dtls/handshake/extensions/signature.d.ts +26 -0
- package/dist/types/lib/dtls/handshake/extensions/useSrtp.d.ts +19 -0
- package/dist/types/lib/dtls/handshake/message/alert.d.ts +12 -0
- package/dist/types/lib/dtls/handshake/message/certificate.d.ts +17 -0
- package/dist/types/lib/dtls/handshake/message/changeCipherSpec.d.ts +11 -0
- package/dist/types/lib/dtls/handshake/message/client/certificateVerify.d.ts +20 -0
- package/dist/types/lib/dtls/handshake/message/client/hello.d.ts +50 -0
- package/dist/types/lib/dtls/handshake/message/client/keyExchange.d.ts +17 -0
- package/dist/types/lib/dtls/handshake/message/finished.d.ts +13 -0
- package/dist/types/lib/dtls/handshake/message/server/certificateRequest.d.ts +31 -0
- package/dist/types/lib/dtls/handshake/message/server/hello.d.ts +33 -0
- package/dist/types/lib/dtls/handshake/message/server/helloDone.d.ts +12 -0
- package/dist/types/lib/dtls/handshake/message/server/helloVerifyRequest.d.ts +32 -0
- package/dist/types/lib/dtls/handshake/message/server/keyExchange.d.ts +32 -0
- package/dist/types/lib/dtls/handshake/random.d.ts +13 -0
- package/dist/types/lib/dtls/helper.d.ts +4 -0
- package/dist/types/lib/dtls/imports/common.d.ts +1 -0
- package/dist/types/lib/dtls/imports/rtp.d.ts +1 -0
- package/dist/types/lib/dtls/index.d.ts +7 -0
- package/dist/types/lib/dtls/record/antiReplayWindow.d.ts +27 -0
- package/dist/types/lib/dtls/record/builder.d.ts +9 -0
- package/dist/types/lib/dtls/record/const.d.ts +33 -0
- package/dist/types/lib/dtls/record/message/fragment.d.ts +26 -0
- package/dist/types/lib/dtls/record/message/header.d.ts +38 -0
- package/dist/types/lib/dtls/record/message/plaintext.d.ts +14 -0
- package/dist/types/lib/dtls/record/receive.d.ts +9 -0
- package/dist/types/lib/dtls/server.d.ts +6 -0
- package/dist/types/lib/dtls/socket.d.ts +52 -0
- package/dist/types/lib/dtls/typings/domain.d.ts +20 -0
- package/dist/types/lib/dtls/util/binary.d.ts +2 -0
- package/dist/types/lib/ice/candidate.d.ts +35 -0
- package/dist/types/lib/ice/dns/lookup.d.ts +16 -0
- package/dist/types/lib/ice/dns/mdns.d.ts +38 -0
- package/dist/types/lib/ice/exceptions.d.ts +24 -0
- package/dist/types/lib/ice/helper.d.ts +17 -0
- package/dist/types/lib/ice/ice.d.ts +182 -0
- package/dist/types/lib/ice/iceBase.d.ts +214 -0
- package/dist/types/lib/ice/imports/common.d.ts +1 -0
- package/dist/types/lib/ice/index.d.ts +12 -0
- package/dist/types/lib/ice/internal/selectAddresses.d.ts +9 -0
- package/dist/types/lib/ice/stun/attributes.d.ts +1 -0
- package/dist/types/lib/ice/stun/const.d.ts +8 -0
- package/dist/types/lib/ice/stun/message.d.ts +1 -0
- package/dist/types/lib/ice/stun/protocol.d.ts +30 -0
- package/dist/types/lib/ice/stun/tcpFrame.d.ts +5 -0
- package/dist/types/lib/ice/stun/tcpProtocol.d.ts +57 -0
- package/dist/types/lib/ice/stun/transaction.d.ts +75 -0
- package/dist/types/lib/ice/turn/frame.d.ts +1 -0
- package/dist/types/lib/ice/turn/protocol.d.ts +170 -0
- package/dist/types/lib/ice/types/model.d.ts +56 -0
- package/dist/types/lib/ice/utils.d.ts +13 -0
- package/dist/types/lib/peer/const.d.ts +36 -0
- package/dist/types/lib/peer/dataChannel.d.ts +69 -0
- package/dist/types/lib/peer/errors.d.ts +11 -0
- package/dist/types/lib/peer/helper.d.ts +20 -0
- package/dist/types/lib/peer/imports/common.d.ts +1 -0
- package/dist/types/lib/peer/imports/dtls.d.ts +1 -0
- package/dist/types/lib/peer/imports/ice.d.ts +1 -0
- package/dist/types/lib/peer/imports/rtp.d.ts +1 -0
- package/dist/types/lib/peer/index.d.ts +14 -0
- package/dist/types/lib/peer/media/codec.d.ts +15 -0
- package/dist/types/lib/peer/media/codecCompatibility.d.ts +23 -0
- package/dist/types/lib/peer/media/extension/rtcpFeedback.d.ts +6 -0
- package/dist/types/lib/peer/media/extension/rtpExtension.d.ts +9 -0
- package/dist/types/lib/peer/media/index.d.ts +12 -0
- package/dist/types/lib/peer/media/parameters.d.ts +65 -0
- package/dist/types/lib/peer/media/receiver/nack.d.ts +23 -0
- package/dist/types/lib/peer/media/receiver/receiverTwcc.d.ts +47 -0
- package/dist/types/lib/peer/media/receiver/statistics.d.ts +22 -0
- package/dist/types/lib/peer/media/router.d.ts +25 -0
- package/dist/types/lib/peer/media/rtpReceiver.d.ts +90 -0
- package/dist/types/lib/peer/media/rtpSender.d.ts +209 -0
- package/dist/types/lib/peer/media/rtpTransceiver.d.ts +117 -0
- package/dist/types/lib/peer/media/sender/cumulativeResult.d.ts +19 -0
- package/dist/types/lib/peer/media/sender/senderBWE.d.ts +32 -0
- package/dist/types/lib/peer/media/stats.d.ts +293 -0
- package/dist/types/lib/peer/media/track.d.ts +67 -0
- package/dist/types/lib/peer/peerConnection.d.ts +458 -0
- package/dist/types/lib/peer/sctpManager.d.ts +28 -0
- package/dist/types/lib/peer/sdp.d.ts +97 -0
- package/dist/types/lib/peer/sdpManager.d.ts +116 -0
- package/dist/types/lib/peer/secureTransportManager.d.ts +96 -0
- package/dist/types/lib/peer/transceiverManager.d.ts +151 -0
- package/dist/types/lib/peer/transport/dtls.d.ts +95 -0
- package/dist/types/lib/peer/transport/ice.d.ts +143 -0
- package/dist/types/lib/peer/transport/sctp.d.ts +56 -0
- package/dist/types/lib/peer/types/domain.d.ts +5 -0
- package/dist/types/lib/peer/types/util.d.ts +2 -0
- package/dist/types/lib/peer/utils.d.ts +73 -0
- package/dist/types/lib/rtp/codec/av1.d.ts +56 -0
- package/dist/types/lib/rtp/codec/base.d.ts +8 -0
- package/dist/types/lib/rtp/codec/h264.d.ts +32 -0
- package/dist/types/lib/rtp/codec/index.d.ts +16 -0
- package/dist/types/lib/rtp/codec/leb128.d.ts +5 -0
- package/dist/types/lib/rtp/codec/opus.d.ts +9 -0
- package/dist/types/lib/rtp/codec/vp8.d.ts +27 -0
- package/dist/types/lib/rtp/codec/vp9.d.ts +46 -0
- package/dist/types/lib/rtp/const.d.ts +1 -0
- package/dist/types/lib/rtp/helper.d.ts +8 -0
- package/dist/types/lib/rtp/imports/common.d.ts +1 -0
- package/dist/types/lib/rtp/index.d.ts +25 -0
- package/dist/types/lib/rtp/rtcp/header.d.ts +13 -0
- package/dist/types/lib/rtp/rtcp/psfb/fullIntraRequest.d.ts +16 -0
- package/dist/types/lib/rtp/rtcp/psfb/index.d.ts +14 -0
- package/dist/types/lib/rtp/rtcp/psfb/pictureLossIndication.d.ts +10 -0
- package/dist/types/lib/rtp/rtcp/psfb/remb.d.ts +16 -0
- package/dist/types/lib/rtp/rtcp/rr.d.ts +32 -0
- package/dist/types/lib/rtp/rtcp/rtcp.d.ts +10 -0
- package/dist/types/lib/rtp/rtcp/rtpfb/const.d.ts +1 -0
- package/dist/types/lib/rtp/rtcp/rtpfb/index.d.ts +14 -0
- package/dist/types/lib/rtp/rtcp/rtpfb/nack.d.ts +17 -0
- package/dist/types/lib/rtp/rtcp/rtpfb/twcc.d.ts +71 -0
- package/dist/types/lib/rtp/rtcp/sdes.d.ts +26 -0
- package/dist/types/lib/rtp/rtcp/sr.d.ts +41 -0
- package/dist/types/lib/rtp/rtp/headerExtension.d.ts +72 -0
- package/dist/types/lib/rtp/rtp/red/encoder.d.ts +13 -0
- package/dist/types/lib/rtp/rtp/red/handler.d.ts +6 -0
- package/dist/types/lib/rtp/rtp/red/packet.d.ts +26 -0
- package/dist/types/lib/rtp/rtp/rtp.d.ts +44 -0
- package/dist/types/lib/rtp/rtp/rtx.d.ts +3 -0
- package/dist/types/lib/rtp/srtp/cipher/ctr.d.ts +16 -0
- package/dist/types/lib/rtp/srtp/cipher/gcm.d.ts +17 -0
- package/dist/types/lib/rtp/srtp/cipher/index.d.ts +13 -0
- package/dist/types/lib/rtp/srtp/const.d.ts +6 -0
- package/dist/types/lib/rtp/srtp/context/context.d.ts +45 -0
- package/dist/types/lib/rtp/srtp/context/srtcp.d.ts +8 -0
- package/dist/types/lib/rtp/srtp/context/srtp.d.ts +9 -0
- package/dist/types/lib/rtp/srtp/error.d.ts +3 -0
- package/dist/types/lib/rtp/srtp/packet.d.ts +5 -0
- package/dist/types/lib/rtp/srtp/session.d.ts +19 -0
- package/dist/types/lib/rtp/srtp/srtcp.d.ts +8 -0
- package/dist/types/lib/rtp/srtp/srtp.d.ts +9 -0
- package/dist/types/lib/rtp/transport.d.ts +15 -0
- package/dist/types/lib/rtp/util.d.ts +11 -0
- package/dist/types/lib/sctp/chunk.d.ts +164 -0
- package/dist/types/lib/sctp/const.d.ts +17 -0
- package/dist/types/lib/sctp/helper.d.ts +5 -0
- package/dist/types/lib/sctp/imports/common.d.ts +1 -0
- package/dist/types/lib/sctp/index.d.ts +6 -0
- package/dist/types/lib/sctp/param.d.ts +40 -0
- package/dist/types/lib/sctp/sctp.d.ts +210 -0
- package/dist/types/lib/sctp/transport.d.ts +15 -0
- package/dist/types/lib/turn/index.d.ts +9 -0
- package/dist/types/lib/turn/node/server.d.ts +21 -0
- package/dist/types/lib/turn/node/turnServer.d.ts +91 -0
- package/dist/types/lib/turn/protocol.d.ts +47 -0
- package/dist/types/lib/turn/stun/attributes.d.ts +37 -0
- package/dist/types/lib/turn/stun/const.d.ts +28 -0
- package/dist/types/lib/turn/stun/ip.d.ts +12 -0
- package/dist/types/lib/turn/stun/message.d.ts +37 -0
- package/dist/types/lib/turn/turn/auth.d.ts +1 -0
- package/dist/types/lib/turn/turn/frame.d.ts +13 -0
- package/dist/types/lib/turn/turn/protocol.d.ts +147 -0
- package/dist/types/peer/Endpoints.d.ts +75 -0
- package/dist/types/peer/EngineConfig.d.ts +20 -0
- package/dist/types/peer/EngineConnection.d.ts +22 -0
- package/dist/types/peer/Events.d.ts +55 -0
- package/dist/types/peer/MediaCodecs.d.ts +27 -0
- package/dist/types/peer/MediaTrack.d.ts +212 -0
- package/dist/types/peer/PeerChannel.d.ts +248 -0
- package/dist/types/peer/PeerConnection.d.ts +603 -0
- package/dist/types/peer/PeerThreadChannel.d.ts +112 -0
- package/dist/types/peer/PeerThreadProtocol.d.ts +325 -0
- package/dist/types/peer/PeerThreads.d.ts +114 -0
- package/dist/types/peer/PeerWorker.d.ts +6 -0
- package/dist/types/peer/PeerWorkerCode.d.ts +5 -0
- package/dist/types/peer/RemoteConnection.d.ts +314 -0
- package/dist/types/peer/RtpPacket.d.ts +112 -0
- package/dist/types/peer/RtpTransceiver.d.ts +167 -0
- package/dist/types/peer/SignalingClient.d.ts +236 -0
- package/dist/types/protocol/SignalingProtocol.d.ts +266 -0
- package/dist/types/service/WebRTCServiceEntrypoint.d.ts +158 -0
- package/dist/types/sfu/SFU.d.ts +356 -0
- package/dist/types/sfu/SFUAccess.d.ts +48 -0
- package/dist/types/sfu/SFUClusterLeg.d.ts +101 -0
- package/dist/types/sfu/SFURoom.d.ts +148 -0
- package/dist/types/sfu/SFUWorker.d.ts +13 -0
- package/dist/types/sfu/SFUWorkerChannel.d.ts +204 -0
- package/dist/types/sfu/SFUWorkerCode.d.ts +5 -0
- package/dist/types/sfu/SFUWorkers.d.ts +247 -0
- package/dist/types/shared/ChunkedChannel.d.ts +122 -0
- package/dist/types/shared/Connections.d.ts +231 -0
- package/dist/types/shared/Emitter.d.ts +50 -0
- package/dist/types/shared/Peer.d.ts +182 -0
- package/dist/types/shared/PeerServiceProxy.d.ts +173 -0
- package/dist/types/shared/Room.d.ts +143 -0
- package/dist/types/shared/SignalingError.d.ts +40 -0
- package/dist/types/shared/SignalingSession.d.ts +97 -0
- package/dist/types/shared/Transports.d.ts +139 -0
- package/dist/types/signaling/MediaServers.d.ts +40 -0
- package/dist/types/signaling/Signaling.d.ts +573 -0
- package/dist/types/signaling/SignalingController.d.ts +128 -0
- package/dist/types/turn/TURNCredentials.d.ts +49 -0
- package/dist/types/turn/TURNIceServers.d.ts +11 -0
- package/dist/types/turn/TURNServer.d.ts +309 -0
- package/dist/types/turn/TURNWorker.d.ts +42 -0
- package/dist/types/turn/TURNWorkerCode.d.ts +5 -0
- package/dist/types/turn/TURNWorkers.d.ts +52 -0
- package/dist/types/whep/WHEP.d.ts +386 -0
- package/dist/types/whep/WHEPController.d.ts +134 -0
- package/dist/types/whip/WHIP.d.ts +426 -0
- package/dist/types/whip/WHIPController.d.ts +132 -0
- package/package.json +115 -4
|
@@ -0,0 +1,1296 @@
|
|
|
1
|
+
import { RTCRtpCodecParameters } from '../lib/peer/media/parameters.js';
|
|
2
|
+
import { engineChannelOf, engineConnectionOf } from '../peer/EngineConnection.js';
|
|
3
|
+
import { engineTrackOf, relayedTrack } from '../peer/MediaTrack.js';
|
|
4
|
+
import { gathered, patchConnection } from '../peer/Endpoints.js';
|
|
5
|
+
import { engineSenderOf } from '../peer/RtpTransceiver.js';
|
|
6
|
+
import { SignalingControlChannel, SignalingEvent } from '../protocol/SignalingProtocol.js';
|
|
7
|
+
import { Peer } from '../shared/Peer.js';
|
|
8
|
+
/**
|
|
9
|
+
* The key of a track: its member and its id
|
|
10
|
+
* @param peerId
|
|
11
|
+
* @param trackId
|
|
12
|
+
*/
|
|
13
|
+
function trackKey(peerId, trackId) {
|
|
14
|
+
return JSON.stringify([peerId, trackId]);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* How long a channel to a member not known yet waits for it (its joining on its way through the cluster), in
|
|
18
|
+
* milliseconds
|
|
19
|
+
*/
|
|
20
|
+
const UNKNOWN_MEMBER_TIMEOUT = 5000;
|
|
21
|
+
/**
|
|
22
|
+
* How long a member joining waits for the answers of select for the tracks already published, in milliseconds, so the
|
|
23
|
+
* first offer carries them (select asked in the main thread from a worker thread); an answer coming later is applied in
|
|
24
|
+
* an offer of its own
|
|
25
|
+
*/
|
|
26
|
+
const FIRST_OFFER_SELECT_WAIT = 1000;
|
|
27
|
+
/**
|
|
28
|
+
* The members a channel from the media server of another node goes from and to: its protocol, `["from","to"]`
|
|
29
|
+
* @param protocol
|
|
30
|
+
*/
|
|
31
|
+
function routeOf(protocol) {
|
|
32
|
+
try {
|
|
33
|
+
const route = JSON.parse(protocol);
|
|
34
|
+
return Array.isArray(route) && route.length === 2 && route.every((id) => typeof id === 'string') ? route : undefined;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The bytes a channel relayed to a member may have waiting to be sent: past them, the messages wait at the server, out
|
|
42
|
+
* of the receive window of the member sending them (which waits then), until the channel sends half of them
|
|
43
|
+
*/
|
|
44
|
+
const RELAY_HIGH_WATER_MARK = 1024 * 1024;
|
|
45
|
+
/**
|
|
46
|
+
* Relay the messages of a channel to another one, as fast as the other one sends them: the messages of a reliable
|
|
47
|
+
* channel wait at the server while the other one is not open or has too much to send, held out of the receive window
|
|
48
|
+
* of the connection they come from (its sender waits once the window is closed); the ones of an unreliable channel are
|
|
49
|
+
* dropped then, once the other one is open or past RELAY_HIGH_WATER_MARK waiting
|
|
50
|
+
* @param source
|
|
51
|
+
* @param target
|
|
52
|
+
* @param early The messages the source got before.
|
|
53
|
+
*/
|
|
54
|
+
function relay(source, target, early = []) {
|
|
55
|
+
const transport = engineChannelOf(source).sctp;
|
|
56
|
+
const reliable = source.maxRetransmits === null && source.maxPacketLifeTime === null;
|
|
57
|
+
const waiting = [];
|
|
58
|
+
let held = 0;
|
|
59
|
+
let queued = 0;
|
|
60
|
+
target.bufferedAmountLowThreshold = RELAY_HIGH_WATER_MARK / 2;
|
|
61
|
+
const drain = () => {
|
|
62
|
+
while (waiting.length && target.readyState === 'open' && target.bufferedAmount < RELAY_HIGH_WATER_MARK) {
|
|
63
|
+
const { data, size } = waiting.shift();
|
|
64
|
+
queued -= size;
|
|
65
|
+
target.send(data);
|
|
66
|
+
if (reliable) {
|
|
67
|
+
held -= size;
|
|
68
|
+
transport.releaseReceived(size);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const relayed = (data) => {
|
|
73
|
+
const message = typeof data === 'string' || Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
74
|
+
if (target.readyState === 'closing' || target.readyState === 'closed')
|
|
75
|
+
return;
|
|
76
|
+
if (!waiting.length && target.readyState === 'open' && target.bufferedAmount < RELAY_HIGH_WATER_MARK)
|
|
77
|
+
return target.send(message);
|
|
78
|
+
const size = typeof message === 'string' ? Buffer.byteLength(message) : message.length;
|
|
79
|
+
if (!reliable && (target.readyState === 'open' || queued + size > RELAY_HIGH_WATER_MARK))
|
|
80
|
+
return;
|
|
81
|
+
waiting.push({ data: message, size: size });
|
|
82
|
+
queued += size;
|
|
83
|
+
if (reliable) {
|
|
84
|
+
held += size;
|
|
85
|
+
transport.holdReceived(size);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
early.forEach(relayed);
|
|
89
|
+
source.on('message', relayed);
|
|
90
|
+
target.on('open', drain);
|
|
91
|
+
target.on('bufferedamountlow', drain);
|
|
92
|
+
//The window held is given back when the other side is gone
|
|
93
|
+
target.on('close', () => {
|
|
94
|
+
waiting.length = 0;
|
|
95
|
+
queued = 0;
|
|
96
|
+
if (held)
|
|
97
|
+
transport.releaseReceived(held);
|
|
98
|
+
held = 0;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The transceiver of the engine of a transceiver
|
|
103
|
+
* @param connection
|
|
104
|
+
* @param transceiver
|
|
105
|
+
*/
|
|
106
|
+
function engineTransceiverOf(connection, transceiver) {
|
|
107
|
+
const engine = engineConnectionOf(connection);
|
|
108
|
+
return transceiver.mid === null ? undefined : engine.getTransceivers().find((each) => each.mid === transceiver.mid);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The part of a room on the media server: a connection to each member (the server never gives up its offers), the
|
|
112
|
+
* tracks they publish, forwarded to the others the server selects for them
|
|
113
|
+
*/
|
|
114
|
+
export class SFURoom {
|
|
115
|
+
#host;
|
|
116
|
+
#members = new Map();
|
|
117
|
+
#viewers = new Map();
|
|
118
|
+
#publications = new Set();
|
|
119
|
+
//The transports whose bandwidth is watched
|
|
120
|
+
#watched = new WeakSet();
|
|
121
|
+
//The clients connected to the media servers of other nodes, and the id of their server
|
|
122
|
+
#elsewhere = new Map();
|
|
123
|
+
//What select answered for each member (by its id) and each track of the other nodes (by key)
|
|
124
|
+
#selected = new Map();
|
|
125
|
+
//The tracks of other nodes read here, by key
|
|
126
|
+
#reads = new Map();
|
|
127
|
+
//The channels to members not known yet
|
|
128
|
+
#waiting = new Set();
|
|
129
|
+
#closed = false;
|
|
130
|
+
/**
|
|
131
|
+
* Create the part of a room, and join it.
|
|
132
|
+
* @param host The media server.
|
|
133
|
+
* @param name The room.
|
|
134
|
+
*/
|
|
135
|
+
constructor(host, name) {
|
|
136
|
+
this.#host = host;
|
|
137
|
+
this.name = name;
|
|
138
|
+
this.ready = this.#join();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Whether the room has no member and no viewer left.
|
|
142
|
+
*/
|
|
143
|
+
get empty() {
|
|
144
|
+
return !this.members.length && !this.#viewers.size;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* The number of the viewers of WHEP.
|
|
148
|
+
*/
|
|
149
|
+
get viewers() {
|
|
150
|
+
return this.#viewers.size;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Whether the server left the room.
|
|
154
|
+
*/
|
|
155
|
+
get closed() {
|
|
156
|
+
return this.#closed;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* The ids of the members of this node (the media servers of the other nodes are not counted).
|
|
160
|
+
*/
|
|
161
|
+
get members() {
|
|
162
|
+
return [...this.#members.values()].filter((member) => !member.cascade).map((member) => member.id);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The tracks the members of this node publish.
|
|
166
|
+
*/
|
|
167
|
+
get tracks() {
|
|
168
|
+
return [...this.#publications].filter((publication) => !publication.remote).map((publication) => publication.track);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* A track published in the room: received from its member, or from the media server of its node while it is read.
|
|
172
|
+
* @param peerId The member.
|
|
173
|
+
* @param trackId The id of the track.
|
|
174
|
+
* @returns The track, or undefined when it is not published.
|
|
175
|
+
*/
|
|
176
|
+
track(peerId, trackId) {
|
|
177
|
+
for (const publication of this.#publications) {
|
|
178
|
+
if (!publication.remote && publication.track.peerId === peerId && publication.track.id === trackId)
|
|
179
|
+
return publication.media;
|
|
180
|
+
}
|
|
181
|
+
const key = trackKey(peerId, trackId);
|
|
182
|
+
const offered = this.#offered(key);
|
|
183
|
+
if (!offered)
|
|
184
|
+
return undefined;
|
|
185
|
+
let read = this.#reads.get(key);
|
|
186
|
+
if (!read) {
|
|
187
|
+
const codec = offered.codec ?? { mimeType: offered.track.codec, clockRate: offered.track.kind === 'audio' ? 48000 : 90000 };
|
|
188
|
+
const relayed = relayedTrack(offered.track.kind, new RTCRtpCodecParameters(codec), trackId, {
|
|
189
|
+
requestKeyFrame: () => this.#remotePublication(key)?.media.requestKeyFrame(),
|
|
190
|
+
wanted: (wanted) => {
|
|
191
|
+
const current = this.#reads.get(key);
|
|
192
|
+
if (!current)
|
|
193
|
+
return;
|
|
194
|
+
current.wanted = wanted;
|
|
195
|
+
this.#pipe(key);
|
|
196
|
+
this.#tellWants();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
read = { track: relayed.track, receive: relayed.receive, wanted: false };
|
|
200
|
+
this.#reads.set(key, read);
|
|
201
|
+
}
|
|
202
|
+
return read.track;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The connections to the media servers of the other nodes: the tracks sent on each, the ones received (for the
|
|
206
|
+
* tests).
|
|
207
|
+
* @returns By the id of the member of each server.
|
|
208
|
+
*/
|
|
209
|
+
cascades() {
|
|
210
|
+
return Object.fromEntries([...this.#members.values()].filter((member) => !!member.cascade).map((member) => [member.id, { sends: member.subscriptions.size, receives: member.publications.size }]));
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Leave the room: the connections to the members are closed.
|
|
214
|
+
* @returns Resolves once the signaling is told.
|
|
215
|
+
*/
|
|
216
|
+
async close() {
|
|
217
|
+
if (this.#closed)
|
|
218
|
+
return;
|
|
219
|
+
this.#closed = true;
|
|
220
|
+
for (const member of [...this.#members.values()])
|
|
221
|
+
this.#remove(member);
|
|
222
|
+
for (const viewer of [...this.#viewers.values()])
|
|
223
|
+
this.#stop(viewer);
|
|
224
|
+
for (const key of [...this.#reads.keys()])
|
|
225
|
+
this.#endRead(key);
|
|
226
|
+
for (const opening of [...this.#waiting])
|
|
227
|
+
opening.channel.close();
|
|
228
|
+
await this.#host.signaling.leave(this.#host.id, this.name).catch(() => undefined);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* A viewer of WHEP: the connection answering its offer sends it an audio and a video track of a member of the room
|
|
232
|
+
* (its source), once and as long as there is one, from a key frame. Its media negotiate every codec it offers that
|
|
233
|
+
* the server has, so a source publishing later with any of them is sent too.
|
|
234
|
+
* @param id The id of the viewer.
|
|
235
|
+
* @param offer The offer of the viewer.
|
|
236
|
+
* @param select Chooses its source among the members publishing; the newest stream of WHIP, else the first member
|
|
237
|
+
* publishing, without it.
|
|
238
|
+
* @returns The connection, its answer with all its candidates, and its source now.
|
|
239
|
+
*/
|
|
240
|
+
async play(id, offer, select) {
|
|
241
|
+
const connection = await this.#host.connect();
|
|
242
|
+
const ended = [];
|
|
243
|
+
let closed = false;
|
|
244
|
+
const leg = {
|
|
245
|
+
connection: connection,
|
|
246
|
+
ready: Promise.resolve(),
|
|
247
|
+
get closed() {
|
|
248
|
+
return closed;
|
|
249
|
+
},
|
|
250
|
+
close: () => {
|
|
251
|
+
if (closed)
|
|
252
|
+
return;
|
|
253
|
+
closed = true;
|
|
254
|
+
connection.close();
|
|
255
|
+
for (const listener of ended.splice(0))
|
|
256
|
+
listener();
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
const viewer = { id: id, leg: leg, transceivers: new Map(), attached: new Map(), select: select, feeding: Promise.resolve() };
|
|
260
|
+
connection.on('connectionstatechange', (state) => {
|
|
261
|
+
if (state === 'failed' || state === 'closed')
|
|
262
|
+
this.#stop(viewer);
|
|
263
|
+
});
|
|
264
|
+
try {
|
|
265
|
+
await connection.setRemoteDescription(offer);
|
|
266
|
+
//The first media of each kind sends; no track before the answer, which keeps all the codecs
|
|
267
|
+
for (const transceiver of connection.getTransceivers()) {
|
|
268
|
+
if (viewer.transceivers.has(transceiver.kind))
|
|
269
|
+
continue;
|
|
270
|
+
viewer.transceivers.set(transceiver.kind, transceiver);
|
|
271
|
+
transceiver.direction = 'sendonly';
|
|
272
|
+
}
|
|
273
|
+
if (!viewer.transceivers.size)
|
|
274
|
+
throw new Error('The offer has no audio and no video');
|
|
275
|
+
await connection.setLocalDescription();
|
|
276
|
+
await gathered(connection);
|
|
277
|
+
if (closed)
|
|
278
|
+
throw new Error(`The connection is ${connection.connectionState}`);
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
leg.close();
|
|
282
|
+
throw error;
|
|
283
|
+
}
|
|
284
|
+
this.#viewers.set(id, viewer);
|
|
285
|
+
this.#host.changed?.(this);
|
|
286
|
+
await this.#feed(viewer);
|
|
287
|
+
return {
|
|
288
|
+
answer: connection.localDescription,
|
|
289
|
+
patch: (fragment, restart) => patchConnection(connection, fragment, restart),
|
|
290
|
+
ended: (listener) => closed ? listener() : ended.push(listener),
|
|
291
|
+
close: () => this.#stop(viewer),
|
|
292
|
+
source: () => viewer.source
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Send a viewer the tracks of its source, after the changes before
|
|
297
|
+
* @param viewer
|
|
298
|
+
*/
|
|
299
|
+
#feed(viewer) {
|
|
300
|
+
viewer.feeding = viewer.feeding.then(() => this.#refeed(viewer)).catch(() => undefined);
|
|
301
|
+
return viewer.feeding;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Send a viewer the tracks of its source: chosen again, as the tracks of the room change
|
|
305
|
+
* @param viewer
|
|
306
|
+
*/
|
|
307
|
+
async #refeed(viewer) {
|
|
308
|
+
if (viewer.leg.closed)
|
|
309
|
+
return;
|
|
310
|
+
//The tracks of the members of this node, then the ones of the other nodes
|
|
311
|
+
const tracks = [...this.tracks, ...[...this.#offeredTracks()].map((offered) => offered.track)];
|
|
312
|
+
const selected = viewer.select ? await viewer.select(tracks) : undefined;
|
|
313
|
+
if (viewer.leg.closed)
|
|
314
|
+
return;
|
|
315
|
+
const publishers = [...new Set(tracks.map((track) => track.peerId))];
|
|
316
|
+
const chosen = selected
|
|
317
|
+
?? publishers.filter((id) => id.startsWith('whip:')).at(-1)
|
|
318
|
+
?? publishers[0];
|
|
319
|
+
const before = viewer.source;
|
|
320
|
+
viewer.source = chosen !== undefined && publishers.includes(chosen) ? chosen : undefined;
|
|
321
|
+
if (viewer.source !== before) {
|
|
322
|
+
this.#host.sourced?.(viewer.id, viewer.source);
|
|
323
|
+
//The tracks of a source of another node come from that node
|
|
324
|
+
this.#tellWants();
|
|
325
|
+
}
|
|
326
|
+
for (const [kind, transceiver] of viewer.transceivers) {
|
|
327
|
+
const publication = viewer.source === undefined
|
|
328
|
+
? undefined
|
|
329
|
+
: [...this.#publications].find((each) => each.track.peerId === viewer.source && each.track.kind === kind);
|
|
330
|
+
if (viewer.attached.get(kind) === publication)
|
|
331
|
+
continue;
|
|
332
|
+
viewer.attached.delete(kind);
|
|
333
|
+
try {
|
|
334
|
+
await transceiver.sender.replaceTrack(publication?.media ?? null);
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
//Of a codec the viewer does not have
|
|
338
|
+
this.#host.emit('unsupported', this.name, viewer.id, publication.track);
|
|
339
|
+
await transceiver.sender.replaceTrack(null).catch(() => undefined);
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
if (!publication)
|
|
343
|
+
continue;
|
|
344
|
+
viewer.attached.set(kind, publication);
|
|
345
|
+
if (kind === 'video')
|
|
346
|
+
publication.media.requestKeyFrame();
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* A viewer stopped: its connection is closed
|
|
351
|
+
* @param viewer
|
|
352
|
+
*/
|
|
353
|
+
#stop(viewer) {
|
|
354
|
+
if (this.#viewers.get(viewer.id) !== viewer)
|
|
355
|
+
return viewer.leg.close();
|
|
356
|
+
this.#viewers.delete(viewer.id);
|
|
357
|
+
viewer.leg.close();
|
|
358
|
+
if (!this.#closed)
|
|
359
|
+
this.#host.changed?.(this);
|
|
360
|
+
if (!this.#closed && this.empty)
|
|
361
|
+
this.#host.emptied(this);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* A stream published with WHIP joins the room: a member (of role `whip`) whose connection answers the offer of the
|
|
365
|
+
* publisher, publishing its tracks and receiving nothing
|
|
366
|
+
* @param id The id of the member.
|
|
367
|
+
* @param offer The offer of the publisher.
|
|
368
|
+
* @returns The connection, its answer with all its candidates.
|
|
369
|
+
*/
|
|
370
|
+
async publish(id, offer) {
|
|
371
|
+
const connection = await this.#host.connect();
|
|
372
|
+
const ended = [];
|
|
373
|
+
let closed = false;
|
|
374
|
+
const leg = {
|
|
375
|
+
connection: connection,
|
|
376
|
+
ready: Promise.resolve(),
|
|
377
|
+
get closed() {
|
|
378
|
+
return closed;
|
|
379
|
+
},
|
|
380
|
+
close: () => {
|
|
381
|
+
if (closed)
|
|
382
|
+
return;
|
|
383
|
+
closed = true;
|
|
384
|
+
connection.close();
|
|
385
|
+
for (const listener of ended.splice(0))
|
|
386
|
+
listener();
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
const member = {
|
|
390
|
+
id: id,
|
|
391
|
+
leg: leg,
|
|
392
|
+
metadata: undefined,
|
|
393
|
+
publications: new Map(),
|
|
394
|
+
subscriptions: new Map(),
|
|
395
|
+
streams: new Map(),
|
|
396
|
+
streamIds: new Map(),
|
|
397
|
+
transceivers: new Set()
|
|
398
|
+
};
|
|
399
|
+
this.#members.set(id, member);
|
|
400
|
+
this.#host.changed?.(this);
|
|
401
|
+
connection.addEventListener('track', (event) => this.#published(member, event));
|
|
402
|
+
connection.on('connectionstatechange', (state) => {
|
|
403
|
+
if (state === 'failed' || state === 'closed')
|
|
404
|
+
this.#remove(member);
|
|
405
|
+
});
|
|
406
|
+
//Negotiated again for an ICE restart (a PATCH)
|
|
407
|
+
connection.on('signalingstatechange', (state) => {
|
|
408
|
+
if (state === 'stable')
|
|
409
|
+
setImmediate(() => this.#negotiated(member));
|
|
410
|
+
});
|
|
411
|
+
try {
|
|
412
|
+
await connection.setRemoteDescription(offer);
|
|
413
|
+
await connection.setLocalDescription();
|
|
414
|
+
await gathered(connection);
|
|
415
|
+
if (closed)
|
|
416
|
+
throw new Error(`The connection is ${connection.connectionState}`);
|
|
417
|
+
await this.#host.signaling.join(id, this.name, { role: 'whip', receive: () => undefined });
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
this.#remove(member);
|
|
421
|
+
throw error;
|
|
422
|
+
}
|
|
423
|
+
return {
|
|
424
|
+
answer: connection.localDescription,
|
|
425
|
+
patch: (fragment, restart) => patchConnection(connection, fragment, restart),
|
|
426
|
+
ended: (listener) => closed ? listener() : ended.push(listener),
|
|
427
|
+
close: () => this.#remove(member)
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Join the room, with the members already in it
|
|
432
|
+
*/
|
|
433
|
+
async #join() {
|
|
434
|
+
const result = await this.#host.signaling.join(this.#host.id, this.name, {
|
|
435
|
+
role: 'sfu',
|
|
436
|
+
receive: (event, payload) => this.#receive(event, payload)
|
|
437
|
+
});
|
|
438
|
+
for (const peer of result.peers) {
|
|
439
|
+
if (this.#serves(peer))
|
|
440
|
+
this.#add(peer.peerId, peer.metadata, peer.session);
|
|
441
|
+
else
|
|
442
|
+
this.#elsewhereJoined(peer);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* A member of the room this server does not serve: the media server of another node (connected to), or a client of
|
|
447
|
+
* one
|
|
448
|
+
* @param peer
|
|
449
|
+
*/
|
|
450
|
+
#elsewhereJoined(peer) {
|
|
451
|
+
if (peer.role === 'sfu') {
|
|
452
|
+
if (peer.peerId !== this.#host.id && !this.#members.has(peer.peerId))
|
|
453
|
+
this.#cascade(peer.peerId);
|
|
454
|
+
}
|
|
455
|
+
else if (!peer.role && peer.sfu) {
|
|
456
|
+
this.#elsewhere.set(peer.peerId, peer.sfu);
|
|
457
|
+
}
|
|
458
|
+
this.#unwait();
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Whether the server serves a member: a client connected to it (the media server of another node serves the
|
|
462
|
+
* others)
|
|
463
|
+
* @param peer
|
|
464
|
+
*/
|
|
465
|
+
#serves(peer) {
|
|
466
|
+
return !peer.role && peer.sfu === this.#host.id;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* An event of the room
|
|
470
|
+
* @param event
|
|
471
|
+
* @param payload
|
|
472
|
+
*/
|
|
473
|
+
#receive(event, payload) {
|
|
474
|
+
if (this.#closed)
|
|
475
|
+
return;
|
|
476
|
+
switch (event) {
|
|
477
|
+
case SignalingEvent.peerJoined: {
|
|
478
|
+
const joined = payload;
|
|
479
|
+
const member = this.#members.get(joined.peerId);
|
|
480
|
+
if (!this.#serves(joined)) {
|
|
481
|
+
//A client joining again through the media server of another node
|
|
482
|
+
if (!joined.role && member?.peer)
|
|
483
|
+
this.#remove(member);
|
|
484
|
+
this.#elsewhereJoined(joined);
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
this.#elsewhere.delete(joined.peerId);
|
|
488
|
+
//A new client behind the same id: its old connection is useless
|
|
489
|
+
if (member && joined.session !== undefined && member.session !== joined.session)
|
|
490
|
+
this.#remove(member);
|
|
491
|
+
if (member && this.#members.get(joined.peerId) === member) {
|
|
492
|
+
const changed = JSON.stringify(member.metadata) !== JSON.stringify(joined.metadata);
|
|
493
|
+
member.metadata = joined.metadata;
|
|
494
|
+
if (changed)
|
|
495
|
+
this.#reselect(member);
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
this.#add(joined.peerId, joined.metadata, joined.session);
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
case SignalingEvent.peerLeft: {
|
|
502
|
+
const peerId = payload.peerId;
|
|
503
|
+
this.#elsewhere.delete(peerId);
|
|
504
|
+
const member = this.#members.get(peerId);
|
|
505
|
+
if (member)
|
|
506
|
+
this.#remove(member);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
case SignalingEvent.signal: {
|
|
510
|
+
const signal = payload;
|
|
511
|
+
let member = this.#members.get(signal.from);
|
|
512
|
+
if (!member) {
|
|
513
|
+
//A client of another media server (a signal still on its way when it moved) is not taken
|
|
514
|
+
if (this.#elsewhere.has(signal.from))
|
|
515
|
+
return;
|
|
516
|
+
member = signal.from.startsWith('sfu:') ? this.#cascade(signal.from) : this.#add(signal.from, undefined, signal.session);
|
|
517
|
+
}
|
|
518
|
+
//The streams of the media server of another node: the members they come from
|
|
519
|
+
if (member.cascade)
|
|
520
|
+
for (const stream of signal.streams ?? [])
|
|
521
|
+
member.cascade.received.set(stream.id, stream);
|
|
522
|
+
const received = {};
|
|
523
|
+
if (signal.description)
|
|
524
|
+
received.description = signal.description;
|
|
525
|
+
if (signal.candidate)
|
|
526
|
+
received.candidate = signal.candidate;
|
|
527
|
+
member.peer?.receive(received);
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Connect to a member, and send it the tracks published
|
|
534
|
+
* @param id
|
|
535
|
+
* @param metadata
|
|
536
|
+
* @param session
|
|
537
|
+
*/
|
|
538
|
+
#add(id, metadata, session) {
|
|
539
|
+
const host = {
|
|
540
|
+
localId: this.#host.id,
|
|
541
|
+
create: () => this.#host.connect(),
|
|
542
|
+
send: (to, signal) => this.#signal(member, signal),
|
|
543
|
+
signalingUp: true,
|
|
544
|
+
closed: () => undefined,
|
|
545
|
+
polite: false
|
|
546
|
+
};
|
|
547
|
+
const peer = new Peer(host, id, metadata, session);
|
|
548
|
+
const member = {
|
|
549
|
+
id: id,
|
|
550
|
+
leg: peer,
|
|
551
|
+
peer: peer,
|
|
552
|
+
metadata: metadata,
|
|
553
|
+
session: session,
|
|
554
|
+
publications: new Map(),
|
|
555
|
+
subscriptions: new Map(),
|
|
556
|
+
streams: new Map(),
|
|
557
|
+
streamIds: new Map(),
|
|
558
|
+
transceivers: new Set()
|
|
559
|
+
};
|
|
560
|
+
this.#members.set(id, member);
|
|
561
|
+
this.#host.changed?.(this);
|
|
562
|
+
//The tracks of the other nodes it may receive
|
|
563
|
+
this.#evaluate();
|
|
564
|
+
this.#unwait();
|
|
565
|
+
//A failed negotiation is the member's (it left meanwhile, it sent a wrong description)
|
|
566
|
+
peer.on('error', () => undefined);
|
|
567
|
+
peer.on('track', (event) => this.#published(member, event));
|
|
568
|
+
peer.on('datachannel', (channel) => this.#opened(member, channel));
|
|
569
|
+
peer.ready.then(async () => {
|
|
570
|
+
if (peer.closed)
|
|
571
|
+
return;
|
|
572
|
+
const connection = peer.connection;
|
|
573
|
+
//Once the negotiation applied the directions
|
|
574
|
+
connection.on('signalingstatechange', (state) => {
|
|
575
|
+
if (state === 'stable')
|
|
576
|
+
setImmediate(() => this.#negotiated(member));
|
|
577
|
+
});
|
|
578
|
+
connection.on('connectionstatechange', (state) => {
|
|
579
|
+
if (state === 'connected')
|
|
580
|
+
this.#watchBandwidth(member);
|
|
581
|
+
});
|
|
582
|
+
//select asked first for the tracks already published, its answers awaited a moment: the control channel and
|
|
583
|
+
//the tracks selected are then added at once, and the first offer carries them all
|
|
584
|
+
const metadata = member.metadata;
|
|
585
|
+
const answers = new Map([...this.#publications].map((publication) => [publication, this.#ask(member, publication)]));
|
|
586
|
+
//Waiting only for answers to come: otherwise the first offer goes as soon as before
|
|
587
|
+
const settled = [...answers.values()].some((answer) => answer instanceof Promise)
|
|
588
|
+
? await this.#settle(answers)
|
|
589
|
+
: new Map();
|
|
590
|
+
if (peer.closed || this.#members.get(member.id) !== member)
|
|
591
|
+
return;
|
|
592
|
+
const control = connection.createDataChannel(SignalingControlChannel.label, { negotiated: true, id: SignalingControlChannel.id });
|
|
593
|
+
control.on('message', (data) => this.#controlled(member, data));
|
|
594
|
+
member.control = control;
|
|
595
|
+
//The tracks published meanwhile were offered as they came; when the metadata changed meanwhile (a change
|
|
596
|
+
//before the connection is up is not reselected), select is asked again
|
|
597
|
+
for (const [publication, answer] of answers) {
|
|
598
|
+
if (!this.#publications.has(publication))
|
|
599
|
+
continue;
|
|
600
|
+
if (member.metadata === metadata)
|
|
601
|
+
this.#offer(member, publication, settled.get(publication) ?? answer);
|
|
602
|
+
else
|
|
603
|
+
this.#offer(member, publication);
|
|
604
|
+
}
|
|
605
|
+
}, () => this.#remove(member));
|
|
606
|
+
return member;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* A member opened a channel to another one (its protocol): the server opens the same channel to the other one (its
|
|
610
|
+
* protocol the id of the first one), and relays their messages
|
|
611
|
+
* @param member
|
|
612
|
+
* @param channel
|
|
613
|
+
*/
|
|
614
|
+
#opened(member, channel) {
|
|
615
|
+
let source = member.id;
|
|
616
|
+
let target = channel.protocol;
|
|
617
|
+
if (member.cascade) {
|
|
618
|
+
//From the media server of another node: its protocol has the member it comes from and the one it goes to
|
|
619
|
+
const route = routeOf(channel.protocol);
|
|
620
|
+
if (!route)
|
|
621
|
+
return channel.close();
|
|
622
|
+
[source, target] = route;
|
|
623
|
+
}
|
|
624
|
+
//Its first messages may come with its opening, before the other side is there
|
|
625
|
+
const early = [];
|
|
626
|
+
const keep = (data) => early.push(data);
|
|
627
|
+
channel.on('message', keep);
|
|
628
|
+
this.#route({ member: member, channel: channel, source: source, target: target, early: early, keep: keep });
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Relay a channel to its other member: on the connection to it, the protocol the id of the member it comes from;
|
|
632
|
+
* on the connection to the media server of its node, the protocol both of them (from a member of this node only:
|
|
633
|
+
* a channel goes through two servers at most). A channel to a member not known yet waits for it.
|
|
634
|
+
* @param opening
|
|
635
|
+
*/
|
|
636
|
+
#route(opening) {
|
|
637
|
+
const { member, channel, source, target, early, keep } = opening;
|
|
638
|
+
if (channel.readyState === 'closing' || channel.readyState === 'closed')
|
|
639
|
+
return;
|
|
640
|
+
const local = this.#members.get(target);
|
|
641
|
+
let other;
|
|
642
|
+
let protocol;
|
|
643
|
+
//Not to a media server
|
|
644
|
+
if (local?.cascade || target.startsWith('sfu:'))
|
|
645
|
+
return channel.close();
|
|
646
|
+
if (local) {
|
|
647
|
+
//Not to a stream published with WHIP: it has no data channels
|
|
648
|
+
if (local === member || !local.peer || local.leg.closed)
|
|
649
|
+
return channel.close();
|
|
650
|
+
other = local;
|
|
651
|
+
protocol = source;
|
|
652
|
+
}
|
|
653
|
+
else {
|
|
654
|
+
const server = this.#elsewhere.get(target);
|
|
655
|
+
if (member.cascade && server !== undefined)
|
|
656
|
+
return channel.close();
|
|
657
|
+
other = member.cascade || server === undefined ? undefined : this.#members.get(server);
|
|
658
|
+
protocol = JSON.stringify([source, target]);
|
|
659
|
+
}
|
|
660
|
+
if (!other)
|
|
661
|
+
return this.#wait(opening);
|
|
662
|
+
const relayTo = other;
|
|
663
|
+
relayTo.leg.ready
|
|
664
|
+
.then(() => relayTo.cascade ? relayTo.peer.negotiated : undefined)
|
|
665
|
+
.then(() => {
|
|
666
|
+
channel.off('message', keep);
|
|
667
|
+
if (relayTo.leg.closed || channel.readyState === 'closed')
|
|
668
|
+
return channel.close();
|
|
669
|
+
const relayed = relayTo.leg.connection.createDataChannel(channel.label, {
|
|
670
|
+
protocol: protocol,
|
|
671
|
+
ordered: channel.ordered,
|
|
672
|
+
...channel.maxRetransmits !== null ? { maxRetransmits: channel.maxRetransmits } : {},
|
|
673
|
+
...channel.maxPacketLifeTime !== null ? { maxPacketLifeTime: channel.maxPacketLifeTime } : {}
|
|
674
|
+
});
|
|
675
|
+
relay(channel, relayed, early);
|
|
676
|
+
relay(relayed, channel);
|
|
677
|
+
channel.on('close', () => relayed.close());
|
|
678
|
+
relayed.on('close', () => channel.close());
|
|
679
|
+
}, () => channel.close());
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* A channel to a member not known yet waits for it, UNKNOWN_MEMBER_TIMEOUT at most
|
|
683
|
+
* @param opening
|
|
684
|
+
*/
|
|
685
|
+
#wait(opening) {
|
|
686
|
+
if (this.#waiting.has(opening))
|
|
687
|
+
return;
|
|
688
|
+
this.#waiting.add(opening);
|
|
689
|
+
opening.timer = setTimeout(() => {
|
|
690
|
+
this.#waiting.delete(opening);
|
|
691
|
+
opening.channel.close();
|
|
692
|
+
}, UNKNOWN_MEMBER_TIMEOUT);
|
|
693
|
+
opening.timer.unref();
|
|
694
|
+
opening.channel.on('close', () => {
|
|
695
|
+
clearTimeout(opening.timer);
|
|
696
|
+
this.#waiting.delete(opening);
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* A member, or the media server of another node, is known: the channels waiting are relayed if they can be
|
|
701
|
+
*/
|
|
702
|
+
#unwait() {
|
|
703
|
+
for (const opening of [...this.#waiting]) {
|
|
704
|
+
const known = this.#members.has(opening.target) || this.#members.has(this.#elsewhere.get(opening.target) ?? '');
|
|
705
|
+
if (!known)
|
|
706
|
+
continue;
|
|
707
|
+
this.#waiting.delete(opening);
|
|
708
|
+
clearTimeout(opening.timer);
|
|
709
|
+
this.#route(opening);
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Close the connection to a member: its tracks are unpublished
|
|
714
|
+
* @param member
|
|
715
|
+
*/
|
|
716
|
+
#remove(member) {
|
|
717
|
+
if (this.#members.get(member.id) !== member)
|
|
718
|
+
return;
|
|
719
|
+
this.#members.delete(member.id);
|
|
720
|
+
for (const publication of [...member.publications.values()])
|
|
721
|
+
this.#unpublished(publication);
|
|
722
|
+
member.leg.close();
|
|
723
|
+
//A stream published with WHIP leaves the signaling (before the server, when it was the last one)
|
|
724
|
+
if (!member.peer)
|
|
725
|
+
this.#host.signaling.leave(member.id, this.name).catch(() => undefined);
|
|
726
|
+
if (member.cascade) {
|
|
727
|
+
//Its tracks are not offered any more, its members are not reached any more
|
|
728
|
+
for (const key of member.cascade.offered.keys())
|
|
729
|
+
this.#endRead(key);
|
|
730
|
+
for (const opening of [...this.#waiting])
|
|
731
|
+
if (this.#elsewhere.get(opening.target) === member.id)
|
|
732
|
+
opening.channel.close();
|
|
733
|
+
if (!this.#closed)
|
|
734
|
+
this.#knownChanged();
|
|
735
|
+
}
|
|
736
|
+
else {
|
|
737
|
+
this.#selected.delete(member.id);
|
|
738
|
+
if (!this.#closed)
|
|
739
|
+
this.#tellWants();
|
|
740
|
+
}
|
|
741
|
+
if (!this.#closed)
|
|
742
|
+
this.#host.changed?.(this);
|
|
743
|
+
if (!this.#closed && this.empty)
|
|
744
|
+
this.#host.emptied(this);
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* Send a signal to a member: a description carries the streams sent to it
|
|
748
|
+
* @param member
|
|
749
|
+
* @param signal
|
|
750
|
+
*/
|
|
751
|
+
async #signal(member, signal) {
|
|
752
|
+
await this.#host.signaling.signal(this.#host.id, this.name, member.id, {
|
|
753
|
+
...signal,
|
|
754
|
+
...signal.description ? { streams: [...member.streams.values()] } : {}
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
/**
|
|
758
|
+
* Send a track published to a member, if the server selects it for the member
|
|
759
|
+
* @param member
|
|
760
|
+
* @param publication
|
|
761
|
+
*/
|
|
762
|
+
#offer(member, publication, answer = this.#ask(member, publication)) {
|
|
763
|
+
//A stream published with WHIP receives nothing
|
|
764
|
+
if (member === publication.publisher || !member.peer || member.leg.closed)
|
|
765
|
+
return;
|
|
766
|
+
//The media server of another node: the tracks of the members of this node it wants
|
|
767
|
+
if (member.cascade) {
|
|
768
|
+
if (!publication.remote && member.cascade.wanted.has(trackKey(publication.track.peerId, publication.track.id)))
|
|
769
|
+
this.#subscribe(member, publication).catch(() => undefined);
|
|
770
|
+
return;
|
|
771
|
+
}
|
|
772
|
+
const selected = answer;
|
|
773
|
+
if (selected === undefined)
|
|
774
|
+
return;
|
|
775
|
+
if (typeof selected === 'boolean') {
|
|
776
|
+
if (selected)
|
|
777
|
+
this.#subscribe(member, publication).catch(() => undefined);
|
|
778
|
+
return;
|
|
779
|
+
}
|
|
780
|
+
//Chosen elsewhere: the member and the track may be gone meanwhile
|
|
781
|
+
selected.then((selected) => selected
|
|
782
|
+
&& this.#members.get(member.id) === member
|
|
783
|
+
&& !member.leg.closed
|
|
784
|
+
&& this.#publications.has(publication)
|
|
785
|
+
? this.#subscribe(member, publication)
|
|
786
|
+
: undefined).catch(() => undefined);
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Ask select whether a member receives a track published: undefined for the members select is not asked for (the
|
|
790
|
+
* publisher, the media servers of the other nodes, a member whose connection is closed)
|
|
791
|
+
* @param member
|
|
792
|
+
* @param publication
|
|
793
|
+
*/
|
|
794
|
+
#ask(member, publication) {
|
|
795
|
+
if (member === publication.publisher || !member.peer || member.leg.closed || member.cascade)
|
|
796
|
+
return undefined;
|
|
797
|
+
return this.#host.select({ peerId: member.id, metadata: member.metadata, session: member.session }, publication.track);
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* Wait for the answers of select given as promises, FIRST_OFFER_SELECT_WAIT at most
|
|
801
|
+
* @param answers
|
|
802
|
+
* @returns The answers that came, a failed one as false
|
|
803
|
+
*/
|
|
804
|
+
async #settle(answers) {
|
|
805
|
+
const settled = new Map();
|
|
806
|
+
const waiting = [];
|
|
807
|
+
for (const [publication, answer] of answers) {
|
|
808
|
+
if (answer instanceof Promise)
|
|
809
|
+
waiting.push(answer.then((selected) => void settled.set(publication, selected), () => void settled.set(publication, false)));
|
|
810
|
+
}
|
|
811
|
+
if (!waiting.length)
|
|
812
|
+
return settled;
|
|
813
|
+
let timer;
|
|
814
|
+
await Promise.race([Promise.all(waiting), new Promise((resolve) => {
|
|
815
|
+
timer = setTimeout(resolve, FIRST_OFFER_SELECT_WAIT);
|
|
816
|
+
})]);
|
|
817
|
+
clearTimeout(timer);
|
|
818
|
+
return settled;
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* A member publishes a track: the members selected for it receive it
|
|
822
|
+
* @param member
|
|
823
|
+
* @param event
|
|
824
|
+
*/
|
|
825
|
+
#published(member, event) {
|
|
826
|
+
//A transceiver of the member receiving again: the track it received before ended
|
|
827
|
+
const previous = member.publications.get(event.transceiver);
|
|
828
|
+
if (previous)
|
|
829
|
+
this.#unpublished(previous);
|
|
830
|
+
const engine = engineTransceiverOf(member.leg.connection, event.transceiver);
|
|
831
|
+
let peerId = member.id;
|
|
832
|
+
let stream = event.streams[0]?.id ?? '';
|
|
833
|
+
if (member.cascade) {
|
|
834
|
+
//A track of a member of another node: its member and its stream are the ones of the streams of its server
|
|
835
|
+
const origin = member.cascade.received.get(stream);
|
|
836
|
+
if (!origin)
|
|
837
|
+
return;
|
|
838
|
+
peerId = origin.peerId;
|
|
839
|
+
stream = origin.stream;
|
|
840
|
+
}
|
|
841
|
+
const track = {
|
|
842
|
+
room: this.name,
|
|
843
|
+
peerId: peerId,
|
|
844
|
+
id: engine?.receiver.remoteTrackId ?? event.transceiver.mid ?? event.track.id,
|
|
845
|
+
kind: event.track.kind,
|
|
846
|
+
codec: event.track.codec ?? '',
|
|
847
|
+
stream: stream
|
|
848
|
+
};
|
|
849
|
+
const publication = { track: track, media: event.track, transceiver: event.transceiver, publisher: member, remote: !!member.cascade };
|
|
850
|
+
member.publications.set(event.transceiver, publication);
|
|
851
|
+
this.#publications.add(publication);
|
|
852
|
+
if (publication.remote) {
|
|
853
|
+
this.#pipe(trackKey(track.peerId, track.id));
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
this.#host.emit('publish', track);
|
|
857
|
+
this.#tellTracks();
|
|
858
|
+
}
|
|
859
|
+
for (const other of this.#members.values())
|
|
860
|
+
this.#offer(other, publication);
|
|
861
|
+
for (const viewer of this.#viewers.values())
|
|
862
|
+
void this.#feed(viewer);
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* A track is not published any more: the members receiving it stop
|
|
866
|
+
* @param publication
|
|
867
|
+
*/
|
|
868
|
+
#unpublished(publication) {
|
|
869
|
+
if (!this.#publications.delete(publication))
|
|
870
|
+
return;
|
|
871
|
+
if (publication.publisher.publications.get(publication.transceiver) === publication)
|
|
872
|
+
publication.publisher.publications.delete(publication.transceiver);
|
|
873
|
+
for (const member of this.#members.values())
|
|
874
|
+
this.#unsubscribe(member, publication);
|
|
875
|
+
if (publication.remote) {
|
|
876
|
+
this.#pipe(trackKey(publication.track.peerId, publication.track.id));
|
|
877
|
+
}
|
|
878
|
+
else {
|
|
879
|
+
this.#host.emit('unpublish', publication.track);
|
|
880
|
+
this.#tellTracks();
|
|
881
|
+
}
|
|
882
|
+
for (const viewer of this.#viewers.values())
|
|
883
|
+
void this.#feed(viewer);
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* Send a track to a member: on a transceiver of a track sent before, of the same codec, else on a new one
|
|
887
|
+
* @param member
|
|
888
|
+
* @param publication
|
|
889
|
+
*/
|
|
890
|
+
async #subscribe(member, publication) {
|
|
891
|
+
if (member.subscriptions.has(publication))
|
|
892
|
+
return;
|
|
893
|
+
const connection = member.leg.connection;
|
|
894
|
+
const stream = this.#streamOf(member, publication.track);
|
|
895
|
+
const taken = new Set([...member.subscriptions.values()].map((subscription) => subscription.transceiver));
|
|
896
|
+
const reusable = connection.getTransceivers().find((transceiver) => member.transceivers.has(transceiver)
|
|
897
|
+
&& !taken.has(transceiver)
|
|
898
|
+
&& !transceiver.sender.track
|
|
899
|
+
&& transceiver.direction === 'inactive'
|
|
900
|
+
&& transceiver.currentDirection === 'inactive'
|
|
901
|
+
&& transceiver.kind === publication.track.kind
|
|
902
|
+
&& engineTransceiverOf(connection, transceiver)?.sender.codec?.mimeType.toLowerCase() === publication.track.codec.toLowerCase());
|
|
903
|
+
if (!reusable) {
|
|
904
|
+
const transceiver = connection.addTransceiver(publication.media, { direction: 'sendonly', streams: [stream] });
|
|
905
|
+
//The media server of another node takes the id of the track from its MSID, before it is negotiated
|
|
906
|
+
if (member.cascade)
|
|
907
|
+
engineSenderOf(transceiver.sender).trackId = publication.track.id;
|
|
908
|
+
member.transceivers.add(transceiver);
|
|
909
|
+
member.subscriptions.set(publication, { transceiver: transceiver, started: false, paused: false });
|
|
910
|
+
return;
|
|
911
|
+
}
|
|
912
|
+
member.subscriptions.set(publication, { transceiver: reusable, started: false, paused: false });
|
|
913
|
+
if (member.cascade)
|
|
914
|
+
engineSenderOf(reusable.sender).trackId = publication.track.id;
|
|
915
|
+
await reusable.sender.replaceTrack(publication.media);
|
|
916
|
+
reusable.sender.setStreams(stream);
|
|
917
|
+
reusable.direction = 'sendonly';
|
|
918
|
+
}
|
|
919
|
+
/**
|
|
920
|
+
* Stop sending a track to a member: its transceiver stays, inactive, for the next one
|
|
921
|
+
* @param member
|
|
922
|
+
* @param publication
|
|
923
|
+
*/
|
|
924
|
+
#unsubscribe(member, publication) {
|
|
925
|
+
const subscription = member.subscriptions.get(publication);
|
|
926
|
+
if (!subscription)
|
|
927
|
+
return;
|
|
928
|
+
member.subscriptions.delete(publication);
|
|
929
|
+
if (member.leg.closed)
|
|
930
|
+
return;
|
|
931
|
+
try {
|
|
932
|
+
subscription.transceiver.direction = 'inactive';
|
|
933
|
+
subscription.transceiver.sender.replaceTrack(null).catch(() => undefined);
|
|
934
|
+
}
|
|
935
|
+
catch {
|
|
936
|
+
//Stopped already
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
/**
|
|
940
|
+
* The id of the stream of a track on the connection of a member: short (at most 64 characters in an MSID), the
|
|
941
|
+
* same for the tracks of a stream of a member
|
|
942
|
+
* @param member
|
|
943
|
+
* @param track
|
|
944
|
+
*/
|
|
945
|
+
#streamOf(member, track) {
|
|
946
|
+
const key = JSON.stringify([track.peerId, track.stream || track.id]);
|
|
947
|
+
let id = member.streamIds.get(key);
|
|
948
|
+
if (!id) {
|
|
949
|
+
id = `s${member.streamIds.size + 1}`;
|
|
950
|
+
member.streamIds.set(key, id);
|
|
951
|
+
member.streams.set(id, { id: id, peerId: track.peerId, stream: track.stream });
|
|
952
|
+
}
|
|
953
|
+
return id;
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* A negotiation with a member completed: the tracks it stopped sending are unpublished, the ones it refused (no
|
|
957
|
+
* codec in common) are given up, and the ones it starts receiving begin with a key frame
|
|
958
|
+
* @param member
|
|
959
|
+
*/
|
|
960
|
+
#negotiated(member) {
|
|
961
|
+
if (member.leg.closed || member.leg.connection.signalingState !== 'stable')
|
|
962
|
+
return;
|
|
963
|
+
for (const publication of [...member.publications.values()]) {
|
|
964
|
+
const direction = publication.transceiver.currentDirection;
|
|
965
|
+
if (direction === 'inactive' || direction === 'sendonly' || direction === 'stopped')
|
|
966
|
+
this.#unpublished(publication);
|
|
967
|
+
}
|
|
968
|
+
for (const [publication, subscription] of [...member.subscriptions]) {
|
|
969
|
+
const direction = subscription.transceiver.currentDirection;
|
|
970
|
+
if (direction === 'stopped') {
|
|
971
|
+
member.subscriptions.delete(publication);
|
|
972
|
+
this.#host.emit('unsupported', this.name, member.id, publication.track);
|
|
973
|
+
}
|
|
974
|
+
else if (!subscription.started && (direction === 'sendonly' || direction === 'sendrecv')) {
|
|
975
|
+
subscription.started = true;
|
|
976
|
+
if (publication.track.kind === 'video')
|
|
977
|
+
publication.media.requestKeyFrame();
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
/**
|
|
982
|
+
* A message of a member on its control channel: pause or resume a track it receives
|
|
983
|
+
* @param member
|
|
984
|
+
* @param data
|
|
985
|
+
*/
|
|
986
|
+
#controlled(member, data) {
|
|
987
|
+
let message;
|
|
988
|
+
try {
|
|
989
|
+
message = JSON.parse(typeof data === 'string' ? data : Buffer.from(data).toString());
|
|
990
|
+
}
|
|
991
|
+
catch {
|
|
992
|
+
return;
|
|
993
|
+
}
|
|
994
|
+
if (member.cascade)
|
|
995
|
+
return this.#cascaded(member, member.cascade, message);
|
|
996
|
+
if (message?.type !== 'pause' && message?.type !== 'resume')
|
|
997
|
+
return;
|
|
998
|
+
for (const [publication, subscription] of member.subscriptions) {
|
|
999
|
+
if (subscription.transceiver.mid !== message.mid)
|
|
1000
|
+
continue;
|
|
1001
|
+
const paused = message.type === 'pause';
|
|
1002
|
+
if (subscription.paused === paused)
|
|
1003
|
+
return;
|
|
1004
|
+
subscription.paused = paused;
|
|
1005
|
+
subscription.transceiver.sender.replaceTrack(paused ? null : publication.media).catch(() => undefined);
|
|
1006
|
+
if (!paused && publication.track.kind === 'video')
|
|
1007
|
+
publication.media.requestKeyFrame();
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
/**
|
|
1012
|
+
* Connect to the media server of another node in the room: the one of the lower id offers first and does not give
|
|
1013
|
+
* up its offers; their control channel carries the tracks of each node and the ones each wants of the other
|
|
1014
|
+
* @param id The id of the member of that server.
|
|
1015
|
+
*/
|
|
1016
|
+
#cascade(id) {
|
|
1017
|
+
const peerHost = {
|
|
1018
|
+
localId: this.#host.id,
|
|
1019
|
+
create: () => this.#host.connect(),
|
|
1020
|
+
send: (_to, signal) => this.#signal(member, signal),
|
|
1021
|
+
signalingUp: true,
|
|
1022
|
+
closed: () => undefined,
|
|
1023
|
+
polite: this.#host.id > id
|
|
1024
|
+
};
|
|
1025
|
+
const peer = new Peer(peerHost, id, undefined, undefined);
|
|
1026
|
+
const cascade = { offered: new Map(), wanted: new Set(), received: new Map() };
|
|
1027
|
+
const member = {
|
|
1028
|
+
id: id,
|
|
1029
|
+
leg: peer,
|
|
1030
|
+
peer: peer,
|
|
1031
|
+
metadata: undefined,
|
|
1032
|
+
publications: new Map(),
|
|
1033
|
+
subscriptions: new Map(),
|
|
1034
|
+
streams: new Map(),
|
|
1035
|
+
streamIds: new Map(),
|
|
1036
|
+
transceivers: new Set(),
|
|
1037
|
+
cascade: cascade
|
|
1038
|
+
};
|
|
1039
|
+
this.#members.set(id, member);
|
|
1040
|
+
this.#unwait();
|
|
1041
|
+
peer.on('error', () => undefined);
|
|
1042
|
+
peer.on('track', (event) => this.#published(member, event));
|
|
1043
|
+
peer.on('datachannel', (channel) => this.#opened(member, channel));
|
|
1044
|
+
//The polite side waits for the first offer of the other one
|
|
1045
|
+
peer.ready.then(() => peer.polite ? peer.negotiated : undefined).then(() => {
|
|
1046
|
+
if (peer.closed)
|
|
1047
|
+
return;
|
|
1048
|
+
const connection = peer.connection;
|
|
1049
|
+
connection.on('signalingstatechange', (state) => {
|
|
1050
|
+
if (state === 'stable')
|
|
1051
|
+
setImmediate(() => this.#negotiated(member));
|
|
1052
|
+
});
|
|
1053
|
+
const control = connection.createDataChannel(SignalingControlChannel.label, { negotiated: true, id: SignalingControlChannel.id });
|
|
1054
|
+
control.on('message', (data) => this.#controlled(member, data));
|
|
1055
|
+
//What it was told before is lost with a channel not open
|
|
1056
|
+
control.on('open', () => {
|
|
1057
|
+
cascade.toldTracks = undefined;
|
|
1058
|
+
cascade.toldWants = undefined;
|
|
1059
|
+
this.#tellTracks();
|
|
1060
|
+
this.#tellWants();
|
|
1061
|
+
});
|
|
1062
|
+
member.control = control;
|
|
1063
|
+
}, () => this.#remove(member));
|
|
1064
|
+
return member;
|
|
1065
|
+
}
|
|
1066
|
+
/**
|
|
1067
|
+
* A message of the media server of another node
|
|
1068
|
+
* @param member
|
|
1069
|
+
* @param cascade
|
|
1070
|
+
* @param message
|
|
1071
|
+
*/
|
|
1072
|
+
#cascaded(member, cascade, message) {
|
|
1073
|
+
if (!cascade.heard) {
|
|
1074
|
+
cascade.heard = true;
|
|
1075
|
+
cascade.toldTracks = undefined;
|
|
1076
|
+
cascade.toldWants = undefined;
|
|
1077
|
+
this.#tellTracks();
|
|
1078
|
+
this.#tellWants();
|
|
1079
|
+
}
|
|
1080
|
+
if (message?.type === 'tracks' && Array.isArray(message.tracks)) {
|
|
1081
|
+
const before = cascade.offered;
|
|
1082
|
+
cascade.offered = new Map(message.tracks
|
|
1083
|
+
.filter((offered) => typeof offered?.track?.peerId === 'string' && typeof offered.track.id === 'string')
|
|
1084
|
+
.map((offered) => [trackKey(offered.track.peerId, offered.track.id), { track: { ...offered.track, room: this.name }, ...offered.codec ? { codec: offered.codec } : {} }]));
|
|
1085
|
+
for (const key of before.keys())
|
|
1086
|
+
if (!cascade.offered.has(key))
|
|
1087
|
+
this.#endRead(key);
|
|
1088
|
+
this.#knownChanged();
|
|
1089
|
+
this.#evaluate();
|
|
1090
|
+
for (const viewer of this.#viewers.values())
|
|
1091
|
+
void this.#feed(viewer);
|
|
1092
|
+
}
|
|
1093
|
+
else if (message?.type === 'want' && Array.isArray(message.keys)) {
|
|
1094
|
+
cascade.wanted = new Set(message.keys.filter((key) => typeof key === 'string'));
|
|
1095
|
+
for (const publication of [...this.#publications]) {
|
|
1096
|
+
if (publication.remote)
|
|
1097
|
+
continue;
|
|
1098
|
+
if (cascade.wanted.has(trackKey(publication.track.peerId, publication.track.id)))
|
|
1099
|
+
this.#offer(member, publication);
|
|
1100
|
+
else
|
|
1101
|
+
this.#unsubscribe(member, publication);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
/**
|
|
1106
|
+
* The tracks the media servers of the other nodes offer
|
|
1107
|
+
*/
|
|
1108
|
+
*#offeredTracks() {
|
|
1109
|
+
for (const member of this.#members.values())
|
|
1110
|
+
if (member.cascade)
|
|
1111
|
+
yield* member.cascade.offered.values();
|
|
1112
|
+
}
|
|
1113
|
+
/**
|
|
1114
|
+
* A track another node offers
|
|
1115
|
+
* @param key
|
|
1116
|
+
*/
|
|
1117
|
+
#offered(key) {
|
|
1118
|
+
for (const member of this.#members.values()) {
|
|
1119
|
+
const offered = member.cascade?.offered.get(key);
|
|
1120
|
+
if (offered)
|
|
1121
|
+
return offered;
|
|
1122
|
+
}
|
|
1123
|
+
return undefined;
|
|
1124
|
+
}
|
|
1125
|
+
/**
|
|
1126
|
+
* A track of another node received here
|
|
1127
|
+
* @param key
|
|
1128
|
+
*/
|
|
1129
|
+
#remotePublication(key) {
|
|
1130
|
+
for (const publication of this.#publications) {
|
|
1131
|
+
if (publication.remote && trackKey(publication.track.peerId, publication.track.id) === key)
|
|
1132
|
+
return publication;
|
|
1133
|
+
}
|
|
1134
|
+
return undefined;
|
|
1135
|
+
}
|
|
1136
|
+
/**
|
|
1137
|
+
* The tracks the other nodes offer changed: the thread forwarding the room tells the main thread
|
|
1138
|
+
*/
|
|
1139
|
+
#knownChanged() {
|
|
1140
|
+
this.#host.known?.(this, [...this.#offeredTracks()]);
|
|
1141
|
+
}
|
|
1142
|
+
/**
|
|
1143
|
+
* Tell the media servers of the other nodes the tracks of the members of this node
|
|
1144
|
+
*/
|
|
1145
|
+
#tellTracks() {
|
|
1146
|
+
const tracks = [...this.#publications].filter((publication) => !publication.remote).map((publication) => {
|
|
1147
|
+
const codec = engineTrackOf(publication.media).codec;
|
|
1148
|
+
return { track: publication.track, ...codec ? { codec: { payloadType: codec.payloadType, mimeType: codec.mimeType, clockRate: codec.clockRate, channels: codec.channels, parameters: codec.parameters } } : {} };
|
|
1149
|
+
});
|
|
1150
|
+
const told = JSON.stringify({ type: 'tracks', tracks: tracks });
|
|
1151
|
+
for (const member of this.#members.values()) {
|
|
1152
|
+
if (!member.cascade || member.control?.readyState !== 'open' || member.cascade.toldTracks === told)
|
|
1153
|
+
continue;
|
|
1154
|
+
member.cascade.toldTracks = told;
|
|
1155
|
+
member.control.send(told);
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
/**
|
|
1159
|
+
* Tell the media servers of the other nodes the tracks of theirs this node wants: the ones a member of this node is
|
|
1160
|
+
* selected for, the ones of the source of a viewer, the ones read here
|
|
1161
|
+
*/
|
|
1162
|
+
#tellWants() {
|
|
1163
|
+
if (this.#closed)
|
|
1164
|
+
return;
|
|
1165
|
+
const sources = new Set([...this.#viewers.values()].map((viewer) => viewer.source).filter((source) => source !== undefined));
|
|
1166
|
+
for (const member of this.#members.values()) {
|
|
1167
|
+
const cascade = member.cascade;
|
|
1168
|
+
if (!cascade || member.control?.readyState !== 'open')
|
|
1169
|
+
continue;
|
|
1170
|
+
const keys = [];
|
|
1171
|
+
for (const [key, { track }] of cascade.offered) {
|
|
1172
|
+
const selected = [...this.#members.values()].some((each) => !!each.peer && !each.cascade && !each.leg.closed && each.id !== track.peerId && this.#selected.get(each.id)?.get(key) === true);
|
|
1173
|
+
if (selected || sources.has(track.peerId) || this.#reads.get(key)?.wanted)
|
|
1174
|
+
keys.push(key);
|
|
1175
|
+
}
|
|
1176
|
+
const told = JSON.stringify({ type: 'want', keys: keys.sort() });
|
|
1177
|
+
if (cascade.toldWants === told)
|
|
1178
|
+
continue;
|
|
1179
|
+
cascade.toldWants = told;
|
|
1180
|
+
member.control.send(told);
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
/**
|
|
1184
|
+
* The metadata of a member changed: select is asked again for it, the tracks it receives follow the answers (and
|
|
1185
|
+
* the tracks of the other nodes this node wants)
|
|
1186
|
+
* @param member
|
|
1187
|
+
*/
|
|
1188
|
+
#reselect(member) {
|
|
1189
|
+
if (!member.peer || member.cascade)
|
|
1190
|
+
return;
|
|
1191
|
+
this.#selected.delete(member.id);
|
|
1192
|
+
this.#evaluate();
|
|
1193
|
+
//Before its connection is up, it gets the tracks as it comes
|
|
1194
|
+
if (!member.control)
|
|
1195
|
+
return;
|
|
1196
|
+
const subscriber = { peerId: member.id, metadata: member.metadata, session: member.session };
|
|
1197
|
+
for (const publication of [...this.#publications]) {
|
|
1198
|
+
if (publication.publisher === member)
|
|
1199
|
+
continue;
|
|
1200
|
+
const apply = (selected) => {
|
|
1201
|
+
if (this.#members.get(member.id) !== member || member.leg.closed || !this.#publications.has(publication))
|
|
1202
|
+
return;
|
|
1203
|
+
if (selected)
|
|
1204
|
+
this.#subscribe(member, publication).catch(() => undefined);
|
|
1205
|
+
else
|
|
1206
|
+
this.#unsubscribe(member, publication);
|
|
1207
|
+
};
|
|
1208
|
+
const answer = this.#host.select(subscriber, publication.track);
|
|
1209
|
+
if (typeof answer === 'boolean')
|
|
1210
|
+
apply(answer);
|
|
1211
|
+
else
|
|
1212
|
+
answer.then(apply, () => undefined);
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
/**
|
|
1216
|
+
* Ask select for the members of this node and the tracks of the other nodes not asked yet; the tracks wanted follow
|
|
1217
|
+
* the answers
|
|
1218
|
+
*/
|
|
1219
|
+
#evaluate() {
|
|
1220
|
+
for (const member of this.#members.values()) {
|
|
1221
|
+
if (!member.peer || member.cascade)
|
|
1222
|
+
continue;
|
|
1223
|
+
let selected = this.#selected.get(member.id);
|
|
1224
|
+
if (!selected) {
|
|
1225
|
+
selected = new Map();
|
|
1226
|
+
this.#selected.set(member.id, selected);
|
|
1227
|
+
}
|
|
1228
|
+
const answers = selected;
|
|
1229
|
+
for (const offered of this.#offeredTracks()) {
|
|
1230
|
+
const key = trackKey(offered.track.peerId, offered.track.id);
|
|
1231
|
+
if (answers.has(key) || offered.track.peerId === member.id)
|
|
1232
|
+
continue;
|
|
1233
|
+
const answer = this.#host.select({ peerId: member.id, metadata: member.metadata, session: member.session }, offered.track);
|
|
1234
|
+
if (typeof answer === 'boolean') {
|
|
1235
|
+
answers.set(key, answer);
|
|
1236
|
+
continue;
|
|
1237
|
+
}
|
|
1238
|
+
//Not wanted until it answers
|
|
1239
|
+
answers.set(key, false);
|
|
1240
|
+
answer.then((yes) => {
|
|
1241
|
+
if (!yes || this.#selected.get(member.id) !== answers)
|
|
1242
|
+
return;
|
|
1243
|
+
answers.set(key, true);
|
|
1244
|
+
this.#tellWants();
|
|
1245
|
+
}, () => undefined);
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
this.#tellWants();
|
|
1249
|
+
}
|
|
1250
|
+
/**
|
|
1251
|
+
* Give a track of another node read here its packets, while it is read and received
|
|
1252
|
+
* @param key
|
|
1253
|
+
*/
|
|
1254
|
+
#pipe(key) {
|
|
1255
|
+
const read = this.#reads.get(key);
|
|
1256
|
+
if (!read)
|
|
1257
|
+
return;
|
|
1258
|
+
const source = read.wanted ? this.#remotePublication(key) : undefined;
|
|
1259
|
+
if (read.source === source)
|
|
1260
|
+
return;
|
|
1261
|
+
read.unpipe?.();
|
|
1262
|
+
read.unpipe = undefined;
|
|
1263
|
+
read.source = source;
|
|
1264
|
+
if (!source)
|
|
1265
|
+
return;
|
|
1266
|
+
read.unpipe = engineTrackOf(source.media).onReceiveRtp.subscribe((packet, extensions) => read.receive(packet, extensions)).unSubscribe;
|
|
1267
|
+
if (source.track.kind === 'video')
|
|
1268
|
+
source.media.requestKeyFrame();
|
|
1269
|
+
}
|
|
1270
|
+
/**
|
|
1271
|
+
* A track of another node is not offered any more: the track read here ends
|
|
1272
|
+
* @param key
|
|
1273
|
+
*/
|
|
1274
|
+
#endRead(key) {
|
|
1275
|
+
const read = this.#reads.get(key);
|
|
1276
|
+
if (!read)
|
|
1277
|
+
return;
|
|
1278
|
+
this.#reads.delete(key);
|
|
1279
|
+
read.unpipe?.();
|
|
1280
|
+
read.track.stop();
|
|
1281
|
+
}
|
|
1282
|
+
/**
|
|
1283
|
+
* Tell the application when the bandwidth to a member is too low, and when it is enough again
|
|
1284
|
+
* @param member
|
|
1285
|
+
*/
|
|
1286
|
+
#watchBandwidth(member) {
|
|
1287
|
+
const transport = engineConnectionOf(member.leg.connection).dtlsTransports[0];
|
|
1288
|
+
if (!transport || this.#watched.has(transport))
|
|
1289
|
+
return;
|
|
1290
|
+
this.#watched.add(transport);
|
|
1291
|
+
transport.senderBWE.onCongestion.subscribe((congested) => {
|
|
1292
|
+
if (!member.leg.closed)
|
|
1293
|
+
this.#host.emit('congestion', this.name, member.id, congested, transport.senderBWE.availableBitrate);
|
|
1294
|
+
});
|
|
1295
|
+
}
|
|
1296
|
+
}
|