werift 0.14.4-debug0 → 0.15.0-alpha.0

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 (64) hide show
  1. package/lib/common/src/binary.d.ts +0 -1
  2. package/lib/common/src/binary.js +1 -2
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/dtls/src/context/cipher.js +5 -2
  5. package/lib/dtls/src/context/cipher.js.map +1 -1
  6. package/lib/dtls/src/handshake/extensions/useSrtp.js +5 -2
  7. package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
  8. package/lib/ice/src/candidate.js +5 -2
  9. package/lib/ice/src/candidate.js.map +1 -1
  10. package/lib/ice/src/ice.d.ts +2 -2
  11. package/lib/ice/src/ice.js +6 -5
  12. package/lib/ice/src/ice.js.map +1 -1
  13. package/lib/ice/src/stun/attributes.js +5 -2
  14. package/lib/ice/src/stun/attributes.js.map +1 -1
  15. package/lib/rtp/src/rtcp/rr.js +5 -2
  16. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  17. package/lib/rtp/src/rtcp/rtpfb/nack.js +6 -3
  18. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  19. package/lib/rtp/src/rtcp/rtpfb/twcc.js +6 -6
  20. package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
  21. package/lib/rtp/src/rtcp/sr.js +5 -2
  22. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  23. package/lib/rtp/src/srtp/cipher/ctr.js +5 -2
  24. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  25. package/lib/rtp/src/srtp/cipher/gcm.js +6 -3
  26. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  27. package/lib/sctp/src/param.js +5 -2
  28. package/lib/sctp/src/param.js.map +1 -1
  29. package/lib/sctp/src/sctp.js +5 -5
  30. package/lib/sctp/src/sctp.js.map +1 -1
  31. package/lib/webrtc/src/media/receiver/nack.js +2 -2
  32. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  33. package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -2
  34. package/lib/webrtc/src/media/rtpReceiver.js +4 -2
  35. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  36. package/lib/webrtc/src/media/rtpSender.d.ts +4 -2
  37. package/lib/webrtc/src/media/rtpSender.js +15 -7
  38. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  39. package/lib/webrtc/src/media/rtpTransceiver.d.ts +7 -6
  40. package/lib/webrtc/src/media/rtpTransceiver.js +8 -3
  41. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  42. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +1 -1
  43. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  44. package/lib/webrtc/src/peerConnection.d.ts +10 -10
  45. package/lib/webrtc/src/peerConnection.js +324 -188
  46. package/lib/webrtc/src/peerConnection.js.map +1 -1
  47. package/lib/webrtc/src/sdp.js +5 -2
  48. package/lib/webrtc/src/sdp.js.map +1 -1
  49. package/lib/webrtc/src/transport/dtls.d.ts +3 -2
  50. package/lib/webrtc/src/transport/dtls.js +3 -0
  51. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  52. package/lib/webrtc/src/transport/sctp.d.ts +5 -3
  53. package/lib/webrtc/src/transport/sctp.js +46 -34
  54. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  55. package/package.json +2 -2
  56. package/src/media/receiver/nack.ts +1 -1
  57. package/src/media/rtpReceiver.ts +6 -5
  58. package/src/media/rtpSender.ts +18 -9
  59. package/src/media/rtpTransceiver.ts +13 -6
  60. package/src/nonstandard/recorder/writer/webm.ts +1 -1
  61. package/src/peerConnection.ts +386 -223
  62. package/src/sdp.ts +1 -1
  63. package/src/transport/dtls.ts +4 -1
  64. package/src/transport/sctp.ts +53 -33
