@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,1585 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { DEFAULT_SCTP_MTU, validateSctpMtu } from '../sctp/index.js';
|
|
3
|
+
import { createWebRtcDomException, createWebRtcTypeError } from './errors.js';
|
|
4
|
+
import { EventTarget, enumerate } from './helper.js';
|
|
5
|
+
import { Event, debug, runDetached } from './imports/common.js';
|
|
6
|
+
import { RTCRtpHeaderExtensionParameters, RtpRouter, TransceiverManager, defaultCodecs } from './media/index.js';
|
|
7
|
+
import { buildStatsReport, generateStatsId, getStatsTimestamp } from './media/stats.js';
|
|
8
|
+
import { SctpTransportManager } from './sctpManager.js';
|
|
9
|
+
import { SessionDescription } from './sdp.js';
|
|
10
|
+
import { SDPManager } from './sdpManager.js';
|
|
11
|
+
import { SecureTransportManager } from './secureTransportManager.js';
|
|
12
|
+
import { DEFAULT_MAX_MESSAGE_SIZE } from './transport/sctp.js';
|
|
13
|
+
import { andDirection, deepMerge } from './utils.js';
|
|
14
|
+
const log = debug('webrtc/peer/peerConnection');
|
|
15
|
+
/**
|
|
16
|
+
* W3C compatibility notes kept near the public RTCPeerConnection surface so the
|
|
17
|
+
* reviewable diff does not depend on external PR text.
|
|
18
|
+
*
|
|
19
|
+
* - `current/pending*Description`, `canTrickleIceCandidates`, `sctp`,
|
|
20
|
+
* `addIceCandidate(null)`, and `RTCConfiguration` round-trip behavior are
|
|
21
|
+
* implemented here and covered by `tests/wpt/peerConnectionApiCompatibility.test.ts`.
|
|
22
|
+
* - `addIceCandidate()` also validates `sdpMid` / `sdpMLineIndex` /
|
|
23
|
+
* `usernameFragment` against the applied remote description and appends
|
|
24
|
+
* candidates or end-of-candidates markers to the corresponding m-section.
|
|
25
|
+
* The public API keeps werift's historical pre-SRD buffering behavior, while
|
|
26
|
+
* the WPT runner wraps the class to exercise strict spec rejection.
|
|
27
|
+
* - `bundlePolicy: "balanced"` is accepted for input compatibility but is
|
|
28
|
+
* normalized to werift's `"max-compat"` behavior, so `getConfiguration()`
|
|
29
|
+
* returns the normalized value.
|
|
30
|
+
* - `setLocalDescription()` keeps the historical `SessionDescription` return
|
|
31
|
+
* value for non-rollback calls, while `{ type: "rollback" }` resolves `void`
|
|
32
|
+
* to match the actual behavior without pretending to return a description.
|
|
33
|
+
* - API reference markdown is regenerated with `cd packages/webrtc && npm run doc`.
|
|
34
|
+
* The generated output lives under `packages/webrtc/doc/`; compatibility
|
|
35
|
+
* notes remain here and in the package README so review context is visible
|
|
36
|
+
* even when generated docs are not committed in the same change.
|
|
37
|
+
*/
|
|
38
|
+
export class RTCPeerConnection extends EventTarget {
|
|
39
|
+
get ondatachannel() {
|
|
40
|
+
return this.eventHandlers.ondatachannel ?? null;
|
|
41
|
+
}
|
|
42
|
+
set ondatachannel(value) {
|
|
43
|
+
this.eventHandlers.ondatachannel = value ?? undefined;
|
|
44
|
+
}
|
|
45
|
+
get onicecandidate() {
|
|
46
|
+
return this.eventHandlers.onicecandidate ?? null;
|
|
47
|
+
}
|
|
48
|
+
set onicecandidate(value) {
|
|
49
|
+
this.eventHandlers.onicecandidate = value ?? undefined;
|
|
50
|
+
}
|
|
51
|
+
get onicecandidateerror() {
|
|
52
|
+
return this.eventHandlers.onicecandidateerror ?? null;
|
|
53
|
+
}
|
|
54
|
+
set onicecandidateerror(value) {
|
|
55
|
+
this.eventHandlers.onicecandidateerror = value ?? undefined;
|
|
56
|
+
}
|
|
57
|
+
get onicegatheringstatechange() {
|
|
58
|
+
return this.eventHandlers.onicegatheringstatechange ?? null;
|
|
59
|
+
}
|
|
60
|
+
set onicegatheringstatechange(value) {
|
|
61
|
+
this.eventHandlers.onicegatheringstatechange = value ?? undefined;
|
|
62
|
+
}
|
|
63
|
+
get onnegotiationneeded() {
|
|
64
|
+
return this.eventHandlers.onnegotiationneeded ?? null;
|
|
65
|
+
}
|
|
66
|
+
set onnegotiationneeded(value) {
|
|
67
|
+
this.eventHandlers.onnegotiationneeded = value ?? undefined;
|
|
68
|
+
}
|
|
69
|
+
get onsignalingstatechange() {
|
|
70
|
+
return this.eventHandlers.onsignalingstatechange ?? null;
|
|
71
|
+
}
|
|
72
|
+
set onsignalingstatechange(value) {
|
|
73
|
+
this.eventHandlers.onsignalingstatechange = value ?? undefined;
|
|
74
|
+
}
|
|
75
|
+
get ontrack() {
|
|
76
|
+
return this.eventHandlers.ontrack ?? null;
|
|
77
|
+
}
|
|
78
|
+
set ontrack(value) {
|
|
79
|
+
this.eventHandlers.ontrack = value ?? undefined;
|
|
80
|
+
}
|
|
81
|
+
get onconnectionstatechange() {
|
|
82
|
+
return this.eventHandlers.onconnectionstatechange ?? null;
|
|
83
|
+
}
|
|
84
|
+
set onconnectionstatechange(value) {
|
|
85
|
+
this.eventHandlers.onconnectionstatechange = value ?? undefined;
|
|
86
|
+
}
|
|
87
|
+
get oniceconnectionstatechange() {
|
|
88
|
+
return this.eventHandlers.oniceconnectionstatechange ?? null;
|
|
89
|
+
}
|
|
90
|
+
set oniceconnectionstatechange(value) {
|
|
91
|
+
this.eventHandlers.oniceconnectionstatechange = value ?? undefined;
|
|
92
|
+
}
|
|
93
|
+
constructor(config = {}) {
|
|
94
|
+
super();
|
|
95
|
+
this.id = randomUUID().toString();
|
|
96
|
+
this.cname = randomUUID().toString();
|
|
97
|
+
this.config = generateDefaultPeerConfig();
|
|
98
|
+
this.signalingState = 'stable';
|
|
99
|
+
this.negotiationneeded = false;
|
|
100
|
+
/**同じ tick の複数の変更で negotiationneeded を重複発火しないための予約フラグ */
|
|
101
|
+
this.negotiationneededScheduled = false;
|
|
102
|
+
/**交渉が必要な変更の通し番号 */
|
|
103
|
+
this.negotiationChangeSeq = 0;
|
|
104
|
+
/**answer まで確定した local offer が反映している変更の通し番号 */
|
|
105
|
+
this.negotiatedChangeSeq = 0;
|
|
106
|
+
this.lastCreatedOfferChangeSeq = 0;
|
|
107
|
+
this.needRestart = false;
|
|
108
|
+
this.router = new RtpRouter();
|
|
109
|
+
this.isClosed = false;
|
|
110
|
+
this.shouldNegotiationneeded = false;
|
|
111
|
+
this.pendingRemoteCandidates = [];
|
|
112
|
+
this.iceGatheringStateChange = new Event();
|
|
113
|
+
this.iceConnectionStateChange = new Event();
|
|
114
|
+
this.signalingStateChange = new Event();
|
|
115
|
+
this.connectionStateChange = new Event();
|
|
116
|
+
this.onDataChannel = new Event();
|
|
117
|
+
this.onRemoteTransceiverAdded = new Event();
|
|
118
|
+
this.onTransceiverAdded = new Event();
|
|
119
|
+
this.onIceCandidate = new Event();
|
|
120
|
+
this.onNegotiationneeded = new Event();
|
|
121
|
+
this.onTrack = new Event();
|
|
122
|
+
this.eventHandlers = {};
|
|
123
|
+
/**交渉が必要な変更を記録し、negotiationneeded を予約する */
|
|
124
|
+
this.needNegotiation = () => {
|
|
125
|
+
this.negotiationChangeSeq++;
|
|
126
|
+
this.scheduleNegotiationneeded();
|
|
127
|
+
};
|
|
128
|
+
this.setConfiguration(config);
|
|
129
|
+
this.sdpManager = new SDPManager({
|
|
130
|
+
cname: this.cname,
|
|
131
|
+
bundlePolicy: this.config.bundlePolicy,
|
|
132
|
+
mLineReuse: this.config.mLineReuse
|
|
133
|
+
});
|
|
134
|
+
this.transceiverManager = new TransceiverManager(this.cname, this.config, this.router);
|
|
135
|
+
this.transceiverManager.onTransceiverAdded.pipe(this.onTransceiverAdded);
|
|
136
|
+
this.transceiverManager.onRemoteTransceiverAdded.pipe(this.onRemoteTransceiverAdded);
|
|
137
|
+
this.transceiverManager.onTrack.subscribe(({ track, streams, transceiver }) => {
|
|
138
|
+
const event = new RTCTrackEvent({
|
|
139
|
+
track,
|
|
140
|
+
streams,
|
|
141
|
+
transceiver,
|
|
142
|
+
receiver: transceiver.receiver
|
|
143
|
+
});
|
|
144
|
+
this.onTrack.execute(track);
|
|
145
|
+
this.emit('track', event);
|
|
146
|
+
if (this.ontrack) {
|
|
147
|
+
runDetached(() => this.ontrack(event), (error) => log('event handler failed', error));
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
this.transceiverManager.onNegotiationNeeded.subscribe(() => this.needNegotiation());
|
|
151
|
+
this.sctpManager = new SctpTransportManager();
|
|
152
|
+
this.sctpManager.onDataChannel.subscribe((channel) => {
|
|
153
|
+
this.onDataChannel.execute(channel);
|
|
154
|
+
const event = { type: 'datachannel', channel };
|
|
155
|
+
if (this.ondatachannel)
|
|
156
|
+
runDetached(() => this.ondatachannel(event), (error) => log('event handler failed', error));
|
|
157
|
+
this.emit('datachannel', event);
|
|
158
|
+
});
|
|
159
|
+
this.secureManager = new SecureTransportManager({
|
|
160
|
+
config: this.config,
|
|
161
|
+
sctpManager: this.sctpManager,
|
|
162
|
+
transceiverManager: this.transceiverManager
|
|
163
|
+
});
|
|
164
|
+
this.secureManager.iceGatheringStateChange.subscribe((state) => {
|
|
165
|
+
this.iceGatheringStateChange.execute(state);
|
|
166
|
+
if (this.onicegatheringstatechange) {
|
|
167
|
+
runDetached(() => this.onicegatheringstatechange(new globalThis.Event('icegatheringstatechange')), (error) => log('event handler failed', error));
|
|
168
|
+
}
|
|
169
|
+
this.emit('icegatheringstatechange');
|
|
170
|
+
});
|
|
171
|
+
this.secureManager.iceConnectionStateChange.subscribe((state) => {
|
|
172
|
+
if (state === 'closed') {
|
|
173
|
+
this.close().catch((error) => log('close failed', error));
|
|
174
|
+
}
|
|
175
|
+
this.iceConnectionStateChange.execute(state);
|
|
176
|
+
if (this.oniceconnectionstatechange)
|
|
177
|
+
runDetached(() => this.oniceconnectionstatechange(), (error) => log('event handler failed', error));
|
|
178
|
+
this.emit('iceconnectionstatechange');
|
|
179
|
+
});
|
|
180
|
+
this.secureManager.connectionStateChange.subscribe((state) => {
|
|
181
|
+
this.connectionStateChange.execute(state);
|
|
182
|
+
if (this.onconnectionstatechange)
|
|
183
|
+
runDetached(() => this.onconnectionstatechange(), (error) => log('event handler failed', error));
|
|
184
|
+
this.emit('connectionstatechange');
|
|
185
|
+
});
|
|
186
|
+
this.secureManager.onIceCandidate.subscribe((candidate) => {
|
|
187
|
+
const iceCandidate = candidate ? candidate.toJSON() : undefined;
|
|
188
|
+
this.onIceCandidate.execute(iceCandidate);
|
|
189
|
+
const event = {
|
|
190
|
+
type: 'icecandidate',
|
|
191
|
+
candidate: iceCandidate
|
|
192
|
+
};
|
|
193
|
+
if (this.onicecandidate)
|
|
194
|
+
runDetached(() => this.onicecandidate(event), (error) => log('event handler failed', error));
|
|
195
|
+
this.emit('icecandidate', event);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
get connectionState() {
|
|
199
|
+
return this.secureManager.connectionState;
|
|
200
|
+
}
|
|
201
|
+
get iceConnectionState() {
|
|
202
|
+
return this.secureManager.iceConnectionState;
|
|
203
|
+
}
|
|
204
|
+
get iceGathererState() {
|
|
205
|
+
return this.secureManager.iceGatheringState;
|
|
206
|
+
}
|
|
207
|
+
get iceGatheringState() {
|
|
208
|
+
return this.secureManager.iceGatheringState;
|
|
209
|
+
}
|
|
210
|
+
get dtlsTransports() {
|
|
211
|
+
return this.secureManager.dtlsTransports;
|
|
212
|
+
}
|
|
213
|
+
get sctpTransport() {
|
|
214
|
+
return this.sctpManager.sctpTransport;
|
|
215
|
+
}
|
|
216
|
+
get sctp() {
|
|
217
|
+
return this.sctpTransport ?? null;
|
|
218
|
+
}
|
|
219
|
+
get sctpRemotePort() {
|
|
220
|
+
return this.sctpManager.sctpRemotePort;
|
|
221
|
+
}
|
|
222
|
+
get iceTransports() {
|
|
223
|
+
return this.secureManager.iceTransports;
|
|
224
|
+
}
|
|
225
|
+
get extIdUriMap() {
|
|
226
|
+
return this.router.extIdUriMap;
|
|
227
|
+
}
|
|
228
|
+
get iceGeneration() {
|
|
229
|
+
return this.iceTransports[0].connection.generation;
|
|
230
|
+
}
|
|
231
|
+
get localDescription() {
|
|
232
|
+
return this.sdpManager.localDescription ?? null;
|
|
233
|
+
}
|
|
234
|
+
get currentLocalDescription() {
|
|
235
|
+
return this.sdpManager.currentLocalDescription?.toJSON() ?? null;
|
|
236
|
+
}
|
|
237
|
+
get pendingLocalDescription() {
|
|
238
|
+
return this.sdpManager.pendingLocalDescription?.toJSON() ?? null;
|
|
239
|
+
}
|
|
240
|
+
get remoteDescription() {
|
|
241
|
+
return this.sdpManager.remoteDescription ?? null;
|
|
242
|
+
}
|
|
243
|
+
get currentRemoteDescription() {
|
|
244
|
+
return this.sdpManager.currentRemoteDescription?.toJSON() ?? null;
|
|
245
|
+
}
|
|
246
|
+
get pendingRemoteDescription() {
|
|
247
|
+
return this.sdpManager.pendingRemoteDescription?.toJSON() ?? null;
|
|
248
|
+
}
|
|
249
|
+
get canTrickleIceCandidates() {
|
|
250
|
+
const remoteDescription = this.sdpManager._remoteDescription;
|
|
251
|
+
if (!remoteDescription) {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
const iceOptions = [
|
|
255
|
+
remoteDescription.iceOptions,
|
|
256
|
+
...remoteDescription.media.map((media) => media.iceOptions)
|
|
257
|
+
]
|
|
258
|
+
.filter((value) => !!value)
|
|
259
|
+
.join(' ');
|
|
260
|
+
return iceOptions.split(/\s+/).includes('trickle');
|
|
261
|
+
}
|
|
262
|
+
get remoteIsBundled() {
|
|
263
|
+
return this.sdpManager.remoteIsBundled;
|
|
264
|
+
}
|
|
265
|
+
/**@private */
|
|
266
|
+
get _localDescription() {
|
|
267
|
+
return this.sdpManager._localDescription;
|
|
268
|
+
}
|
|
269
|
+
/**@private */
|
|
270
|
+
get _remoteDescription() {
|
|
271
|
+
return this.sdpManager._remoteDescription;
|
|
272
|
+
}
|
|
273
|
+
getTransceivers() {
|
|
274
|
+
return this.transceiverManager.getTransceivers();
|
|
275
|
+
}
|
|
276
|
+
getSenders() {
|
|
277
|
+
return this.transceiverManager.getSenders();
|
|
278
|
+
}
|
|
279
|
+
getReceivers() {
|
|
280
|
+
return this.transceiverManager.getReceivers();
|
|
281
|
+
}
|
|
282
|
+
setConfiguration(config) {
|
|
283
|
+
const normalizedConfig = normalizePeerConfiguration(config);
|
|
284
|
+
const isReconfiguration = !!this.sdpManager;
|
|
285
|
+
if (normalizedConfig.rtcpMuxPolicy &&
|
|
286
|
+
normalizedConfig.rtcpMuxPolicy !== 'require') {
|
|
287
|
+
throw new Error('rtcpMuxPolicy must be require');
|
|
288
|
+
}
|
|
289
|
+
if (normalizedConfig.iceCandidatePoolSize !== undefined &&
|
|
290
|
+
(!Number.isInteger(normalizedConfig.iceCandidatePoolSize) ||
|
|
291
|
+
normalizedConfig.iceCandidatePoolSize < 0)) {
|
|
292
|
+
throw new Error('iceCandidatePoolSize must be a non-negative integer');
|
|
293
|
+
}
|
|
294
|
+
if (isReconfiguration &&
|
|
295
|
+
normalizedConfig.bundlePolicy !== undefined &&
|
|
296
|
+
normalizedConfig.bundlePolicy !== this.config.bundlePolicy) {
|
|
297
|
+
throw new Error('bundlePolicy cannot be changed');
|
|
298
|
+
}
|
|
299
|
+
if (normalizedConfig.mLineReuse !== undefined &&
|
|
300
|
+
!MLineReuseModes.includes(normalizedConfig.mLineReuse)) {
|
|
301
|
+
throw createWebRtcTypeError(`mLineReuse must be one of ${MLineReuseModes.join(', ')}`);
|
|
302
|
+
}
|
|
303
|
+
if (isReconfiguration &&
|
|
304
|
+
normalizedConfig.mLineReuse !== undefined &&
|
|
305
|
+
normalizedConfig.mLineReuse !== this.config.mLineReuse) {
|
|
306
|
+
throw createWebRtcDomException('InvalidModificationError', 'mLineReuse cannot be changed');
|
|
307
|
+
}
|
|
308
|
+
if (isReconfiguration &&
|
|
309
|
+
normalizedConfig.rtcpMuxPolicy !== undefined &&
|
|
310
|
+
normalizedConfig.rtcpMuxPolicy !== this.config.rtcpMuxPolicy) {
|
|
311
|
+
throw new Error('rtcpMuxPolicy cannot be changed');
|
|
312
|
+
}
|
|
313
|
+
if (isReconfiguration &&
|
|
314
|
+
normalizedConfig.certificates !== undefined &&
|
|
315
|
+
!hasSameCertificates(normalizedConfig.certificates, this.config.certificates)) {
|
|
316
|
+
throw new Error('certificates cannot be changed');
|
|
317
|
+
}
|
|
318
|
+
if (isReconfiguration &&
|
|
319
|
+
normalizedConfig.iceCandidatePoolSize !== undefined &&
|
|
320
|
+
this.localDescription &&
|
|
321
|
+
normalizedConfig.iceCandidatePoolSize !== this.config.iceCandidatePoolSize) {
|
|
322
|
+
throw new Error('iceCandidatePoolSize cannot be changed after setLocalDescription');
|
|
323
|
+
}
|
|
324
|
+
if ((normalizedConfig.iceCandidatePoolSize ?? 0) > 0) {
|
|
325
|
+
throw new Error('iceCandidatePoolSize > 0 is not supported');
|
|
326
|
+
}
|
|
327
|
+
if (normalizedConfig.sctp !== undefined) {
|
|
328
|
+
const requestedSctpMtu = normalizedConfig.sctp.mtu ?? DEFAULT_SCTP_MTU;
|
|
329
|
+
validateSctpMtu(requestedSctpMtu);
|
|
330
|
+
if (this.sctpManager?.sctpTransport &&
|
|
331
|
+
requestedSctpMtu !== this.config.sctp.mtu) {
|
|
332
|
+
throw new Error('sctp.mtu cannot be changed after SCTP transport creation');
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
deepMerge(this.config, normalizedConfig);
|
|
336
|
+
this.config.sctp = {
|
|
337
|
+
mtu: this.config.sctp?.mtu ?? DEFAULT_SCTP_MTU
|
|
338
|
+
};
|
|
339
|
+
if (this.config.icePortRange) {
|
|
340
|
+
const [min, max] = this.config.icePortRange;
|
|
341
|
+
if (min === max)
|
|
342
|
+
throw new Error('should not be same value');
|
|
343
|
+
if (min >= max)
|
|
344
|
+
throw new Error('The min must be less than max');
|
|
345
|
+
}
|
|
346
|
+
if (!Number.isInteger(this.config.maxMessageSize) ||
|
|
347
|
+
this.config.maxMessageSize < 0) {
|
|
348
|
+
throw new Error('maxMessageSize must be a non-negative integer');
|
|
349
|
+
}
|
|
350
|
+
if (this.sctpManager?.sctpTransport) {
|
|
351
|
+
this.sctpManager.sctpTransport.maxMessageSize =
|
|
352
|
+
this.config.maxMessageSize;
|
|
353
|
+
}
|
|
354
|
+
assignDynamicPayloadTypes(this.config);
|
|
355
|
+
//One id per extension, the same in all the media (of a bundle)
|
|
356
|
+
const extensionIds = new Map();
|
|
357
|
+
const extensions = [
|
|
358
|
+
...(this.config.headerExtensions.audio || []),
|
|
359
|
+
...(this.config.headerExtensions.video || [])
|
|
360
|
+
];
|
|
361
|
+
extensions.forEach((v) => {
|
|
362
|
+
if (!extensionIds.has(v.uri))
|
|
363
|
+
extensionIds.set(v.uri, extensionIds.size + 1);
|
|
364
|
+
v.id = extensionIds.get(v.uri);
|
|
365
|
+
});
|
|
366
|
+
// Propagate ICE server changes only to transports still in gathering
|
|
367
|
+
// state "new". JSEP (RFC 8829 §4.1.18): STUN/TURN changes affect the next
|
|
368
|
+
// gathering phase; once gathering has started or finished, nothing is
|
|
369
|
+
// applied to the live Connection (WHIP: createOffer → setConfiguration →
|
|
370
|
+
// setLocalDescription). Per-transport state is used so a gatherer that
|
|
371
|
+
// was reset to "new" (e.g. after ICE restart) is not blocked by a stale
|
|
372
|
+
// manager aggregate of "complete".
|
|
373
|
+
if (isReconfiguration &&
|
|
374
|
+
this.secureManager &&
|
|
375
|
+
(normalizedConfig.iceServers !== undefined ||
|
|
376
|
+
normalizedConfig.turnUdpFamily !== undefined)) {
|
|
377
|
+
this.secureManager.updateIceServers();
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
getConfiguration() {
|
|
381
|
+
return clonePeerConfiguration(this.config);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* The header extensions of a media not negotiated yet: the ones configured, with the ids the connection negotiated
|
|
385
|
+
* for them in its other media (an extension has one id in all the media of a bundle: a browser refuses another one),
|
|
386
|
+
* else their configured ids when not taken by another extension, else free ones
|
|
387
|
+
*/
|
|
388
|
+
headerExtensionsFor(kind) {
|
|
389
|
+
const negotiated = new Map();
|
|
390
|
+
for (const transceiver of this.transceiverManager.getTransceivers()) {
|
|
391
|
+
for (const extension of transceiver.headerExtensions)
|
|
392
|
+
negotiated.set(extension.uri, extension.id);
|
|
393
|
+
}
|
|
394
|
+
const taken = new Set(negotiated.values());
|
|
395
|
+
return (this.config.headerExtensions[kind] ?? []).flatMap((extension) => {
|
|
396
|
+
let id = negotiated.get(extension.uri);
|
|
397
|
+
if (id === undefined) {
|
|
398
|
+
id = taken.has(extension.id)
|
|
399
|
+
? Array.from({ length: 14 }, (_, index) => index + 1).find((free) => !taken.has(free))
|
|
400
|
+
: extension.id;
|
|
401
|
+
if (id === undefined)
|
|
402
|
+
return [];
|
|
403
|
+
taken.add(id);
|
|
404
|
+
negotiated.set(extension.uri, id);
|
|
405
|
+
}
|
|
406
|
+
return [new RTCRtpHeaderExtensionParameters({ uri: extension.uri, id })];
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
async createOffer({ iceRestart } = {}) {
|
|
410
|
+
if (iceRestart || this.needRestart) {
|
|
411
|
+
this.needRestart = false;
|
|
412
|
+
this.secureManager.restartIce();
|
|
413
|
+
}
|
|
414
|
+
await this.secureManager.ensureCerts();
|
|
415
|
+
for (const transceiver of this.transceiverManager.getTransceivers()) {
|
|
416
|
+
if (transceiver.codecs.length === 0 ||
|
|
417
|
+
transceiver.codecPreferencesNeedResolution) {
|
|
418
|
+
this.transceiverManager.assignTransceiverCodecs(transceiver);
|
|
419
|
+
}
|
|
420
|
+
if (transceiver.headerExtensions.length === 0) {
|
|
421
|
+
transceiver.headerExtensions = this.headerExtensionsFor(transceiver.kind);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
const description = this.sdpManager.buildOfferSdp(this.transceiverManager.getTransceivers(), this.sctpTransport);
|
|
425
|
+
const createdOffer = description.toJSON();
|
|
426
|
+
this.lastCreatedOffer = createdOffer;
|
|
427
|
+
this.lastCreatedOfferChangeSeq = this.negotiationChangeSeq;
|
|
428
|
+
return createdOffer;
|
|
429
|
+
}
|
|
430
|
+
createSctpTransport() {
|
|
431
|
+
const sctp = this.sctpManager.createSctpTransport(this.config.maxMessageSize, this.config.sctp);
|
|
432
|
+
const dtlsTransport = this.findOrCreateTransport();
|
|
433
|
+
sctp.setDtlsTransport(dtlsTransport);
|
|
434
|
+
return sctp;
|
|
435
|
+
}
|
|
436
|
+
createDataChannel(label, options = {}) {
|
|
437
|
+
if (!this.sctpTransport) {
|
|
438
|
+
this.createSctpTransport();
|
|
439
|
+
this.needNegotiation();
|
|
440
|
+
}
|
|
441
|
+
const channel = this.sctpManager.createDataChannel(label, options);
|
|
442
|
+
if (!channel.sctp.dtlsTransport) {
|
|
443
|
+
const dtlsTransport = this.findOrCreateTransport();
|
|
444
|
+
channel.sctp.setDtlsTransport(dtlsTransport);
|
|
445
|
+
}
|
|
446
|
+
return channel;
|
|
447
|
+
}
|
|
448
|
+
removeTrack(sender) {
|
|
449
|
+
if (this.isClosed) {
|
|
450
|
+
throw createWebRtcDomException('InvalidStateError', 'peer closed');
|
|
451
|
+
}
|
|
452
|
+
if (this.transceiverManager.removeTrack(sender)) {
|
|
453
|
+
this.needNegotiation();
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/**未交渉の変更が残っていれば negotiationneeded を予約する (stable 復帰時の再判定にも使う) */
|
|
457
|
+
scheduleNegotiationneeded() {
|
|
458
|
+
this.invalidateLastCreatedDescriptions();
|
|
459
|
+
this.shouldNegotiationneeded = true;
|
|
460
|
+
if (this.negotiationneeded ||
|
|
461
|
+
this.negotiationneededScheduled ||
|
|
462
|
+
this.signalingState !== 'stable') {
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
this.shouldNegotiationneeded = false;
|
|
466
|
+
this.negotiationneededScheduled = true;
|
|
467
|
+
setImmediate(() => {
|
|
468
|
+
this.negotiationneededScheduled = false;
|
|
469
|
+
if (this.negotiatedChangeSeq >= this.negotiationChangeSeq) {
|
|
470
|
+
// 発火前に適用された local offer が変更をすべて含んでいる
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
if (this.signalingState !== 'stable') {
|
|
474
|
+
// stable に戻った時点で改めて判定する
|
|
475
|
+
this.shouldNegotiationneeded = true;
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
this.negotiationneeded = true;
|
|
479
|
+
this.onNegotiationneeded.execute();
|
|
480
|
+
if (this.onnegotiationneeded) {
|
|
481
|
+
runDetached(() => this.onnegotiationneeded(new globalThis.Event('negotiationneeded')), (error) => log('event handler failed', error));
|
|
482
|
+
}
|
|
483
|
+
this.emit('negotiationneeded');
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
invalidateLastCreatedDescriptions() {
|
|
487
|
+
this.lastCreatedAnswer = undefined;
|
|
488
|
+
this.lastCreatedOffer = undefined;
|
|
489
|
+
}
|
|
490
|
+
async waitForPendingDescriptionTask() {
|
|
491
|
+
this.assertNotClosed();
|
|
492
|
+
await Promise.resolve();
|
|
493
|
+
if (this.isClosed) {
|
|
494
|
+
await new Promise(() => undefined);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
findOrCreateTransport() {
|
|
498
|
+
const existingDtlsTransport = this.dtlsTransports.find((transport) => transport.state !== 'closed');
|
|
499
|
+
// Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.
|
|
500
|
+
// https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum
|
|
501
|
+
if (this.sdpManager.bundlePolicy === 'max-bundle' ||
|
|
502
|
+
(this.sdpManager.bundlePolicy !== 'disable' && this.remoteIsBundled)) {
|
|
503
|
+
if (existingDtlsTransport) {
|
|
504
|
+
return existingDtlsTransport;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return this.createDtlsTransport();
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* @param inheritCredentials false の場合は BUNDLE 外の独立 transport として
|
|
511
|
+
* 既存 transport と異なる ICE credentials を使う
|
|
512
|
+
*/
|
|
513
|
+
createDtlsTransport({ inheritCredentials = true } = {}) {
|
|
514
|
+
const dtlsTransport = this.secureManager.createTransport({
|
|
515
|
+
inheritCredentials
|
|
516
|
+
});
|
|
517
|
+
dtlsTransport.onRtp.subscribe((rtp) => {
|
|
518
|
+
this.router.routeRtp(rtp);
|
|
519
|
+
});
|
|
520
|
+
dtlsTransport.onRtcp.subscribe((rtcp) => {
|
|
521
|
+
this.router.routeRtcp(rtcp);
|
|
522
|
+
});
|
|
523
|
+
const iceTransport = dtlsTransport.iceTransport;
|
|
524
|
+
iceTransport.onNegotiationNeeded.subscribe(() => {
|
|
525
|
+
this.needNegotiation();
|
|
526
|
+
});
|
|
527
|
+
iceTransport.onIceCandidate.subscribe((candidate) => {
|
|
528
|
+
if (!this.localDescription) {
|
|
529
|
+
log('localDescription not found when ice candidate was gathered');
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
if (!candidate) {
|
|
533
|
+
this.sdpManager.setLocal(this._localDescription, this.transceiverManager.getTransceivers(), this.sctpTransport);
|
|
534
|
+
this.onIceCandidate.execute(undefined);
|
|
535
|
+
if (this.onicecandidate) {
|
|
536
|
+
runDetached(() => this.onicecandidate({ candidate: undefined }), (error) => log('event handler failed', error));
|
|
537
|
+
}
|
|
538
|
+
this.emit('icecandidate', { candidate: undefined });
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
if (!this._localDescription) {
|
|
542
|
+
log('localDescription not found when ice candidate was gathered');
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
const owner = this.resolveLocalCandidateOwner(iceTransport);
|
|
546
|
+
if (!owner) {
|
|
547
|
+
// 停止 / 拒否した m-line だけが使う transport の候補は通知しない
|
|
548
|
+
log('no accepted m-line owns the ice transport', iceTransport.id);
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
this.secureManager.handleNewIceCandidate({
|
|
552
|
+
candidate,
|
|
553
|
+
sdpMid: owner.mid,
|
|
554
|
+
sdpMLineIndex: owner.index
|
|
555
|
+
});
|
|
556
|
+
});
|
|
557
|
+
return dtlsTransport;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* local candidate の sdpMid / sdpMLineIndex を、その ICE transport を実際に
|
|
561
|
+
* 所有する受け入れ済み m-line (BUNDLE なら tag) に合わせる。
|
|
562
|
+
*/
|
|
563
|
+
resolveLocalCandidateOwner(iceTransport) {
|
|
564
|
+
const description = this._localDescription;
|
|
565
|
+
if (!description) {
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
const owners = description.media
|
|
569
|
+
.map((media, index) => ({ media, index }))
|
|
570
|
+
.filter(({ media }) => {
|
|
571
|
+
if (media.port === 0) {
|
|
572
|
+
return false;
|
|
573
|
+
}
|
|
574
|
+
const mid = media.rtp.muxId;
|
|
575
|
+
if (media.kind === 'application') {
|
|
576
|
+
return (!!this.sctpTransport &&
|
|
577
|
+
this.sctpTransport.mid === mid &&
|
|
578
|
+
this.sctpTransport.dtlsTransport?.iceTransport.id ===
|
|
579
|
+
iceTransport.id);
|
|
580
|
+
}
|
|
581
|
+
const transceiver = this.transceiverManager
|
|
582
|
+
.getTransceivers()
|
|
583
|
+
.find((t) => t.mid != undefined && t.mid === mid);
|
|
584
|
+
return (!!transceiver &&
|
|
585
|
+
!transceiver.stopped &&
|
|
586
|
+
transceiver.dtlsTransport?.iceTransport.id === iceTransport.id);
|
|
587
|
+
});
|
|
588
|
+
const tags = description.group
|
|
589
|
+
.filter((group) => group.semantic === 'BUNDLE')
|
|
590
|
+
.map((group) => group.items[0]);
|
|
591
|
+
const owner = owners.find(({ media }) => tags.includes(media.rtp.muxId)) ?? owners[0];
|
|
592
|
+
if (!owner) {
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
return { mid: owner.media.rtp.muxId, index: owner.index };
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* answer 確定後の stopping transceiver を整理する。
|
|
599
|
+
* @returns port 0 を自分の offer で交渉すべき transceiver が残っているか
|
|
600
|
+
*/
|
|
601
|
+
settleStoppingTransceivers() {
|
|
602
|
+
const negotiatedMids = new Set((this.sdpManager.currentLocalDescription?.media ?? [])
|
|
603
|
+
.filter((media) => media.port !== 0 && media.rtp.muxId)
|
|
604
|
+
.map((media) => media.rtp.muxId));
|
|
605
|
+
const pending = this.transceiverManager.settleStoppingTransceivers(negotiatedMids);
|
|
606
|
+
this.closeIdleTransports();
|
|
607
|
+
return pending;
|
|
608
|
+
}
|
|
609
|
+
/**停止した transceiver の transport のうち、live な利用者がいないものを閉じる */
|
|
610
|
+
closeIdleTransports(candidates = this.transceiverManager
|
|
611
|
+
.getTransceivers()
|
|
612
|
+
.filter((t) => t.stopped)
|
|
613
|
+
.map((t) => t.dtlsTransport)) {
|
|
614
|
+
const live = new Set(this.dtlsTransports.map((t) => t.id));
|
|
615
|
+
for (const transport of new Set(candidates)) {
|
|
616
|
+
if (!transport ||
|
|
617
|
+
transport.state === 'closed' ||
|
|
618
|
+
live.has(transport.id)) {
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
621
|
+
transport.stop().catch((error) => {
|
|
622
|
+
log('failed to close idle transport', error);
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
async setLocalDescription(sessionDescription) {
|
|
627
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setLocalDescription#type
|
|
628
|
+
const implicitOfferState = [
|
|
629
|
+
'stable',
|
|
630
|
+
'have-local-offer',
|
|
631
|
+
'have-remote-pranswer'
|
|
632
|
+
];
|
|
633
|
+
await this.waitForPendingDescriptionTask();
|
|
634
|
+
if (sessionDescription?.type === 'rollback') {
|
|
635
|
+
this.sdpManager.rollbackLocalDescription(this.signalingState);
|
|
636
|
+
this.rollbackLocalOffer();
|
|
637
|
+
for (const transceiver of this.transceiverManager.getTransceivers()) {
|
|
638
|
+
transceiver.pendingLocalOfferCodecs = undefined;
|
|
639
|
+
}
|
|
640
|
+
this.pendingOfferChangeSeq = undefined;
|
|
641
|
+
this.setSignalingState('stable');
|
|
642
|
+
if (this.shouldNegotiationneeded) {
|
|
643
|
+
this.scheduleNegotiationneeded();
|
|
644
|
+
}
|
|
645
|
+
this.invalidateLastCreatedDescriptions();
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
const needsGeneratedDescription = !sessionDescription?.type ||
|
|
649
|
+
!sessionDescription.sdp ||
|
|
650
|
+
sessionDescription.sdp.length === 0;
|
|
651
|
+
const generatedDescription = needsGeneratedDescription
|
|
652
|
+
? sessionDescription?.type === 'offer'
|
|
653
|
+
? (this.lastCreatedOffer ?? (await this.createOffer()))
|
|
654
|
+
: sessionDescription?.type === 'answer' ||
|
|
655
|
+
sessionDescription?.type === 'pranswer'
|
|
656
|
+
? (this.lastCreatedAnswer ?? (await this.createAnswer()))
|
|
657
|
+
: implicitOfferState.includes(this.signalingState)
|
|
658
|
+
? (this.lastCreatedOffer ?? (await this.createOffer()))
|
|
659
|
+
: (this.lastCreatedAnswer ?? (await this.createAnswer()))
|
|
660
|
+
: undefined;
|
|
661
|
+
sessionDescription = {
|
|
662
|
+
type: sessionDescription?.type ?? generatedDescription.type,
|
|
663
|
+
sdp: sessionDescription?.sdp && sessionDescription.sdp.length > 0
|
|
664
|
+
? sessionDescription.sdp
|
|
665
|
+
: generatedDescription.sdp
|
|
666
|
+
};
|
|
667
|
+
if (sessionDescription.type === 'offer' &&
|
|
668
|
+
this.lastCreatedOffer &&
|
|
669
|
+
sessionDescription.sdp !== this.lastCreatedOffer.sdp) {
|
|
670
|
+
throw createWebRtcDomException('InvalidModificationError', 'setLocalDescription must use the latest created offer');
|
|
671
|
+
}
|
|
672
|
+
// # parse and validate description
|
|
673
|
+
const descriptionType = sessionDescription.type;
|
|
674
|
+
const descriptionSdp = sessionDescription.sdp;
|
|
675
|
+
const description = this.sdpManager.parseSdp({
|
|
676
|
+
sdp: descriptionSdp,
|
|
677
|
+
isLocal: true,
|
|
678
|
+
signalingState: this.signalingState,
|
|
679
|
+
type: descriptionType
|
|
680
|
+
});
|
|
681
|
+
// # update signaling state
|
|
682
|
+
if (description.type === 'offer') {
|
|
683
|
+
// この offer は作成時点までの変更を含む。answer の適用で交渉済みにする
|
|
684
|
+
this.pendingOfferChangeSeq =
|
|
685
|
+
this.lastCreatedOffer?.sdp === sessionDescription.sdp
|
|
686
|
+
? this.lastCreatedOfferChangeSeq
|
|
687
|
+
: undefined;
|
|
688
|
+
this.setSignalingState('have-local-offer');
|
|
689
|
+
}
|
|
690
|
+
else if (description.type === 'answer') {
|
|
691
|
+
this.setSignalingState('stable');
|
|
692
|
+
}
|
|
693
|
+
else if (description.type === 'pranswer') {
|
|
694
|
+
this.setSignalingState('have-local-pranswer');
|
|
695
|
+
}
|
|
696
|
+
if (description.type === 'answer') {
|
|
697
|
+
// answer の確定で拒否予定の m-line を停止し、RTP pipeline / 遊休 transport を解放する
|
|
698
|
+
this.transceiverManager.commitRemoteOffer();
|
|
699
|
+
// port 0 で答えた m-line (aggressive の inactive など) は offerer 側で拒否として停止が確定する。
|
|
700
|
+
// answerer 側も同じ位置を停止確定にし、offerer が新 MID で再利用できるようにする
|
|
701
|
+
for (const media of description.media) {
|
|
702
|
+
if (!['audio', 'video'].includes(media.kind) || media.port !== 0) {
|
|
703
|
+
continue;
|
|
704
|
+
}
|
|
705
|
+
const transceiver = this.transceiverManager
|
|
706
|
+
.getTransceivers()
|
|
707
|
+
.find((t) => t.mid === media.rtp.muxId && !t.stopped);
|
|
708
|
+
transceiver?.commitStopped({ rejected: true });
|
|
709
|
+
}
|
|
710
|
+
this.closeIdleTransports();
|
|
711
|
+
}
|
|
712
|
+
// # assign MID
|
|
713
|
+
for (const [i, media] of enumerate(description.media)) {
|
|
714
|
+
const mid = media.rtp.muxId;
|
|
715
|
+
this.sdpManager.registerMid(mid);
|
|
716
|
+
if (['audio', 'video'].includes(media.kind) && media.port !== 0) {
|
|
717
|
+
// 停止済み、別 kind、別 MID の transceiver には割り当てない (MID の一意性を保つ)
|
|
718
|
+
const transceiver = this.transceiverManager
|
|
719
|
+
.getTransceivers()
|
|
720
|
+
.find((t) => t.mLineIndex === i &&
|
|
721
|
+
!t.stopped &&
|
|
722
|
+
t.kind === media.kind &&
|
|
723
|
+
(t.mid == null || t.mid === mid));
|
|
724
|
+
if (transceiver) {
|
|
725
|
+
transceiver.mid = mid;
|
|
726
|
+
if (description.type === 'offer') {
|
|
727
|
+
transceiver.pendingLocalOfferCodecs = [...media.rtp.codecs];
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
if (media.kind === 'application' && this.sctpTransport) {
|
|
732
|
+
this.sctpTransport.mid = mid;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
// setup ice,dtls role
|
|
736
|
+
const role = description.media.find((media) => media.dtlsParams)?.dtlsParams
|
|
737
|
+
?.role;
|
|
738
|
+
// transport ごとに、その transport を使う受け入れ済み m-line の a=setup を適用する
|
|
739
|
+
// (BUNDLE group 外の独立 transport は先頭 m-line と異なる role を持ちうる)
|
|
740
|
+
const roleOfTransport = new Map();
|
|
741
|
+
for (const media of description.media) {
|
|
742
|
+
const mid = media.rtp.muxId;
|
|
743
|
+
const mediaRole = media.dtlsParams?.role;
|
|
744
|
+
if (media.port === 0 || mid == undefined || !mediaRole) {
|
|
745
|
+
continue;
|
|
746
|
+
}
|
|
747
|
+
const owner = media.kind === 'application'
|
|
748
|
+
? this.sctpTransport?.mid === mid
|
|
749
|
+
? this.sctpTransport
|
|
750
|
+
: undefined
|
|
751
|
+
: this.transceiverManager
|
|
752
|
+
.getTransceivers()
|
|
753
|
+
.find((t) => t.mid === mid && !t.stopped);
|
|
754
|
+
if (owner?.dtlsTransport && !roleOfTransport.has(owner.dtlsTransport)) {
|
|
755
|
+
roleOfTransport.set(owner.dtlsTransport, mediaRole);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
this.secureManager.setLocalRole({
|
|
759
|
+
type: description.type === 'offer' ? 'offer' : 'answer',
|
|
760
|
+
role,
|
|
761
|
+
roleOfTransport
|
|
762
|
+
});
|
|
763
|
+
// # configure direction
|
|
764
|
+
if (['answer', 'pranswer'].includes(description.type)) {
|
|
765
|
+
for (const media of description.media) {
|
|
766
|
+
const t = this.transceiverManager
|
|
767
|
+
.getTransceivers()
|
|
768
|
+
.find((t) => t.mid != undefined && t.mid === media.rtp.muxId);
|
|
769
|
+
if (!t || t.stopped || t.pendingRejection) {
|
|
770
|
+
continue;
|
|
771
|
+
}
|
|
772
|
+
const direction = t.stopping
|
|
773
|
+
? 'inactive'
|
|
774
|
+
: andDirection(t.direction, t.offerDirection);
|
|
775
|
+
t.setCurrentDirection(direction);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
// for trickle ice
|
|
779
|
+
this.sdpManager.setLocal(description, this.transceiverManager.getTransceivers(), this.sctpTransport);
|
|
780
|
+
await this.gatherCandidates().catch((e) => {
|
|
781
|
+
log('gatherCandidates failed', e);
|
|
782
|
+
});
|
|
783
|
+
// connect transports
|
|
784
|
+
if (description.type === 'answer') {
|
|
785
|
+
this.connect().catch((err) => {
|
|
786
|
+
log('connect failed', err);
|
|
787
|
+
this.secureManager.setConnectionState('failed');
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
this.sdpManager.setLocal(description, this.transceiverManager.getTransceivers(), this.sctpTransport);
|
|
791
|
+
// answerer の stop() は次の自分の offer で交渉する
|
|
792
|
+
const hasUnnegotiatedStop = description.type === 'answer' && this.settleStoppingTransceivers();
|
|
793
|
+
if (this.shouldNegotiationneeded || hasUnnegotiatedStop) {
|
|
794
|
+
this.scheduleNegotiationneeded();
|
|
795
|
+
}
|
|
796
|
+
this.invalidateLastCreatedDescriptions();
|
|
797
|
+
return description;
|
|
798
|
+
}
|
|
799
|
+
async gatherCandidates() {
|
|
800
|
+
await this.secureManager.gatherCandidates();
|
|
801
|
+
}
|
|
802
|
+
async addIceCandidate(candidateMessage = {}) {
|
|
803
|
+
if (this.isClosed) {
|
|
804
|
+
throw createWebRtcDomException('InvalidStateError', 'is closed');
|
|
805
|
+
}
|
|
806
|
+
if (!this.remoteDescription || !this.sdpManager._remoteDescription) {
|
|
807
|
+
this.pendingRemoteCandidates.push(candidateMessage);
|
|
808
|
+
return;
|
|
809
|
+
}
|
|
810
|
+
await this.applyRemoteIceCandidate(candidateMessage);
|
|
811
|
+
}
|
|
812
|
+
async applyRemoteIceCandidate(candidateMessage) {
|
|
813
|
+
const sdp = this.sdpManager._remoteDescription;
|
|
814
|
+
if (!sdp) {
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
const appliedCandidate = await this.secureManager.addIceCandidate(sdp, candidateMessage);
|
|
818
|
+
const remoteDescription = this.sdpManager._remoteDescription;
|
|
819
|
+
if (!remoteDescription || !appliedCandidate) {
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
if (appliedCandidate.kind === 'end-of-candidates') {
|
|
823
|
+
for (const mediaIndex of appliedCandidate.mediaIndices) {
|
|
824
|
+
const media = remoteDescription.media[mediaIndex];
|
|
825
|
+
if (media) {
|
|
826
|
+
media.iceCandidatesComplete = true;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
return;
|
|
830
|
+
}
|
|
831
|
+
for (const mediaIndex of appliedCandidate.mediaIndices) {
|
|
832
|
+
const media = remoteDescription.media[mediaIndex];
|
|
833
|
+
if (!media) {
|
|
834
|
+
continue;
|
|
835
|
+
}
|
|
836
|
+
media.iceCandidates.push(appliedCandidate.candidate);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
async flushPendingRemoteCandidates() {
|
|
840
|
+
while (this.pendingRemoteCandidates.length > 0 &&
|
|
841
|
+
this.remoteDescription &&
|
|
842
|
+
this.sdpManager._remoteDescription) {
|
|
843
|
+
const candidate = this.pendingRemoteCandidates.shift();
|
|
844
|
+
await this.applyRemoteIceCandidate(candidate ?? null);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
async connect() {
|
|
848
|
+
log('start connect');
|
|
849
|
+
const res = await Promise.allSettled(this.dtlsTransports.map(async (dtlsTransport) => {
|
|
850
|
+
const { iceTransport } = dtlsTransport;
|
|
851
|
+
if (iceTransport.state === 'connected') {
|
|
852
|
+
return;
|
|
853
|
+
}
|
|
854
|
+
//Not negotiated yet (the transport of a transceiver added since, which the next offer bundles): the
|
|
855
|
+
//negotiation giving it its remote parameters connects it
|
|
856
|
+
if (!iceTransport.connection.remoteUsername || !iceTransport.connection.remotePassword) {
|
|
857
|
+
return;
|
|
858
|
+
}
|
|
859
|
+
const checkDtlsConnected = () => dtlsTransport.state === 'connected';
|
|
860
|
+
if (checkDtlsConnected()) {
|
|
861
|
+
//After an ICE restart (new credentials, no pair nominated), DTLS is still connected: ICE checks
|
|
862
|
+
//again, and the records go over the pair it nominates
|
|
863
|
+
if (!iceTransport.connection.nominated) {
|
|
864
|
+
await iceTransport.start().catch((err) => {
|
|
865
|
+
log('iceTransport.start failed', err);
|
|
866
|
+
throw err;
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
return;
|
|
870
|
+
}
|
|
871
|
+
this.secureManager.setConnectionState('connecting');
|
|
872
|
+
await iceTransport.start().catch((err) => {
|
|
873
|
+
log('iceTransport.start failed', err);
|
|
874
|
+
throw err;
|
|
875
|
+
});
|
|
876
|
+
if (checkDtlsConnected()) {
|
|
877
|
+
return;
|
|
878
|
+
}
|
|
879
|
+
await dtlsTransport.start().catch((err) => {
|
|
880
|
+
log('dtlsTransport.start failed', err);
|
|
881
|
+
throw err;
|
|
882
|
+
});
|
|
883
|
+
if (this.sctpTransport &&
|
|
884
|
+
this.sctpTransport.dtlsTransport.id === dtlsTransport.id) {
|
|
885
|
+
await this.sctpManager.connectSctp();
|
|
886
|
+
}
|
|
887
|
+
}));
|
|
888
|
+
if (res.find((r) => r.status === 'rejected')) {
|
|
889
|
+
this.secureManager.setConnectionState('failed');
|
|
890
|
+
}
|
|
891
|
+
else {
|
|
892
|
+
this.secureManager.setConnectionState('connected');
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
restartIce() {
|
|
896
|
+
this.needRestart = true;
|
|
897
|
+
this.needNegotiation();
|
|
898
|
+
}
|
|
899
|
+
async setRemoteDescription(sessionDescription) {
|
|
900
|
+
if (sessionDescription instanceof SessionDescription) {
|
|
901
|
+
sessionDescription = sessionDescription.toSdp();
|
|
902
|
+
}
|
|
903
|
+
await this.waitForPendingDescriptionTask();
|
|
904
|
+
//An offer of the other side while this side offers: this side's offer is rolled back first, the offer of the
|
|
905
|
+
//other side then associated with the transceivers as they were before it
|
|
906
|
+
const needsImplicitLocalRollback = sessionDescription.type === 'offer' &&
|
|
907
|
+
['have-local-offer', 'have-local-pranswer'].includes(this.signalingState);
|
|
908
|
+
if (needsImplicitLocalRollback) {
|
|
909
|
+
this.sdpManager.rollbackLocalDescription(this.signalingState);
|
|
910
|
+
this.rollbackLocalOffer();
|
|
911
|
+
for (const transceiver of this.transceiverManager.getTransceivers()) {
|
|
912
|
+
transceiver.pendingLocalOfferCodecs = undefined;
|
|
913
|
+
}
|
|
914
|
+
this.pendingOfferChangeSeq = undefined;
|
|
915
|
+
this.shouldNegotiationneeded = true;
|
|
916
|
+
this.setSignalingState('stable');
|
|
917
|
+
await Promise.resolve();
|
|
918
|
+
}
|
|
919
|
+
let codecPlan = new Map();
|
|
920
|
+
if (sessionDescription.type &&
|
|
921
|
+
sessionDescription.type !== 'rollback' &&
|
|
922
|
+
sessionDescription.sdp) {
|
|
923
|
+
const preview = this.sdpManager.parseSdp({
|
|
924
|
+
sdp: sessionDescription.sdp,
|
|
925
|
+
isLocal: false,
|
|
926
|
+
signalingState: this.signalingState,
|
|
927
|
+
type: sessionDescription.type
|
|
928
|
+
});
|
|
929
|
+
// 本適用と同じ対応付けで全 m-line の codec を副作用なしに解決する
|
|
930
|
+
const planned = new Set();
|
|
931
|
+
codecPlan = this.transceiverManager.planRemoteRtpCodecs(preview, (remoteMedia, index) => {
|
|
932
|
+
const transceiver = this.findTransceiverForRemoteMedia(remoteMedia, index, planned, sessionDescription.type === 'offer');
|
|
933
|
+
if (transceiver)
|
|
934
|
+
planned.add(transceiver);
|
|
935
|
+
return transceiver;
|
|
936
|
+
});
|
|
937
|
+
}
|
|
938
|
+
// # parse and validate description
|
|
939
|
+
this.assertAnswerKeepsSharedTransports(sessionDescription);
|
|
940
|
+
const remoteSdp = this.sdpManager.setRemoteDescription(sessionDescription, this.signalingState);
|
|
941
|
+
if (!remoteSdp) {
|
|
942
|
+
// 非対応 re-offer などの rollback では元の transceiver 対応を復元する
|
|
943
|
+
const transportsBeforeRollback = this.transceiverManager
|
|
944
|
+
.getTransceivers()
|
|
945
|
+
.map((t) => t.dtlsTransport);
|
|
946
|
+
this.transceiverManager.rollbackRemoteOffer();
|
|
947
|
+
this.closeIdleTransports(transportsBeforeRollback);
|
|
948
|
+
this.setSignalingState('stable');
|
|
949
|
+
if (this.shouldNegotiationneeded) {
|
|
950
|
+
this.scheduleNegotiationneeded();
|
|
951
|
+
}
|
|
952
|
+
this.invalidateLastCreatedDescriptions();
|
|
953
|
+
return;
|
|
954
|
+
}
|
|
955
|
+
if (remoteSdp.type === 'offer') {
|
|
956
|
+
this.transceiverManager.beginRemoteOffer();
|
|
957
|
+
}
|
|
958
|
+
// # apply description
|
|
959
|
+
const bundleGroups = this.config.bundlePolicy === 'disable'
|
|
960
|
+
? []
|
|
961
|
+
: remoteSdp.group.filter((group) => group.semantic === 'BUNDLE');
|
|
962
|
+
const groupOfMid = (mid) => mid == undefined
|
|
963
|
+
? undefined
|
|
964
|
+
: bundleGroups.find((group) => group.items.includes(mid));
|
|
965
|
+
// ## associate m-lines with transceivers / sctp
|
|
966
|
+
const associated = new Set();
|
|
967
|
+
const entries = remoteSdp.media.map((remoteMedia, index) => {
|
|
968
|
+
if (['audio', 'video'].includes(remoteMedia.kind)) {
|
|
969
|
+
let transceiver = this.findTransceiverForRemoteMedia(remoteMedia, index, associated, remoteSdp.type === 'offer');
|
|
970
|
+
if (!transceiver) {
|
|
971
|
+
if (remoteMedia.port === 0) {
|
|
972
|
+
// 未知の MID の拒否済み m-line には transceiver を関連付けない
|
|
973
|
+
return { remoteMedia, index };
|
|
974
|
+
}
|
|
975
|
+
transceiver = this.addRemoteTransceiver(remoteMedia, index);
|
|
976
|
+
}
|
|
977
|
+
else if (transceiver.mid == null) {
|
|
978
|
+
this.transceiverManager.associateMLine(transceiver, index);
|
|
979
|
+
}
|
|
980
|
+
associated.add(transceiver);
|
|
981
|
+
return { remoteMedia, index, transceiver };
|
|
982
|
+
}
|
|
983
|
+
else if (remoteMedia.kind === 'application') {
|
|
984
|
+
let sctpTransport = this.sctpTransport;
|
|
985
|
+
if (!sctpTransport) {
|
|
986
|
+
sctpTransport = this.createSctpTransport();
|
|
987
|
+
sctpTransport.mid = remoteMedia.rtp.muxId;
|
|
988
|
+
}
|
|
989
|
+
return { remoteMedia, index, sctpTransport };
|
|
990
|
+
}
|
|
991
|
+
else {
|
|
992
|
+
throw new Error('invalid media kind');
|
|
993
|
+
}
|
|
994
|
+
});
|
|
995
|
+
if (remoteSdp.type === 'offer') {
|
|
996
|
+
this.transceiverManager.releaseUnassociatedReservations(associated, remoteSdp.media.length);
|
|
997
|
+
}
|
|
998
|
+
const ownerOf = (entry) => entry.transceiver ?? entry.sctpTransport;
|
|
999
|
+
// ## transport ownership
|
|
1000
|
+
// remote offer の所有関係は bundlePolicy によらず offer の BUNDLE group だけで決まる
|
|
1001
|
+
// (max-bundle は自分の offer にだけ効く)。group ごとに 1 つの transport を共有し、
|
|
1002
|
+
// 異なる group や group 外の m-line とは共有しない。
|
|
1003
|
+
// remote answer では offer で渡した ICE credentials を保つため transport を作り直さない
|
|
1004
|
+
// (共有 transport を分割する answer は assertAnswerKeepsSharedTransports で事前に拒否済み)
|
|
1005
|
+
const isRemoteOffer = remoteSdp.type === 'offer';
|
|
1006
|
+
const liveTransport = (transport) => !!transport && transport.state !== 'closed';
|
|
1007
|
+
const groupTransports = new Map();
|
|
1008
|
+
const claimed = new Set();
|
|
1009
|
+
for (const group of bundleGroups) {
|
|
1010
|
+
const members = entries.filter((entry) => !!ownerOf(entry) &&
|
|
1011
|
+
group.items.includes(entry.remoteMedia.rtp.muxId));
|
|
1012
|
+
if (members.length === 0) {
|
|
1013
|
+
continue;
|
|
1014
|
+
}
|
|
1015
|
+
// 既存 member の transport を優先し、他の group が使っていれば新しい transport を作る
|
|
1016
|
+
let shared = members
|
|
1017
|
+
.map((entry) => ownerOf(entry).dtlsTransport)
|
|
1018
|
+
.find((transport) => liveTransport(transport) &&
|
|
1019
|
+
(!isRemoteOffer || !claimed.has(transport)));
|
|
1020
|
+
if (!shared) {
|
|
1021
|
+
shared = this.createDtlsTransport({ inheritCredentials: false });
|
|
1022
|
+
}
|
|
1023
|
+
groupTransports.set(group, shared);
|
|
1024
|
+
claimed.add(shared);
|
|
1025
|
+
for (const entry of members) {
|
|
1026
|
+
const owner = ownerOf(entry);
|
|
1027
|
+
if (owner.dtlsTransport !== shared) {
|
|
1028
|
+
owner.setDtlsTransport(shared);
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
if (isRemoteOffer) {
|
|
1033
|
+
// group 外 (group のない offer を含む) で受け入れた m-line は独立した transport / ICE credentials を持つ
|
|
1034
|
+
for (const entry of entries) {
|
|
1035
|
+
const owner = ownerOf(entry);
|
|
1036
|
+
if (!owner ||
|
|
1037
|
+
entry.remoteMedia.port === 0 ||
|
|
1038
|
+
groupOfMid(entry.remoteMedia.rtp.muxId)) {
|
|
1039
|
+
continue;
|
|
1040
|
+
}
|
|
1041
|
+
if (!liveTransport(owner.dtlsTransport) ||
|
|
1042
|
+
claimed.has(owner.dtlsTransport)) {
|
|
1043
|
+
owner.setDtlsTransport(this.createDtlsTransport({ inheritCredentials: false }));
|
|
1044
|
+
}
|
|
1045
|
+
claimed.add(owner.dtlsTransport);
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
// ## apply RTP / SCTP (受け入れ判定)
|
|
1049
|
+
const acceptedEntries = new Set();
|
|
1050
|
+
for (const entry of entries) {
|
|
1051
|
+
const { remoteMedia, index } = entry;
|
|
1052
|
+
if (entry.transceiver) {
|
|
1053
|
+
if (this.transceiverManager.setRemoteRTP(entry.transceiver, remoteMedia, remoteSdp.type, index, codecPlan.get(index) ?? [])) {
|
|
1054
|
+
acceptedEntries.add(entry);
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
else if (entry.sctpTransport) {
|
|
1058
|
+
this.sctpManager.setRemoteSCTP(remoteMedia, index);
|
|
1059
|
+
acceptedEntries.add(entry);
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
// ICE / DTLS パラメータは group で最初に受け入れた member (tag) から適用する
|
|
1063
|
+
// (codec 不一致で拒否した member のパラメータは使わない)
|
|
1064
|
+
const groupParamSources = new Map();
|
|
1065
|
+
for (const group of bundleGroups) {
|
|
1066
|
+
for (const mid of group.items) {
|
|
1067
|
+
const entry = entries.find((e) => e.remoteMedia.rtp.muxId === mid &&
|
|
1068
|
+
e.remoteMedia.port !== 0 &&
|
|
1069
|
+
acceptedEntries.has(e));
|
|
1070
|
+
if (entry) {
|
|
1071
|
+
groupParamSources.set(group, entry);
|
|
1072
|
+
break;
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
// ## apply transport parameters
|
|
1077
|
+
for (const entry of entries) {
|
|
1078
|
+
const { remoteMedia } = entry;
|
|
1079
|
+
const owner = ownerOf(entry);
|
|
1080
|
+
if (!owner) {
|
|
1081
|
+
continue;
|
|
1082
|
+
}
|
|
1083
|
+
const accepted = acceptedEntries.has(entry);
|
|
1084
|
+
const dtlsTransport = owner.dtlsTransport;
|
|
1085
|
+
const group = groupOfMid(remoteMedia.rtp.muxId);
|
|
1086
|
+
if (remoteMedia.port === 0 ||
|
|
1087
|
+
!dtlsTransport ||
|
|
1088
|
+
dtlsTransport.state === 'closed' ||
|
|
1089
|
+
// group 外の拒否 section の transport は使わない
|
|
1090
|
+
(!accepted && !group)) {
|
|
1091
|
+
continue;
|
|
1092
|
+
}
|
|
1093
|
+
const iceTransport = dtlsTransport.iceTransport;
|
|
1094
|
+
const ownsTransportParams = !group || groupParamSources.get(group) === entry;
|
|
1095
|
+
if (ownsTransportParams) {
|
|
1096
|
+
if (remoteMedia.iceParams) {
|
|
1097
|
+
const renomination = !!this.sdpManager.inactiveRemoteMedia;
|
|
1098
|
+
iceTransport.setRemoteParams(remoteMedia.iceParams, renomination);
|
|
1099
|
+
// One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role
|
|
1100
|
+
// RFC 8445 S6.1.1
|
|
1101
|
+
if (remoteMedia.iceParams.iceLite &&
|
|
1102
|
+
!iceTransport.connection.iceLite) {
|
|
1103
|
+
iceTransport.connection.iceControlling = true;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
if (remoteMedia.dtlsParams) {
|
|
1107
|
+
dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
// # add ICE candidates
|
|
1111
|
+
for (const candidate of remoteMedia.iceCandidates) {
|
|
1112
|
+
iceTransport.addRemoteCandidate(candidate).catch((error) => log('add candidate failed', error));
|
|
1113
|
+
}
|
|
1114
|
+
if (remoteMedia.iceCandidatesComplete) {
|
|
1115
|
+
iceTransport.addRemoteCandidate(undefined).catch((error) => log('end of candidates failed', error));
|
|
1116
|
+
}
|
|
1117
|
+
// # set DTLS role
|
|
1118
|
+
if (remoteSdp.type === 'answer' && remoteMedia.dtlsParams?.role) {
|
|
1119
|
+
dtlsTransport.role =
|
|
1120
|
+
remoteMedia.dtlsParams.role === 'client' ? 'server' : 'client';
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
if (remoteSdp.type === 'answer') {
|
|
1124
|
+
// answer に含まれない既存 m-line は remote 起因の停止として確定する
|
|
1125
|
+
for (const transceiver of this.transceiverManager.getTransceivers()) {
|
|
1126
|
+
if (!associated.has(transceiver) &&
|
|
1127
|
+
transceiver.mid != undefined &&
|
|
1128
|
+
!transceiver.stopped) {
|
|
1129
|
+
transceiver.commitStopped({ rejected: true });
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
this.closeIdleTransports();
|
|
1133
|
+
}
|
|
1134
|
+
if (remoteSdp.type === 'offer') {
|
|
1135
|
+
this.setSignalingState('have-remote-offer');
|
|
1136
|
+
}
|
|
1137
|
+
else if (remoteSdp.type === 'answer') {
|
|
1138
|
+
this.setSignalingState('stable');
|
|
1139
|
+
}
|
|
1140
|
+
else if (remoteSdp.type === 'pranswer') {
|
|
1141
|
+
this.setSignalingState('have-remote-pranswer');
|
|
1142
|
+
}
|
|
1143
|
+
await this.flushPendingRemoteCandidates();
|
|
1144
|
+
// connect transports
|
|
1145
|
+
if (remoteSdp.type === 'answer') {
|
|
1146
|
+
log('caller start connect');
|
|
1147
|
+
this.connect().catch((err) => {
|
|
1148
|
+
log('connect failed', err);
|
|
1149
|
+
this.secureManager.setConnectionState('failed');
|
|
1150
|
+
});
|
|
1151
|
+
}
|
|
1152
|
+
this.negotiationneeded = false;
|
|
1153
|
+
if (remoteSdp.type === 'answer' &&
|
|
1154
|
+
this.pendingOfferChangeSeq != undefined) {
|
|
1155
|
+
this.negotiatedChangeSeq = Math.max(this.negotiatedChangeSeq, this.pendingOfferChangeSeq);
|
|
1156
|
+
this.pendingOfferChangeSeq = undefined;
|
|
1157
|
+
}
|
|
1158
|
+
const hasUnnegotiatedStop = remoteSdp.type === 'answer' && this.settleStoppingTransceivers();
|
|
1159
|
+
if (this.shouldNegotiationneeded || hasUnnegotiatedStop) {
|
|
1160
|
+
this.scheduleNegotiationneeded();
|
|
1161
|
+
}
|
|
1162
|
+
this.invalidateLastCreatedDescriptions();
|
|
1163
|
+
}
|
|
1164
|
+
/**
|
|
1165
|
+
* remote answer / pranswer の検証 (offerer 側、状態を変更する前に実行する)。
|
|
1166
|
+
* local offer で 1 つの transport を共有した m-line を、answer が同じ BUNDLE group に置かずに
|
|
1167
|
+
* 異なる ICE credentials で受け入れることはできない (RFC 8843 7.3.2)。共有 transport は分割できず、
|
|
1168
|
+
* 新しい transport を作ると offer で渡した ICE credentials とも一致しなくなる。
|
|
1169
|
+
* group の記述が MID と一致しなくても remote の ICE credentials が同じなら、同じ transport のまま扱う。
|
|
1170
|
+
*/
|
|
1171
|
+
assertAnswerKeepsSharedTransports(sessionDescription) {
|
|
1172
|
+
if (!['answer', 'pranswer'].includes(sessionDescription.type ?? '') ||
|
|
1173
|
+
!['have-local-offer', 'have-local-pranswer'].includes(this.signalingState) ||
|
|
1174
|
+
!sessionDescription.sdp ||
|
|
1175
|
+
this.config.bundlePolicy === 'disable') {
|
|
1176
|
+
return;
|
|
1177
|
+
}
|
|
1178
|
+
const answer = SessionDescription.parse(sessionDescription.sdp);
|
|
1179
|
+
const answerGroups = answer.group.filter((g) => g.semantic === 'BUNDLE');
|
|
1180
|
+
const byTransport = new Map();
|
|
1181
|
+
for (const media of answer.media) {
|
|
1182
|
+
const mid = media.rtp.muxId;
|
|
1183
|
+
if (media.port === 0 || mid == undefined) {
|
|
1184
|
+
continue;
|
|
1185
|
+
}
|
|
1186
|
+
const owner = media.kind === 'application'
|
|
1187
|
+
? this.sctpTransport?.mid === mid
|
|
1188
|
+
? this.sctpTransport
|
|
1189
|
+
: undefined
|
|
1190
|
+
: this.transceiverManager
|
|
1191
|
+
.getTransceivers()
|
|
1192
|
+
.find((t) => t.mid === mid && !t.stopped);
|
|
1193
|
+
const transport = owner?.dtlsTransport;
|
|
1194
|
+
if (!transport) {
|
|
1195
|
+
continue;
|
|
1196
|
+
}
|
|
1197
|
+
const current = {
|
|
1198
|
+
group: answerGroups.find((g) => g.items.includes(mid)),
|
|
1199
|
+
credentials: `${media.iceParams?.usernameFragment}:${media.iceParams?.password}`
|
|
1200
|
+
};
|
|
1201
|
+
const first = byTransport.get(transport);
|
|
1202
|
+
if (!first) {
|
|
1203
|
+
byTransport.set(transport, current);
|
|
1204
|
+
continue;
|
|
1205
|
+
}
|
|
1206
|
+
const sameGroup = !!current.group && current.group === first.group;
|
|
1207
|
+
if (!sameGroup && current.credentials !== first.credentials) {
|
|
1208
|
+
throw createWebRtcDomException('InvalidAccessError', `mid=${mid} shares a transport in the local offer but the remote ${sessionDescription.type} moves it out of that BUNDLE group`);
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
/**
|
|
1213
|
+
* remote m-line に対応する transceiver を探す。MID の一致を優先し、
|
|
1214
|
+
* 未関連付け transceiver は同じ offer 内で異なる m-line に割り当てる。
|
|
1215
|
+
*/
|
|
1216
|
+
findTransceiverForRemoteMedia(remoteMedia, index, associated, offer) {
|
|
1217
|
+
const candidates = this.transceiverManager
|
|
1218
|
+
.getTransceivers()
|
|
1219
|
+
.filter((t) => !associated.has(t) && t.kind === remoteMedia.kind);
|
|
1220
|
+
const mid = remoteMedia.rtp.muxId;
|
|
1221
|
+
const byMid = mid != undefined ? candidates.find((t) => t.mid === mid) : undefined;
|
|
1222
|
+
if (byMid) {
|
|
1223
|
+
return byMid;
|
|
1224
|
+
}
|
|
1225
|
+
if (remoteMedia.port === 0) {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
//A media of an offer asking to receive takes a transceiver of addTrack, never one of addTransceiver (it sends
|
|
1229
|
+
//something else: RFC 8829 5.10)
|
|
1230
|
+
const unassociated = candidates.filter((t) => t.mid == null &&
|
|
1231
|
+
!t.stopping &&
|
|
1232
|
+
!t.stopped &&
|
|
1233
|
+
(!offer ||
|
|
1234
|
+
(t.addedByAddTrack &&
|
|
1235
|
+
['sendrecv', 'recvonly'].includes(remoteMedia.direction ?? 'sendrecv'))));
|
|
1236
|
+
return unassociated.find((t) => t.mLineIndex === index) ?? unassociated[0];
|
|
1237
|
+
}
|
|
1238
|
+
/**
|
|
1239
|
+
* remote offer / answer の m-line 用に transceiver を作る。
|
|
1240
|
+
* 同じ位置に停止済みの旧 transceiver があれば、それを復活させず新しい receiver/router で置き換える。
|
|
1241
|
+
*/
|
|
1242
|
+
addRemoteTransceiver(remoteMedia, index) {
|
|
1243
|
+
const dtlsTransport = this.findOrCreateTransport();
|
|
1244
|
+
const transceiver = this.transceiverManager.addTransceiver(remoteMedia.kind, dtlsTransport, { direction: 'recvonly' }, { remoteMLineIndex: index });
|
|
1245
|
+
transceiver.mid = remoteMedia.rtp.muxId ?? null;
|
|
1246
|
+
this.secureManager.updateIceConnectionState();
|
|
1247
|
+
this.onRemoteTransceiverAdded.execute(transceiver);
|
|
1248
|
+
return transceiver;
|
|
1249
|
+
}
|
|
1250
|
+
addTransceiver(trackOrKind, options = {}) {
|
|
1251
|
+
const dtlsTransport = this.findOrCreateTransport();
|
|
1252
|
+
const transceiver = this.transceiverManager.addTransceiver(trackOrKind, dtlsTransport, options);
|
|
1253
|
+
this.secureManager.updateIceConnectionState();
|
|
1254
|
+
this.needNegotiation();
|
|
1255
|
+
return transceiver;
|
|
1256
|
+
}
|
|
1257
|
+
// todo fix
|
|
1258
|
+
addTrack(track, ...streams) {
|
|
1259
|
+
return this.addTrackOn(undefined, track, ...streams);
|
|
1260
|
+
}
|
|
1261
|
+
/**
|
|
1262
|
+
* Whether addTrack may give a track of its kind to a transceiver, rather than adding one
|
|
1263
|
+
* @param transceiver
|
|
1264
|
+
*/
|
|
1265
|
+
reusableForTrack(transceiver) {
|
|
1266
|
+
return this.transceiverManager.reusableForTrack(transceiver, transceiver.kind);
|
|
1267
|
+
}
|
|
1268
|
+
/**
|
|
1269
|
+
* addTrack, on the transceiver chosen already (by the main thread, for a connection served in a worker thread) if
|
|
1270
|
+
* it may still take the track, else on a new one, as for null
|
|
1271
|
+
* @param chosen
|
|
1272
|
+
* @param track
|
|
1273
|
+
* @param streams
|
|
1274
|
+
*/
|
|
1275
|
+
addTrackOn(chosen, track, ...streams) {
|
|
1276
|
+
if (this.isClosed) {
|
|
1277
|
+
throw createWebRtcDomException('InvalidStateError', 'is closed');
|
|
1278
|
+
}
|
|
1279
|
+
const transceiver = this.transceiverManager.addTrack(track, streams, chosen);
|
|
1280
|
+
if (!transceiver.dtlsTransport) {
|
|
1281
|
+
const dtlsTransport = this.findOrCreateTransport();
|
|
1282
|
+
transceiver.setDtlsTransport(dtlsTransport);
|
|
1283
|
+
}
|
|
1284
|
+
this.needNegotiation();
|
|
1285
|
+
return transceiver.sender;
|
|
1286
|
+
}
|
|
1287
|
+
async createAnswer() {
|
|
1288
|
+
this.assertNotClosed();
|
|
1289
|
+
await this.secureManager.ensureCerts();
|
|
1290
|
+
// setCodecPreferences() で無効化された transceiver を再解決する。
|
|
1291
|
+
// offer 側と異なり answer は remote offer との交渉結果を使い、
|
|
1292
|
+
// sender/receiver の codec 状態も新しい negotiated codec に同期する。
|
|
1293
|
+
for (const transceiver of this.transceiverManager.getTransceivers()) {
|
|
1294
|
+
if (transceiver.codecs.length !== 0 &&
|
|
1295
|
+
!transceiver.codecPreferencesNeedResolution) {
|
|
1296
|
+
continue;
|
|
1297
|
+
}
|
|
1298
|
+
// 拒否予定 / 停止済みの m-line は port 0 で answer するため codec を解決しない
|
|
1299
|
+
if (transceiver.pendingRejection ||
|
|
1300
|
+
transceiver.stopping ||
|
|
1301
|
+
transceiver.stopped) {
|
|
1302
|
+
continue;
|
|
1303
|
+
}
|
|
1304
|
+
const remoteDescription = this.sdpManager._remoteDescription;
|
|
1305
|
+
const remoteMedia = remoteDescription?.media.find((media) => media.rtp.muxId != undefined &&
|
|
1306
|
+
media.rtp.muxId === transceiver.mid &&
|
|
1307
|
+
media.kind === transceiver.kind) ??
|
|
1308
|
+
(transceiver.mLineIndex != undefined
|
|
1309
|
+
? remoteDescription?.media[transceiver.mLineIndex]
|
|
1310
|
+
: undefined);
|
|
1311
|
+
if (remoteMedia && ['audio', 'video'].includes(remoteMedia.kind)) {
|
|
1312
|
+
this.transceiverManager.resyncAnswerCodecs(transceiver, remoteMedia);
|
|
1313
|
+
}
|
|
1314
|
+
else {
|
|
1315
|
+
this.transceiverManager.assignTransceiverCodecs(transceiver);
|
|
1316
|
+
}
|
|
1317
|
+
if (transceiver.headerExtensions.length === 0) {
|
|
1318
|
+
transceiver.headerExtensions = this.headerExtensionsFor(transceiver.kind);
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
const description = this.sdpManager.buildAnswerSdp({
|
|
1322
|
+
transceivers: this.transceiverManager.getTransceivers(),
|
|
1323
|
+
sctpTransport: this.sctpTransport,
|
|
1324
|
+
signalingState: this.signalingState
|
|
1325
|
+
});
|
|
1326
|
+
const createdAnswer = description.toJSON();
|
|
1327
|
+
this.lastCreatedAnswer = createdAnswer;
|
|
1328
|
+
return createdAnswer;
|
|
1329
|
+
}
|
|
1330
|
+
assertNotClosed() {
|
|
1331
|
+
if (this.isClosed) {
|
|
1332
|
+
throw createWebRtcDomException('InvalidStateError', 'RTCPeerConnection is closed');
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
/**
|
|
1336
|
+
* The signaling state is stable: the associations of the transceivers and of the data channels are kept, for a
|
|
1337
|
+
* rollback of the next local offer
|
|
1338
|
+
*/
|
|
1339
|
+
markStable() {
|
|
1340
|
+
this.transceiverManager.markStable();
|
|
1341
|
+
const sctp = this.sctpTransport;
|
|
1342
|
+
this.stableSctp = sctp ? { mid: sctp.mid, mLineIndex: sctp.mLineIndex } : undefined;
|
|
1343
|
+
}
|
|
1344
|
+
/**
|
|
1345
|
+
* A local offer is rolled back: the transceivers and the data channels are associated as before it
|
|
1346
|
+
*/
|
|
1347
|
+
rollbackLocalOffer() {
|
|
1348
|
+
this.transceiverManager.rollbackLocalOffer();
|
|
1349
|
+
const sctp = this.sctpTransport;
|
|
1350
|
+
if (sctp) {
|
|
1351
|
+
sctp.mid = this.stableSctp?.mid;
|
|
1352
|
+
sctp.mLineIndex = this.stableSctp?.mLineIndex;
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
setSignalingState(state) {
|
|
1356
|
+
if (this.signalingState === state) {
|
|
1357
|
+
return;
|
|
1358
|
+
}
|
|
1359
|
+
log('signalingStateChange', state);
|
|
1360
|
+
this.signalingState = state;
|
|
1361
|
+
if (state === 'stable')
|
|
1362
|
+
this.markStable();
|
|
1363
|
+
this.signalingStateChange.execute(state);
|
|
1364
|
+
if (this.onsignalingstatechange) {
|
|
1365
|
+
runDetached(() => this.onsignalingstatechange(new globalThis.Event('signalingstatechange')), (error) => log('event handler failed', error));
|
|
1366
|
+
}
|
|
1367
|
+
this.emit('signalingstatechange');
|
|
1368
|
+
}
|
|
1369
|
+
createPeerConnectionStats(timestamp) {
|
|
1370
|
+
return {
|
|
1371
|
+
type: 'peer-connection',
|
|
1372
|
+
id: generateStatsId('peer-connection', this.id),
|
|
1373
|
+
timestamp,
|
|
1374
|
+
dataChannelsOpened: this.sctpManager.dataChannelsOpened,
|
|
1375
|
+
dataChannelsClosed: this.sctpManager.dataChannelsClosed
|
|
1376
|
+
};
|
|
1377
|
+
}
|
|
1378
|
+
async getStats(selector) {
|
|
1379
|
+
const timestamp = getStatsTimestamp();
|
|
1380
|
+
const stats = [];
|
|
1381
|
+
if (!selector) {
|
|
1382
|
+
stats.push(this.createPeerConnectionStats(timestamp));
|
|
1383
|
+
}
|
|
1384
|
+
stats.push(...this.transceiverManager.collectStats(timestamp));
|
|
1385
|
+
const transportStats = await this.secureManager.getStats(timestamp);
|
|
1386
|
+
stats.push(...transportStats);
|
|
1387
|
+
if (!selector && this.sctpTransport) {
|
|
1388
|
+
const dataChannelStats = await this.sctpManager.getStats(timestamp);
|
|
1389
|
+
if (dataChannelStats) {
|
|
1390
|
+
stats.push(...dataChannelStats);
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
if (!selector) {
|
|
1394
|
+
return buildStatsReport(stats);
|
|
1395
|
+
}
|
|
1396
|
+
return buildStatsReport(stats, this.transceiverManager.getStatsRootIds(selector));
|
|
1397
|
+
}
|
|
1398
|
+
async close() {
|
|
1399
|
+
if (this.isClosed)
|
|
1400
|
+
return;
|
|
1401
|
+
this.isClosed = true;
|
|
1402
|
+
this.pendingRemoteCandidates.length = 0;
|
|
1403
|
+
this.setSignalingState('closed');
|
|
1404
|
+
this.transceiverManager.close();
|
|
1405
|
+
// SCTP ABORT は DTLS/ICE が生きている間に送る(close は abrupt であり SHUTDOWN ではない)
|
|
1406
|
+
await this.sctpManager.close();
|
|
1407
|
+
await this.secureManager.close();
|
|
1408
|
+
// 公開 Event を完了させ、購読者・クロージャが PeerConnection を保持し続けないようにする
|
|
1409
|
+
this.completePeerEvents();
|
|
1410
|
+
log('peerConnection closed');
|
|
1411
|
+
}
|
|
1412
|
+
completePeerEvents() {
|
|
1413
|
+
const events = [
|
|
1414
|
+
this.onDataChannel,
|
|
1415
|
+
this.iceGatheringStateChange,
|
|
1416
|
+
this.iceConnectionStateChange,
|
|
1417
|
+
this.signalingStateChange,
|
|
1418
|
+
this.connectionStateChange,
|
|
1419
|
+
this.onTransceiverAdded,
|
|
1420
|
+
this.onRemoteTransceiverAdded,
|
|
1421
|
+
this.onIceCandidate,
|
|
1422
|
+
this.onNegotiationneeded
|
|
1423
|
+
];
|
|
1424
|
+
for (const event of events) {
|
|
1425
|
+
if (!event.ended) {
|
|
1426
|
+
event.complete();
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
const MLineReuseModes = ['compatible', 'aggressive'];
|
|
1432
|
+
export const findCodecByMimeType = (codecs, target) => codecs.find((localCodec) => localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase())
|
|
1433
|
+
? target
|
|
1434
|
+
: undefined;
|
|
1435
|
+
function assignDynamicPayloadTypes(config) {
|
|
1436
|
+
for (const [i, codecParams] of enumerate([
|
|
1437
|
+
...(config.codecs.audio || []),
|
|
1438
|
+
...(config.codecs.video || [])
|
|
1439
|
+
])) {
|
|
1440
|
+
if (codecParams.payloadType != undefined) {
|
|
1441
|
+
continue;
|
|
1442
|
+
}
|
|
1443
|
+
codecParams.payloadType = 96 + i;
|
|
1444
|
+
switch (codecParams.name.toLowerCase()) {
|
|
1445
|
+
case 'rtx':
|
|
1446
|
+
{
|
|
1447
|
+
codecParams.parameters = `apt=${codecParams.payloadType - 1}`;
|
|
1448
|
+
}
|
|
1449
|
+
break;
|
|
1450
|
+
case 'red':
|
|
1451
|
+
{
|
|
1452
|
+
if (codecParams.contentType === 'audio') {
|
|
1453
|
+
const redundant = codecParams.payloadType + 1;
|
|
1454
|
+
codecParams.parameters = `${redundant}/${redundant}`;
|
|
1455
|
+
codecParams.payloadType = 63;
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
break;
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
function generateDefaultPeerConfig() {
|
|
1463
|
+
return {
|
|
1464
|
+
codecs: defaultCodecs(),
|
|
1465
|
+
headerExtensions: {
|
|
1466
|
+
audio: [],
|
|
1467
|
+
video: []
|
|
1468
|
+
},
|
|
1469
|
+
iceTransportPolicy: 'all',
|
|
1470
|
+
iceLite: false,
|
|
1471
|
+
iceServers: [],
|
|
1472
|
+
icePortRange: undefined,
|
|
1473
|
+
iceInterfaceAddresses: undefined,
|
|
1474
|
+
iceAdditionalHostAddresses: undefined,
|
|
1475
|
+
iceUseIpv4: true,
|
|
1476
|
+
iceUseIpv6: true,
|
|
1477
|
+
iceUseTcp: false,
|
|
1478
|
+
iceTcpPassive: true,
|
|
1479
|
+
iceStunGatherTimeout: undefined,
|
|
1480
|
+
iceTurnConnectTimeout: undefined,
|
|
1481
|
+
turnTransport: undefined,
|
|
1482
|
+
turnTlsOptions: undefined,
|
|
1483
|
+
turnUdpFamily: undefined,
|
|
1484
|
+
iceFilterStunResponse: undefined,
|
|
1485
|
+
iceFilterCandidatePair: undefined,
|
|
1486
|
+
icePasswordPrefix: undefined,
|
|
1487
|
+
iceUseLinkLocalAddress: undefined,
|
|
1488
|
+
dtls: {},
|
|
1489
|
+
bundlePolicy: 'max-compat',
|
|
1490
|
+
rtcpMuxPolicy: 'require',
|
|
1491
|
+
iceCandidatePoolSize: 0,
|
|
1492
|
+
certificates: [],
|
|
1493
|
+
debug: {},
|
|
1494
|
+
midSuffix: false,
|
|
1495
|
+
forceTurnTCP: false,
|
|
1496
|
+
maxMessageSize: DEFAULT_MAX_MESSAGE_SIZE,
|
|
1497
|
+
sctp: { mtu: DEFAULT_SCTP_MTU },
|
|
1498
|
+
pendingRtp: false,
|
|
1499
|
+
mLineReuse: 'compatible'
|
|
1500
|
+
};
|
|
1501
|
+
}
|
|
1502
|
+
export const defaultPeerConfig = generateDefaultPeerConfig();
|
|
1503
|
+
function normalizePeerConfiguration(config) {
|
|
1504
|
+
const input = Object(config ?? {});
|
|
1505
|
+
const normalizedConfig = { ...input };
|
|
1506
|
+
if (input.sctp !== undefined) {
|
|
1507
|
+
normalizedConfig.sctp = { ...input.sctp };
|
|
1508
|
+
}
|
|
1509
|
+
if (input.bundlePolicy === 'balanced') {
|
|
1510
|
+
normalizedConfig.bundlePolicy = 'max-compat';
|
|
1511
|
+
}
|
|
1512
|
+
if ('certificates' in input) {
|
|
1513
|
+
if (input.certificates === undefined) {
|
|
1514
|
+
normalizedConfig.certificates = undefined;
|
|
1515
|
+
}
|
|
1516
|
+
else if (!Array.isArray(input.certificates) ||
|
|
1517
|
+
input.certificates.some((certificate) => certificate == null)) {
|
|
1518
|
+
throw createWebRtcTypeError('certificates must be an array of RTCCertificate');
|
|
1519
|
+
}
|
|
1520
|
+
else {
|
|
1521
|
+
normalizedConfig.certificates = [...input.certificates];
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
if ('iceCandidatePoolSize' in input) {
|
|
1525
|
+
normalizedConfig.iceCandidatePoolSize = coerceUnsignedShort(input.iceCandidatePoolSize, 'iceCandidatePoolSize');
|
|
1526
|
+
}
|
|
1527
|
+
return normalizedConfig;
|
|
1528
|
+
}
|
|
1529
|
+
function coerceUnsignedShort(value, name) {
|
|
1530
|
+
const coerced = Number(value);
|
|
1531
|
+
if (!Number.isFinite(coerced) ||
|
|
1532
|
+
!Number.isInteger(coerced) ||
|
|
1533
|
+
coerced < 0 ||
|
|
1534
|
+
coerced > 65535) {
|
|
1535
|
+
throw createWebRtcTypeError(`${name} must be an unsigned short`);
|
|
1536
|
+
}
|
|
1537
|
+
return coerced;
|
|
1538
|
+
}
|
|
1539
|
+
function hasSameCertificates(left, right) {
|
|
1540
|
+
return (left.length === right.length &&
|
|
1541
|
+
left.every((certificate, index) => certificate === right[index]));
|
|
1542
|
+
}
|
|
1543
|
+
function clonePeerConfiguration(config) {
|
|
1544
|
+
return {
|
|
1545
|
+
...config,
|
|
1546
|
+
codecs: {
|
|
1547
|
+
audio: config.codecs.audio ? [...config.codecs.audio] : undefined,
|
|
1548
|
+
video: config.codecs.video ? [...config.codecs.video] : undefined
|
|
1549
|
+
},
|
|
1550
|
+
headerExtensions: {
|
|
1551
|
+
audio: config.headerExtensions.audio
|
|
1552
|
+
? [...config.headerExtensions.audio]
|
|
1553
|
+
: undefined,
|
|
1554
|
+
video: config.headerExtensions.video
|
|
1555
|
+
? [...config.headerExtensions.video]
|
|
1556
|
+
: undefined
|
|
1557
|
+
},
|
|
1558
|
+
iceServers: config.iceServers.map((server) => ({
|
|
1559
|
+
...server,
|
|
1560
|
+
urls: Array.isArray(server.urls) ? [...server.urls] : server.urls
|
|
1561
|
+
})),
|
|
1562
|
+
icePortRange: config.icePortRange
|
|
1563
|
+
? [...config.icePortRange]
|
|
1564
|
+
: undefined,
|
|
1565
|
+
iceAdditionalHostAddresses: config.iceAdditionalHostAddresses
|
|
1566
|
+
? [...config.iceAdditionalHostAddresses]
|
|
1567
|
+
: undefined,
|
|
1568
|
+
dtls: { ...config.dtls },
|
|
1569
|
+
certificates: [...config.certificates],
|
|
1570
|
+
debug: { ...config.debug },
|
|
1571
|
+
sctp: { ...config.sctp },
|
|
1572
|
+
pendingRtp: typeof config.pendingRtp === 'object' && config.pendingRtp != undefined
|
|
1573
|
+
? { ...config.pendingRtp }
|
|
1574
|
+
: config.pendingRtp
|
|
1575
|
+
};
|
|
1576
|
+
}
|
|
1577
|
+
export class RTCTrackEvent {
|
|
1578
|
+
constructor(init) {
|
|
1579
|
+
this.type = 'track';
|
|
1580
|
+
this.track = init.track;
|
|
1581
|
+
this.streams = [...init.streams];
|
|
1582
|
+
this.transceiver = init.transceiver;
|
|
1583
|
+
this.receiver = init.receiver;
|
|
1584
|
+
}
|
|
1585
|
+
}
|