werift 0.19.0 → 0.19.1

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.
Files changed (241) hide show
  1. package/lib/common/src/binary.js.map +1 -1
  2. package/lib/common/src/network.js.map +1 -1
  3. package/lib/common/src/promise.js.map +1 -1
  4. package/lib/dtls/src/cipher/const.js +2 -2
  5. package/lib/dtls/src/cipher/const.js.map +1 -1
  6. package/lib/dtls/src/cipher/create.js +10 -10
  7. package/lib/dtls/src/cipher/create.js.map +1 -1
  8. package/lib/dtls/src/cipher/namedCurve.js.map +1 -1
  9. package/lib/dtls/src/cipher/prf.js +1 -1
  10. package/lib/dtls/src/cipher/prf.js.map +1 -1
  11. package/lib/dtls/src/cipher/suites/aead.d.ts +1 -1
  12. package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
  13. package/lib/dtls/src/client.js.map +1 -1
  14. package/lib/dtls/src/context/cipher.js +2 -2
  15. package/lib/dtls/src/context/cipher.js.map +1 -1
  16. package/lib/dtls/src/context/dtls.js.map +1 -1
  17. package/lib/dtls/src/context/srtp.js.map +1 -1
  18. package/lib/dtls/src/flight/client/flight5.js +8 -6
  19. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  20. package/lib/dtls/src/flight/flight.js +1 -1
  21. package/lib/dtls/src/flight/flight.js.map +1 -1
  22. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  23. package/lib/dtls/src/flight/server/flight4.js.map +1 -1
  24. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  25. package/lib/dtls/src/handshake/const.js +1 -1
  26. package/lib/dtls/src/handshake/const.js.map +1 -1
  27. package/lib/dtls/src/handshake/extensions/ellipticCurves.js +1 -1
  28. package/lib/dtls/src/handshake/extensions/ellipticCurves.js.map +1 -1
  29. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js +1 -1
  30. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js.map +1 -1
  31. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js +1 -1
  32. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js.map +1 -1
  33. package/lib/dtls/src/handshake/extensions/signature.js +1 -1
  34. package/lib/dtls/src/handshake/extensions/signature.js.map +1 -1
  35. package/lib/dtls/src/handshake/extensions/useSrtp.js +1 -1
  36. package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
  37. package/lib/dtls/src/handshake/message/alert.js +1 -1
  38. package/lib/dtls/src/handshake/message/alert.js.map +1 -1
  39. package/lib/dtls/src/handshake/message/certificate.js +1 -1
  40. package/lib/dtls/src/handshake/message/certificate.js.map +1 -1
  41. package/lib/dtls/src/handshake/message/changeCipherSpec.js +1 -1
  42. package/lib/dtls/src/handshake/message/changeCipherSpec.js.map +1 -1
  43. package/lib/dtls/src/handshake/message/client/certificateVerify.js +1 -1
  44. package/lib/dtls/src/handshake/message/client/certificateVerify.js.map +1 -1
  45. package/lib/dtls/src/handshake/message/client/hello.js +1 -1
  46. package/lib/dtls/src/handshake/message/client/hello.js.map +1 -1
  47. package/lib/dtls/src/handshake/message/client/keyExchange.js +1 -1
  48. package/lib/dtls/src/handshake/message/client/keyExchange.js.map +1 -1
  49. package/lib/dtls/src/handshake/message/server/certificateRequest.js +1 -1
  50. package/lib/dtls/src/handshake/message/server/certificateRequest.js.map +1 -1
  51. package/lib/dtls/src/handshake/message/server/hello.js +1 -1
  52. package/lib/dtls/src/handshake/message/server/hello.js.map +1 -1
  53. package/lib/dtls/src/handshake/message/server/helloDone.js +1 -1
  54. package/lib/dtls/src/handshake/message/server/helloDone.js.map +1 -1
  55. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js +1 -1
  56. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js.map +1 -1
  57. package/lib/dtls/src/handshake/message/server/keyExchange.js +1 -1
  58. package/lib/dtls/src/handshake/message/server/keyExchange.js.map +1 -1
  59. package/lib/dtls/src/handshake/random.js +2 -2
  60. package/lib/dtls/src/handshake/random.js.map +1 -1
  61. package/lib/dtls/src/helper.d.ts +1 -1
  62. package/lib/dtls/src/helper.js.map +1 -1
  63. package/lib/dtls/src/record/const.js +2 -2
  64. package/lib/dtls/src/record/const.js.map +1 -1
  65. package/lib/dtls/src/record/message/fragment.d.ts +1 -1
  66. package/lib/dtls/src/record/message/fragment.js +3 -3
  67. package/lib/dtls/src/record/message/fragment.js.map +1 -1
  68. package/lib/dtls/src/record/message/header.js +2 -2
  69. package/lib/dtls/src/record/message/header.js.map +1 -1
  70. package/lib/dtls/src/record/message/plaintext.js +1 -1
  71. package/lib/dtls/src/record/message/plaintext.js.map +1 -1
  72. package/lib/dtls/src/record/receive.js.map +1 -1
  73. package/lib/dtls/src/server.js.map +1 -1
  74. package/lib/dtls/src/socket.js.map +1 -1
  75. package/lib/dtls/src/transport.js.map +1 -1
  76. package/lib/ice/src/candidate.js +1 -1
  77. package/lib/ice/src/candidate.js.map +1 -1
  78. package/lib/ice/src/dns/lookup.js.map +1 -1
  79. package/lib/ice/src/exceptions.js.map +1 -1
  80. package/lib/ice/src/helper.js.map +1 -1
  81. package/lib/ice/src/ice.d.ts +5 -13
  82. package/lib/ice/src/ice.js +57 -154
  83. package/lib/ice/src/ice.js.map +1 -1
  84. package/lib/ice/src/stun/attributes.js.map +1 -1
  85. package/lib/ice/src/stun/const.d.ts +1 -1
  86. package/lib/ice/src/stun/const.js +2 -2
  87. package/lib/ice/src/stun/const.js.map +1 -1
  88. package/lib/ice/src/stun/message.js +1 -1
  89. package/lib/ice/src/stun/message.js.map +1 -1
  90. package/lib/ice/src/stun/protocol.js.map +1 -1
  91. package/lib/ice/src/stun/transaction.js.map +1 -1
  92. package/lib/ice/src/transport.js +1 -1
  93. package/lib/ice/src/transport.js.map +1 -1
  94. package/lib/ice/src/turn/protocol.js.map +1 -1
  95. package/lib/ice/src/utils.d.ts +1 -0
  96. package/lib/ice/src/utils.js +72 -1
  97. package/lib/ice/src/utils.js.map +1 -1
  98. package/lib/rtp/src/codec/av1.js +1 -1
  99. package/lib/rtp/src/codec/av1.js.map +1 -1
  100. package/lib/rtp/src/codec/h264.js.map +1 -1
  101. package/lib/rtp/src/codec/index.js.map +1 -1
  102. package/lib/rtp/src/codec/opus.js.map +1 -1
  103. package/lib/rtp/src/codec/vp8.js.map +1 -1
  104. package/lib/rtp/src/codec/vp9.js.map +1 -1
  105. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  106. package/lib/rtp/src/extra/container/mp4/exp-golomb.js.map +1 -1
  107. package/lib/rtp/src/extra/container/mp4/h264.js +1 -1
  108. package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
  109. package/lib/rtp/src/extra/container/mp4/sps-parser.js +4 -4
  110. package/lib/rtp/src/extra/container/mp4/sps-parser.js.map +1 -1
  111. package/lib/rtp/src/extra/container/ogg/parser.js.map +1 -1
  112. package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
  113. package/lib/rtp/src/extra/container/webm/ebml/ebml.js +1 -1
  114. package/lib/rtp/src/extra/container/webm/ebml/ebml.js.map +1 -1
  115. package/lib/rtp/src/extra/container/webm/ebml/typedArrayUtils.js.map +1 -1
  116. package/lib/rtp/src/extra/processor/depacketizer.js.map +1 -1
  117. package/lib/rtp/src/extra/processor/depacketizerTransformer.js.map +1 -1
  118. package/lib/rtp/src/extra/processor/dtx.js.map +1 -1
  119. package/lib/rtp/src/extra/processor/interface.js.map +1 -1
  120. package/lib/rtp/src/extra/processor/jitterBuffer.js.map +1 -1
  121. package/lib/rtp/src/extra/processor/jitterBufferTransformer.js.map +1 -1
  122. package/lib/rtp/src/extra/processor/lipsync.js.map +1 -1
  123. package/lib/rtp/src/extra/processor/lipsyncCallback.d.ts +1 -1
  124. package/lib/rtp/src/extra/processor/lipsyncCallback.js.map +1 -1
  125. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  126. package/lib/rtp/src/extra/processor/mp4Callback.js +1 -1
  127. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  128. package/lib/rtp/src/extra/processor/mute.js.map +1 -1
  129. package/lib/rtp/src/extra/processor/muteCallback.js.map +1 -1
  130. package/lib/rtp/src/extra/processor/nack.js.map +1 -1
  131. package/lib/rtp/src/extra/processor/ntpTime.js.map +1 -1
  132. package/lib/rtp/src/extra/processor/rtcpCallback.js.map +1 -1
  133. package/lib/rtp/src/extra/processor/rtpCallback.js.map +1 -1
  134. package/lib/rtp/src/extra/processor/rtpStream.js.map +1 -1
  135. package/lib/rtp/src/extra/processor/rtpTime.js.map +1 -1
  136. package/lib/rtp/src/extra/processor/webm.js.map +1 -1
  137. package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
  138. package/lib/rtp/src/extra/processor/webmStream.js.map +1 -1
  139. package/lib/rtp/src/index.d.ts +1 -0
  140. package/lib/rtp/src/rtcp/header.js.map +1 -1
  141. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js +1 -1
  142. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js.map +1 -1
  143. package/lib/rtp/src/rtcp/psfb/index.js +1 -1
  144. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  145. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js +1 -1
  146. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js.map +1 -1
  147. package/lib/rtp/src/rtcp/psfb/remb.js +1 -1
  148. package/lib/rtp/src/rtcp/psfb/remb.js.map +1 -1
  149. package/lib/rtp/src/rtcp/rr.js +1 -1
  150. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  151. package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
  152. package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
  153. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  154. package/lib/rtp/src/rtcp/rtpfb/nack.js +2 -2
  155. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  156. package/lib/rtp/src/rtcp/rtpfb/twcc.js +3 -3
  157. package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
  158. package/lib/rtp/src/rtcp/sdes.js +1 -1
  159. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  160. package/lib/rtp/src/rtcp/sr.js +1 -1
  161. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  162. package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
  163. package/lib/rtp/src/rtp/red/encoder.js.map +1 -1
  164. package/lib/rtp/src/rtp/red/handler.js.map +1 -1
  165. package/lib/rtp/src/rtp/red/packet.js +0 -1
  166. package/lib/rtp/src/rtp/red/packet.js.map +1 -1
  167. package/lib/rtp/src/rtp/rtp.js +3 -2
  168. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  169. package/lib/rtp/src/srtp/cipher/ctr.d.ts +1 -1
  170. package/lib/rtp/src/srtp/cipher/ctr.js +1 -1
  171. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  172. package/lib/rtp/src/srtp/cipher/gcm.d.ts +1 -1
  173. package/lib/rtp/src/srtp/cipher/gcm.js +1 -1
  174. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  175. package/lib/rtp/src/srtp/const.js.map +1 -1
  176. package/lib/rtp/src/srtp/context/context.js +1 -1
  177. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  178. package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
  179. package/lib/sctp/src/chunk.js +17 -17
  180. package/lib/sctp/src/chunk.js.map +1 -1
  181. package/lib/sctp/src/const.js +2 -2
  182. package/lib/sctp/src/const.js.map +1 -1
  183. package/lib/sctp/src/param.js +5 -5
  184. package/lib/sctp/src/param.js.map +1 -1
  185. package/lib/sctp/src/sctp.js +5 -1
  186. package/lib/sctp/src/sctp.js.map +1 -1
  187. package/lib/sctp/src/transport.js.map +1 -1
  188. package/lib/webrtc/src/dataChannel.d.ts +1 -1
  189. package/lib/webrtc/src/dataChannel.js +1 -1
  190. package/lib/webrtc/src/dataChannel.js.map +1 -1
  191. package/lib/webrtc/src/helper.js.map +1 -1
  192. package/lib/webrtc/src/media/parameters.d.ts +1 -2
  193. package/lib/webrtc/src/media/parameters.js.map +1 -1
  194. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  195. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  196. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  197. package/lib/webrtc/src/media/router.js +4 -2
  198. package/lib/webrtc/src/media/router.js.map +1 -1
  199. package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -1
  200. package/lib/webrtc/src/media/rtpReceiver.js +1 -1
  201. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  202. package/lib/webrtc/src/media/rtpSender.js +1 -1
  203. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  204. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  205. package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -1
  206. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  207. package/lib/webrtc/src/media/track.js.map +1 -1
  208. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  209. package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
  210. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  211. package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +2 -2
  212. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -2
  213. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  214. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  215. package/lib/webrtc/src/peerConnection.d.ts +2 -2
  216. package/lib/webrtc/src/peerConnection.js +11 -8
  217. package/lib/webrtc/src/peerConnection.js.map +1 -1
  218. package/lib/webrtc/src/sdp.js +47 -37
  219. package/lib/webrtc/src/sdp.js.map +1 -1
  220. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  221. package/lib/webrtc/src/transport/ice.js.map +1 -1
  222. package/lib/webrtc/src/transport/sctp.js +9 -7
  223. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  224. package/lib/webrtc/src/utils.js +1 -1
  225. package/lib/webrtc/src/utils.js.map +1 -1
  226. package/package.json +9 -17
  227. package/src/dataChannel.ts +1 -1
  228. package/src/media/parameters.ts +2 -2
  229. package/src/media/receiver/nack.ts +4 -7
  230. package/src/media/router.ts +36 -40
  231. package/src/media/rtpReceiver.ts +12 -15
  232. package/src/media/rtpSender.ts +69 -82
  233. package/src/nonstandard/recorder/writer/index.ts +1 -1
  234. package/src/nonstandard/recorder/writer/webm.ts +3 -3
  235. package/src/nonstandard/userMedia.ts +1 -3
  236. package/src/peerConnection.ts +28 -24
  237. package/src/sdp.ts +49 -55
  238. package/src/transport/dtls.ts +3 -6
  239. package/src/transport/ice.ts +1 -1
  240. package/src/transport/sctp.ts +60 -66
  241. package/src/utils.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../src/transport/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport { Event } from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport { SCTP, SCTP_STATE, Transport } from \"../../../sctp/src\";\nimport {\n DATA_CHANNEL_ACK,\n DATA_CHANNEL_OPEN,\n DATA_CHANNEL_RELIABLE,\n WEBRTC_BINARY,\n WEBRTC_BINARY_EMPTY,\n WEBRTC_DCEP,\n WEBRTC_STRING,\n WEBRTC_STRING_EMPTY,\n} from \"../const\";\nimport {\n DCState,\n RTCDataChannel,\n RTCDataChannelParameters,\n} from \"../dataChannel\";\nimport { RTCDtlsTransport } from \"./dtls\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctp.ts\");\n\nexport class RTCSctpTransport {\n dtlsTransport!: RTCDtlsTransport;\n sctp!: SCTP;\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly id = uuid.v4();\n\n mid?: string;\n mLineIndex?: number;\n bundled = false;\n dataChannels: { [key: number]: RTCDataChannel } = {};\n\n private dataChannelQueue: [RTCDataChannel, number, Buffer][] = [];\n private dataChannelId?: number;\n private eventDisposer: (() => void)[] = [];\n\n constructor(public port = 5000) {}\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {\n return;\n }\n\n this.eventDisposer.forEach((dispose) => dispose());\n\n this.dtlsTransport = dtlsTransport;\n this.sctp = new SCTP(new BridgeDtls(this.dtlsTransport), this.port);\n\n this.eventDisposer = [\n ...[\n this.sctp.onReceive.subscribe(this.datachannelReceive),\n this.sctp.onReconfigStreams.subscribe((ids: number[]) => {\n ids.forEach((id) => {\n const dc = this.dataChannels[id];\n if (!dc) return;\n // todo fix\n dc.setReadyState(\"closing\");\n dc.setReadyState(\"closed\");\n delete this.dataChannels[id];\n });\n }),\n this.sctp.stateChanged.connected.subscribe(() => {\n Object.values(this.dataChannels).forEach((channel) => {\n if (channel.negotiated && channel.readyState !== \"open\") {\n channel.setReadyState(\"open\");\n }\n });\n this.dataChannelFlush();\n }),\n this.sctp.stateChanged.closed.subscribe(() => {\n Object.values(this.dataChannels).forEach((dc) => {\n dc.setReadyState(\"closed\");\n });\n this.dataChannels = {};\n }),\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.sctp.setState(SCTP_STATE.CLOSED);\n }\n }),\n ].map((e) => e.unSubscribe),\n () => (this.sctp.onSackReceived = async () => {}),\n ];\n\n this.sctp.onSackReceived = async () => {\n await this.dataChannelFlush();\n };\n }\n\n private get isServer() {\n return this.dtlsTransport.iceTransport.role !== \"controlling\";\n }\n\n channelByLabel(label: string) {\n return Object.values(this.dataChannels).find((d) => d.label === label);\n }\n\n private datachannelReceive = async (\n streamId: number,\n ppId: number,\n data: Buffer,\n ) => {\n if (ppId === WEBRTC_DCEP && data.length > 0) {\n log(\"DCEP\", streamId, ppId, data);\n switch (data[0]) {\n case DATA_CHANNEL_OPEN:\n {\n if (data.length < 12) {\n log(\"DATA_CHANNEL_OPEN data.length not enough\");\n return;\n }\n\n if (!Object.keys(this.dataChannels).includes(streamId.toString())) {\n const [\n ,\n channelType,\n ,\n reliability,\n labelLength,\n protocolLength,\n ] = jspack.Unpack(\"!BBHLHH\", data);\n\n let pos = 12;\n const label = data.slice(pos, pos + labelLength).toString(\"utf8\");\n pos += labelLength;\n const protocol = data\n .slice(pos, pos + protocolLength)\n .toString(\"utf8\");\n\n log(\"DATA_CHANNEL_OPEN\", {\n channelType,\n reliability,\n streamId,\n label,\n protocol,\n });\n\n const maxRetransmits =\n (channelType & 0x03) === 1 ? reliability : undefined;\n const maxPacketLifeTime =\n (channelType & 0x03) === 2 ? reliability : undefined;\n\n // # register channel\n const parameters = new RTCDataChannelParameters({\n label,\n ordered: (channelType & 0x80) === 0,\n maxPacketLifeTime,\n maxRetransmits,\n protocol,\n id: streamId,\n });\n const channel = new RTCDataChannel(this, parameters, false);\n channel.isCreatedByRemote = true;\n this.dataChannels[streamId] = channel;\n\n this.onDataChannel.execute(channel);\n channel.setReadyState(\"open\");\n } else {\n log(\"datachannel already opened\", \"retransmit ack\");\n }\n\n const channel = this.dataChannels[streamId];\n this.dataChannelQueue.push([\n channel,\n WEBRTC_DCEP,\n Buffer.from(jspack.Pack(\"!B\", [DATA_CHANNEL_ACK])),\n ]);\n await this.dataChannelFlush();\n }\n break;\n case DATA_CHANNEL_ACK:\n log(\"DATA_CHANNEL_ACK\", streamId, ppId);\n const channel = this.dataChannels[streamId];\n if (!channel) {\n throw new Error(\"channel not found\");\n }\n channel.setReadyState(\"open\");\n break;\n }\n } else {\n const channel = this.dataChannels[streamId];\n if (channel) {\n const msg = (() => {\n switch (ppId) {\n case WEBRTC_STRING:\n return data.toString(\"utf8\");\n case WEBRTC_STRING_EMPTY:\n return \"\";\n case WEBRTC_BINARY:\n return data;\n case WEBRTC_BINARY_EMPTY:\n return Buffer.from([]);\n default:\n throw new Error();\n }\n })();\n\n channel.message.execute(msg);\n channel.emit(\"message\", { data: msg });\n if (channel.onmessage) {\n channel.onmessage({ data: msg });\n }\n }\n }\n };\n\n dataChannelAddNegotiated(channel: RTCDataChannel) {\n if (channel.id == undefined) {\n throw new Error();\n }\n if (this.dataChannels[channel.id]) {\n throw new Error();\n }\n\n this.dataChannels[channel.id] = channel;\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n channel.setReadyState(\"open\");\n }\n }\n\n dataChannelOpen(channel: RTCDataChannel) {\n if (channel.id) {\n if (this.dataChannels[channel.id])\n throw new Error(\n `Data channel with ID ${channel.id} already registered`,\n );\n this.dataChannels[channel.id] = channel;\n }\n\n let channelType = DATA_CHANNEL_RELIABLE;\n const priority = 0;\n let reliability = 0;\n\n if (!channel.ordered) {\n channelType = 0x80;\n }\n if (channel.maxRetransmits) {\n channelType = 1;\n reliability = channel.maxRetransmits;\n } else if (channel.maxPacketLifeTime) {\n channelType = 2;\n reliability = channel.maxPacketLifeTime;\n }\n\n // 5.1. DATA_CHANNEL_OPEN Message\n const data = jspack.Pack(\"!BBHLHH\", [\n DATA_CHANNEL_OPEN,\n channelType,\n priority,\n reliability,\n channel.label.length,\n channel.protocol.length,\n ]);\n const send = Buffer.concat([\n Buffer.from(data),\n Buffer.from(channel.label, \"utf8\"),\n Buffer.from(channel.protocol, \"utf8\"),\n ]);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, send]);\n this.dataChannelFlush();\n }\n\n private async dataChannelFlush() {\n // \"\"\"\n // Try to flush buffered data to the SCTP layer.\n\n // We wait until the association is established, as we need to know\n // whether we are a client or a server to correctly assign an odd/even ID\n // to the data channels.\n // \"\"\"\n\n if (this.sctp.associationState != SCTP_STATE.ESTABLISHED) return;\n if (this.sctp.outboundQueue.length > 0) return;\n\n while (this.dataChannelQueue.length > 0) {\n const [channel, protocol, userData] = this.dataChannelQueue.shift()!;\n\n let streamId = channel.id;\n if (streamId === undefined) {\n streamId = this.dataChannelId!;\n while (Object.keys(this.dataChannels).includes(streamId.toString())) {\n streamId += 2;\n }\n this.dataChannels[streamId] = channel;\n channel.setId(streamId);\n }\n\n if (protocol === WEBRTC_DCEP) {\n await this.sctp.send(streamId, protocol, userData, {\n ordered: true,\n });\n } else {\n const expiry = channel.maxPacketLifeTime\n ? Date.now() + channel.maxPacketLifeTime / 1000\n : undefined;\n\n await this.sctp.send(streamId, protocol, userData, {\n expiry,\n maxRetransmits: channel.maxRetransmits,\n ordered: channel.ordered,\n });\n channel.addBufferedAmount(-userData.length);\n }\n }\n }\n\n datachannelSend = (channel: RTCDataChannel, data: Buffer | string) => {\n channel.addBufferedAmount(data.length);\n\n this.dataChannelQueue.push(\n typeof data === \"string\"\n ? [channel, WEBRTC_STRING, Buffer.from(data)]\n : [channel, WEBRTC_BINARY, data],\n );\n\n if (this.sctp.associationState !== SCTP_STATE.ESTABLISHED) {\n log(\"sctp not established\", this.sctp.associationState);\n }\n\n this.dataChannelFlush();\n };\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.sctp.setRemotePort(port);\n }\n\n async start(remotePort: number) {\n if (this.isServer) {\n this.dataChannelId = 0;\n } else {\n this.dataChannelId = 1;\n }\n this.sctp.isServer = this.isServer;\n\n await this.sctp.start(remotePort);\n }\n\n async stop() {\n this.dtlsTransport.dataReceiver = () => {};\n await this.sctp.stop();\n }\n\n dataChannelClose(channel: RTCDataChannel) {\n if (!([\"closing\", \"closed\"] as DCState[]).includes(channel.readyState)) {\n channel.setReadyState(\"closing\");\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n this.sctp.reconfigQueue.push(channel.id);\n if (this.sctp.reconfigQueue.length === 1) {\n this.sctp.transmitReconfigRequest();\n }\n } else {\n this.dataChannelQueue = this.dataChannelQueue.filter(\n (queueItem) => queueItem[0].id !== channel.id,\n );\n if (channel.id) {\n delete this.dataChannels[channel.id];\n }\n channel.setReadyState(\"closed\");\n }\n }\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nclass BridgeDtls implements Transport {\n constructor(private dtls: RTCDtlsTransport) {}\n set onData(onData: (buf: Buffer) => void) {\n this.dtls.dataReceiver = onData;\n }\n readonly send = (data: Buffer) => {\n return this.dtls.sendData(data);\n };\n close() {}\n}\n"]}
