werift 0.19.9 → 0.20.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 (139) hide show
  1. package/lib/common/src/event.d.ts +45 -0
  2. package/lib/common/src/event.js +232 -0
  3. package/lib/common/src/event.js.map +1 -0
  4. package/lib/common/src/index.d.ts +1 -0
  5. package/lib/common/src/index.js +1 -0
  6. package/lib/common/src/index.js.map +1 -1
  7. package/lib/dtls/src/flight/client/flight5.js +6 -1
  8. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  9. package/lib/dtls/src/imports/common.d.ts +1 -0
  10. package/lib/dtls/src/imports/common.js +18 -0
  11. package/lib/dtls/src/imports/common.js.map +1 -0
  12. package/lib/dtls/src/socket.d.ts +1 -1
  13. package/lib/dtls/src/socket.js +5 -5
  14. package/lib/dtls/src/socket.js.map +1 -1
  15. package/lib/ice/src/candidate.d.ts +1 -1
  16. package/lib/ice/src/candidate.js +2 -1
  17. package/lib/ice/src/candidate.js.map +1 -1
  18. package/lib/ice/src/helper.js +2 -2
  19. package/lib/ice/src/helper.js.map +1 -1
  20. package/lib/ice/src/ice.d.ts +10 -5
  21. package/lib/ice/src/ice.js +46 -16
  22. package/lib/ice/src/ice.js.map +1 -1
  23. package/lib/ice/src/imports/common.d.ts +1 -0
  24. package/lib/ice/src/imports/common.js +18 -0
  25. package/lib/ice/src/imports/common.js.map +1 -0
  26. package/lib/ice/src/index.d.ts +4 -0
  27. package/lib/ice/src/index.js +4 -0
  28. package/lib/ice/src/index.js.map +1 -1
  29. package/lib/ice/src/stun/message.d.ts +1 -0
  30. package/lib/ice/src/stun/message.js +16 -6
  31. package/lib/ice/src/stun/message.js.map +1 -1
  32. package/lib/ice/src/stun/protocol.d.ts +3 -2
  33. package/lib/ice/src/stun/protocol.js +13 -7
  34. package/lib/ice/src/stun/protocol.js.map +1 -1
  35. package/lib/ice/src/stun/transaction.js +4 -3
  36. package/lib/ice/src/stun/transaction.js.map +1 -1
  37. package/lib/ice/src/transport.d.ts +21 -4
  38. package/lib/ice/src/transport.js +115 -7
  39. package/lib/ice/src/transport.js.map +1 -1
  40. package/lib/ice/src/turn/protocol.d.ts +52 -36
  41. package/lib/ice/src/turn/protocol.js +183 -76
  42. package/lib/ice/src/turn/protocol.js.map +1 -1
  43. package/lib/ice/src/types/model.d.ts +5 -5
  44. package/lib/ice/src/types/model.js.map +1 -1
  45. package/lib/ice/src/utils.d.ts +1 -0
  46. package/lib/ice/src/utils.js +15 -16
  47. package/lib/ice/src/utils.js.map +1 -1
  48. package/lib/rtp/src/extra/container/mp4/container.d.ts +1 -1
  49. package/lib/rtp/src/extra/container/mp4/container.js +2 -5
  50. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  51. package/lib/rtp/src/extra/processor/depacketizer.d.ts +1 -1
  52. package/lib/rtp/src/extra/processor/depacketizer.js +2 -2
  53. package/lib/rtp/src/extra/processor/depacketizer.js.map +1 -1
  54. package/lib/rtp/src/extra/processor/mp4.d.ts +1 -1
  55. package/lib/rtp/src/extra/processor/mp4.js +2 -5
  56. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  57. package/lib/rtp/src/extra/processor/nack.d.ts +1 -1
  58. package/lib/rtp/src/extra/processor/nack.js +3 -3
  59. package/lib/rtp/src/extra/processor/nack.js.map +1 -1
  60. package/lib/rtp/src/extra/processor/rtcpCallback.d.ts +1 -1
  61. package/lib/rtp/src/extra/processor/rtcpCallback.js +2 -5
  62. package/lib/rtp/src/extra/processor/rtcpCallback.js.map +1 -1
  63. package/lib/rtp/src/extra/processor/rtpCallback.d.ts +1 -1
  64. package/lib/rtp/src/extra/processor/rtpCallback.js +2 -5
  65. package/lib/rtp/src/extra/processor/rtpCallback.js.map +1 -1
  66. package/lib/rtp/src/extra/processor/webm.d.ts +1 -1
  67. package/lib/rtp/src/extra/processor/webm.js +2 -5
  68. package/lib/rtp/src/extra/processor/webm.js.map +1 -1
  69. package/lib/rtp/src/imports/common.d.ts +1 -0
  70. package/lib/rtp/src/imports/common.js +18 -0
  71. package/lib/rtp/src/imports/common.js.map +1 -0
  72. package/lib/sctp/src/helper.js +2 -5
  73. package/lib/sctp/src/helper.js.map +1 -1
  74. package/lib/sctp/src/imports/common.d.ts +1 -0
  75. package/lib/sctp/src/imports/common.js +18 -0
  76. package/lib/sctp/src/imports/common.js.map +1 -0
  77. package/lib/sctp/src/sctp.d.ts +1 -1
  78. package/lib/sctp/src/sctp.js +3 -3
  79. package/lib/sctp/src/sctp.js.map +1 -1
  80. package/lib/webrtc/src/dataChannel.d.ts +1 -1
  81. package/lib/webrtc/src/dataChannel.js +5 -5
  82. package/lib/webrtc/src/dataChannel.js.map +1 -1
  83. package/lib/webrtc/src/imports/common.d.ts +1 -0
  84. package/lib/webrtc/src/imports/common.js +18 -0
  85. package/lib/webrtc/src/imports/common.js.map +1 -0
  86. package/lib/webrtc/src/media/receiver/nack.d.ts +1 -1
  87. package/lib/webrtc/src/media/receiver/nack.js +2 -2
  88. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  89. package/lib/webrtc/src/media/rtpReceiver.d.ts +2 -2
  90. package/lib/webrtc/src/media/rtpReceiver.js +2 -5
  91. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  92. package/lib/webrtc/src/media/rtpSender.d.ts +1 -1
  93. package/lib/webrtc/src/media/rtpSender.js +5 -5
  94. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  95. package/lib/webrtc/src/media/rtpTransceiver.d.ts +1 -1
  96. package/lib/webrtc/src/media/rtpTransceiver.js +2 -5
  97. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  98. package/lib/webrtc/src/media/sender/senderBWE.d.ts +1 -1
  99. package/lib/webrtc/src/media/sender/senderBWE.js +4 -7
  100. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  101. package/lib/webrtc/src/media/track.d.ts +1 -1
  102. package/lib/webrtc/src/media/track.js +4 -7
  103. package/lib/webrtc/src/media/track.js.map +1 -1
  104. package/lib/webrtc/src/nonstandard/recorder/index.d.ts +2 -1
  105. package/lib/webrtc/src/nonstandard/recorder/index.js +2 -5
  106. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  107. package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
  108. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  109. package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +1 -1
  110. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -2
  111. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  112. package/lib/webrtc/src/peerConnection.d.ts +9 -6
  113. package/lib/webrtc/src/peerConnection.js +31 -18
  114. package/lib/webrtc/src/peerConnection.js.map +1 -1
  115. package/lib/webrtc/src/transport/dtls.d.ts +1 -1
  116. package/lib/webrtc/src/transport/dtls.js +12 -8
  117. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  118. package/lib/webrtc/src/transport/ice.d.ts +3 -3
  119. package/lib/webrtc/src/transport/ice.js +14 -8
  120. package/lib/webrtc/src/transport/ice.js.map +1 -1
  121. package/lib/webrtc/src/transport/sctp.d.ts +1 -1
  122. package/lib/webrtc/src/transport/sctp.js +2 -2
  123. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  124. package/package.json +1 -1
  125. package/src/dataChannel.ts +1 -1
  126. package/src/imports/common.ts +1 -0
  127. package/src/media/receiver/nack.ts +1 -1
  128. package/src/media/rtpReceiver.ts +1 -1
  129. package/src/media/rtpSender.ts +1 -1
  130. package/src/media/rtpTransceiver.ts +1 -1
  131. package/src/media/sender/senderBWE.ts +1 -1
  132. package/src/media/track.ts +1 -1
  133. package/src/nonstandard/recorder/index.ts +3 -1
  134. package/src/nonstandard/recorder/writer/index.ts +1 -1
  135. package/src/nonstandard/recorder/writer/webm.ts +1 -1
  136. package/src/peerConnection.ts +30 -15
  137. package/src/transport/dtls.ts +11 -5
  138. package/src/transport/ice.ts +14 -8
  139. package/src/transport/sctp.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../sctp/src/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\nimport debug from \"debug\";\nimport range from \"lodash/range\";\nimport { Event } from \"rx.mini\";\n\nimport {\n random32,\n uint16Add,\n uint16Gt,\n uint32Gt,\n uint32Gte,\n} from \"../../common/src\";\nimport {\n AbortChunk,\n type Chunk,\n CookieAckChunk,\n CookieEchoChunk,\n DataChunk,\n ErrorChunk,\n ForwardTsnChunk,\n HeartbeatAckChunk,\n HeartbeatChunk,\n InitAckChunk,\n InitChunk,\n ReConfigChunk,\n ReconfigChunk,\n SackChunk,\n ShutdownAckChunk,\n ShutdownChunk,\n ShutdownCompleteChunk,\n parsePacket,\n serializePacket,\n} from \"./chunk\";\nimport { SCTP_STATE } from \"./const\";\nimport { type Unpacked, createEventsFromList, enumerate } from \"./helper\";\nimport {\n OutgoingSSNResetRequestParam,\n RECONFIG_PARAM_BY_TYPES,\n ReconfigResponseParam,\n StreamAddOutgoingParam,\n type StreamParam,\n reconfigResult,\n} from \"./param\";\nimport type { Transport } from \"./transport\";\n\nconst log = debug(\"werift/sctp/sctp\");\n\n// SSN: Stream Sequence Number\n\n// # local constants\nconst COOKIE_LENGTH = 24;\nconst COOKIE_LIFETIME = 60;\nconst MAX_STREAMS = 65535;\nconst USERDATA_MAX_LENGTH = 1200;\n\n// # protocol constants\nconst SCTP_DATA_LAST_FRAG = 0x01;\nconst SCTP_DATA_FIRST_FRAG = 0x02;\nconst SCTP_DATA_UNORDERED = 0x04;\n\nconst SCTP_MAX_ASSOCIATION_RETRANS = 10;\nconst SCTP_MAX_INIT_RETRANS = 8;\nconst SCTP_RTO_ALPHA = 1 / 8;\nconst SCTP_RTO_BETA = 1 / 4;\nconst SCTP_RTO_INITIAL = 3;\nconst SCTP_RTO_MIN = 1;\nconst SCTP_RTO_MAX = 60;\nconst SCTP_TSN_MODULO = 2 ** 32;\n\nconst RECONFIG_MAX_STREAMS = 135;\n\n// # parameters\nconst SCTP_STATE_COOKIE = 0x0007;\nconst SCTP_SUPPORTED_CHUNK_EXT = 0x8008; //32778\nconst SCTP_PRSCTP_SUPPORTED = 0xc000; //49152\n\nconst SCTPConnectionStates = [\n \"new\",\n \"closed\",\n \"connected\",\n \"connecting\",\n] as const;\ntype SCTPConnectionState = Unpacked<typeof SCTPConnectionStates>;\n\nexport class SCTP {\n readonly stateChanged: {\n [key in SCTPConnectionState]: Event<[]>;\n } = createEventsFromList(SCTPConnectionStates);\n readonly onReconfigStreams = new Event<[number[]]>();\n /**streamId: number, ppId: number, data: Buffer */\n readonly onReceive = new Event<[number, number, Buffer]>();\n onSackReceived: () => Promise<void> = async () => {};\n\n associationState = SCTP_STATE.CLOSED;\n started = false;\n state: SCTPConnectionState = \"new\";\n isServer = true;\n\n private hmacKey = randomBytes(16);\n private localPartialReliability = true;\n private localPort: number;\n private localVerificationTag = random32();\n\n remoteExtensions: number[] = [];\n remotePartialReliability = true;\n private remotePort?: number;\n private remoteVerificationTag = 0;\n\n // inbound\n private advertisedRwnd = 1024 * 1024; // Receiver Window\n private inboundStreams: { [key: number]: InboundStream } = {};\n _inboundStreamsCount = 0;\n _inboundStreamsMax = MAX_STREAMS;\n private lastReceivedTsn?: number; // Transmission Sequence Number\n private sackDuplicates: number[] = [];\n private sackMisOrdered = new Set<number>();\n private sackNeeded = false;\n\n // # outbound\n private cwnd = 3 * USERDATA_MAX_LENGTH; // Congestion Window\n private fastRecoveryExit?: number;\n private fastRecoveryTransmit = false;\n private forwardTsnChunk?: ForwardTsnChunk;\n private flightSize = 0;\n outboundQueue: DataChunk[] = [];\n private outboundStreamSeq: { [streamId: number]: number } = {};\n _outboundStreamsCount = MAX_STREAMS;\n /**local transmission sequence number */\n private localTsn = Number(random32());\n private lastSackedTsn = tsnMinusOne(this.localTsn);\n private advancedPeerAckTsn = tsnMinusOne(this.localTsn); // acknowledgement\n private partialBytesAcked = 0;\n private sentQueue: DataChunk[] = [];\n\n // # reconfiguration\n\n /**初期TSNと同じ値に初期化される単調に増加する数です. これは、新しいre-configuration requestパラメーターを送信するたびに1ずつ増加します */\n reconfigRequestSeq = this.localTsn;\n /**このフィールドは、incoming要求のre-configuration requestシーケンス番号を保持します. 他の場合では、次に予想されるre-configuration requestシーケンス番号から1を引いた値が保持されます */\n reconfigResponseSeq = 0;\n reconfigRequest?: OutgoingSSNResetRequestParam;\n reconfigQueue: number[] = [];\n\n // rtt calculation\n private srtt?: number;\n private rttvar?: number;\n\n // timers\n private rto = SCTP_RTO_INITIAL;\n /**t1 is wait for initAck or cookieAck */\n private timer1Handle?: any;\n private timer1Chunk?: Chunk;\n private timer1Failures = 0;\n /**t2 is wait for shutdown */\n private timer2Handle?: any;\n private timer2Chunk?: Chunk;\n private timer2Failures = 0;\n /**t3 is wait for data sack */\n private timer3Handle?: any;\n /**Re-configuration Timer */\n private timerReconfigHandle?: any;\n private timerReconfigFailures = 0;\n\n // etc\n private ssthresh?: number; // slow start threshold\n\n constructor(\n public transport: Transport,\n public port = 5000,\n ) {\n this.localPort = this.port;\n this.transport.onData = (buf) => {\n this.handleData(buf);\n };\n }\n\n get maxChannels() {\n if (this._inboundStreamsCount > 0) {\n return Math.min(this._inboundStreamsCount, this._outboundStreamsCount);\n }\n return undefined;\n }\n\n static client(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = false;\n return sctp;\n }\n\n static server(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = true;\n return sctp;\n }\n\n // call from dtls transport\n private async handleData(data: Buffer) {\n let expectedTag: number;\n\n const [, , verificationTag, chunks] = parsePacket(data);\n const initChunk = chunks.filter((v) => v.type === InitChunk.type).length;\n if (initChunk > 0) {\n if (chunks.length != 1) {\n throw new Error();\n }\n expectedTag = 0;\n } else {\n expectedTag = this.localVerificationTag;\n }\n\n if (verificationTag !== expectedTag) {\n return;\n }\n\n for (const chunk of chunks) {\n await this.receiveChunk(chunk);\n }\n\n if (this.sackNeeded) {\n await this.sendSack();\n }\n }\n\n private async sendSack() {\n const gaps: [number, number][] = [];\n let gapNext: number;\n [...this.sackMisOrdered].sort().forEach((tsn) => {\n const pos = (tsn - this.lastReceivedTsn!) % SCTP_TSN_MODULO;\n if (tsn === gapNext) {\n gaps[gaps.length - 1][1] = pos;\n } else {\n gaps.push([pos, pos]);\n }\n gapNext = tsnPlusOne(tsn);\n });\n const sack = new SackChunk(0, undefined);\n sack.cumulativeTsn = this.lastReceivedTsn!;\n sack.advertisedRwnd = Math.max(0, this.advertisedRwnd);\n sack.duplicates = [...this.sackDuplicates];\n sack.gaps = gaps;\n\n await this.sendChunk(sack).catch((err: Error) => {\n log(\"send sack failed\", err.message);\n });\n\n this.sackDuplicates = [];\n this.sackNeeded = false;\n }\n\n private async receiveChunk(chunk: Chunk) {\n switch (chunk.type) {\n case DataChunk.type:\n {\n this.receiveDataChunk(chunk as DataChunk);\n }\n break;\n case InitChunk.type:\n {\n if (!this.isServer) return;\n const init = chunk as InitChunk;\n\n log(\"receive init\", init);\n this.lastReceivedTsn = tsnMinusOne(init.initialTsn);\n this.reconfigResponseSeq = tsnMinusOne(init.initialTsn);\n this.remoteVerificationTag = init.initiateTag;\n this.ssthresh = init.advertisedRwnd;\n this.getExtensions(init.params);\n\n this._inboundStreamsCount = Math.min(\n init.outboundStreams,\n this._inboundStreamsMax,\n );\n this._outboundStreamsCount = Math.min(\n this._outboundStreamsCount,\n init.inboundStreams,\n );\n\n const ack = new InitAckChunk();\n ack.initiateTag = this.localVerificationTag;\n ack.advertisedRwnd = this.advertisedRwnd;\n ack.outboundStreams = this._outboundStreamsCount;\n ack.inboundStreams = this._inboundStreamsCount;\n ack.initialTsn = this.localTsn;\n this.setExtensions(ack.params);\n\n const time = Date.now() / 1000;\n let cookie = Buffer.from(jspack.Pack(\"!L\", [time]));\n cookie = Buffer.concat([\n cookie,\n createHmac(\"sha1\", this.hmacKey).update(cookie).digest(),\n ]);\n ack.params.push([SCTP_STATE_COOKIE, cookie]);\n log(\"send initAck\", ack);\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send initAck failed\", err.message);\n });\n }\n break;\n case InitAckChunk.type:\n {\n if (this.associationState != SCTP_STATE.COOKIE_WAIT) return;\n\n const initAck = chunk as InitAckChunk;\n this.timer1Cancel();\n this.lastReceivedTsn = tsnMinusOne(initAck.initialTsn);\n this.reconfigResponseSeq = tsnMinusOne(initAck.initialTsn);\n this.remoteVerificationTag = initAck.initiateTag;\n this.ssthresh = initAck.advertisedRwnd;\n this.getExtensions(initAck.params);\n\n this._inboundStreamsCount = Math.min(\n initAck.outboundStreams,\n this._inboundStreamsMax,\n );\n this._outboundStreamsCount = Math.min(\n this._outboundStreamsCount,\n initAck.inboundStreams,\n );\n\n const echo = new CookieEchoChunk();\n for (const [k, v] of initAck.params) {\n if (k === SCTP_STATE_COOKIE) {\n echo.body = v;\n break;\n }\n }\n await this.sendChunk(echo).catch((err: Error) => {\n log(\"send echo failed\", err.message);\n });\n\n this.timer1Start(echo);\n this.setState(SCTP_STATE.COOKIE_ECHOED);\n }\n break;\n case SackChunk.type:\n {\n await this.receiveSackChunk(chunk as SackChunk);\n }\n break;\n case HeartbeatChunk.type:\n {\n const ack = new HeartbeatAckChunk();\n ack.params = (chunk as HeartbeatChunk).params;\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send heartbeat ack failed\", err.message);\n });\n }\n break;\n case AbortChunk.type:\n {\n this.setState(SCTP_STATE.CLOSED);\n }\n break;\n case ShutdownChunk.type:\n {\n this.timer2Cancel();\n this.setState(SCTP_STATE.SHUTDOWN_RECEIVED);\n const ack = new ShutdownAckChunk();\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send shutdown ack failed\", err.message);\n });\n this.t2Start(ack);\n this.setState(SCTP_STATE.SHUTDOWN_SENT);\n }\n break;\n case ErrorChunk.type:\n {\n // 3.3.10. Operation Error (ERROR) (9)\n // An Operation Error is not considered fatal in and of itself, but may be\n // used with an ABORT chunk to report a fatal condition. It has the\n // following parameters:\n log(\"ErrorChunk\", (chunk as ErrorChunk).descriptions);\n }\n break;\n case CookieEchoChunk.type:\n {\n if (!this.isServer) return;\n const data = chunk as CookieEchoChunk;\n const cookie = data.body!;\n const digest = createHmac(\"sha1\", this.hmacKey)\n .update(cookie.slice(0, 4))\n .digest();\n if (\n cookie?.length != COOKIE_LENGTH ||\n !cookie.slice(4).equals(digest)\n ) {\n log(\"x State cookie is invalid\");\n return;\n }\n const now = Date.now() / 1000;\n const stamp = jspack.Unpack(\"!L\", cookie)[0];\n if (stamp < now - COOKIE_LIFETIME || stamp > now) {\n const error = new ErrorChunk(0, undefined);\n error.params.push([\n ErrorChunk.CODE.StaleCookieError,\n Buffer.concat([...Array(8)].map(() => Buffer.from(\"\\x00\"))),\n ]);\n await this.sendChunk(error).catch((err: Error) => {\n log(\"send errorChunk failed\", err.message);\n });\n return;\n }\n const ack = new CookieAckChunk();\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send cookieAck failed\", err.message);\n });\n this.setState(SCTP_STATE.ESTABLISHED);\n }\n break;\n case CookieAckChunk.type:\n {\n if (this.associationState != SCTP_STATE.COOKIE_ECHOED) return;\n this.timer1Cancel();\n this.setState(SCTP_STATE.ESTABLISHED);\n }\n break;\n case ShutdownCompleteChunk.type:\n {\n if (this.associationState != SCTP_STATE.SHUTDOWN_ACK_SENT) return;\n this.timer2Cancel();\n this.setState(SCTP_STATE.CLOSED);\n }\n break;\n // extensions\n case ReconfigChunk.type:\n {\n if (this.associationState != SCTP_STATE.ESTABLISHED) return;\n const reconfig = chunk as ReConfigChunk;\n for (const [type, body] of reconfig.params) {\n const target = RECONFIG_PARAM_BY_TYPES[type];\n if (target) {\n await this.receiveReconfigParam(target.parse(body));\n }\n }\n }\n break;\n case ForwardTsnChunk.type:\n {\n this.receiveForwardTsnChunk(chunk as ForwardTsnChunk);\n }\n break;\n }\n }\n\n private getExtensions(params: [number, Buffer][]) {\n for (const [k, v] of params) {\n if (k === SCTP_PRSCTP_SUPPORTED) {\n this.remotePartialReliability = true;\n } else if (k === SCTP_SUPPORTED_CHUNK_EXT) {\n this.remoteExtensions = [...v];\n }\n }\n }\n\n private async receiveReconfigParam(param: StreamParam) {\n log(\"receiveReconfigParam\", RECONFIG_PARAM_BY_TYPES[param.type]);\n switch (param.type) {\n case OutgoingSSNResetRequestParam.type:\n {\n const p = param as OutgoingSSNResetRequestParam;\n\n // # send response\n const response = new ReconfigResponseParam(\n p.requestSequence,\n reconfigResult.ReconfigResultSuccessPerformed,\n );\n this.reconfigResponseSeq = p.requestSequence;\n await this.sendReconfigParam(response);\n\n // # mark closed inbound streams\n await Promise.all(\n p.streams.map(async (streamId) => {\n delete this.inboundStreams[streamId];\n if (this.outboundStreamSeq[streamId]) {\n this.reconfigQueue.push(streamId);\n // await this.sendResetRequest(streamId);\n }\n }),\n );\n await this.transmitReconfigRequest();\n // # close data channel\n this.onReconfigStreams.execute(p.streams);\n }\n break;\n case ReconfigResponseParam.type:\n {\n const reset = param as ReconfigResponseParam;\n if (reset.result !== reconfigResult.ReconfigResultSuccessPerformed) {\n log(\n \"OutgoingSSNResetRequestParam failed\",\n Object.keys(reconfigResult).find(\n (key) => reconfigResult[key as never] === reset.result,\n ),\n );\n } else if (\n reset.responseSequence === this.reconfigRequest?.requestSequence\n ) {\n const streamIds = this.reconfigRequest.streams.map((streamId) => {\n delete this.outboundStreamSeq[streamId];\n return streamId;\n });\n\n this.onReconfigStreams.execute(streamIds);\n\n this.reconfigRequest = undefined;\n this.timerReconfigCancel();\n if (this.reconfigQueue.length > 0) {\n await this.transmitReconfigRequest();\n }\n }\n }\n break;\n case StreamAddOutgoingParam.type:\n {\n const add = param as StreamAddOutgoingParam;\n this._inboundStreamsCount += add.newStreams;\n const res = new ReconfigResponseParam(add.requestSequence, 1);\n this.reconfigResponseSeq = add.requestSequence;\n await this.sendReconfigParam(res);\n }\n break;\n }\n }\n\n private receiveDataChunk(chunk: DataChunk) {\n this.sackNeeded = true;\n\n if (this.markReceived(chunk.tsn)) return;\n\n const inboundStream = this.getInboundStream(chunk.streamId);\n\n inboundStream.addChunk(chunk);\n this.advertisedRwnd -= chunk.userData.length;\n for (const message of inboundStream.popMessages()) {\n this.advertisedRwnd += message[2].length;\n this.receive(...message);\n }\n }\n\n private async receiveSackChunk(chunk: SackChunk) {\n // \"\"\"\n // Handle a SACK chunk.\n // \"\"\"\n\n if (uint32Gt(this.lastSackedTsn, chunk.cumulativeTsn)) return;\n\n const receivedTime = Date.now() / 1000;\n this.lastSackedTsn = chunk.cumulativeTsn;\n const cwndFullyUtilized = this.flightSize >= this.cwnd;\n let done = 0,\n doneBytes = 0;\n\n // # handle acknowledged data\n while (\n this.sentQueue.length > 0 &&\n uint32Gte(this.lastSackedTsn, this.sentQueue[0].tsn)\n ) {\n const sChunk = this.sentQueue.shift()!;\n done++;\n if (!sChunk?.acked) {\n doneBytes += sChunk.bookSize;\n this.flightSizeDecrease(sChunk);\n }\n\n if (done === 1 && sChunk.sentCount === 1) {\n this.updateRto(receivedTime - sChunk.sentTime!);\n }\n }\n\n // # handle gap blocks\n let loss = false;\n if (chunk.gaps.length > 0) {\n const seen = new Set();\n let highestSeenTsn: number;\n chunk.gaps.forEach((gap) =>\n range(gap[0], gap[1] + 1).forEach((pos) => {\n highestSeenTsn = (chunk.cumulativeTsn + pos) % SCTP_TSN_MODULO;\n seen.add(highestSeenTsn);\n }),\n );\n\n let highestNewlyAcked = chunk.cumulativeTsn;\n for (const sChunk of this.sentQueue) {\n if (uint32Gt(sChunk.tsn, highestSeenTsn!)) {\n break;\n }\n if (seen.has(sChunk.tsn) && !sChunk.acked) {\n doneBytes += sChunk.bookSize;\n sChunk.acked = true;\n this.flightSizeDecrease(sChunk);\n highestNewlyAcked = sChunk.tsn;\n }\n }\n\n // # strike missing chunks prior to HTNA\n for (const sChunk of this.sentQueue) {\n if (uint32Gt(sChunk.tsn, highestNewlyAcked)) {\n break;\n }\n if (!seen.has(sChunk.tsn)) {\n sChunk.misses++;\n if (sChunk.misses === 3) {\n sChunk.misses = 0;\n if (!this.maybeAbandon(sChunk)) {\n sChunk.retransmit = true;\n }\n sChunk.acked = false;\n this.flightSizeDecrease(sChunk);\n loss = true;\n }\n }\n }\n }\n\n // # adjust congestion window\n if (this.fastRecoveryExit === undefined) {\n if (done && cwndFullyUtilized) {\n if (this.cwnd <= this.ssthresh!) {\n this.cwnd += Math.min(doneBytes, USERDATA_MAX_LENGTH);\n } else {\n this.partialBytesAcked += doneBytes;\n if (this.partialBytesAcked >= this.cwnd) {\n this.partialBytesAcked -= this.cwnd;\n this.cwnd += USERDATA_MAX_LENGTH;\n }\n }\n }\n if (loss) {\n this.ssthresh = Math.max(\n Math.floor(this.cwnd / 2),\n 4 * USERDATA_MAX_LENGTH,\n );\n this.cwnd = this.ssthresh;\n this.partialBytesAcked = 0;\n this.fastRecoveryExit = this.sentQueue[this.sentQueue.length - 1].tsn;\n this.fastRecoveryTransmit = true;\n }\n } else if (uint32Gte(chunk.cumulativeTsn, this.fastRecoveryExit)) {\n this.fastRecoveryExit = undefined;\n }\n\n if (this.sentQueue.length === 0) {\n this.timer3Cancel();\n } else if (done > 0) {\n this.timer3Restart();\n }\n\n this.updateAdvancedPeerAckPoint();\n await this.onSackReceived();\n await this.transmit();\n }\n\n receiveForwardTsnChunk(chunk: ForwardTsnChunk) {\n this.sackNeeded = true;\n\n if (uint32Gte(this.lastReceivedTsn!, chunk.cumulativeTsn)) {\n return;\n }\n\n const isObsolete = (x: number) => uint32Gt(x, this.lastReceivedTsn!);\n\n // # advance cumulative TSN\n this.lastReceivedTsn = chunk.cumulativeTsn;\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n for (const tsn of [...this.sackMisOrdered].sort()) {\n if (tsn === tsnPlusOne(this.lastReceivedTsn)) {\n this.lastReceivedTsn = tsn;\n } else {\n break;\n }\n }\n\n // # filter out obsolete entries\n this.sackDuplicates = this.sackDuplicates.filter(isObsolete);\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n\n // # update reassembly\n for (const [streamId, streamSeqNum] of chunk.streams) {\n const inboundStream = this.getInboundStream(streamId);\n\n // # advance sequence number and perform delivery\n inboundStream.streamSequenceNumber = uint16Add(streamSeqNum, 1);\n for (const message of inboundStream.popMessages()) {\n this.advertisedRwnd += message[2].length;\n this.receive(...message);\n }\n }\n\n // # prune obsolete chunks\n Object.values(this.inboundStreams).forEach((inboundStream) => {\n this.advertisedRwnd += inboundStream.pruneChunks(this.lastReceivedTsn!);\n });\n }\n\n private updateRto(R: number) {\n if (!this.srtt) {\n this.rttvar = R / 2;\n this.srtt = R;\n } else {\n this.rttvar =\n (1 - SCTP_RTO_BETA) * this.rttvar! +\n SCTP_RTO_BETA * Math.abs(this.srtt - R);\n this.srtt = (1 - SCTP_RTO_ALPHA) * this.srtt + SCTP_RTO_ALPHA * R;\n }\n this.rto = Math.max(\n SCTP_RTO_MIN,\n Math.min(this.srtt + 4 * this.rttvar, SCTP_RTO_MAX),\n );\n }\n\n private receive(streamId: number, ppId: number, data: Buffer) {\n this.onReceive.execute(streamId, ppId, data);\n }\n\n private getInboundStream(streamId: number) {\n if (!this.inboundStreams[streamId]) {\n this.inboundStreams[streamId] = new InboundStream();\n }\n return this.inboundStreams[streamId];\n }\n\n private markReceived(tsn: number) {\n if (uint32Gte(this.lastReceivedTsn!, tsn) || this.sackMisOrdered.has(tsn)) {\n this.sackDuplicates.push(tsn);\n return true;\n }\n\n this.sackMisOrdered.add(tsn);\n for (const tsn of [...this.sackMisOrdered].sort()) {\n if (tsn === tsnPlusOne(this.lastReceivedTsn!)) {\n this.lastReceivedTsn = tsn;\n } else {\n break;\n }\n }\n\n const isObsolete = (x: number) => uint32Gt(x, this.lastReceivedTsn!);\n\n this.sackDuplicates = this.sackDuplicates.filter(isObsolete);\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n\n return false;\n }\n\n send = async (\n streamId: number,\n ppId: number,\n userData: Buffer,\n {\n expiry,\n maxRetransmits,\n ordered,\n }: {\n expiry?: number | undefined;\n maxRetransmits?: number | undefined;\n ordered?: boolean;\n } = { expiry: undefined, maxRetransmits: undefined, ordered: true },\n ) => {\n const streamSeqNum = ordered ? this.outboundStreamSeq[streamId] || 0 : 0;\n\n const fragments = Math.ceil(userData.length / USERDATA_MAX_LENGTH);\n let pos = 0;\n const chunks: DataChunk[] = [];\n for (const fragment of range(0, fragments)) {\n const chunk = new DataChunk(0, undefined);\n chunk.flags = 0;\n if (!ordered) {\n chunk.flags = SCTP_DATA_UNORDERED;\n }\n if (fragment === 0) {\n chunk.flags |= SCTP_DATA_FIRST_FRAG;\n }\n if (fragment === fragments - 1) {\n chunk.flags |= SCTP_DATA_LAST_FRAG;\n }\n chunk.tsn = this.localTsn;\n chunk.streamId = streamId;\n chunk.streamSeqNum = streamSeqNum;\n chunk.protocol = ppId;\n chunk.userData = userData.slice(pos, pos + USERDATA_MAX_LENGTH);\n chunk.bookSize = chunk.userData.length;\n chunk.expiry = expiry;\n chunk.maxRetransmits = maxRetransmits;\n\n pos += USERDATA_MAX_LENGTH;\n this.localTsn = tsnPlusOne(this.localTsn);\n chunks.push(chunk);\n }\n\n chunks.forEach((chunk) => {\n this.outboundQueue.push(chunk);\n });\n\n if (ordered) {\n this.outboundStreamSeq[streamId] = uint16Add(streamSeqNum, 1);\n }\n\n if (!this.timer3Handle) {\n await this.transmit();\n } else {\n await new Promise((r) => setImmediate(r));\n }\n };\n\n private async transmit() {\n // \"\"\"\n // Transmit outbound data.\n // \"\"\"\n\n // # send FORWARD TSN\n if (this.forwardTsnChunk) {\n await this.sendChunk(this.forwardTsnChunk).catch((err: Error) => {\n log(\"send forwardTsn failed\", err.message);\n });\n this.forwardTsnChunk = undefined;\n\n if (!this.timer3Handle) {\n this.timer3Start();\n }\n }\n\n const burstSize =\n this.fastRecoveryExit != undefined\n ? 2 * USERDATA_MAX_LENGTH\n : 4 * USERDATA_MAX_LENGTH;\n\n const cwnd = Math.min(this.flightSize + burstSize, this.cwnd);\n\n let retransmitEarliest = true;\n for (const dataChunk of this.sentQueue) {\n if (dataChunk.retransmit) {\n if (this.fastRecoveryTransmit) {\n this.fastRecoveryTransmit = false;\n } else if (this.flightSize >= cwnd) {\n return;\n }\n this.flightSizeIncrease(dataChunk);\n\n dataChunk.misses = 0;\n dataChunk.retransmit = false;\n dataChunk.sentCount++;\n await this.sendChunk(dataChunk).catch((err: Error) => {\n log(\"send data failed\", err.message);\n });\n\n if (retransmitEarliest) {\n this.timer3Restart();\n }\n }\n retransmitEarliest = false;\n }\n\n // for performance todo fix\n while (this.outboundQueue.length > 0) {\n const chunk = this.outboundQueue.shift();\n if (!chunk) return;\n\n this.sentQueue.push(chunk);\n this.flightSizeIncrease(chunk);\n\n // # update counters\n chunk.sentCount++;\n chunk.sentTime = Date.now() / 1000;\n\n await this.sendChunk(chunk).catch((err: Error) => {\n log(\"send data outboundQueue failed\", err.message);\n });\n if (!this.timer3Handle) {\n this.timer3Start();\n }\n }\n }\n\n async transmitReconfigRequest() {\n if (\n this.reconfigQueue.length > 0 &&\n this.associationState === SCTP_STATE.ESTABLISHED &&\n !this.reconfigRequest\n ) {\n const streams = this.reconfigQueue.slice(0, RECONFIG_MAX_STREAMS);\n\n this.reconfigQueue = this.reconfigQueue.slice(RECONFIG_MAX_STREAMS);\n const param = new OutgoingSSNResetRequestParam(\n this.reconfigRequestSeq,\n this.reconfigResponseSeq,\n tsnMinusOne(this.localTsn),\n streams,\n );\n this.reconfigRequestSeq = tsnPlusOne(this.reconfigRequestSeq);\n\n this.reconfigRequest = param;\n await this.sendReconfigParam(param);\n this.timerReconfigHandleStart();\n }\n }\n\n async sendReconfigParam(param: StreamParam) {\n log(\"sendReconfigParam\", param);\n const chunk = new ReconfigChunk();\n chunk.params.push([param.type, param.bytes]);\n await this.sendChunk(chunk).catch((err: Error) => {\n log(\"send reconfig failed\", err.message);\n });\n }\n\n // https://github.com/pion/sctp/pull/44/files\n private async sendResetRequest(streamId: number) {\n log(\"sendResetRequest\", streamId);\n const chunk = new DataChunk(0, undefined);\n chunk.streamId = streamId;\n this.outboundQueue.push(chunk);\n if (!this.timer3Handle) {\n await this.transmit();\n }\n }\n\n private flightSizeIncrease(chunk: DataChunk) {\n this.flightSize += chunk.bookSize;\n }\n\n private flightSizeDecrease(chunk: DataChunk) {\n this.flightSize = Math.max(0, this.flightSize - chunk.bookSize);\n }\n\n // # timers\n\n /**t1 is wait for initAck or cookieAck */\n private timer1Start(chunk: Chunk) {\n if (this.timer1Handle) throw new Error();\n this.timer1Chunk = chunk;\n this.timer1Failures = 0;\n this.timer1Handle = setTimeout(this.timer1Expired, this.rto * 1000);\n }\n\n private timer1Expired = () => {\n this.timer1Failures++;\n this.timer1Handle = undefined;\n if (this.timer1Failures > SCTP_MAX_INIT_RETRANS) {\n this.setState(SCTP_STATE.CLOSED);\n } else {\n setImmediate(() => {\n this.sendChunk(this.timer1Chunk!).catch((err: Error) => {\n log(\"send timer1 chunk failed\", err.message);\n });\n });\n this.timer1Handle = setTimeout(this.timer1Expired, this.rto * 1000);\n }\n };\n\n private timer1Cancel() {\n if (this.timer1Handle) {\n clearTimeout(this.timer1Handle);\n this.timer1Handle = undefined;\n this.timer1Chunk = undefined;\n }\n }\n\n /**t2 is wait for shutdown */\n private t2Start(chunk: Chunk) {\n if (this.timer2Handle) throw new Error();\n this.timer2Chunk = chunk;\n this.timer2Failures = 0;\n this.timer2Handle = setTimeout(this.timer2Expired, this.rto * 1000);\n }\n\n private timer2Expired = () => {\n this.timer2Failures++;\n this.timer2Handle = undefined;\n if (this.timer2Failures > SCTP_MAX_ASSOCIATION_RETRANS) {\n this.setState(SCTP_STATE.CLOSED);\n } else {\n setImmediate(() => {\n this.sendChunk(this.timer2Chunk!).catch((err: Error) => {\n log(\"send timer2Chunk failed\", err.message);\n });\n });\n this.timer2Handle = setTimeout(this.timer2Expired, this.rto * 1000);\n }\n };\n\n private timer2Cancel() {\n if (this.timer2Handle) {\n clearTimeout(this.timer2Handle);\n this.timer2Handle = undefined;\n this.timer2Chunk = undefined;\n }\n }\n\n /**t3 is wait for data sack */\n private timer3Start() {\n if (this.timer3Handle) throw new Error();\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto * 1000);\n }\n\n private timer3Restart() {\n this.timer3Cancel();\n // for performance\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto);\n }\n\n private timer3Expired = () => {\n this.timer3Handle = undefined;\n\n // # mark retransmit or abandoned chunks\n this.sentQueue.forEach((chunk) => {\n if (!this.maybeAbandon(chunk)) {\n chunk.retransmit = true;\n }\n });\n this.updateAdvancedPeerAckPoint();\n\n // # adjust congestion window\n this.fastRecoveryExit = undefined;\n this.flightSize = 0;\n this.partialBytesAcked = 0;\n\n this.ssthresh = Math.max(\n Math.floor(this.cwnd / 2),\n 4 * USERDATA_MAX_LENGTH,\n );\n this.cwnd = USERDATA_MAX_LENGTH;\n\n this.transmit();\n };\n\n private timer3Cancel() {\n if (this.timer3Handle) {\n clearTimeout(this.timer3Handle);\n this.timer3Handle = undefined;\n }\n }\n\n /**Re-configuration Timer */\n private timerReconfigHandleStart() {\n if (this.timerReconfigHandle) return;\n log(\"timerReconfigHandleStart\", { rto: this.rto });\n this.timerReconfigFailures = 0;\n this.timerReconfigHandle = setTimeout(\n this.timerReconfigHandleExpired,\n this.rto * 1000,\n );\n }\n\n private timerReconfigHandleExpired = async () => {\n this.timerReconfigFailures++;\n // back off\n this.rto = Math.ceil(this.rto * 1.5);\n\n if (this.timerReconfigFailures > SCTP_MAX_ASSOCIATION_RETRANS) {\n log(\"timerReconfigFailures\", this.timerReconfigFailures);\n this.setState(SCTP_STATE.CLOSED);\n\n this.timerReconfigHandle = undefined;\n } else if (this.reconfigRequest) {\n log(\"timerReconfigHandleExpired\", this.timerReconfigFailures, this.rto);\n await this.sendReconfigParam(this.reconfigRequest);\n\n this.timerReconfigHandle = setTimeout(\n this.timerReconfigHandleExpired,\n this.rto * 1000,\n );\n }\n };\n\n private timerReconfigCancel() {\n if (this.timerReconfigHandle) {\n log(\"timerReconfigCancel\");\n clearTimeout(this.timerReconfigHandle);\n this.timerReconfigHandle = undefined;\n }\n }\n\n private updateAdvancedPeerAckPoint() {\n if (uint32Gt(this.lastSackedTsn, this.advancedPeerAckTsn)) {\n this.advancedPeerAckTsn = this.lastSackedTsn;\n }\n\n let done = 0;\n const streams: { [key: number]: number } = {};\n while (this.sentQueue.length > 0 && this.sentQueue[0].abandoned) {\n const chunk = this.sentQueue.shift()!;\n this.advancedPeerAckTsn = chunk.tsn;\n done++;\n if (!(chunk.flags & SCTP_DATA_UNORDERED)) {\n streams[chunk.streamId] = chunk.streamSeqNum;\n }\n }\n\n if (done) {\n this.forwardTsnChunk = new ForwardTsnChunk(0, undefined);\n this.forwardTsnChunk.cumulativeTsn = this.advancedPeerAckTsn;\n this.forwardTsnChunk.streams = Object.entries(streams).map(([k, v]) => [\n Number(k),\n v,\n ]);\n }\n }\n\n private maybeAbandon(chunk: DataChunk): boolean {\n if (chunk.abandoned) return true;\n const abandon =\n (!!chunk.maxRetransmits && chunk.maxRetransmits < chunk.sentCount!) ||\n (!!chunk.expiry && chunk.expiry < Date.now() / 1000);\n if (!abandon) return false;\n\n const chunkPos = this.sentQueue.findIndex((v) => v.type === chunk.type);\n for (const pos of range(chunkPos, -1, -1)) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n for (const pos of range(chunkPos, this.sentQueue.length)) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n return true;\n }\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.remotePort = port;\n }\n\n async start(remotePort?: number) {\n if (!this.started) {\n this.started = true;\n this.setConnectionState(\"connecting\");\n\n if (remotePort) {\n this.setRemotePort(remotePort);\n }\n\n if (!this.isServer) {\n await this.init();\n }\n }\n }\n\n private async init() {\n const init = new InitChunk();\n init.initiateTag = this.localVerificationTag;\n init.advertisedRwnd = this.advertisedRwnd;\n init.outboundStreams = this._outboundStreamsCount;\n init.inboundStreams = this._inboundStreamsMax;\n init.initialTsn = this.localTsn;\n this.setExtensions(init.params);\n log(\"send init\", init);\n\n try {\n await this.sendChunk(init);\n\n // # start T1 timer and enter COOKIE-WAIT state\n this.timer1Start(init);\n this.setState(SCTP_STATE.COOKIE_WAIT);\n } catch (error: any) {\n log(\"send init failed\", error.message);\n }\n }\n\n private setExtensions(params: [number, Buffer][]) {\n const extensions: number[] = [];\n if (this.localPartialReliability) {\n params.push([SCTP_PRSCTP_SUPPORTED, Buffer.from(\"\")]);\n extensions.push(ForwardTsnChunk.type);\n }\n\n extensions.push(ReConfigChunk.type);\n params.push([SCTP_SUPPORTED_CHUNK_EXT, Buffer.from(extensions)]);\n }\n\n async sendChunk(chunk: Chunk) {\n if (this.state === \"closed\") return;\n if (this.remotePort === undefined) {\n throw new Error(\"invalid remote port\");\n }\n\n const packet = serializePacket(\n this.localPort,\n this.remotePort,\n this.remoteVerificationTag,\n chunk,\n );\n await this.transport.send(packet);\n }\n\n setState(state: SCTP_STATE) {\n if (state != this.associationState) {\n this.associationState = state;\n }\n if (state === SCTP_STATE.ESTABLISHED) {\n this.setConnectionState(\"connected\");\n } else if (state === SCTP_STATE.CLOSED) {\n this.timer1Cancel();\n this.timer2Cancel();\n this.timer3Cancel();\n this.timerReconfigCancel();\n this.setConnectionState(\"closed\");\n this.removeAllListeners();\n }\n }\n\n setConnectionState(state: SCTPConnectionState) {\n this.state = state;\n log(\"setConnectionState\", state);\n this.stateChanged[state].execute();\n }\n\n async stop() {\n if (this.associationState !== SCTP_STATE.CLOSED) {\n await this.abort();\n }\n this.setState(SCTP_STATE.CLOSED);\n clearTimeout(this.timer1Handle);\n clearTimeout(this.timer2Handle);\n clearTimeout(this.timer3Handle);\n clearTimeout(this.timerReconfigHandle);\n }\n\n async abort() {\n const abort = new AbortChunk();\n await this.sendChunk(abort).catch((err: Error) => {\n log(\"send abort failed\", err.message);\n });\n }\n\n private removeAllListeners() {\n Object.values(this.stateChanged).forEach((v) => v.allUnsubscribe());\n }\n}\n\nexport class InboundStream {\n reassembly: DataChunk[] = [];\n streamSequenceNumber = 0; // SSN\n\n constructor() {}\n\n addChunk(chunk: DataChunk) {\n if (\n this.reassembly.length === 0 ||\n uint32Gt(chunk.tsn, this.reassembly[this.reassembly.length - 1].tsn)\n ) {\n this.reassembly.push(chunk);\n return;\n }\n\n for (const [i, v] of enumerate(this.reassembly)) {\n if (v.tsn === chunk.tsn) throw new Error(\"duplicate chunk in reassembly\");\n\n if (uint32Gt(v.tsn, chunk.tsn)) {\n this.reassembly.splice(i, 0, chunk);\n break;\n }\n }\n }\n\n *popMessages(): Generator<[number, number, Buffer]> {\n let pos = 0;\n let startPos: number | undefined;\n let expectedTsn: number;\n let ordered: boolean | undefined;\n while (pos < this.reassembly.length) {\n const chunk = this.reassembly[pos];\n if (startPos === undefined) {\n ordered = !(chunk.flags & SCTP_DATA_UNORDERED);\n if (!(chunk.flags & SCTP_DATA_FIRST_FRAG)) {\n if (ordered) {\n break;\n } else {\n pos++;\n continue;\n }\n }\n if (\n ordered &&\n uint16Gt(chunk.streamSeqNum, this.streamSequenceNumber)\n ) {\n break;\n }\n expectedTsn = chunk.tsn;\n startPos = pos;\n } else if (chunk.tsn !== expectedTsn!) {\n if (ordered!) {\n break;\n } else {\n startPos = undefined;\n pos++;\n continue;\n }\n }\n\n if (chunk.flags & SCTP_DATA_LAST_FRAG) {\n const arr = this.reassembly\n .slice(startPos, pos + 1)\n .map((c) => c.userData)\n .reduce((acc, cur) => {\n acc.push(cur);\n acc.push(Buffer.from(\"\"));\n return acc;\n }, [] as Buffer[]);\n arr.pop();\n const userData = Buffer.concat(arr);\n\n this.reassembly = [\n ...this.reassembly.slice(0, startPos),\n ...this.reassembly.slice(pos + 1),\n ];\n if (ordered && chunk.streamSeqNum === this.streamSequenceNumber) {\n this.streamSequenceNumber = uint16Add(this.streamSequenceNumber, 1);\n }\n pos = startPos;\n yield [chunk.streamId, chunk.protocol, userData];\n } else {\n pos++;\n }\n expectedTsn = tsnPlusOne(expectedTsn);\n }\n }\n\n pruneChunks(tsn: number) {\n // \"\"\"\n // Prune chunks up to the given TSN.\n // \"\"\"\n\n let pos = -1,\n size = 0;\n\n for (const [i, chunk] of this.reassembly.entries()) {\n if (uint32Gte(tsn, chunk.tsn)) {\n pos = i;\n size += chunk.userData.length;\n } else {\n break;\n }\n }\n\n this.reassembly = this.reassembly.slice(pos + 1);\n return size;\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nfunction tsnMinusOne(a: number) {\n return (a - 1) % SCTP_TSN_MODULO;\n}\n\nfunction tsnPlusOne(a: number) {\n return (a + 1) % SCTP_TSN_MODULO;\n}\n"]}
