6.1 RTCPeerConnection 接口扩展
对等数据API对RTCPeerConnection接口的扩展如下。
partial interface RTCPeerConnection {readonly attribute RTCSctpTransport? sctp;RTCDataChannel createDataChannel (USVString label, optional RTCDataChannelInit dataChannelDict);attribute EventHandler ondatachannel;};
属性
RTCSctpTransport类型的sctp,只读,可以为null,测试:SCTP数据通过SCTP传输发送和接收。如果SCTP还未经过协商,值为null。此属性必须返回存储在[SctpTransport]内部插槽的RTCSctpTransport对象。
EventHandler类型的ondatachannel,测试:此event handler的事件类型是datachannel。
方法
createDataChannel
以给定标签创建一个新的RTCDataChannel对象。RTCDataChannelInit字典可以被用来配置底层通道属性,例如数据可靠性。
当createDataChannel方法被调用时,用户代理必须运行下列步骤。
1.让connection成为用来调用方法的RTCPeerConnection对象。
2.如果connection的[IsClosed]插槽为true,抛出一个InvalidStateError。测试
3.创建一个RTCDataChannel,channel。
4.初始化channel的[DataChannelLable]插槽为第一个参数的值。
5.如果[DataChannelLabel]长度大于65535bytes,抛出TypeError。
6.让options成为第二个参数。
7.初始化channels的[MaxPacketLifeTime]插槽为option的maxPacketLifeTime成员,如果存在,否则为null。
8.初始化channel的[MaxRetransmits]插槽为option的maxRetransmits成员,如果存在,否则为null。
9.初始化channel的[Ordered]插槽为option的ordered成员。
10.初始化channel的[DataChannelProtocol]插槽为option的protocol成员。
11.如果[DataChannelProtocol]长度大于65535bytes,抛出TypeError。
12.初始化channel的[Negotiated]插槽为option的negotiated成员。
13.初始化channel的[DataChannelId]插槽为option的id成员的值,如果存在并且[Negotiated]为true,否则为null。
NOTE:这意味着如果数据通道在带内协商,id成员将会被忽略。这是有意的。数据通道带内协商应该基于DTLS角色选择ID,如[RTCWEB-DATA-PROTOCOL]中所述。
14.如果[Negotiated]为true,并且[DataChannelId]为null,抛出TypeError。
15.初始化channel的[DATAChannelPriority]插槽为option的priority成员。
16.如果[MaxPacketLifeTime]和[MaxRetransmits]属性都被设置(不为null),抛出TypeError。
17.如果一个设置,或是[MaxPacketLifeTime],或是[MaxRetransmits]已经被设置用来表示不可靠模式,并且它的值超过了用户代理支持的最大值,此数值必须被设置为用户代理最大值。
18.如果[DataChannelId]等于65535,比最大允许ID65534长,但是仍然是无符号short值,抛出TypeError。
19.如果[DataChannelId]插槽为null(由于没有ID被传入createDataChannel,或者[Negotiated]为false),并且SCTP传输DTLS角色已经协商,则初始化[DataChannelId]为用户代理生成的值,根据[RTCWEB-DATA-PROTOCOL],并且跳过下列步骤。如果不能生成可用ID,或者[DataChannelId]插槽的值被现存RTCDataChannel使用,抛出OperationError异常。
NOTE:如果在此步骤之后[DataChannelId]插槽为
null,则在设置RTCSessionDescription的过程中确定DTLS角色后,将填充该插槽。
20.让transport成为connection的[SctpTransport]插槽。如果[DataChannelId]插槽为null,transport处于connected状态,并且[DataChannelId]大于等于transport的[MaxChannels]插槽,抛出OperationError。
21.如果channel是在connection上创建的第一个RTCDataChannel,更新negotiation-needed标记。
22.返回channel并且继续并行执行下列步骤。
23.创建channel的关联底层数据传输,并且根据相关channel属性配置。