1
+ {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../src/transport/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport { Event } from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport { SCTP, SCTP_STATE, Transport } from \"../../../sctp/src\";\nimport {\n DATA_CHANNEL_ACK,\n DATA_CHANNEL_OPEN,\n DATA_CHANNEL_RELIABLE,\n WEBRTC_BINARY,\n WEBRTC_BINARY_EMPTY,\n WEBRTC_DCEP,\n WEBRTC_STRING,\n WEBRTC_STRING_EMPTY,\n} from \"../const\";\nimport {\n DCState,\n RTCDataChannel,\n RTCDataChannelParameters,\n} from \"../dataChannel\";\nimport { RTCDtlsTransport } from \"./dtls\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctp.ts\");\n\nexport class RTCSctpTransport {\n dtlsTransport!: RTCDtlsTransport;\n sctp!: SCTP;\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly id = uuid.v4();\n\n mid?: string;\n mLineIndex?: number;\n bundled = false;\n dataChannels: { [key: number]: RTCDataChannel } = {};\n\n private dataChannelQueue: [RTCDataChannel, number, Buffer][] = [];\n private dataChannelId?: number;\n private eventDisposer: (() => void)[] = [];\n\n constructor(public port = 5000) {}\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {\n return;\n }\n\n this.eventDisposer.forEach((dispose) => dispose());\n\n this.dtlsTransport = dtlsTransport;\n this.sctp = new SCTP(new BridgeDtls(this.dtlsTransport), this.port);\n\n this.eventDisposer = [\n ...[\n this.sctp.onReceive.subscribe(this.datachannelReceive),\n this.sctp.onReconfigStreams.subscribe((ids: number[]) => {\n ids.forEach((id) => {\n const dc = this.dataChannels[id];\n if (!dc) return;\n // todo fix\n dc.setReadyState(\"closing\");\n dc.setReadyState(\"closed\");\n delete this.dataChannels[id];\n });\n }),\n this.sctp.stateChanged.connected.subscribe(() => {\n Object.values(this.dataChannels).forEach((channel) => {\n if (channel.negotiated && channel.readyState !== \"open\") {\n channel.setReadyState(\"open\");\n }\n });\n this.dataChannelFlush();\n }),\n this.sctp.stateChanged.closed.subscribe(() => {\n Object.values(this.dataChannels).forEach((dc) => {\n dc.setReadyState(\"closed\");\n });\n this.dataChannels = {};\n }),\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.sctp.setState(SCTP_STATE.CLOSED);\n }\n }),\n ].map((e) => e.unSubscribe),\n () => (this.sctp.onSackReceived = async () => {}),\n ];\n\n this.sctp.onSackReceived = async () => {\n await this.dataChannelFlush();\n };\n }\n\n private get isServer() {\n return this.dtlsTransport.iceTransport.role !== \"controlling\";\n }\n\n channelByLabel(label: string) {\n return Object.values(this.dataChannels).find((d) => d.label === label);\n }\n\n private datachannelReceive = async (\n streamId: number,\n ppId: number,\n data: Buffer,\n ) => {\n if (ppId === WEBRTC_DCEP && data.length > 0) {\n log(\"DCEP\", streamId, ppId, data);\n switch (data[0]) {\n case DATA_CHANNEL_OPEN: {\n if (data.length < 12) {\n log(\"DATA_CHANNEL_OPEN data.length not enough\");\n return;\n }\n\n if (!Object.keys(this.dataChannels).includes(streamId.toString())) {\n const [, channelType, , reliability, labelLength, protocolLength] =\n jspack.Unpack(\"!BBHLHH\", data);\n\n let pos = 12;\n const label = data.slice(pos, pos + labelLength).toString(\"utf8\");\n pos += labelLength;\n const protocol = data\n .slice(pos, pos + protocolLength)\n .toString(\"utf8\");\n\n log(\"DATA_CHANNEL_OPEN\", {\n channelType,\n reliability,\n streamId,\n label,\n protocol,\n });\n\n const maxRetransmits =\n (channelType & 0x03) === 1 ? reliability : undefined;\n const maxPacketLifeTime =\n (channelType & 0x03) === 2 ? reliability : undefined;\n\n // # register channel\n const parameters = new RTCDataChannelParameters({\n label,\n ordered: (channelType & 0x80) === 0,\n maxPacketLifeTime,\n maxRetransmits,\n protocol,\n id: streamId,\n });\n const channel = new RTCDataChannel(this, parameters, false);\n channel.isCreatedByRemote = true;\n this.dataChannels[streamId] = channel;\n\n this.onDataChannel.execute(channel);\n channel.setReadyState(\"open\");\n } else {\n log(\"datachannel already opened\", \"retransmit ack\");\n }\n\n const channel = this.dataChannels[streamId];\n this.dataChannelQueue.push([\n channel,\n WEBRTC_DCEP,\n Buffer.from(jspack.Pack(\"!B\", [DATA_CHANNEL_ACK])),\n ]);\n await this.dataChannelFlush();\n }\n break;\n case DATA_CHANNEL_ACK: {\n log(\"DATA_CHANNEL_ACK\", streamId, ppId);\n const channel = this.dataChannels[streamId];\n if (!channel) {\n throw new Error(\"channel not found\");\n }\n channel.setReadyState(\"open\");\n }\n break;\n }\n } else {\n const channel = this.dataChannels[streamId];\n if (channel) {\n const msg = (() => {\n switch (ppId) {\n case WEBRTC_STRING:\n return data.toString(\"utf8\");\n case WEBRTC_STRING_EMPTY:\n return \"\";\n case WEBRTC_BINARY:\n return data;\n case WEBRTC_BINARY_EMPTY:\n return Buffer.from([]);\n default:\n throw new Error();\n }\n })();\n\n channel.onMessage.execute(msg);\n channel.emit(\"message\", { data: msg });\n if (channel.onmessage) {\n channel.onmessage({ data: msg });\n }\n }\n }\n };\n\n dataChannelAddNegotiated(channel: RTCDataChannel) {\n if (channel.id == undefined) {\n throw new Error();\n }\n if (this.dataChannels[channel.id]) {\n throw new Error();\n }\n\n this.dataChannels[channel.id] = channel;\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n channel.setReadyState(\"open\");\n }\n }\n\n dataChannelOpen(channel: RTCDataChannel) {\n if (channel.id) {\n if (this.dataChannels[channel.id])\n throw new Error(\n `Data channel with ID ${channel.id} already registered`,\n );\n this.dataChannels[channel.id] = channel;\n }\n\n let channelType = DATA_CHANNEL_RELIABLE;\n const priority = 0;\n let reliability = 0;\n\n if (!channel.ordered) {\n channelType = 0x80;\n }\n if (channel.maxRetransmits) {\n channelType = 1;\n reliability = channel.maxRetransmits;\n } else if (channel.maxPacketLifeTime) {\n channelType = 2;\n reliability = channel.maxPacketLifeTime;\n }\n\n // 5.1. DATA_CHANNEL_OPEN Message\n const data = jspack.Pack(\"!BBHLHH\", [\n DATA_CHANNEL_OPEN,\n channelType,\n priority,\n reliability,\n channel.label.length,\n channel.protocol.length,\n ]);\n const send = Buffer.concat([\n Buffer.from(data),\n Buffer.from(channel.label, \"utf8\"),\n Buffer.from(channel.protocol, \"utf8\"),\n ]);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, send]);\n this.dataChannelFlush();\n }\n\n private async dataChannelFlush() {\n // \"\"\"\n // Try to flush buffered data to the SCTP layer.\n\n // We wait until the association is established, as we need to know\n // whether we are a client or a server to correctly assign an odd/even ID\n // to the data channels.\n // \"\"\"\n\n if (this.sctp.associationState != SCTP_STATE.ESTABLISHED) return;\n if (this.sctp.outboundQueue.length > 0) return;\n\n while (this.dataChannelQueue.length > 0) {\n const [channel, protocol, userData] = this.dataChannelQueue.shift()!;\n\n let streamId = channel.id;\n if (streamId === undefined) {\n streamId = this.dataChannelId!;\n while (Object.keys(this.dataChannels).includes(streamId.toString())) {\n streamId += 2;\n }\n this.dataChannels[streamId] = channel;\n channel.setId(streamId);\n }\n\n if (protocol === WEBRTC_DCEP) {\n await this.sctp.send(streamId, protocol, userData, {\n ordered: true,\n });\n } else {\n const expiry = channel.maxPacketLifeTime\n ? Date.now() + channel.maxPacketLifeTime / 1000\n : undefined;\n\n await this.sctp.send(streamId, protocol, userData, {\n expiry,\n maxRetransmits: channel.maxRetransmits,\n ordered: channel.ordered,\n });\n channel.addBufferedAmount(-userData.length);\n }\n }\n }\n\n datachannelSend = (channel: RTCDataChannel, data: Buffer | string) => {\n channel.addBufferedAmount(data.length);\n\n this.dataChannelQueue.push(\n typeof data === \"string\"\n ? [channel, WEBRTC_STRING, Buffer.from(data)]\n : [channel, WEBRTC_BINARY, data],\n );\n\n if (this.sctp.associationState !== SCTP_STATE.ESTABLISHED) {\n log(\"sctp not established\", this.sctp.associationState);\n }\n\n this.dataChannelFlush();\n };\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.sctp.setRemotePort(port);\n }\n\n async start(remotePort: number) {\n if (this.isServer) {\n this.dataChannelId = 0;\n } else {\n this.dataChannelId = 1;\n }\n this.sctp.isServer = this.isServer;\n\n await this.sctp.start(remotePort);\n }\n\n async stop() {\n this.dtlsTransport.dataReceiver = () => {};\n await this.sctp.stop();\n }\n\n dataChannelClose(channel: RTCDataChannel) {\n if (!([\"closing\", \"closed\"] as DCState[]).includes(channel.readyState)) {\n channel.setReadyState(\"closing\");\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n this.sctp.reconfigQueue.push(channel.id);\n if (this.sctp.reconfigQueue.length === 1) {\n this.sctp.transmitReconfigRequest();\n }\n } else {\n this.dataChannelQueue = this.dataChannelQueue.filter(\n (queueItem) => queueItem[0].id !== channel.id,\n );\n if (channel.id) {\n delete this.dataChannels[channel.id];\n }\n channel.setReadyState(\"closed\");\n }\n }\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nclass BridgeDtls implements Transport {\n constructor(private dtls: RTCDtlsTransport) {}\n set onData(onData: (buf: Buffer) => void) {\n this.dtls.dataReceiver = onData;\n }\n readonly send = (data: Buffer) => {\n return this.dtls.sendData(data);\n };\n close() {}\n}\n"]}
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.deepMerge = exports.MediaStreamTrackFactory = exports.createSelfSignedCertificate = exports.parseIceServers = exports.compactNtp = exports.ntpTime = exports.timestampSeconds = exports.milliTime = exports.microTime = exports.reverseDirection = exports.andDirection = exports.reverseSimulcastDirection = exports.isDtls = exports.fingerprint = void 0;
7
7
  /* eslint-disable prefer-const */