@@ -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 debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport { range } from \"lodash\";\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 Chunk,\n CookieAckChunk,\n CookieEchoChunk,\n DataChunk,\n ErrorChunk,\n ForwardTsnChunk,\n HeartbeatAckChunk,\n HeartbeatChunk,\n InitAckChunk,\n InitChunk,\n parsePacket,\n ReConfigChunk,\n ReconfigChunk,\n SackChunk,\n serializePacket,\n ShutdownAckChunk,\n ShutdownChunk,\n ShutdownCompleteChunk,\n} from \"./chunk\";\nimport { SCTP_STATE } from \"./const\";\nimport { createEventsFromList, enumerate, Unpacked } from \"./helper\";\nimport {\n OutgoingSSNResetRequestParam,\n RECONFIG_PARAM_BY_TYPES,\n ReconfigResponseParam,\n reconfigResult,\n StreamAddOutgoingParam,\n StreamParam,\n} from \"./param\";\nimport { 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 = this.port;\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(public transport: Transport, public port = 5000) {\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\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.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 }\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 debug from \"debug\";\nimport { jspack } from \"jspack\";\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 Chunk,\n CookieAckChunk,\n CookieEchoChunk,\n DataChunk,\n ErrorChunk,\n ForwardTsnChunk,\n HeartbeatAckChunk,\n HeartbeatChunk,\n InitAckChunk,\n InitChunk,\n parsePacket,\n ReConfigChunk,\n ReconfigChunk,\n SackChunk,\n serializePacket,\n ShutdownAckChunk,\n ShutdownChunk,\n ShutdownCompleteChunk,\n} from \"./chunk\";\nimport { SCTP_STATE } from \"./const\";\nimport { createEventsFromList, enumerate, Unpacked } from \"./helper\";\nimport {\n OutgoingSSNResetRequestParam,\n RECONFIG_PARAM_BY_TYPES,\n ReconfigResponseParam,\n reconfigResult,\n StreamAddOutgoingParam,\n StreamParam,\n} from \"./param\";\nimport { 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 = this.port;\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(public transport: Transport, public port = 5000) {\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\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.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 }\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"]}
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Nack = void 0;
7
- const lodash_1 = require("lodash");
7
+ const range_1 = __importDefault(require("lodash/range"));
8
8
  const rx_mini_1 = __importDefault(require("rx.mini"));
9
9
  const src_1 = require("../../../../common/src");
10
10
  const src_2 = require("../../../../rtp/src");
@@ -36,7 +36,7 @@ class Nack {
36
36
  }
