Пример #1
0
        /// <summary>
        /// <para>Events:</para>
        /// <para>@emits icestatechange - (iceState: IceState)</para>
        /// <para>@emits iceselectedtuplechange - (iceSelectedTuple: TransportTuple)</para>
        /// <para>@emits dtlsstatechange - (dtlsState: DtlsState)</para>
        /// <para>@emits sctpstatechange - (sctpState: SctpState)</para>
        /// <para>@emits trace - (trace: TransportTraceEventData)</para>
        /// <para>Observer events:</para>
        /// <para>@emits close</para>
        /// <para>@emits newproducer - (producer: Producer)</para>
        /// <para>@emits newconsumer - (producer: Producer)</para>
        /// <para>@emits newdataproducer - (dataProducer: DataProducer)</para>
        /// <para>@emits newdataconsumer - (dataProducer: DataProducer)</para>
        /// <para>@emits icestatechange - (iceState: IceState)</para>
        /// <para>@emits iceselectedtuplechange - (iceSelectedTuple: TransportTuple)</para>
        /// <para>@emits dtlsstatechange - (dtlsState: DtlsState)</para>
        /// <para>@emits sctpstatechange - (sctpState: SctpState)</para>
        /// <para>@emits trace - (trace: TransportTraceEventData)</para>
        /// </summary>
        /// <param name="loggerFactory"></param>
        /// <param name="transportInternalData"></param>
        /// <param name="sctpParameters"></param>
        /// <param name="sctpState"></param>
        /// <param name="channel"></param>
        /// <param name="payloadChannel"></param>
        /// <param name="appData"></param>
        /// <param name="getRouterRtpCapabilities"></param>
        /// <param name="getProducerById"></param>
        /// <param name="getDataProducerById"></param>
        /// <param name="iceRole"></param>
        /// <param name="iceParameters"></param>
        /// <param name="iceCandidates"></param>
        /// <param name="iceState"></param>
        /// <param name="iceSelectedTuple"></param>
        /// <param name="dtlsParameters"></param>
        /// <param name="dtlsState"></param>
        /// <param name="dtlsRemoteCert"></param>
        public WebRtcTransport(ILoggerFactory loggerFactory,
                               TransportInternalData transportInternalData,
                               SctpParameters?sctpParameters,
                               SctpState?sctpState,
                               Channel channel,
                               PayloadChannel payloadChannel,
                               Dictionary <string, object>?appData,
                               Func <RtpCapabilities> getRouterRtpCapabilities,
                               Func <string, Producer> getProducerById,
                               Func <string, DataProducer> getDataProducerById,
                               string iceRole,
                               IceParameters iceParameters,
                               IceCandidate[] iceCandidates,
                               IceState iceState,
                               TransportTuple?iceSelectedTuple,
                               DtlsParameters dtlsParameters,
                               DtlsState dtlsState,
                               string?dtlsRemoteCert
                               ) : base(loggerFactory, transportInternalData, sctpParameters, sctpState, channel, payloadChannel, appData, getRouterRtpCapabilities, getProducerById, getDataProducerById)
        {
            _logger = loggerFactory.CreateLogger <WebRtcTransport>();

            // Data
            IceRole          = iceRole;
            IceParameters    = iceParameters;
            IceCandidates    = iceCandidates;
            IceState         = iceState;
            IceSelectedTuple = iceSelectedTuple;
            DtlsParameters   = dtlsParameters;
            DtlsState        = dtlsState;
            DtlsRemoteCert   = dtlsRemoteCert;

            HandleWorkerNotifications();
        }
Пример #2
0
        /// <summary>
        /// Sends a packet to a remote endpoint.
        /// </summary>
        /// <param name="Packet">Packet to send.</param>
        /// <param name="RemoteEndpoint">Remote endpoint.</param>
        /// <param name="Credentials">Optional credentials.</param>
        /// <param name="Callback">Method to call when operation concludes.</param>
        /// <param name="State">State object to pass on to callback method.</param>
        public void Send(byte[] Packet, IPEndPoint RemoteEndpoint, IDtlsCredentials Credentials,
                         UdpTransmissionEventHandler Callback, object State)
        {
            if (this.dtlsStates.TryGetValue(RemoteEndpoint, out DtlsOverUdpState DtlsState))
            {
                switch (DtlsState.CurrentState)
                {
                case Security.DTLS.DtlsState.SessionEstablished:
                    this.dtls.SendApplicationData(Packet, RemoteEndpoint);
                    break;

                case Security.DTLS.DtlsState.Handshake:
                    DtlsState.AddToQueue(Packet, Callback, State);
                    break;

                case Security.DTLS.DtlsState.Closed:
                case Security.DTLS.DtlsState.Failed:
                case Security.DTLS.DtlsState.Created:
                default:
                    DtlsState.AddToQueue(Packet, Callback, State);
                    this.dtls.StartHandshake(RemoteEndpoint, Credentials);
                    break;
                }
            }
            else
            {
                DtlsState = new DtlsOverUdpState()
                {
                    RemoteEndpoint = RemoteEndpoint,
                    Queue          = new LinkedList <Tuple <byte[], UdpTransmissionEventHandler, object> >(),
                    CurrentState   = Security.DTLS.DtlsState.Handshake
                };

                DtlsState.AddToQueue(Packet, Callback, State);
                this.dtlsStates.Add(RemoteEndpoint, DtlsState);

                this.dtls.StartHandshake(RemoteEndpoint, Credentials);
            }
        }
 /// <summary>
 /// Event arguments for state change events.
 /// </summary>
 /// <param name="RemoteEndpoint">Remote endpoint.</param>
 /// <param name="State">Endpoint state.</param>
 public StateChangedEventArgs(object RemoteEndpoint, DtlsState State)
     : base(RemoteEndpoint)
 {
     this.state = State;
 }