/// <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(); }
/// <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; }