1
+ {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../sctp/src/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\nimport debug from \"debug\";\nimport range from \"lodash/range\";\nimport { Event } from \"./imports/common\";\n\nimport {\n random32,\n uint16Add,\n uint16Gt,\n uint32Gt,\n uint32Gte,\n} from \"../../common/src\";\nimport {\n AbortChunk,\n type Chunk,\n CookieAckChunk,\n CookieEchoChunk,\n DataChunk,\n ErrorChunk,\n ForwardTsnChunk,\n HeartbeatAckChunk,\n HeartbeatChunk,\n InitAckChunk,\n InitChunk,\n ReConfigChunk,\n ReconfigChunk,\n SackChunk,\n ShutdownAckChunk,\n ShutdownChunk,\n ShutdownCompleteChunk,\n parsePacket,\n serializePacket,\n} from \"./chunk\";\nimport { SCTP_STATE } from \"./const\";\nimport { type Unpacked, createEventsFromList, enumerate } from \"./helper\";\nimport {\n OutgoingSSNResetRequestParam,\n RECONFIG_PARAM_BY_TYPES,\n ReconfigResponseParam,\n StreamAddOutgoingParam,\n type StreamParam,\n reconfigResult,\n} from \"./param\";\nimport type { Transport } from \"./transport\";\n\nconst log = debug(\"werift/sctp/sctp\");\n\n// SSN: Stream Sequence Number\n\n// # local constants\nconst COOKIE_LENGTH = 24;\nconst COOKIE_LIFETIME = 60;\nconst MAX_STREAMS = 65535;\nconst USERDATA_MAX_LENGTH = 1200;\n\n// # protocol constants\nconst SCTP_DATA_LAST_FRAG = 0x01;\nconst SCTP_DATA_FIRST_FRAG = 0x02;\nconst SCTP_DATA_UNORDERED = 0x04;\n\nconst SCTP_MAX_ASSOCIATION_RETRANS = 10;\nconst SCTP_MAX_INIT_RETRANS = 8;\nconst SCTP_RTO_ALPHA = 1 / 8;\nconst SCTP_RTO_BETA = 1 / 4;\nconst SCTP_RTO_INITIAL = 3;\nconst SCTP_RTO_MIN = 1;\nconst SCTP_RTO_MAX = 60;\nconst SCTP_TSN_MODULO = 2 ** 32;\n\nconst RECONFIG_MAX_STREAMS = 135;\n\n// # parameters\nconst SCTP_STATE_COOKIE = 0x0007;\nconst SCTP_SUPPORTED_CHUNK_EXT = 0x8008; //32778\nconst SCTP_PRSCTP_SUPPORTED = 0xc000; //49152\n\nconst SCTPConnectionStates = [\n \"new\",\n \"closed\",\n \"connected\",\n \"connecting\",\n] as const;\ntype SCTPConnectionState = Unpacked<typeof SCTPConnectionStates>;\n\nexport class SCTP {\n readonly stateChanged: {\n [key in SCTPConnectionState]: Event<[]>;\n } = createEventsFromList(SCTPConnectionStates);\n readonly onReconfigStreams = new Event<[number[]]>();\n /**streamId: number, ppId: number, data: Buffer */\n readonly onReceive = new Event<[number, number, Buffer]>();\n onSackReceived: () => Promise<void> = async () => {};\n\n associationState = SCTP_STATE.CLOSED;\n started = false;\n state: SCTPConnectionState = \"new\";\n isServer = true;\n\n private hmacKey = randomBytes(16);\n private localPartialReliability = true;\n private localPort: number;\n private localVerificationTag = random32();\n\n remoteExtensions: number[] = [];\n remotePartialReliability = true;\n private remotePort?: number;\n private remoteVerificationTag = 0;\n\n // inbound\n private advertisedRwnd = 1024 * 1024; // Receiver Window\n private inboundStreams: { [key: number]: InboundStream } = {};\n _inboundStreamsCount = 0;\n _inboundStreamsMax = MAX_STREAMS;\n private lastReceivedTsn?: number; // Transmission Sequence Number\n private sackDuplicates: number[] = [];\n private sackMisOrdered = new Set<number>();\n private sackNeeded = false;\n\n // # outbound\n private cwnd = 3 * USERDATA_MAX_LENGTH; // Congestion Window\n private fastRecoveryExit?: number;\n private fastRecoveryTransmit = false;\n private forwardTsnChunk?: ForwardTsnChunk;\n private flightSize = 0;\n outboundQueue: DataChunk[] = [];\n private outboundStreamSeq: { [streamId: number]: number } = {};\n _outboundStreamsCount = MAX_STREAMS;\n /**local transmission sequence number */\n private localTsn = Number(random32());\n private lastSackedTsn = tsnMinusOne(this.localTsn);\n private advancedPeerAckTsn = tsnMinusOne(this.localTsn); // acknowledgement\n private partialBytesAcked = 0;\n private sentQueue: DataChunk[] = [];\n\n // # reconfiguration\n\n /**初期TSNと同じ値に初期化される単調に増加する数です. これは、新しいre-configuration requestパラメーターを送信するたびに1ずつ増加します */\n reconfigRequestSeq = this.localTsn;\n /**このフィールドは、incoming要求のre-configuration requestシーケンス番号を保持します. 他の場合では、次に予想されるre-configuration requestシーケンス番号から1を引いた値が保持されます */\n reconfigResponseSeq = 0;\n reconfigRequest?: OutgoingSSNResetRequestParam;\n reconfigQueue: number[] = [];\n\n // rtt calculation\n private srtt?: number;\n private rttvar?: number;\n\n // timers\n private rto = SCTP_RTO_INITIAL;\n /**t1 is wait for initAck or cookieAck */\n private timer1Handle?: any;\n private timer1Chunk?: Chunk;\n private timer1Failures = 0;\n /**t2 is wait for shutdown */\n private timer2Handle?: any;\n private timer2Chunk?: Chunk;\n private timer2Failures = 0;\n /**t3 is wait for data sack */\n private timer3Handle?: any;\n /**Re-configuration Timer */\n private timerReconfigHandle?: any;\n private timerReconfigFailures = 0;\n\n // etc\n private ssthresh?: number; // slow start threshold\n\n constructor(\n public transport: Transport,\n public port = 5000,\n ) {\n this.localPort = this.port;\n this.transport.onData = (buf) => {\n this.handleData(buf);\n };\n }\n\n get maxChannels() {\n if (this._inboundStreamsCount > 0) {\n return Math.min(this._inboundStreamsCount, this._outboundStreamsCount);\n }\n return undefined;\n }\n\n static client(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = false;\n return sctp;\n }\n\n static server(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = true;\n return sctp;\n }\n\n // call from dtls transport\n private async handleData(data: Buffer) {\n let expectedTag: number;\n\n const [, , verificationTag, chunks] = parsePacket(data);\n const initChunk = chunks.filter((v) => v.type === InitChunk.type).length;\n if (initChunk > 0) {\n if (chunks.length != 1) {\n throw new Error();\n }\n expectedTag = 0;\n } else {\n expectedTag = this.localVerificationTag;\n }\n\n if (verificationTag !== expectedTag) {\n return;\n }\n\n for (const chunk of chunks) {\n await this.receiveChunk(chunk);\n }\n\n if (this.sackNeeded) {\n await this.sendSack();\n }\n }\n\n private async sendSack() {\n const gaps: [number, number][] = [];\n let gapNext: number;\n [...this.sackMisOrdered].sort().forEach((tsn) => {\n const pos = (tsn - this.lastReceivedTsn!) % SCTP_TSN_MODULO;\n if (tsn === gapNext) {\n gaps[gaps.length - 1][1] = pos;\n } else {\n gaps.push([pos, pos]);\n }\n gapNext = tsnPlusOne(tsn);\n });\n const sack = new SackChunk(0, undefined);\n sack.cumulativeTsn = this.lastReceivedTsn!;\n sack.advertisedRwnd = Math.max(0, this.advertisedRwnd);\n sack.duplicates = [...this.sackDuplicates];\n sack.gaps = gaps;\n\n await this.sendChunk(sack).catch((err: Error) => {\n log(\"send sack failed\", err.message);\n });\n\n this.sackDuplicates = [];\n this.sackNeeded = false;\n }\n\n private async receiveChunk(chunk: Chunk) {\n switch (chunk.type) {\n case DataChunk.type:\n {\n this.receiveDataChunk(chunk as DataChunk);\n }\n break;\n case InitChunk.type:\n {\n if (!this.isServer) return;\n const init = chunk as InitChunk;\n\n log(\"receive init\", init);\n this.lastReceivedTsn = tsnMinusOne(init.initialTsn);\n this.reconfigResponseSeq = tsnMinusOne(init.initialTsn);\n this.remoteVerificationTag = init.initiateTag;\n this.ssthresh = init.advertisedRwnd;\n this.getExtensions(init.params);\n\n this._inboundStreamsCount = Math.min(\n init.outboundStreams,\n this._inboundStreamsMax,\n );\n this._outboundStreamsCount = Math.min(\n this._outboundStreamsCount,\n init.inboundStreams,\n );\n\n const ack = new InitAckChunk();\n ack.initiateTag = this.localVerificationTag;\n ack.advertisedRwnd = this.advertisedRwnd;\n ack.outboundStreams = this._outboundStreamsCount;\n ack.inboundStreams = this._inboundStreamsCount;\n ack.initialTsn = this.localTsn;\n this.setExtensions(ack.params);\n\n const time = Date.now() / 1000;\n let cookie = Buffer.from(jspack.Pack(\"!L\", [time]));\n cookie = Buffer.concat([\n cookie,\n createHmac(\"sha1\", this.hmacKey).update(cookie).digest(),\n ]);\n ack.params.push([SCTP_STATE_COOKIE, cookie]);\n log(\"send initAck\", ack);\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send initAck failed\", err.message);\n });\n }\n break;\n case InitAckChunk.type:\n {\n if (this.associationState != SCTP_STATE.COOKIE_WAIT) return;\n\n const initAck = chunk as InitAckChunk;\n this.timer1Cancel();\n this.lastReceivedTsn = tsnMinusOne(initAck.initialTsn);\n this.reconfigResponseSeq = tsnMinusOne(initAck.initialTsn);\n this.remoteVerificationTag = initAck.initiateTag;\n this.ssthresh = initAck.advertisedRwnd;\n this.getExtensions(initAck.params);\n\n this._inboundStreamsCount = Math.min(\n initAck.outboundStreams,\n this._inboundStreamsMax,\n );\n this._outboundStreamsCount = Math.min(\n this._outboundStreamsCount,\n initAck.inboundStreams,\n );\n\n const echo = new CookieEchoChunk();\n for (const [k, v] of initAck.params) {\n if (k === SCTP_STATE_COOKIE) {\n echo.body = v;\n break;\n }\n }\n await this.sendChunk(echo).catch((err: Error) => {\n log(\"send echo failed\", err.message);\n });\n\n this.timer1Start(echo);\n this.setState(SCTP_STATE.COOKIE_ECHOED);\n }\n break;\n case SackChunk.type:\n {\n await this.receiveSackChunk(chunk as SackChunk);\n }\n break;\n case HeartbeatChunk.type:\n {\n const ack = new HeartbeatAckChunk();\n ack.params = (chunk as HeartbeatChunk).params;\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send heartbeat ack failed\", err.message);\n });\n }\n break;\n case AbortChunk.type:\n {\n this.setState(SCTP_STATE.CLOSED);\n }\n break;\n case ShutdownChunk.type:\n {\n this.timer2Cancel();\n this.setState(SCTP_STATE.SHUTDOWN_RECEIVED);\n const ack = new ShutdownAckChunk();\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send shutdown ack failed\", err.message);\n });\n this.t2Start(ack);\n this.setState(SCTP_STATE.SHUTDOWN_SENT);\n }\n break;\n case ErrorChunk.type:\n {\n // 3.3.10. Operation Error (ERROR) (9)\n // An Operation Error is not considered fatal in and of itself, but may be\n // used with an ABORT chunk to report a fatal condition. It has the\n // following parameters:\n log(\"ErrorChunk\", (chunk as ErrorChunk).descriptions);\n }\n break;\n case CookieEchoChunk.type:\n {\n if (!this.isServer) return;\n const data = chunk as CookieEchoChunk;\n const cookie = data.body!;\n const digest = createHmac(\"sha1\", this.hmacKey)\n .update(cookie.slice(0, 4))\n .digest();\n if (\n cookie?.length != COOKIE_LENGTH ||\n !cookie.slice(4).equals(digest)\n ) {\n log(\"x State cookie is invalid\");\n return;\n }\n const now = Date.now() / 1000;\n const stamp = jspack.Unpack(\"!L\", cookie)[0];\n if (stamp < now - COOKIE_LIFETIME || stamp > now) {\n const error = new ErrorChunk(0, undefined);\n error.params.push([\n ErrorChunk.CODE.StaleCookieError,\n Buffer.concat([...Array(8)].map(() => Buffer.from(\"\\x00\"))),\n ]);\n await this.sendChunk(error).catch((err: Error) => {\n log(\"send errorChunk failed\", err.message);\n });\n return;\n }\n const ack = new CookieAckChunk();\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send cookieAck failed\", err.message);\n });\n this.setState(SCTP_STATE.ESTABLISHED);\n }\n break;\n case CookieAckChunk.type:\n {\n if (this.associationState != SCTP_STATE.COOKIE_ECHOED) return;\n this.timer1Cancel();\n this.setState(SCTP_STATE.ESTABLISHED);\n }\n break;\n case ShutdownCompleteChunk.type:\n {\n if (this.associationState != SCTP_STATE.SHUTDOWN_ACK_SENT) return;\n this.timer2Cancel();\n this.setState(SCTP_STATE.CLOSED);\n }\n break;\n // extensions\n case ReconfigChunk.type:\n {\n if (this.associationState != SCTP_STATE.ESTABLISHED) return;\n const reconfig = chunk as ReConfigChunk;\n for (const [type, body] of reconfig.params) {\n const target = RECONFIG_PARAM_BY_TYPES[type];\n if (target) {\n await this.receiveReconfigParam(target.parse(body));\n }\n }\n }\n break;\n case ForwardTsnChunk.type:\n {\n this.receiveForwardTsnChunk(chunk as ForwardTsnChunk);\n }\n break;\n }\n }\n\n private getExtensions(params: [number, Buffer][]) {\n for (const [k, v] of params) {\n if (k === SCTP_PRSCTP_SUPPORTED) {\n this.remotePartialReliability = true;\n } else if (k === SCTP_SUPPORTED_CHUNK_EXT) {\n this.remoteExtensions = [...v];\n }\n }\n }\n\n private async receiveReconfigParam(param: StreamParam) {\n log(\"receiveReconfigParam\", RECONFIG_PARAM_BY_TYPES[param.type]);\n switch (param.type) {\n case OutgoingSSNResetRequestParam.type:\n {\n const p = param as OutgoingSSNResetRequestParam;\n\n // # send response\n const response = new ReconfigResponseParam(\n p.requestSequence,\n reconfigResult.ReconfigResultSuccessPerformed,\n );\n this.reconfigResponseSeq = p.requestSequence;\n await this.sendReconfigParam(response);\n\n // # mark closed inbound streams\n await Promise.all(\n p.streams.map(async (streamId) => {\n delete this.inboundStreams[streamId];\n if (this.outboundStreamSeq[streamId]) {\n this.reconfigQueue.push(streamId);\n // await this.sendResetRequest(streamId);\n }\n }),\n );\n await this.transmitReconfigRequest();\n // # close data channel\n this.onReconfigStreams.execute(p.streams);\n }\n break;\n case ReconfigResponseParam.type:\n {\n const reset = param as ReconfigResponseParam;\n if (reset.result !== reconfigResult.ReconfigResultSuccessPerformed) {\n log(\n \"OutgoingSSNResetRequestParam failed\",\n Object.keys(reconfigResult).find(\n (key) => reconfigResult[key as never] === reset.result,\n ),\n );\n } else if (\n reset.responseSequence === this.reconfigRequest?.requestSequence\n ) {\n const streamIds = this.reconfigRequest.streams.map((streamId) => {\n delete this.outboundStreamSeq[streamId];\n return streamId;\n });\n\n this.onReconfigStreams.execute(streamIds);\n\n this.reconfigRequest = undefined;\n this.timerReconfigCancel();\n if (this.reconfigQueue.length > 0) {\n await this.transmitReconfigRequest();\n }\n }\n }\n break;\n case StreamAddOutgoingParam.type:\n {\n const add = param as StreamAddOutgoingParam;\n this._inboundStreamsCount += add.newStreams;\n const res = new ReconfigResponseParam(add.requestSequence, 1);\n this.reconfigResponseSeq = add.requestSequence;\n await this.sendReconfigParam(res);\n }\n break;\n }\n }\n\n private receiveDataChunk(chunk: DataChunk) {\n this.sackNeeded = true;\n\n if (this.markReceived(chunk.tsn)) return;\n\n const inboundStream = this.getInboundStream(chunk.streamId);\n\n inboundStream.addChunk(chunk);\n this.advertisedRwnd -= chunk.userData.length;\n for (const message of inboundStream.popMessages()) {\n this.advertisedRwnd += message[2].length;\n this.receive(...message);\n }\n }\n\n private async receiveSackChunk(chunk: SackChunk) {\n // \"\"\"\n // Handle a SACK chunk.\n // \"\"\"\n\n if (uint32Gt(this.lastSackedTsn, chunk.cumulativeTsn)) return;\n\n const receivedTime = Date.now() / 1000;\n this.lastSackedTsn = chunk.cumulativeTsn;\n const cwndFullyUtilized = this.flightSize >= this.cwnd;\n let done = 0,\n doneBytes = 0;\n\n // # handle acknowledged data\n while (\n this.sentQueue.length > 0 &&\n uint32Gte(this.lastSackedTsn, this.sentQueue[0].tsn)\n ) {\n const sChunk = this.sentQueue.shift()!;\n done++;\n if (!sChunk?.acked) {\n doneBytes += sChunk.bookSize;\n this.flightSizeDecrease(sChunk);\n }\n\n if (done === 1 && sChunk.sentCount === 1) {\n this.updateRto(receivedTime - sChunk.sentTime!);\n }\n }\n\n // # handle gap blocks\n let loss = false;\n if (chunk.gaps.length > 0) {\n const seen = new Set();\n let highestSeenTsn: number;\n chunk.gaps.forEach((gap) =>\n range(gap[0], gap[1] + 1).forEach((pos) => {\n highestSeenTsn = (chunk.cumulativeTsn + pos) % SCTP_TSN_MODULO;\n seen.add(highestSeenTsn);\n }),\n );\n\n let highestNewlyAcked = chunk.cumulativeTsn;\n for (const sChunk of this.sentQueue) {\n if (uint32Gt(sChunk.tsn, highestSeenTsn!)) {\n break;\n }\n if (seen.has(sChunk.tsn) && !sChunk.acked) {\n doneBytes += sChunk.bookSize;\n sChunk.acked = true;\n this.flightSizeDecrease(sChunk);\n highestNewlyAcked = sChunk.tsn;\n }\n }\n\n // # strike missing chunks prior to HTNA\n for (const sChunk of this.sentQueue) {\n if (uint32Gt(sChunk.tsn, highestNewlyAcked)) {\n break;\n }\n if (!seen.has(sChunk.tsn)) {\n sChunk.misses++;\n if (sChunk.misses === 3) {\n sChunk.misses = 0;\n if (!this.maybeAbandon(sChunk)) {\n sChunk.retransmit = true;\n }\n sChunk.acked = false;\n this.flightSizeDecrease(sChunk);\n loss = true;\n }\n }\n }\n }\n\n // # adjust congestion window\n if (this.fastRecoveryExit === undefined) {\n if (done && cwndFullyUtilized) {\n if (this.cwnd <= this.ssthresh!) {\n this.cwnd += Math.min(doneBytes, USERDATA_MAX_LENGTH);\n } else {\n this.partialBytesAcked += doneBytes;\n if (this.partialBytesAcked >= this.cwnd) {\n this.partialBytesAcked -= this.cwnd;\n this.cwnd += USERDATA_MAX_LENGTH;\n }\n }\n }\n if (loss) {\n this.ssthresh = Math.max(\n Math.floor(this.cwnd / 2),\n 4 * USERDATA_MAX_LENGTH,\n );\n this.cwnd = this.ssthresh;\n this.partialBytesAcked = 0;\n this.fastRecoveryExit = this.sentQueue[this.sentQueue.length - 1].tsn;\n this.fastRecoveryTransmit = true;\n }\n } else if (uint32Gte(chunk.cumulativeTsn, this.fastRecoveryExit)) {\n this.fastRecoveryExit = undefined;\n }\n\n if (this.sentQueue.length === 0) {\n this.timer3Cancel();\n } else if (done > 0) {\n this.timer3Restart();\n }\n\n this.updateAdvancedPeerAckPoint();\n await this.onSackReceived();\n await this.transmit();\n }\n\n receiveForwardTsnChunk(chunk: ForwardTsnChunk) {\n this.sackNeeded = true;\n\n if (uint32Gte(this.lastReceivedTsn!, chunk.cumulativeTsn)) {\n return;\n }\n\n const isObsolete = (x: number) => uint32Gt(x, this.lastReceivedTsn!);\n\n // # advance cumulative TSN\n this.lastReceivedTsn = chunk.cumulativeTsn;\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n for (const tsn of [...this.sackMisOrdered].sort()) {\n if (tsn === tsnPlusOne(this.lastReceivedTsn)) {\n this.lastReceivedTsn = tsn;\n } else {\n break;\n }\n }\n\n // # filter out obsolete entries\n this.sackDuplicates = this.sackDuplicates.filter(isObsolete);\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n\n // # update reassembly\n for (const [streamId, streamSeqNum] of chunk.streams) {\n const inboundStream = this.getInboundStream(streamId);\n\n // # advance sequence number and perform delivery\n inboundStream.streamSequenceNumber = uint16Add(streamSeqNum, 1);\n for (const message of inboundStream.popMessages()) {\n this.advertisedRwnd += message[2].length;\n this.receive(...message);\n }\n }\n\n // # prune obsolete chunks\n Object.values(this.inboundStreams).forEach((inboundStream) => {\n this.advertisedRwnd += inboundStream.pruneChunks(this.lastReceivedTsn!);\n });\n }\n\n private updateRto(R: number) {\n if (!this.srtt) {\n this.rttvar = R / 2;\n this.srtt = R;\n } else {\n this.rttvar =\n (1 - SCTP_RTO_BETA) * this.rttvar! +\n SCTP_RTO_BETA * Math.abs(this.srtt - R);\n this.srtt = (1 - SCTP_RTO_ALPHA) * this.srtt + SCTP_RTO_ALPHA * R;\n }\n this.rto = Math.max(\n SCTP_RTO_MIN,\n Math.min(this.srtt + 4 * this.rttvar, SCTP_RTO_MAX),\n );\n }\n\n private receive(streamId: number, ppId: number, data: Buffer) {\n this.onReceive.execute(streamId, ppId, data);\n }\n\n private getInboundStream(streamId: number) {\n if (!this.inboundStreams[streamId]) {\n this.inboundStreams[streamId] = new InboundStream();\n }\n return this.inboundStreams[streamId];\n }\n\n private markReceived(tsn: number) {\n if (uint32Gte(this.lastReceivedTsn!, tsn) || this.sackMisOrdered.has(tsn)) {\n this.sackDuplicates.push(tsn);\n return true;\n }\n\n this.sackMisOrdered.add(tsn);\n for (const tsn of [...this.sackMisOrdered].sort()) {\n if (tsn === tsnPlusOne(this.lastReceivedTsn!)) {\n this.lastReceivedTsn = tsn;\n } else {\n break;\n }\n }\n\n const isObsolete = (x: number) => uint32Gt(x, this.lastReceivedTsn!);\n\n this.sackDuplicates = this.sackDuplicates.filter(isObsolete);\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n\n return false;\n }\n\n send = async (\n streamId: number,\n ppId: number,\n userData: Buffer,\n {\n expiry,\n maxRetransmits,\n ordered,\n }: {\n expiry?: number | undefined;\n maxRetransmits?: number | undefined;\n ordered?: boolean;\n } = { expiry: undefined, maxRetransmits: undefined, ordered: true },\n ) => {\n const streamSeqNum = ordered ? this.outboundStreamSeq[streamId] || 0 : 0;\n\n const fragments = Math.ceil(userData.length / USERDATA_MAX_LENGTH);\n let pos = 0;\n const chunks: DataChunk[] = [];\n for (const fragment of range(0, fragments)) {\n const chunk = new DataChunk(0, undefined);\n chunk.flags = 0;\n if (!ordered) {\n chunk.flags = SCTP_DATA_UNORDERED;\n }\n if (fragment === 0) {\n chunk.flags |= SCTP_DATA_FIRST_FRAG;\n }\n if (fragment === fragments - 1) {\n chunk.flags |= SCTP_DATA_LAST_FRAG;\n }\n chunk.tsn = this.localTsn;\n chunk.streamId = streamId;\n chunk.streamSeqNum = streamSeqNum;\n chunk.protocol = ppId;\n chunk.userData = userData.slice(pos, pos + USERDATA_MAX_LENGTH);\n chunk.bookSize = chunk.userData.length;\n chunk.expiry = expiry;\n chunk.maxRetransmits = maxRetransmits;\n\n pos += USERDATA_MAX_LENGTH;\n this.localTsn = tsnPlusOne(this.localTsn);\n chunks.push(chunk);\n }\n\n chunks.forEach((chunk) => {\n this.outboundQueue.push(chunk);\n });\n\n if (ordered) {\n this.outboundStreamSeq[streamId] = uint16Add(streamSeqNum, 1);\n }\n\n if (!this.timer3Handle) {\n await this.transmit();\n } else {\n await new Promise((r) => setImmediate(r));\n }\n };\n\n private async transmit() {\n // \"\"\"\n // Transmit outbound data.\n // \"\"\"\n\n // # send FORWARD TSN\n if (this.forwardTsnChunk) {\n await this.sendChunk(this.forwardTsnChunk).catch((err: Error) => {\n log(\"send forwardTsn failed\", err.message);\n });\n this.forwardTsnChunk = undefined;\n\n if (!this.timer3Handle) {\n this.timer3Start();\n }\n }\n\n const burstSize =\n this.fastRecoveryExit != undefined\n ? 2 * USERDATA_MAX_LENGTH\n : 4 * USERDATA_MAX_LENGTH;\n\n const cwnd = Math.min(this.flightSize + burstSize, this.cwnd);\n\n let retransmitEarliest = true;\n for (const dataChunk of this.sentQueue) {\n if (dataChunk.retransmit) {\n if (this.fastRecoveryTransmit) {\n this.fastRecoveryTransmit = false;\n } else if (this.flightSize >= cwnd) {\n return;\n }\n this.flightSizeIncrease(dataChunk);\n\n dataChunk.misses = 0;\n dataChunk.retransmit = false;\n dataChunk.sentCount++;\n await this.sendChunk(dataChunk).catch((err: Error) => {\n log(\"send data failed\", err.message);\n });\n\n if (retransmitEarliest) {\n this.timer3Restart();\n }\n }\n retransmitEarliest = false;\n }\n\n // for performance todo fix\n while (this.outboundQueue.length > 0) {\n const chunk = this.outboundQueue.shift();\n if (!chunk) return;\n\n this.sentQueue.push(chunk);\n this.flightSizeIncrease(chunk);\n\n // # update counters\n chunk.sentCount++;\n chunk.sentTime = Date.now() / 1000;\n\n await this.sendChunk(chunk).catch((err: Error) => {\n log(\"send data outboundQueue failed\", err.message);\n });\n if (!this.timer3Handle) {\n this.timer3Start();\n }\n }\n }\n\n async transmitReconfigRequest() {\n if (\n this.reconfigQueue.length > 0 &&\n this.associationState === SCTP_STATE.ESTABLISHED &&\n !this.reconfigRequest\n ) {\n const streams = this.reconfigQueue.slice(0, RECONFIG_MAX_STREAMS);\n\n this.reconfigQueue = this.reconfigQueue.slice(RECONFIG_MAX_STREAMS);\n const param = new OutgoingSSNResetRequestParam(\n this.reconfigRequestSeq,\n this.reconfigResponseSeq,\n tsnMinusOne(this.localTsn),\n streams,\n );\n this.reconfigRequestSeq = tsnPlusOne(this.reconfigRequestSeq);\n\n this.reconfigRequest = param;\n await this.sendReconfigParam(param);\n this.timerReconfigHandleStart();\n }\n }\n\n async sendReconfigParam(param: StreamParam) {\n log(\"sendReconfigParam\", param);\n const chunk = new ReconfigChunk();\n chunk.params.push([param.type, param.bytes]);\n await this.sendChunk(chunk).catch((err: Error) => {\n log(\"send reconfig failed\", err.message);\n });\n }\n\n // https://github.com/pion/sctp/pull/44/files\n private async sendResetRequest(streamId: number) {\n log(\"sendResetRequest\", streamId);\n const chunk = new DataChunk(0, undefined);\n chunk.streamId = streamId;\n this.outboundQueue.push(chunk);\n if (!this.timer3Handle) {\n await this.transmit();\n }\n }\n\n private flightSizeIncrease(chunk: DataChunk) {\n this.flightSize += chunk.bookSize;\n }\n\n private flightSizeDecrease(chunk: DataChunk) {\n this.flightSize = Math.max(0, this.flightSize - chunk.bookSize);\n }\n\n // # timers\n\n /**t1 is wait for initAck or cookieAck */\n private timer1Start(chunk: Chunk) {\n if (this.timer1Handle) throw new Error();\n this.timer1Chunk = chunk;\n this.timer1Failures = 0;\n this.timer1Handle = setTimeout(this.timer1Expired, this.rto * 1000);\n }\n\n private timer1Expired = () => {\n this.timer1Failures++;\n this.timer1Handle = undefined;\n if (this.timer1Failures > SCTP_MAX_INIT_RETRANS) {\n this.setState(SCTP_STATE.CLOSED);\n } else {\n setImmediate(() => {\n this.sendChunk(this.timer1Chunk!).catch((err: Error) => {\n log(\"send timer1 chunk failed\", err.message);\n });\n });\n this.timer1Handle = setTimeout(this.timer1Expired, this.rto * 1000);\n }\n };\n\n private timer1Cancel() {\n if (this.timer1Handle) {\n clearTimeout(this.timer1Handle);\n this.timer1Handle = undefined;\n this.timer1Chunk = undefined;\n }\n }\n\n /**t2 is wait for shutdown */\n private t2Start(chunk: Chunk) {\n if (this.timer2Handle) throw new Error();\n this.timer2Chunk = chunk;\n this.timer2Failures = 0;\n this.timer2Handle = setTimeout(this.timer2Expired, this.rto * 1000);\n }\n\n private timer2Expired = () => {\n this.timer2Failures++;\n this.timer2Handle = undefined;\n if (this.timer2Failures > SCTP_MAX_ASSOCIATION_RETRANS) {\n this.setState(SCTP_STATE.CLOSED);\n } else {\n setImmediate(() => {\n this.sendChunk(this.timer2Chunk!).catch((err: Error) => {\n log(\"send timer2Chunk failed\", err.message);\n });\n });\n this.timer2Handle = setTimeout(this.timer2Expired, this.rto * 1000);\n }\n };\n\n private timer2Cancel() {\n if (this.timer2Handle) {\n clearTimeout(this.timer2Handle);\n this.timer2Handle = undefined;\n this.timer2Chunk = undefined;\n }\n }\n\n /**t3 is wait for data sack */\n private timer3Start() {\n if (this.timer3Handle) throw new Error();\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto * 1000);\n }\n\n private timer3Restart() {\n this.timer3Cancel();\n // for performance\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto);\n }\n\n private timer3Expired = () => {\n this.timer3Handle = undefined;\n\n // # mark retransmit or abandoned chunks\n this.sentQueue.forEach((chunk) => {\n if (!this.maybeAbandon(chunk)) {\n chunk.retransmit = true;\n }\n });\n this.updateAdvancedPeerAckPoint();\n\n // # adjust congestion window\n this.fastRecoveryExit = undefined;\n this.flightSize = 0;\n this.partialBytesAcked = 0;\n\n this.ssthresh = Math.max(\n Math.floor(this.cwnd / 2),\n 4 * USERDATA_MAX_LENGTH,\n );\n this.cwnd = USERDATA_MAX_LENGTH;\n\n this.transmit();\n };\n\n private timer3Cancel() {\n if (this.timer3Handle) {\n clearTimeout(this.timer3Handle);\n this.timer3Handle = undefined;\n }\n }\n\n /**Re-configuration Timer */\n private timerReconfigHandleStart() {\n if (this.timerReconfigHandle) return;\n log(\"timerReconfigHandleStart\", { rto: this.rto });\n this.timerReconfigFailures = 0;\n this.timerReconfigHandle = setTimeout(\n this.timerReconfigHandleExpired,\n this.rto * 1000,\n );\n }\n\n private timerReconfigHandleExpired = async () => {\n this.timerReconfigFailures++;\n // back off\n this.rto = Math.ceil(this.rto * 1.5);\n\n if (this.timerReconfigFailures > SCTP_MAX_ASSOCIATION_RETRANS) {\n log(\"timerReconfigFailures\", this.timerReconfigFailures);\n this.setState(SCTP_STATE.CLOSED);\n\n this.timerReconfigHandle = undefined;\n } else if (this.reconfigRequest) {\n log(\"timerReconfigHandleExpired\", this.timerReconfigFailures, this.rto);\n await this.sendReconfigParam(this.reconfigRequest);\n\n this.timerReconfigHandle = setTimeout(\n this.timerReconfigHandleExpired,\n this.rto * 1000,\n );\n }\n };\n\n private timerReconfigCancel() {\n if (this.timerReconfigHandle) {\n log(\"timerReconfigCancel\");\n clearTimeout(this.timerReconfigHandle);\n this.timerReconfigHandle = undefined;\n }\n }\n\n private updateAdvancedPeerAckPoint() {\n if (uint32Gt(this.lastSackedTsn, this.advancedPeerAckTsn)) {\n this.advancedPeerAckTsn = this.lastSackedTsn;\n }\n\n let done = 0;\n const streams: { [key: number]: number } = {};\n while (this.sentQueue.length > 0 && this.sentQueue[0].abandoned) {\n const chunk = this.sentQueue.shift()!;\n this.advancedPeerAckTsn = chunk.tsn;\n done++;\n if (!(chunk.flags & SCTP_DATA_UNORDERED)) {\n streams[chunk.streamId] = chunk.streamSeqNum;\n }\n }\n\n if (done) {\n this.forwardTsnChunk = new ForwardTsnChunk(0, undefined);\n this.forwardTsnChunk.cumulativeTsn = this.advancedPeerAckTsn;\n this.forwardTsnChunk.streams = Object.entries(streams).map(([k, v]) => [\n Number(k),\n v,\n ]);\n }\n }\n\n private maybeAbandon(chunk: DataChunk): boolean {\n if (chunk.abandoned) return true;\n const abandon =\n (!!chunk.maxRetransmits && chunk.maxRetransmits < chunk.sentCount!) ||\n (!!chunk.expiry && chunk.expiry < Date.now() / 1000);\n if (!abandon) return false;\n\n const chunkPos = this.sentQueue.findIndex((v) => v.type === chunk.type);\n for (const pos of range(chunkPos, -1, -1)) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n for (const pos of range(chunkPos, this.sentQueue.length)) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n return true;\n }\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.remotePort = port;\n }\n\n async start(remotePort?: number) {\n if (!this.started) {\n this.started = true;\n this.setConnectionState(\"connecting\");\n\n if (remotePort) {\n this.setRemotePort(remotePort);\n }\n\n if (!this.isServer) {\n await this.init();\n }\n }\n }\n\n private async init() {\n const init = new InitChunk();\n init.initiateTag = this.localVerificationTag;\n init.advertisedRwnd = this.advertisedRwnd;\n init.outboundStreams = this._outboundStreamsCount;\n init.inboundStreams = this._inboundStreamsMax;\n init.initialTsn = this.localTsn;\n this.setExtensions(init.params);\n log(\"send init\", init);\n\n try {\n await this.sendChunk(init);\n\n // # start T1 timer and enter COOKIE-WAIT state\n this.timer1Start(init);\n this.setState(SCTP_STATE.COOKIE_WAIT);\n } catch (error: any) {\n log(\"send init failed\", error.message);\n }\n }\n\n private setExtensions(params: [number, Buffer][]) {\n const extensions: number[] = [];\n if (this.localPartialReliability) {\n params.push([SCTP_PRSCTP_SUPPORTED, Buffer.from(\"\")]);\n extensions.push(ForwardTsnChunk.type);\n }\n\n extensions.push(ReConfigChunk.type);\n params.push([SCTP_SUPPORTED_CHUNK_EXT, Buffer.from(extensions)]);\n }\n\n async sendChunk(chunk: Chunk) {\n if (this.state === \"closed\") return;\n if (this.remotePort === undefined) {\n throw new Error(\"invalid remote port\");\n }\n\n const packet = serializePacket(\n this.localPort,\n this.remotePort,\n this.remoteVerificationTag,\n chunk,\n );\n await this.transport.send(packet);\n }\n\n setState(state: SCTP_STATE) {\n if (state != this.associationState) {\n this.associationState = state;\n }\n if (state === SCTP_STATE.ESTABLISHED) {\n this.setConnectionState(\"connected\");\n } else if (state === SCTP_STATE.CLOSED) {\n this.timer1Cancel();\n this.timer2Cancel();\n this.timer3Cancel();\n this.timerReconfigCancel();\n this.setConnectionState(\"closed\");\n this.removeAllListeners();\n }\n }\n\n setConnectionState(state: SCTPConnectionState) {\n this.state = state;\n log(\"setConnectionState\", state);\n this.stateChanged[state].execute();\n }\n\n async stop() {\n if (this.associationState !== SCTP_STATE.CLOSED) {\n await this.abort();\n }\n this.setState(SCTP_STATE.CLOSED);\n clearTimeout(this.timer1Handle);\n clearTimeout(this.timer2Handle);\n clearTimeout(this.timer3Handle);\n clearTimeout(this.timerReconfigHandle);\n }\n\n async abort() {\n const abort = new AbortChunk();\n await this.sendChunk(abort).catch((err: Error) => {\n log(\"send abort failed\", err.message);\n });\n }\n\n private removeAllListeners() {\n Object.values(this.stateChanged).forEach((v) => v.allUnsubscribe());\n }\n}\n\nexport class InboundStream {\n reassembly: DataChunk[] = [];\n streamSequenceNumber = 0; // SSN\n\n constructor() {}\n\n addChunk(chunk: DataChunk) {\n if (\n this.reassembly.length === 0 ||\n uint32Gt(chunk.tsn, this.reassembly[this.reassembly.length - 1].tsn)\n ) {\n this.reassembly.push(chunk);\n return;\n }\n\n for (const [i, v] of enumerate(this.reassembly)) {\n if (v.tsn === chunk.tsn) throw new Error(\"duplicate chunk in reassembly\");\n\n if (uint32Gt(v.tsn, chunk.tsn)) {\n this.reassembly.splice(i, 0, chunk);\n break;\n }\n }\n }\n\n *popMessages(): Generator<[number, number, Buffer]> {\n let pos = 0;\n let startPos: number | undefined;\n let expectedTsn: number;\n let ordered: boolean | undefined;\n while (pos < this.reassembly.length) {\n const chunk = this.reassembly[pos];\n if (startPos === undefined) {\n ordered = !(chunk.flags & SCTP_DATA_UNORDERED);\n if (!(chunk.flags & SCTP_DATA_FIRST_FRAG)) {\n if (ordered) {\n break;\n } else {\n pos++;\n continue;\n }\n }\n if (\n ordered &&\n uint16Gt(chunk.streamSeqNum, this.streamSequenceNumber)\n ) {\n break;\n }\n expectedTsn = chunk.tsn;\n startPos = pos;\n } else if (chunk.tsn !== expectedTsn!) {\n if (ordered!) {\n break;\n } else {\n startPos = undefined;\n pos++;\n continue;\n }\n }\n\n if (chunk.flags & SCTP_DATA_LAST_FRAG) {\n const arr = this.reassembly\n .slice(startPos, pos + 1)\n .map((c) => c.userData)\n .reduce((acc, cur) => {\n acc.push(cur);\n acc.push(Buffer.from(\"\"));\n return acc;\n }, [] as Buffer[]);\n arr.pop();\n const userData = Buffer.concat(arr);\n\n this.reassembly = [\n ...this.reassembly.slice(0, startPos),\n ...this.reassembly.slice(pos + 1),\n ];\n if (ordered && chunk.streamSeqNum === this.streamSequenceNumber) {\n this.streamSequenceNumber = uint16Add(this.streamSequenceNumber, 1);\n }\n pos = startPos;\n yield [chunk.streamId, chunk.protocol, userData];\n } else {\n pos++;\n }\n expectedTsn = tsnPlusOne(expectedTsn);\n }\n }\n\n pruneChunks(tsn: number) {\n // \"\"\"\n // Prune chunks up to the given TSN.\n // \"\"\"\n\n let pos = -1,\n size = 0;\n\n for (const [i, chunk] of this.reassembly.entries()) {\n if (uint32Gte(tsn, chunk.tsn)) {\n pos = i;\n size += chunk.userData.length;\n } else {\n break;\n }\n }\n\n this.reassembly = this.reassembly.slice(pos + 1);\n return size;\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nfunction tsnMinusOne(a: number) {\n return (a - 1) % SCTP_TSN_MODULO;\n}\n\nfunction tsnPlusOne(a: number) {\n return (a + 1) % SCTP_TSN_MODULO;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Event } from "rx.mini";
1
+ import { Event } from "./imports/common";
2
2
  import { EventTarget } from "./helper";
3
3
  import type { RTCSctpTransport } from "./transport/sctp";
4
4
  import type { Callback, CallbackWithValue } from "./types/util";
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.RTCDataChannelParameters = exports.RTCDataChannel = void 0;
7
7
  const debug_1 = __importDefault(require("debug"));
8
- const rx_mini_1 = require("rx.mini");
8
+ const common_1 = require("./imports/common");
9
9
  const helper_1 = require("./helper");
10
10
  const log = (0, debug_1.default)("werift:packages/webrtc/src/dataChannel.ts");
11
11
  class RTCDataChannel extends helper_1.EventTarget {
@@ -33,26 +33,26 @@ class RTCDataChannel extends helper_1.EventTarget {
33
33
  enumerable: true,
34
34
  configurable: true,
35
35
  writable: true,
36
- value: new rx_mini_1.Event()
36
+ value: new common_1.Event()
37
37
  });
38
38
  Object.defineProperty(this, "onMessage", {
39
39
  enumerable: true,
40
40
  configurable: true,
41
41
  writable: true,
42
- value: new rx_mini_1.Event()
42
+ value: new common_1.Event()
43
43
  });
44
44
  // todo impl
45
45
  Object.defineProperty(this, "error", {
46
46
  enumerable: true,
47
47
  configurable: true,
48
48
  writable: true,
49
- value: new rx_mini_1.Event()
49
+ value: new common_1.Event()
50
50
  });
51
51
  Object.defineProperty(this, "bufferedAmountLow", {
52
52
  enumerable: true,
53
53
  configurable: true,
54
54
  writable: true,
55
- value: new rx_mini_1.Event()
55
+ value: new common_1.Event()
56
56
  });
57
57
  Object.defineProperty(this, "onopen", {
58
58
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"dataChannel.js","sourceRoot":"","sources":["../../../src/dataChannel.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { EventTarget } from \"./helper\";\nimport type { RTCSctpTransport } from \"./transport/sctp\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\n\nconst log = debug(\"werift:packages/webrtc/src/dataChannel.ts\");\n\nexport class RTCDataChannel extends EventTarget {\n readonly stateChanged = new Event<[DCState]>();\n readonly onMessage = new Event<[string | Buffer]>();\n // todo impl\n readonly error = new Event<[Error]>();\n readonly bufferedAmountLow = new Event();\n onopen?: Callback;\n onclose?: Callback;\n onclosing?: Callback;\n onmessage?: CallbackWithValue<MessageEvent>;\n // todo impl\n onerror?: CallbackWithValue<RTCErrorEvent>;\n isCreatedByRemote = false;\n id: number;\n readyState: DCState = \"connecting\";\n\n bufferedAmount = 0;\n private _bufferedAmountLowThreshold = 0;\n\n constructor(\n private readonly transport: RTCSctpTransport,\n private readonly parameters: RTCDataChannelParameters,\n public readonly sendOpen = true,\n ) {\n super();\n\n this.id = this.parameters.id;\n\n if (parameters.negotiated) {\n if (this.id == undefined || this.id < 0 || this.id > 65534) {\n throw new Error(\n \"ID must be in range 0-65534 if data channel is negotiated out-of-band\",\n );\n }\n this.transport.dataChannelAddNegotiated(this);\n } else {\n if (sendOpen) {\n this.sendOpen = false;\n this.transport.dataChannelOpen(this);\n }\n }\n }\n\n get ordered() {\n return this.parameters.ordered;\n }\n\n get maxRetransmits() {\n return this.parameters.maxRetransmits;\n }\n\n get maxPacketLifeTime() {\n return this.parameters.maxPacketLifeTime;\n }\n\n get label() {\n return this.parameters.label;\n }\n\n get protocol() {\n return this.parameters.protocol;\n }\n\n get negotiated() {\n return this.parameters.negotiated;\n }\n\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value: number) {\n if (value < 0 || value > 4294967295) {\n throw new Error(\n \"bufferedAmountLowThreshold must be in range 0 - 4294967295\",\n );\n }\n this._bufferedAmountLowThreshold = value;\n }\n\n setId(id: number) {\n this.id = id;\n }\n\n setReadyState(state: DCState) {\n if (state !== this.readyState) {\n this.readyState = state;\n this.stateChanged.execute(state);\n\n switch (state) {\n case \"open\":\n if (this.onopen) this.onopen();\n this.emit(\"open\");\n break;\n case \"closed\":\n if (this.onclose) this.onclose();\n this.emit(\"close\");\n break;\n case \"closing\":\n if (this.onclosing) this.onclosing();\n break;\n }\n log(\"change state\", state);\n }\n }\n\n addBufferedAmount(amount: number) {\n const crossesThreshold =\n this.bufferedAmount > this.bufferedAmountLowThreshold &&\n this.bufferedAmount + amount <= this.bufferedAmountLowThreshold;\n this.bufferedAmount += amount;\n if (crossesThreshold) {\n this.bufferedAmountLow.execute();\n this.emit(\"bufferedamountlow\");\n }\n }\n\n send(data: Buffer | string) {\n this.transport.datachannelSend(this, data);\n }\n\n close() {\n this.transport.dataChannelClose(this);\n }\n}\n\nexport type DCState = \"open\" | \"closed\" | \"connecting\" | \"closing\";\n\nexport class RTCDataChannelParameters {\n label = \"\";\n maxPacketLifeTime?: number; // sec\n maxRetransmits?: number;\n ordered = true;\n protocol = \"\";\n negotiated = false;\n id!: number;\n constructor(props: Partial<RTCDataChannelParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport interface MessageEvent {\n data: string | Buffer;\n}\n\nexport interface RTCErrorEvent {\n error: any;\n}\n"]}
1
+ {"version":3,"file":"dataChannel.js","sourceRoot":"","sources":["../../../src/dataChannel.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"./imports/common\";\n\nimport { EventTarget } from \"./helper\";\nimport type { RTCSctpTransport } from \"./transport/sctp\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\n\nconst log = debug(\"werift:packages/webrtc/src/dataChannel.ts\");\n\nexport class RTCDataChannel extends EventTarget {\n readonly stateChanged = new Event<[DCState]>();\n readonly onMessage = new Event<[string | Buffer]>();\n // todo impl\n readonly error = new Event<[Error]>();\n readonly bufferedAmountLow = new Event();\n onopen?: Callback;\n onclose?: Callback;\n onclosing?: Callback;\n onmessage?: CallbackWithValue<MessageEvent>;\n // todo impl\n onerror?: CallbackWithValue<RTCErrorEvent>;\n isCreatedByRemote = false;\n id: number;\n readyState: DCState = \"connecting\";\n\n bufferedAmount = 0;\n private _bufferedAmountLowThreshold = 0;\n\n constructor(\n private readonly transport: RTCSctpTransport,\n private readonly parameters: RTCDataChannelParameters,\n public readonly sendOpen = true,\n ) {\n super();\n\n this.id = this.parameters.id;\n\n if (parameters.negotiated) {\n if (this.id == undefined || this.id < 0 || this.id > 65534) {\n throw new Error(\n \"ID must be in range 0-65534 if data channel is negotiated out-of-band\",\n );\n }\n this.transport.dataChannelAddNegotiated(this);\n } else {\n if (sendOpen) {\n this.sendOpen = false;\n this.transport.dataChannelOpen(this);\n }\n }\n }\n\n get ordered() {\n return this.parameters.ordered;\n }\n\n get maxRetransmits() {\n return this.parameters.maxRetransmits;\n }\n\n get maxPacketLifeTime() {\n return this.parameters.maxPacketLifeTime;\n }\n\n get label() {\n return this.parameters.label;\n }\n\n get protocol() {\n return this.parameters.protocol;\n }\n\n get negotiated() {\n return this.parameters.negotiated;\n }\n\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value: number) {\n if (value < 0 || value > 4294967295) {\n throw new Error(\n \"bufferedAmountLowThreshold must be in range 0 - 4294967295\",\n );\n }\n this._bufferedAmountLowThreshold = value;\n }\n\n setId(id: number) {\n this.id = id;\n }\n\n setReadyState(state: DCState) {\n if (state !== this.readyState) {\n this.readyState = state;\n this.stateChanged.execute(state);\n\n switch (state) {\n case \"open\":\n if (this.onopen) this.onopen();\n this.emit(\"open\");\n break;\n case \"closed\":\n if (this.onclose) this.onclose();\n this.emit(\"close\");\n break;\n case \"closing\":\n if (this.onclosing) this.onclosing();\n break;\n }\n log(\"change state\", state);\n }\n }\n\n addBufferedAmount(amount: number) {\n const crossesThreshold =\n this.bufferedAmount > this.bufferedAmountLowThreshold &&\n this.bufferedAmount + amount <= this.bufferedAmountLowThreshold;\n this.bufferedAmount += amount;\n if (crossesThreshold) {\n this.bufferedAmountLow.execute();\n this.emit(\"bufferedamountlow\");\n }\n }\n\n send(data: Buffer | string) {\n this.transport.datachannelSend(this, data);\n }\n\n close() {\n this.transport.dataChannelClose(this);\n }\n}\n\nexport type DCState = \"open\" | \"closed\" | \"connecting\" | \"closing\";\n\nexport class RTCDataChannelParameters {\n label = \"\";\n maxPacketLifeTime?: number; // sec\n maxRetransmits?: number;\n ordered = true;\n protocol = \"\";\n negotiated = false;\n id!: number;\n constructor(props: Partial<RTCDataChannelParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport interface MessageEvent {\n data: string | Buffer;\n}\n\nexport interface RTCErrorEvent {\n error: any;\n}\n"]}
@@ -0,0 +1 @@
1
+ export * from "../../../common/src";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("../../../common/src"), exports);
18
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/imports/common.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC","sourcesContent":["export * from \"../../../common/src\";\n"]}
@@ -1,4 +1,4 @@
1
- import Event from "rx.mini";
1
+ import { Event } from "../../imports/common";
2
2
  import { GenericNack, type RtpPacket } from "../../../../rtp/src";