8
8
  const crypto_1 = require("crypto");
9
- const debug_1 = __importDefault(require("debug"));
10
9
  const dgram_1 = require("dgram");
10
+ const debug_1 = __importDefault(require("debug"));
11
11
  const mergeWith_1 = __importDefault(require("lodash/mergeWith"));
12
12
  const perf_hooks_1 = require("perf_hooks");
13
13
  const src_1 = require("../../common/src");
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { createSocket, RemoteInfo } from \"dgram\";\nimport mergeWith from \"lodash/mergeWith\";\nimport { performance } from \"perf_hooks\";\n\nimport { bufferReader, bufferWriter, randomPort } from \"../../common/src\";\nimport { CipherContext } from \"../../dtls/src/context/cipher\";\nimport { Address } from \"../../ice/src\";\nimport { Direction, Directions } from \"./media/rtpTransceiver\";\nimport { MediaStreamTrack } from \"./media/track\";\nimport { RTCIceServer } from \"./peerConnection\";\nconst now = require(\"nano-time\");\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: Direction, b: Direction) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: Direction): Direction {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const microTime = () => now.micro() as number;\n\nexport const milliTime = () => new Date().getTime();\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5),\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5),\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n\nexport class MediaStreamTrackFactory {\n static async rtpSource({\n port,\n kind,\n }: {\n port?: number;\n kind: \"audio\" | \"video\";\n }) {\n port ??= await randomPort();\n const track = new MediaStreamTrack({ kind });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n const onMessage = (msg: Buffer, rinfo: RemoteInfo) => {\n track.writeRtp(msg);\n };\n udp.addListener(\"message\", onMessage);\n\n const dispose = () => {\n udp.removeListener(\"message\", onMessage);\n udp.close();\n };\n\n return [track, port, dispose] as const;\n }\n}\n\nexport const deepMerge = <T>(dst: T, src: T) =>\n mergeWith(dst, src, (obj, src) => {\n if (!(src == undefined)) {\n return src;\n }\n return obj;\n });\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport { RemoteInfo, createSocket } from \"dgram\";\nimport debug from \"debug\";\nimport mergeWith from \"lodash/mergeWith\";\nimport { performance } from \"perf_hooks\";\n\nimport { bufferReader, bufferWriter, randomPort } from \"../../common/src\";\nimport { CipherContext } from \"../../dtls/src/context/cipher\";\nimport { Address } from \"../../ice/src\";\nimport { Direction, Directions } from \"./media/rtpTransceiver\";\nimport { MediaStreamTrack } from \"./media/track\";\nimport { RTCIceServer } from \"./peerConnection\";\nconst now = require(\"nano-time\");\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: Direction, b: Direction) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: Direction): Direction {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const microTime = () => now.micro() as number;\n\nexport const milliTime = () => new Date().getTime();\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5),\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5),\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n\nexport class MediaStreamTrackFactory {\n static async rtpSource({\n port,\n kind,\n }: {\n port?: number;\n kind: \"audio\" | \"video\";\n }) {\n port ??= await randomPort();\n const track = new MediaStreamTrack({ kind });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n const onMessage = (msg: Buffer, rinfo: RemoteInfo) => {\n track.writeRtp(msg);\n };\n udp.addListener(\"message\", onMessage);\n\n const dispose = () => {\n udp.removeListener(\"message\", onMessage);\n udp.close();\n };\n\n return [track, port, dispose] as const;\n }\n}\n\nexport const deepMerge = <T>(dst: T, src: T) =>\n mergeWith(dst, src, (obj, src) => {\n if (!(src == undefined)) {\n return src;\n }\n return obj;\n });\n"]}
package/package.json CHANGED
@@ -1,11 +1,8 @@
1
1
  {
2
2
  "name": "werift",
3
- "version": "0.19.0",
3
+ "version": "0.19.1",
4
4
  "description": "WebRTC Implementation for TypeScript (Node.js)",
5
- "keywords": [
6
- "WebRTC",
7
- "node.js"
8
- ],
5
+ "keywords": ["WebRTC", "node.js"],
9
6
  "homepage": "https://github.com/shinyoshiaki/werift-webrtc",
10
7
  "repository": {
11
8
  "type": "git",
@@ -17,29 +14,25 @@
17
14
  },
18
15
  "exports": {
19
16
  ".": {
20
- "default": "./lib/webrtc/src/index.js",
21
- "types": "./lib/webrtc/src/index.d.ts"
17
+ "types": "./lib/webrtc/src/index.d.ts",
18
+ "default": "./lib/webrtc/src/index.js"
22
19
  },
23
20
  "./nonstandard": {
24
- "default": "./lib/webrtc/src/nonstandard/index.js",
25
- "types": "./lib/webrtc/src/nonstandard/index.d.ts"
21
+ "types": "./lib/webrtc/src/nonstandard/index.d.ts",
22
+ "default": "./lib/webrtc/src/nonstandard/index.js"
26
23
  }
27
24
  },
28
25
  "main": "lib/webrtc/src/index.js",
29
26
  "types": "lib/webrtc/src/index.d.ts",
30
- "files": [
31
- "lib",
32
- "src"
33
- ],
27
+ "files": ["lib", "src"],
34
28
  "scripts": {
35
29
  "build": "npm i && rm -rf lib && npm run format && tsc -p ./tsconfig.production.json",
36
30
  "depcheck": "npx depcheck --ignores='@typescript-eslint/*,eslint-*'",
37
31
  "deploy": "npm run build && npm publish",
38
32
  "deploy:alpha": "npm run build && npm publish --tag alpha",
39
33
  "doc": "rm -rf doc && typedoc --excludePrivate --disableSources --excludeInternal --plugin typedoc-plugin-markdown --out doc ./src/index.ts",
40
- "format": "npm run unused && npm run lint && prettier --write src/**/*.ts",
34
+ "format": "biome check --apply src tests",
41
35
  "knip": "knip",
42
- "lint": "eslint ./src --fix",
43
36
  "test": "npm run type && jest --runInBand --forceExit --coverage",
44
37
  "type": "tsc --noEmit --project ./tsconfig.json",
45
38
  "unused": "organize-imports-cli src/**/*.ts",
@@ -54,7 +47,7 @@
54
47
  "@shinyoshiaki/ebml-builder": "^0.0.1",
55
48
  "aes-js": "^3.1.2",
56
49
  "binary-data": "^0.6.0",
57
- "buffer-crc32": "^0.2.13",
50
+ "buffer-crc32": "^1.0.0",
58
51
  "date-fns": "^2.29.3",
59
52
  "debug": "^4.3.4",
60
53
  "int64-buffer": "^1.0.1",
@@ -71,7 +64,6 @@
71
64
  },
72
65
  "devDependencies": {
73
66
  "@types/aes-js": "^3.1.1",
74
- "@types/buffer-crc32": "^0.2.2",
75
67
  "@types/debug": "^4.1.7",
76
68
  "@types/ip": "^1.1.0",
77
69
  "@types/jest": "^29.2.4",
@@ -9,7 +9,7 @@ const log = debug("werift:packages/webrtc/src/dataChannel.ts");
9
9
 
10
10
  export class RTCDataChannel extends EventTarget {
11
11
  readonly stateChanged = new Event<[DCState]>();
12
- readonly message = new Event<[string | Buffer]>();
12
+ readonly onMessage = new Event<[string | Buffer]>();
13
13
  // todo impl
14
14
  readonly error = new Event<[Error]>();
15
15
  readonly bufferedAmountLow = new Event();
@@ -60,7 +60,7 @@ export class RTCRtpHeaderExtensionParameters {
60
60
 
61
61
  export class RTCRtcpParameters {
62
62
  cname?: string;
63
- mux: boolean = false;
63
+ mux = false;
64
64
  ssrc?: number;
65
65
 
66
66
  constructor(props: Partial<RTCRtcpParameters> = {}) {
@@ -101,7 +101,7 @@ export interface RTCRtpReceiveParameters extends RTCRtpParameters {
101
101
  encodings: RTCRtpCodingParameters[];
102
102
  }
103
103
 
104
- export interface RTCRtpSendParameters extends RTCRtpParameters {}
104
+ export type RTCRtpSendParameters = RTCRtpParameters;
105
105
 
106
106
  export class RTCRtpSimulcastParameters {
107
107
  rid!: string;
@@ -90,13 +90,10 @@ export class NackHandler {
90
90
  if (this.lostSeqNumbers.length > LOST_SIZE) {
91
91
  this._lost = Object.entries(this._lost)
92
92
  .slice(-LOST_SIZE)
93
- .reduce(
94
- (acc, [key, v]) => {
95
- acc[key] = v;
96
- return acc;
97
- },
98
- {} as { [seqNum: number]: number },
99
- );
93
+ .reduce((acc, [key, v]) => {
94
+ acc[key] = v;
95
+ return acc;
96
+ }, {} as { [seqNum: number]: number });
100
97
  }
101
98
  }
102
99
 
@@ -1,6 +1,7 @@
1
1
  import debug from "debug";
2
2
 
3
3
  import {
4
+ RTP_EXTENSION_URI,
4
5
  ReceiverEstimatedMaxBitrate,
5
6
  RtcpPacket,
6
7
  RtcpPayloadSpecificFeedback,
@@ -8,9 +9,8 @@ import {
8
9
  RtcpSourceDescriptionPacket,
9
10
  RtcpSrPacket,
10
11
  RtcpTransportLayerFeedback,
11
- RTP_EXTENSION_URI,
12
- rtpHeaderExtensionsParser,
13
12
  RtpPacket,
13
+ rtpHeaderExtensionsParser,
14
14
  } from "../../../rtp/src";
15
15
  import {
16
16
  RTCRtpReceiveParameters,
@@ -144,47 +144,43 @@ export class RtpRouter {
144
144
  const recipients: (RTCRtpReceiver | RTCRtpSender)[] = [];
145
145
 
146
146
  switch (packet.type) {
147
- case RtcpSrPacket.type:
148
- {
149
- packet = packet as RtcpSrPacket;
150
- recipients.push(this.ssrcTable[packet.ssrc]);
151
- }
152
- break;
153
- case RtcpRrPacket.type:
154
- {
155
- packet = packet as RtcpRrPacket;
156
- packet.reports.forEach((report) => {
157
- recipients.push(this.ssrcTable[report.ssrc]);
158
- });
159
- }
160
- break;
161
- case RtcpSourceDescriptionPacket.type:
162
- {
163
- const sdes = packet as RtcpSourceDescriptionPacket;
164
- // log("sdes", JSON.stringify(sdes.chunks));
165
- }
166
- break;
167
- case RtcpTransportLayerFeedback.type:
168
- {
169
- const rtpfb = packet as RtcpTransportLayerFeedback;
170
- if (rtpfb.feedback) {
171
- recipients.push(this.ssrcTable[rtpfb.feedback.mediaSourceSsrc]);
172
- }
147
+ case RtcpSrPacket.type: {
148
+ packet = packet as RtcpSrPacket;
149
+ recipients.push(this.ssrcTable[packet.ssrc]);
150
+ }
151
+ break;
152
+ case RtcpRrPacket.type: {
153
+ packet = packet as RtcpRrPacket;
154
+ packet.reports.forEach((report) => {
155
+ recipients.push(this.ssrcTable[report.ssrc]);
156
+ });
157
+ }
158
+ break;
159
+ case RtcpSourceDescriptionPacket.type: {
160
+ const sdes = packet as RtcpSourceDescriptionPacket;
161
+ // log("sdes", JSON.stringify(sdes.chunks));
162
+ }
163
+ break;
164
+ case RtcpTransportLayerFeedback.type: {
165
+ const rtpfb = packet as RtcpTransportLayerFeedback;
166
+ if (rtpfb.feedback) {
167
+ recipients.push(this.ssrcTable[rtpfb.feedback.mediaSourceSsrc]);
173
168
  }
174
- break;
175
- case RtcpPayloadSpecificFeedback.type:
176
- {
177
- const psfb = packet as RtcpPayloadSpecificFeedback;
178
- switch (psfb.feedback.count) {
179
- case ReceiverEstimatedMaxBitrate.count:
180
- const remb = psfb.feedback as ReceiverEstimatedMaxBitrate;
181
- recipients.push(this.ssrcTable[remb.ssrcFeedbacks[0]]);
182
- break;
183
- default:
184
- recipients.push(this.ssrcTable[psfb.feedback.senderSsrc]);
169
+ }
170
+ break;
171
+ case RtcpPayloadSpecificFeedback.type: {
172
+ const psfb = packet as RtcpPayloadSpecificFeedback;
173
+ switch (psfb.feedback.count) {
174
+ case ReceiverEstimatedMaxBitrate.count: {
175
+ const remb = psfb.feedback as ReceiverEstimatedMaxBitrate;
176
+ recipients.push(this.ssrcTable[remb.ssrcFeedbacks[0]]);
185
177
  }
178
+ break;
179
+ default:
180
+ recipients.push(this.ssrcTable[psfb.feedback.senderSsrc]);
186
181
  }
187
- break;
182
+ }
183
+ break;
188
184
  }
189
185
  recipients
190
186
  .filter((v) => v) // todo simulcast
@@ -3,9 +3,11 @@ import Event from "rx.mini";
3
3
  import { setTimeout } from "timers/promises";
4
4
  import { v4 as uuid } from "uuid";
5
5
 
6
+ import { PeerConfig, codecParametersFromString, usePLI, useTWCC } from "..";
6
7
  import { int } from "../../../common/src";
7
8
  import {
8
9
  PictureLossIndication,
10
+ RTP_EXTENSION_URI,
9
11
  Red,
10
12
  RedHandler,
11
13
  RtcpPacket,
@@ -13,12 +15,10 @@ import {
13
15
  RtcpReceiverInfo,
14
16
  RtcpRrPacket,
15
17
  RtcpSrPacket,
16
- RTP_EXTENSION_URI,
17
18
  RtpPacket,
18
19
  TransportWideCCPayload,
19
20
  unwrapRtx,
20
21
  } from "../../../rtp/src";
21
- import { codecParametersFromString, PeerConfig, usePLI, useTWCC } from "..";
22
22
  import { RTCDtlsTransport } from "../transport/dtls";
23
23
  import { Kind } from "../types/domain";
24
24
  import { compactNtp, timestampSeconds } from "../utils";
@@ -236,20 +236,17 @@ export class RTCRtpReceiver {
236
236
 
237
237
  handleRtcpPacket(packet: RtcpPacket) {
238
238
  switch (packet.type) {
239
- case RtcpSrPacket.type:
240
- {
241
- const sr = packet as RtcpSrPacket;
242
- this.lastSRtimestamp[sr.ssrc] = compactNtp(
243
- sr.senderInfo.ntpTimestamp,
244
- );
245
- this.receiveLastSRTimestamp[sr.ssrc] = timestampSeconds();
246
-
247
- const track = this.trackBySSRC[packet.ssrc];
248
- if (track) {
249
- track.onReceiveRtcp.execute(packet);
250
- }
239
+ case RtcpSrPacket.type: {
240
+ const sr = packet as RtcpSrPacket;
241
+ this.lastSRtimestamp[sr.ssrc] = compactNtp(sr.senderInfo.ntpTimestamp);
242
+ this.receiveLastSRTimestamp[sr.ssrc] = timestampSeconds();
243
+
244
+ const track = this.trackBySSRC[packet.ssrc];
245
+ if (track) {
246
+ track.onReceiveRtcp.execute(packet);
251
247
  }
252
- break;
248
+ }
249
+ break;
253
250
  }
254
251
  this.onRtcp.execute(packet);
255
252
  }
@@ -27,11 +27,13 @@ import Event from "rx.mini";
27
27
  import { setTimeout } from "timers/promises";
28
28
  import * as uuid from "uuid";
29
29
 
30
+ import { codecParametersFromString } from "..";
30
31
  import { random16, uint16Add, uint32Add } from "../../../common/src";
31
32
  import {
32
33
  Extension,
33
34
  GenericNack,
34
35
  PictureLossIndication,
36
+ RTP_EXTENSION_URI,
35
37
  ReceiverEstimatedMaxBitrate,
36
38
  RedEncoder,
37
39
  RtcpPacket,
@@ -41,20 +43,18 @@ import {
41
43
  RtcpSourceDescriptionPacket,
42
44
  RtcpSrPacket,
43
45
  RtcpTransportLayerFeedback,
44
- RTP_EXTENSION_URI,
45
46
  RtpHeader,
46
47
  RtpPacket,
48
+ SourceDescriptionChunk,
49
+ SourceDescriptionItem,
50
+ TransportWideCC,
47
51
  serializeAbsSendTime,
48
52
  serializeRepairedRtpStreamId,
49
53
  serializeSdesMid,
50
54
  serializeSdesRTPStreamID,
51
55
  serializeTransportWideCC,
52
- SourceDescriptionChunk,
53
- SourceDescriptionItem,
54
- TransportWideCC,
55
56
  wrapRtx,
56
57
  } from "../../../rtp/src";
57
- import { codecParametersFromString } from "..";
58
58
  import { RTCDtlsTransport } from "../transport/dtls";
59
59
  import { Kind } from "../types/domain";
60
60
  import { compactNtp, milliTime, ntpTime, timestampSeconds } from "../utils";
@@ -104,7 +104,7 @@ export class RTCRtpSender {
104
104
  private octetCount = 0;
105
105
  private packetCount = 0;
106
106
  private rtt?: number;
107
- receiverEstimatedMaxBitrate: bigint = 0n;
107
+ receiverEstimatedMaxBitrate = 0n;
108
108
 
109
109
  // rtp
110
110
  private sequenceNumber?: number;
@@ -410,90 +410,77 @@ export class RTCRtpSender {
410
410
  handleRtcpPacket(rtcpPacket: RtcpPacket) {
411
411
  switch (rtcpPacket.type) {
412
412
  case RtcpSrPacket.type:
413
- case RtcpRrPacket.type:
414
- {
415
- const packet = rtcpPacket as RtcpSrPacket | RtcpRrPacket;
416
- packet.reports
417
- .filter((report) => report.ssrc === this.ssrc)
418
- .forEach((report) => {
419
- if (this.lastSRtimestamp === report.lsr && report.dlsr) {
420
- if (this.lastSentSRTimestamp) {
421
- const rtt =
422
- timestampSeconds() -
423
- this.lastSentSRTimestamp -
424
- report.dlsr / 65536;
425
- if (this.rtt === undefined) {
426
- this.rtt = rtt;
427
- } else {
428
- this.rtt = RTT_ALPHA * this.rtt + (1 - RTT_ALPHA) * rtt;
429
- }
413
+ case RtcpRrPacket.type: {
414
+ const packet = rtcpPacket as RtcpSrPacket | RtcpRrPacket;
415
+ packet.reports
416
+ .filter((report) => report.ssrc === this.ssrc)
417
+ .forEach((report) => {
418
+ if (this.lastSRtimestamp === report.lsr && report.dlsr) {
419
+ if (this.lastSentSRTimestamp) {
420
+ const rtt =
421
+ timestampSeconds() -
422
+ this.lastSentSRTimestamp -
423
+ report.dlsr / 65536;
424
+ if (this.rtt === undefined) {
425
+ this.rtt = rtt;
426
+ } else {
427
+ this.rtt = RTT_ALPHA * this.rtt + (1 - RTT_ALPHA) * rtt;
430
428
  }
431
429
  }
432
- });
433
- }
434
- break;
435
- case RtcpTransportLayerFeedback.type:
436
- {
437
- const packet = rtcpPacket as RtcpTransportLayerFeedback;
438
- switch (packet.feedback.count) {
439
- case TransportWideCC.count:
440
- {
441
- const feedback = packet.feedback as TransportWideCC;
442
- this.senderBWE.receiveTWCC(feedback);
430
+ }
431
+ });
432
+ }
433
+ break;
434
+ case RtcpTransportLayerFeedback.type: {
435
+ const packet = rtcpPacket as RtcpTransportLayerFeedback;
436
+ switch (packet.feedback.count) {
437
+ case TransportWideCC.count: {
438
+ const feedback = packet.feedback as TransportWideCC;
439
+ this.senderBWE.receiveTWCC(feedback);
440
+ }
441
+ break;
442
+ case GenericNack.count: {
443
+ const feedback = packet.feedback as GenericNack;
444
+ feedback.lost.forEach(async (seqNum) => {
445
+ let packet: RtpPacket | undefined =
446
+ this.rtpCache[seqNum % RTP_HISTORY_SIZE];
447
+ if (packet && packet.header.sequenceNumber !== seqNum) {
448
+ packet = undefined;
443
449
  }
444
- break;
445
- case GenericNack.count:
446
- {
447
- const feedback = packet.feedback as GenericNack;
448
- feedback.lost.forEach(async (seqNum) => {
449
- let packet: RtpPacket | undefined =
450
- this.rtpCache[seqNum % RTP_HISTORY_SIZE];
451
- if (packet && packet.header.sequenceNumber !== seqNum) {
452
- packet = undefined;
453
- }
454
- if (packet) {
455
- if (this.rtxPayloadType != undefined) {
456
- packet = wrapRtx(
457
- packet,
458
- this.rtxPayloadType,
459
- this.rtxSequenceNumber,
460
- this.rtxSsrc,
461
- );
462
- this.rtxSequenceNumber = uint16Add(
463
- this.rtxSequenceNumber,
464
- 1,
465
- );
466
- }
467
- await this.dtlsTransport.sendRtp(
468
- packet.payload,
469
- packet.header,
470
- );
471
- }
472
- });
473
- this.onGenericNack.execute(feedback);
450
+ if (packet) {
451
+ if (this.rtxPayloadType != undefined) {
452
+ packet = wrapRtx(
453
+ packet,
454
+ this.rtxPayloadType,
455
+ this.rtxSequenceNumber,
456
+ this.rtxSsrc,
457
+ );
458
+ this.rtxSequenceNumber = uint16Add(this.rtxSequenceNumber, 1);
459
+ }
460
+ await this.dtlsTransport.sendRtp(packet.payload, packet.header);
474
461
  }
475
- break;
462
+ });
463
+ this.onGenericNack.execute(feedback);
476
464
  }
465
+ break;
477
466
  }
478
- break;
479
- case RtcpPayloadSpecificFeedback.type:
480
- {
481
- const packet = rtcpPacket as RtcpPayloadSpecificFeedback;
482
- switch (packet.feedback.count) {
483
- case ReceiverEstimatedMaxBitrate.count:
484
- {
485
- const feedback = packet.feedback as ReceiverEstimatedMaxBitrate;
486
- this.receiverEstimatedMaxBitrate = feedback.bitrate;
487
- }
488
- break;
489
- case PictureLossIndication.count:
490
- {
491
- this.onPictureLossIndication.execute();
492
- }
493
- break;
467
+ }
468
+ break;
469
+ case RtcpPayloadSpecificFeedback.type: {
470
+ const packet = rtcpPacket as RtcpPayloadSpecificFeedback;
471
+ switch (packet.feedback.count) {
472
+ case ReceiverEstimatedMaxBitrate.count: {
473
+ const feedback = packet.feedback as ReceiverEstimatedMaxBitrate;
474
+ this.receiverEstimatedMaxBitrate = feedback.bitrate;
494
475
  }
476
+ break;
477
+ case PictureLossIndication.count: {
478
+ this.onPictureLossIndication.execute();
479
+ }
480
+ break;
495
481
  }
496
- break;
482
+ }
483
+ break;
497
484
  }
498
485
  this.onRtcp.execute(rtcpPacket);
499
486
  }
@@ -1,5 +1,5 @@
1
- import { MediaStreamTrack } from "../../..";
2
1
  import { MediaRecorderOptions } from "..";
2
+ import { MediaStreamTrack } from "../../..";
3
3
 
4
4
  export abstract class MediaWriter {
5
5
  constructor(