37
37
  else if (sequenceNumber > (0, src_1.uint16Add)(this.newEstSeqNum, 1)) {
38
38
  // packet lost detected
39
- (0, lodash_1.range)((0, src_1.uint16Add)(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => {
39
+ (0, range_1.default)((0, src_1.uint16Add)(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => {
40
40
  this._lost[seq] = 1;
41
41
  });
42
42
  this.receiver.sendRtcpPLI(this.mediaSourceSsrc);
@@ -1 +1 @@
1
- {"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../src/media/receiver/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import { range } from \"lodash\";\nimport Event from \"rx.mini\";\n\nimport { uint16Add } from \"../../../../common/src\";\nimport {\n GenericNack,\n RtcpTransportLayerFeedback,\n RtpPacket,\n} from \"../../../../rtp/src\";\nimport { RTCRtpReceiver } from \"../rtpReceiver\";\n\nconst LOST_SIZE = 30 * 5;\n\nexport class Nack {\n private newEstSeqNum = 0;\n private _lost: { [seqNum: number]: number } = {};\n private nackLoop = setInterval(() => this.packetLost(), 20);\n\n readonly onPacketLost = new Event<[GenericNack]>();\n mediaSourceSsrc?: number;\n\n constructor(private receiver: RTCRtpReceiver) {}\n\n get lost() {\n return Object.keys(this._lost).map(Number);\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._lost[sequenceNumber]) {\n delete this._lost[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._lost[seq] = 1;\n });\n this.receiver.sendRtcpPLI(this.mediaSourceSsrc);\n\n this.newEstSeqNum = sequenceNumber;\n\n if (Object.keys(this._lost).length > LOST_SIZE) {\n this._lost = Object.entries(this._lost)\n .slice(-LOST_SIZE)\n .reduce((acc, [key, v]) => {\n acc[key] = v;\n return acc;\n }, {} as { [seqNum: number]: number });\n }\n }\n }\n\n close() {\n clearInterval(this.nackLoop);\n }\n\n private increment() {\n Object.keys(this._lost).forEach((seq) => {\n if (++this._lost[seq] > 10) {\n delete this._lost[seq];\n }\n });\n }\n\n private packetLost() {\n if (this.lost.length > 0 && this.mediaSourceSsrc) {\n const nack = new GenericNack({\n senderSsrc: this.receiver.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n lost: this.lost,\n });\n const rtcp = new RtcpTransportLayerFeedback({\n feedback: nack,\n });\n this.receiver.dtlsTransport.sendRtcp([rtcp]);\n\n this.increment();\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 range from \"lodash/range\";\nimport Event from \"rx.mini\";\n\nimport { uint16Add } from \"../../../../common/src\";\nimport {\n GenericNack,\n RtcpTransportLayerFeedback,\n RtpPacket,\n} from \"../../../../rtp/src\";\nimport { RTCRtpReceiver } from \"../rtpReceiver\";\n\nconst LOST_SIZE = 30 * 5;\n\nexport class Nack {\n private newEstSeqNum = 0;\n private _lost: { [seqNum: number]: number } = {};\n private nackLoop = setInterval(() => this.packetLost(), 20);\n\n readonly onPacketLost = new Event<[GenericNack]>();\n mediaSourceSsrc?: number;\n\n constructor(private receiver: RTCRtpReceiver) {}\n\n get lost() {\n return Object.keys(this._lost).map(Number);\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._lost[sequenceNumber]) {\n delete this._lost[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._lost[seq] = 1;\n });\n this.receiver.sendRtcpPLI(this.mediaSourceSsrc);\n\n this.newEstSeqNum = sequenceNumber;\n\n if (Object.keys(this._lost).length > LOST_SIZE) {\n this._lost = Object.entries(this._lost)\n .slice(-LOST_SIZE)\n .reduce((acc, [key, v]) => {\n acc[key] = v;\n return acc;\n }, {} as { [seqNum: number]: number });\n }\n }\n }\n\n close() {\n clearInterval(this.nackLoop);\n }\n\n private increment() {\n Object.keys(this._lost).forEach((seq) => {\n if (++this._lost[seq] > 10) {\n delete this._lost[seq];\n }\n });\n }\n\n private packetLost() {\n if (this.lost.length > 0 && this.mediaSourceSsrc) {\n const nack = new GenericNack({\n senderSsrc: this.receiver.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n lost: this.lost,\n });\n const rtcp = new RtcpTransportLayerFeedback({\n feedback: nack,\n });\n this.receiver.dtlsTransport.sendRtcp([rtcp]);\n\n this.increment();\n this.onPacketLost.execute(nack);\n }\n }\n}\n"]}
@@ -8,7 +8,6 @@ import { Extensions } from "./router";
8
8
  import { MediaStreamTrack } from "./track";
9
9
  export declare class RTCRtpReceiver {
10
10
  kind: Kind;
11
- dtlsTransport: RTCDtlsTransport;
12
11
  rtcpSsrc: number;
13
12
  private readonly codecs;
14
13
  private readonly ssrcByRtx;
@@ -31,6 +30,7 @@ export declare class RTCRtpReceiver {
31
30
  };
32
31
  readonly onPacketLost: Event<[import("..").GenericNack]>;
33
32
  readonly onRtcp: Event<[RtcpPacket]>;
33
+ dtlsTransport: RTCDtlsTransport;
34
34
  sdesMid?: string;
35
35
  latestRid?: string;
36
36
  latestRepairedRid?: string;
@@ -42,7 +42,8 @@ export declare class RTCRtpReceiver {
42
42
  rtcpRunning: boolean;
43
43
  private rtcpCancel;
44
44
  private remoteStreams;
45
- constructor(kind: Kind, dtlsTransport: RTCDtlsTransport, rtcpSsrc: number);
45
+ constructor(kind: Kind, rtcpSsrc: number);
46
+ setDtlsTransport(dtls: RTCDtlsTransport): void;
46
47
  get track(): MediaStreamTrack;
47
48
  prepareReceive(params: RTCRtpReceiveParameters): void;
48
49
  /**
@@ -20,9 +20,8 @@ const red_1 = require("./receiver/red");
20
20
  const statistics_1 = require("./receiver/statistics");
21
21
  const log = (0, debug_1.debug)("werift:packages/webrtc/src/media/rtpReceiver.ts");
22
22
  class RTCRtpReceiver {
23
- constructor(kind, dtlsTransport, rtcpSsrc) {
23
+ constructor(kind, rtcpSsrc) {
24
24
  this.kind = kind;
25
- this.dtlsTransport = dtlsTransport;
26
25
  this.rtcpSsrc = rtcpSsrc;
27
26
  this.codecs = {};
28
27
  this.ssrcByRtx = {};
@@ -55,6 +54,9 @@ class RTCRtpReceiver {
55
54
  this.handleRTP(packet, extensions, track);
56
55
  };
57
56
  }
57
+ setDtlsTransport(dtls) {
58
+ this.dtlsTransport = dtls;
59
+ }
58
60
  // todo fix
59
61
  get track() {
60
62
  return this.tracks[0];
@@ -1 +1 @@
1
- {"version":3,"file":"rtpReceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpReceiver.ts"],"names":[],"mappings":"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","sourcesContent":["import { debug } from \"debug\";\nimport { jspack } from \"jspack\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { int } from \"../../../common/src\";\nimport {\n PictureLossIndication,\n Red,\n RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpReceiverInfo,\n RtcpRrPacket,\n RtcpSrPacket,\n RtpHeader,\n RtpPacket,\n} from \"../../../rtp/src\";\nimport { codecParametersFromString } from \"..\";\nimport { RTCDtlsTransport } from \"../transport/dtls\";\nimport { Kind } from \"../types/domain\";\nimport { compactNtp } from \"../utils\";\nimport { RTP_EXTENSION_URI } from \"./extension/rtpExtension\";\nimport { RTCRtpCodecParameters, RTCRtpReceiveParameters } from \"./parameters\";\nimport { Nack } from \"./receiver/nack\";\nimport { ReceiverTWCC } from \"./receiver/receiverTwcc\";\nimport { RedHandler } from \"./receiver/red\";\nimport { StreamStatistics } from \"./receiver/statistics\";\nimport { Extensions } from \"./router\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpReceiver.ts\");\n\nexport class RTCRtpReceiver {\n private readonly codecs: { [pt: number]: RTCRtpCodecParameters } = {};\n private readonly ssrcByRtx: { [rtxSsrc: number]: number } = {};\n private readonly nack = new Nack(this);\n private readonly redHandler = new RedHandler();\n\n readonly type = \"receiver\";\n readonly uuid = uuid();\n readonly tracks: MediaStreamTrack[] = [];\n readonly trackBySSRC: { [ssrc: string]: MediaStreamTrack } = {};\n readonly trackByRID: { [rid: string]: MediaStreamTrack } = {};\n // last senderReport\n readonly lsr: { [ssrc: number]: number } = {};\n readonly lsrTime: { [ssrc: number]: number } = {};\n readonly onPacketLost = this.nack.onPacketLost;\n readonly onRtcp = new Event<[RtcpPacket]>();\n\n sdesMid?: string;\n latestRid?: string;\n latestRepairedRid?: string;\n\n receiverTWCC?: ReceiverTWCC;\n supportTWCC = false;\n stopped = false;\n remoteStreamId?: string;\n remoteTrackId?: string;\n\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n private remoteStreams: { [ssrc: number]: StreamStatistics } = {};\n\n constructor(\n public kind: Kind,\n public dtlsTransport: RTCDtlsTransport,\n public rtcpSsrc: number\n ) {}\n\n // todo fix\n get track() {\n return this.tracks[0];\n }\n\n prepareReceive(params: RTCRtpReceiveParameters) {\n params.codecs.forEach((c) => {\n this.codecs[c.payloadType] = c;\n });\n params.encodings.forEach((e) => {\n if (e.rtx) {\n this.ssrcByRtx[e.rtx.ssrc] = e.ssrc;\n }\n });\n }\n\n /**\n * setup TWCC if supported\n */\n setupTWCC(mediaSourceSsrc?: number) {\n this.supportTWCC = !!Object.values(this.codecs).find((codec) =>\n codec.rtcpFeedback.find((v) => v.type === \"transport-cc\")\n );\n log(\"twcc support\", this.supportTWCC);\n\n if (this.supportTWCC && mediaSourceSsrc) {\n this.receiverTWCC = new ReceiverTWCC(\n this.dtlsTransport,\n this.rtcpSsrc,\n mediaSourceSsrc\n );\n }\n }\n\n addTrack(track: MediaStreamTrack) {\n const exist = this.tracks.find((t) => {\n if (t.rid) return t.rid === track.rid;\n if (t.ssrc) return t.ssrc === track.ssrc;\n });\n if (exist) return false;\n this.tracks.push(track);\n if (track.ssrc) this.trackBySSRC[track.ssrc] = track;\n if (track.rid) this.trackByRID[track.rid] = track;\n return true;\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n if (this.receiverTWCC) this.receiverTWCC.twccRunning = false;\n this.nack.close();\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const reports = Object.entries(this.remoteStreams).map(\n ([ssrc, stream]) => {\n let lsr = 0,\n dlsr = 0;\n if (this.lsr[ssrc]) {\n lsr = this.lsr[ssrc];\n const delay = Date.now() / 1000 - this.lsrTime[ssrc];\n if (delay > 0 && delay < 65536) {\n dlsr = int(delay * 65536);\n }\n }\n\n return new RtcpReceiverInfo({\n ssrc: Number(ssrc),\n fractionLost: stream.fraction_lost,\n packetsLost: stream.packets_lost,\n highestSequence: stream.max_seq,\n jitter: stream.jitter,\n lsr,\n dlsr,\n });\n }\n );\n\n const packet = new RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });\n\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n /**todo impl */\n getStats() {}\n\n async sendRtcpPLI(mediaSsrc: number) {\n const packet = new RtcpPayloadSpecificFeedback({\n feedback: new PictureLossIndication({\n senderSsrc: this.rtcpSsrc,\n mediaSsrc,\n }),\n });\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(error);\n }\n }\n\n handleRtcpPacket(packet: RtcpPacket) {\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n const sr = packet as RtcpSrPacket;\n this.lsr[sr.ssrc] = compactNtp(sr.senderInfo.ntpTimestamp);\n this.lsrTime[sr.ssrc] = Date.now() / 1000;\n\n const track = this.trackBySSRC[packet.ssrc];\n if (track) {\n track.onReceiveRtcp.execute(packet);\n }\n }\n break;\n }\n this.onRtcp.execute(packet);\n }\n\n handleRtpBySsrc = (packet: RtpPacket, extensions: Extensions) => {\n const track = this.trackBySSRC[packet.header.ssrc];\n\n this.handleRTP(packet, extensions, track);\n };\n\n handleRtpByRid = (packet: RtpPacket, rid: string, extensions: Extensions) => {\n const track = this.trackByRID[rid];\n if (!this.trackBySSRC[packet.header.ssrc]) {\n this.trackBySSRC[packet.header.ssrc] = track;\n }\n\n this.handleRTP(packet, extensions, track);\n };\n\n private handleRTP(\n packet: RtpPacket,\n extensions: Extensions,\n track?: MediaStreamTrack\n ) {\n if (this.stopped) return;\n\n const codec = this.codecs[packet.header.payloadType];\n if (!codec) {\n log(\"unknown codec \" + packet.header.payloadType);\n return;\n }\n\n this.remoteStreams[packet.header.ssrc] =\n this.remoteStreams[packet.header.ssrc] ??\n new StreamStatistics(codec.clockRate);\n this.remoteStreams[packet.header.ssrc].add(packet);\n\n if (this.receiverTWCC) {\n const transportSequenceNumber = extensions[\n RTP_EXTENSION_URI.transportWideCC\n ] as number;\n if (!transportSequenceNumber == undefined) {\n throw new Error(\"undefined\");\n }\n\n this.receiverTWCC.handleTWCC(transportSequenceNumber);\n } else if (this.supportTWCC) {\n this.setupTWCC(packet.header.ssrc);\n }\n\n if (codec.name.toLowerCase() === \"rtx\") {\n const originalSsrc = this.ssrcByRtx[packet.header.ssrc];\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n const rtxCodec = this.codecs[codecParams[\"apt\"]];\n if (packet.payload.length < 2) return;\n\n packet = unwrapRtx(packet, rtxCodec.payloadType, originalSsrc);\n track = this.trackBySSRC[originalSsrc];\n }\n\n let red: Red | undefined;\n if (codec.name.toLowerCase() === \"red\") {\n red = Red.deSerialize(packet.payload);\n }\n\n // todo fix select use or not use nack\n if (track?.kind === \"video\") {\n this.nack.addPacket(packet);\n }\n\n if (track) {\n if (red) {\n const payloads = this.redHandler.push(red, packet);\n for (const packet of payloads) {\n track.onReceiveRtp.execute(packet.clone());\n }\n } else {\n track.onReceiveRtp.execute(packet.clone());\n }\n }\n\n this.runRtcp();\n }\n}\n\nexport function unwrapRtx(rtx: RtpPacket, payloadType: number, ssrc: number) {\n const packet = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: rtx.header.marker,\n sequenceNumber: jspack.Unpack(\"!H\", rtx.payload.slice(0, 2))[0],\n timestamp: rtx.header.timestamp,\n ssrc,\n }),\n rtx.payload.slice(2)\n );\n return packet;\n}\n"]}
1
+ {"version":3,"file":"rtpReceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpReceiver.ts"],"names":[],"mappings":"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","sourcesContent":["import { debug } from \"debug\";\nimport { jspack } from \"jspack\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { int } from \"../../../common/src\";\nimport {\n PictureLossIndication,\n Red,\n RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpReceiverInfo,\n RtcpRrPacket,\n RtcpSrPacket,\n RtpHeader,\n RtpPacket,\n} from \"../../../rtp/src\";\nimport { codecParametersFromString } from \"..\";\nimport { RTCDtlsTransport } from \"../transport/dtls\";\nimport { Kind } from \"../types/domain\";\nimport { compactNtp } from \"../utils\";\nimport { RTP_EXTENSION_URI } from \"./extension/rtpExtension\";\nimport { RTCRtpCodecParameters, RTCRtpReceiveParameters } from \"./parameters\";\nimport { Nack } from \"./receiver/nack\";\nimport { ReceiverTWCC } from \"./receiver/receiverTwcc\";\nimport { RedHandler } from \"./receiver/red\";\nimport { StreamStatistics } from \"./receiver/statistics\";\nimport { Extensions } from \"./router\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpReceiver.ts\");\n\nexport class RTCRtpReceiver {\n private readonly codecs: { [pt: number]: RTCRtpCodecParameters } = {};\n private readonly ssrcByRtx: { [rtxSsrc: number]: number } = {};\n private readonly nack = new Nack(this);\n private readonly redHandler = new RedHandler();\n\n readonly type = \"receiver\";\n readonly uuid = uuid();\n readonly tracks: MediaStreamTrack[] = [];\n readonly trackBySSRC: { [ssrc: string]: MediaStreamTrack } = {};\n readonly trackByRID: { [rid: string]: MediaStreamTrack } = {};\n // last senderReport\n readonly lsr: { [ssrc: number]: number } = {};\n readonly lsrTime: { [ssrc: number]: number } = {};\n readonly onPacketLost = this.nack.onPacketLost;\n readonly onRtcp = new Event<[RtcpPacket]>();\n\n dtlsTransport!: RTCDtlsTransport;\n sdesMid?: string;\n latestRid?: string;\n latestRepairedRid?: string;\n\n receiverTWCC?: ReceiverTWCC;\n supportTWCC = false;\n stopped = false;\n remoteStreamId?: string;\n remoteTrackId?: string;\n\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n private remoteStreams: { [ssrc: number]: StreamStatistics } = {};\n\n constructor(public kind: Kind, public rtcpSsrc: number) {}\n\n setDtlsTransport(dtls: RTCDtlsTransport) {\n this.dtlsTransport = dtls;\n }\n\n // todo fix\n get track() {\n return this.tracks[0];\n }\n\n prepareReceive(params: RTCRtpReceiveParameters) {\n params.codecs.forEach((c) => {\n this.codecs[c.payloadType] = c;\n });\n params.encodings.forEach((e) => {\n if (e.rtx) {\n this.ssrcByRtx[e.rtx.ssrc] = e.ssrc;\n }\n });\n }\n\n /**\n * setup TWCC if supported\n */\n setupTWCC(mediaSourceSsrc?: number) {\n this.supportTWCC = !!Object.values(this.codecs).find((codec) =>\n codec.rtcpFeedback.find((v) => v.type === \"transport-cc\")\n );\n log(\"twcc support\", this.supportTWCC);\n\n if (this.supportTWCC && mediaSourceSsrc) {\n this.receiverTWCC = new ReceiverTWCC(\n this.dtlsTransport,\n this.rtcpSsrc,\n mediaSourceSsrc\n );\n }\n }\n\n addTrack(track: MediaStreamTrack) {\n const exist = this.tracks.find((t) => {\n if (t.rid) return t.rid === track.rid;\n if (t.ssrc) return t.ssrc === track.ssrc;\n });\n if (exist) return false;\n this.tracks.push(track);\n if (track.ssrc) this.trackBySSRC[track.ssrc] = track;\n if (track.rid) this.trackByRID[track.rid] = track;\n return true;\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n if (this.receiverTWCC) this.receiverTWCC.twccRunning = false;\n this.nack.close();\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const reports = Object.entries(this.remoteStreams).map(\n ([ssrc, stream]) => {\n let lsr = 0,\n dlsr = 0;\n if (this.lsr[ssrc]) {\n lsr = this.lsr[ssrc];\n const delay = Date.now() / 1000 - this.lsrTime[ssrc];\n if (delay > 0 && delay < 65536) {\n dlsr = int(delay * 65536);\n }\n }\n\n return new RtcpReceiverInfo({\n ssrc: Number(ssrc),\n fractionLost: stream.fraction_lost,\n packetsLost: stream.packets_lost,\n highestSequence: stream.max_seq,\n jitter: stream.jitter,\n lsr,\n dlsr,\n });\n }\n );\n\n const packet = new RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });\n\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n /**todo impl */\n getStats() {}\n\n async sendRtcpPLI(mediaSsrc: number) {\n const packet = new RtcpPayloadSpecificFeedback({\n feedback: new PictureLossIndication({\n senderSsrc: this.rtcpSsrc,\n mediaSsrc,\n }),\n });\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(error);\n }\n }\n\n handleRtcpPacket(packet: RtcpPacket) {\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n const sr = packet as RtcpSrPacket;\n this.lsr[sr.ssrc] = compactNtp(sr.senderInfo.ntpTimestamp);\n this.lsrTime[sr.ssrc] = Date.now() / 1000;\n\n const track = this.trackBySSRC[packet.ssrc];\n if (track) {\n track.onReceiveRtcp.execute(packet);\n }\n }\n break;\n }\n this.onRtcp.execute(packet);\n }\n\n handleRtpBySsrc = (packet: RtpPacket, extensions: Extensions) => {\n const track = this.trackBySSRC[packet.header.ssrc];\n\n this.handleRTP(packet, extensions, track);\n };\n\n handleRtpByRid = (packet: RtpPacket, rid: string, extensions: Extensions) => {\n const track = this.trackByRID[rid];\n if (!this.trackBySSRC[packet.header.ssrc]) {\n this.trackBySSRC[packet.header.ssrc] = track;\n }\n\n this.handleRTP(packet, extensions, track);\n };\n\n private handleRTP(\n packet: RtpPacket,\n extensions: Extensions,\n track?: MediaStreamTrack\n ) {\n if (this.stopped) return;\n\n const codec = this.codecs[packet.header.payloadType];\n if (!codec) {\n log(\"unknown codec \" + packet.header.payloadType);\n return;\n }\n\n this.remoteStreams[packet.header.ssrc] =\n this.remoteStreams[packet.header.ssrc] ??\n new StreamStatistics(codec.clockRate);\n this.remoteStreams[packet.header.ssrc].add(packet);\n\n if (this.receiverTWCC) {\n const transportSequenceNumber = extensions[\n RTP_EXTENSION_URI.transportWideCC\n ] as number;\n if (!transportSequenceNumber == undefined) {\n throw new Error(\"undefined\");\n }\n\n this.receiverTWCC.handleTWCC(transportSequenceNumber);\n } else if (this.supportTWCC) {\n this.setupTWCC(packet.header.ssrc);\n }\n\n if (codec.name.toLowerCase() === \"rtx\") {\n const originalSsrc = this.ssrcByRtx[packet.header.ssrc];\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n const rtxCodec = this.codecs[codecParams[\"apt\"]];\n if (packet.payload.length < 2) return;\n\n packet = unwrapRtx(packet, rtxCodec.payloadType, originalSsrc);\n track = this.trackBySSRC[originalSsrc];\n }\n\n let red: Red | undefined;\n if (codec.name.toLowerCase() === \"red\") {\n red = Red.deSerialize(packet.payload);\n }\n\n // todo fix select use or not use nack\n if (track?.kind === \"video\") {\n this.nack.addPacket(packet);\n }\n\n if (track) {\n if (red) {\n const payloads = this.redHandler.push(red, packet);\n for (const packet of payloads) {\n track.onReceiveRtp.execute(packet.clone());\n }\n } else {\n track.onReceiveRtp.execute(packet.clone());\n }\n }\n\n this.runRtcp();\n }\n}\n\nexport function unwrapRtx(rtx: RtpPacket, payloadType: number, ssrc: number) {\n const packet = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: rtx.header.marker,\n sequenceNumber: jspack.Unpack(\"!H\", rtx.payload.slice(0, 2))[0],\n timestamp: rtx.header.timestamp,\n ssrc,\n }),\n rtx.payload.slice(2)\n );\n return packet;\n}\n"]}
@@ -8,7 +8,6 @@ import { SenderBandwidthEstimator } from "./sender/senderBWE";
8
8
  import { MediaStreamTrack } from "./track";
9
9
  export declare class RTCRtpSender {
10
10
  trackOrKind: Kind | MediaStreamTrack;
11
- dtlsTransport: RTCDtlsTransport;
12
11
  readonly type = "sender";
13
12
  readonly kind: Kind;
14
13
  readonly ssrc: number;
@@ -45,11 +44,14 @@ export declare class RTCRtpSender {
45
44
  private seqOffset;
46
45
  private rtpCache;
47
46
  codec?: RTCRtpCodecParameters;
47
+ dtlsTransport: RTCDtlsTransport;
48
+ private dtlsDisposer;
48
49
  track?: MediaStreamTrack;
49
50
  stopped: boolean;
50
51
  rtcpRunning: boolean;
51
52
  private rtcpCancel;
52
- constructor(trackOrKind: Kind | MediaStreamTrack, dtlsTransport: RTCDtlsTransport);
53
+ constructor(trackOrKind: Kind | MediaStreamTrack);
54
+ setDtlsTransport(dtlsTransport: RTCDtlsTransport): void;
53
55
  get redDistance(): number;
54
56
  set redDistance(n: number);
55
57
  prepareSend(params: RTCRtpSendParameters): void;