3
3
  import type { RTCRtpReceiver } from "../rtpReceiver";
4
4
  export declare class NackHandler {
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.NackHandler = void 0;
7
7
  const debug_1 = __importDefault(require("debug"));
8
8
  const range_1 = __importDefault(require("lodash/range"));
9
- const rx_mini_1 = __importDefault(require("rx.mini"));
9
+ const common_1 = require("../../imports/common");
10
10
  const src_1 = require("../../../../common/src");
11
11
  const src_2 = require("../../../../rtp/src");
12
12
  const log = (0, debug_1.default)("werift:packages/webrtc/src/media/receiver/nack.ts");
@@ -41,7 +41,7 @@ class NackHandler {
41
41
  enumerable: true,
42
42
  configurable: true,
43
43
  writable: true,
44
- value: new rx_mini_1.default()
44
+ value: new common_1.Event()
45
45
  });
46
46
  Object.defineProperty(this, "mediaSourceSsrc", {
47
47
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../src/media/receiver/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport range from \"lodash/range\";\nimport Event from \"rx.mini\";\n\nimport { uint16Add } from \"../../../../common/src\";\nimport {\n GenericNack,\n RtcpTransportLayerFeedback,\n type RtpPacket,\n} from \"../../../../rtp/src\";\nimport type { RTCRtpReceiver } from \"../rtpReceiver\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/receiver/nack.ts\");\n\nconst LOST_SIZE = 30 * 5;\n\nexport class NackHandler {\n private newEstSeqNum = 0;\n private _lost: { [seqNum: number]: number } = {};\n private nackLoop: any;\n\n readonly onPacketLost = new Event<[GenericNack]>();\n mediaSourceSsrc?: number;\n retryCount = 10;\n closed = false;\n\n constructor(private receiver: RTCRtpReceiver) {}\n\n get lostSeqNumbers() {\n return Object.keys(this._lost).map(Number).sort();\n }\n\n private getLost(seq: number) {\n return this._lost[seq];\n }\n\n private setLost(seq: number, count: number) {\n this._lost[seq] = count;\n\n if (this.nackLoop || this.closed) {\n return;\n }\n this.nackLoop = setInterval(async () => {\n try {\n await this.sendNack();\n if (!Object.keys(this._lost).length) {\n clearInterval(this.nackLoop);\n this.nackLoop = undefined;\n }\n } catch (error) {\n log(\"failed to send nack\", error);\n }\n }, 5);\n }\n\n private removeLost(sequenceNumber: number) {\n delete this._lost[sequenceNumber];\n }\n\n addPacket(packet: RtpPacket) {\n const { sequenceNumber, ssrc } = packet.header;\n this.mediaSourceSsrc = ssrc;\n\n if (this.newEstSeqNum === 0) {\n this.newEstSeqNum = sequenceNumber;\n return;\n }\n\n if (this.getLost(sequenceNumber)) {\n // log(\"packetLoss resolved\", { sequenceNumber });\n this.removeLost(sequenceNumber);\n return;\n }\n\n if (sequenceNumber === uint16Add(this.newEstSeqNum, 1)) {\n this.newEstSeqNum = sequenceNumber;\n } else if (sequenceNumber > uint16Add(this.newEstSeqNum, 1)) {\n // packet lost detected\n range(uint16Add(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => {\n this.setLost(seq, 1);\n });\n // this.receiver.sendRtcpPLI(this.mediaSourceSsrc);\n\n this.newEstSeqNum = sequenceNumber;\n this.pruneLost();\n }\n }\n\n private pruneLost() {\n if (this.lostSeqNumbers.length > LOST_SIZE) {\n this._lost = Object.entries(this._lost)\n .slice(-LOST_SIZE)\n .reduce(\n (acc, [key, v]) => {\n acc[key] = v;\n return acc;\n },\n {} as { [seqNum: number]: number },\n );\n }\n }\n\n close() {\n this.closed = true;\n clearInterval(this.nackLoop);\n this._lost = {};\n }\n\n private updateRetryCount() {\n this.lostSeqNumbers.forEach((seq) => {\n const count = this._lost[seq]++;\n if (count > this.retryCount) {\n this.removeLost(seq);\n return seq;\n }\n });\n }\n\n private sendNack = () =>\n new Promise((r, f) => {\n if (this.lostSeqNumbers.length > 0 && this.mediaSourceSsrc) {\n const nack = new GenericNack({\n senderSsrc: this.receiver.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n lost: this.lostSeqNumbers,\n });\n\n const rtcp = new RtcpTransportLayerFeedback({\n feedback: nack,\n });\n this.receiver.dtlsTransport.sendRtcp([rtcp]).then(r).catch(f);\n\n this.updateRetryCount();\n this.onPacketLost.execute(nack);\n }\n });\n}\n"]}
1
+ {"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../src/media/receiver/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport range from \"lodash/range\";\nimport { Event } from \"../../imports/common\";\n\nimport { uint16Add } from \"../../../../common/src\";\nimport {\n GenericNack,\n RtcpTransportLayerFeedback,\n type RtpPacket,\n} from \"../../../../rtp/src\";\nimport type { RTCRtpReceiver } from \"../rtpReceiver\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/receiver/nack.ts\");\n\nconst LOST_SIZE = 30 * 5;\n\nexport class NackHandler {\n private newEstSeqNum = 0;\n private _lost: { [seqNum: number]: number } = {};\n private nackLoop: any;\n\n readonly onPacketLost = new Event<[GenericNack]>();\n mediaSourceSsrc?: number;\n retryCount = 10;\n closed = false;\n\n constructor(private receiver: RTCRtpReceiver) {}\n\n get lostSeqNumbers() {\n return Object.keys(this._lost).map(Number).sort();\n }\n\n private getLost(seq: number) {\n return this._lost[seq];\n }\n\n private setLost(seq: number, count: number) {\n this._lost[seq] = count;\n\n if (this.nackLoop || this.closed) {\n return;\n }\n this.nackLoop = setInterval(async () => {\n try {\n await this.sendNack();\n if (!Object.keys(this._lost).length) {\n clearInterval(this.nackLoop);\n this.nackLoop = undefined;\n }\n } catch (error) {\n log(\"failed to send nack\", error);\n }\n }, 5);\n }\n\n private removeLost(sequenceNumber: number) {\n delete this._lost[sequenceNumber];\n }\n\n addPacket(packet: RtpPacket) {\n const { sequenceNumber, ssrc } = packet.header;\n this.mediaSourceSsrc = ssrc;\n\n if (this.newEstSeqNum === 0) {\n this.newEstSeqNum = sequenceNumber;\n return;\n }\n\n if (this.getLost(sequenceNumber)) {\n // log(\"packetLoss resolved\", { sequenceNumber });\n this.removeLost(sequenceNumber);\n return;\n }\n\n if (sequenceNumber === uint16Add(this.newEstSeqNum, 1)) {\n this.newEstSeqNum = sequenceNumber;\n } else if (sequenceNumber > uint16Add(this.newEstSeqNum, 1)) {\n // packet lost detected\n range(uint16Add(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => {\n this.setLost(seq, 1);\n });\n // this.receiver.sendRtcpPLI(this.mediaSourceSsrc);\n\n this.newEstSeqNum = sequenceNumber;\n this.pruneLost();\n }\n }\n\n private pruneLost() {\n if (this.lostSeqNumbers.length > LOST_SIZE) {\n this._lost = Object.entries(this._lost)\n .slice(-LOST_SIZE)\n .reduce(\n (acc, [key, v]) => {\n acc[key] = v;\n return acc;\n },\n {} as { [seqNum: number]: number },\n );\n }\n }\n\n close() {\n this.closed = true;\n clearInterval(this.nackLoop);\n this._lost = {};\n }\n\n private updateRetryCount() {\n this.lostSeqNumbers.forEach((seq) => {\n const count = this._lost[seq]++;\n if (count > this.retryCount) {\n this.removeLost(seq);\n return seq;\n }\n });\n }\n\n private sendNack = () =>\n new Promise((r, f) => {\n if (this.lostSeqNumbers.length > 0 && this.mediaSourceSsrc) {\n const nack = new GenericNack({\n senderSsrc: this.receiver.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n lost: this.lostSeqNumbers,\n });\n\n const rtcp = new RtcpTransportLayerFeedback({\n feedback: nack,\n });\n this.receiver.dtlsTransport.sendRtcp([rtcp]).then(r).catch(f);\n\n this.updateRetryCount();\n this.onPacketLost.execute(nack);\n }\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import Event from "rx.mini";
1
+ import { Event } from "../imports/common";
2
2
  import { type PeerConfig } from "..";
3
3
  import { type RtcpPacket, type RtpPacket } from "../../../rtp/src";
4
4
  import type { RTCDtlsTransport } from "../transport/dtls";
@@ -35,7 +35,7 @@ export declare class RTCRtpReceiver {
35
35
  readonly receiveLastSRTimestamp: {
36
36
  [ssrc: number]: number;
37
37
  };
38
- readonly onPacketLost: Event<[import("..").GenericNack]>;
38
+ readonly onPacketLost: Event<[import("werift-rtp/src/rtcp/rtpfb/nack").GenericNack]>;
39
39
  readonly onRtcp: Event<[RtcpPacket]>;
40
40
  dtlsTransport: RTCDtlsTransport;
41
41
  sdesMid?: string;
@@ -1,13 +1,10 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.RTCRtpReceiver = void 0;
7
4
  const debug_1 = require("debug");
8
- const rx_mini_1 = __importDefault(require("rx.mini"));
9
5
  const promises_1 = require("timers/promises");
10
6
  const uuid_1 = require("uuid");
7
+ const common_1 = require("../imports/common");
11
8
  const __1 = require("..");
12
9
  const src_1 = require("../../../common/src");
13
10
  const src_2 = require("../../../rtp/src");
@@ -119,7 +116,7 @@ class RTCRtpReceiver {
119
116
  enumerable: true,
120
117
  configurable: true,
121
118
  writable: true,
122
- value: new rx_mini_1.default()
119
+ value: new common_1.Event()
123
120
  });
124
121
  Object.defineProperty(this, "dtlsTransport", {
125
122
  enumerable: true,