werift 0.22.8 → 0.23.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 (69) hide show
  1. package/lib/common/src/crc.d.ts +4 -0
  2. package/lib/common/src/crc.js +124 -0
  3. package/lib/common/src/crc.js.map +1 -0
  4. package/lib/common/src/index.d.ts +1 -0
  5. package/lib/common/src/index.js +1 -0
  6. package/lib/common/src/index.js.map +1 -1
  7. package/lib/dtls/src/flight/server/flight6.js +12 -2
  8. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  9. package/lib/dtls/src/server.js +6 -1
  10. package/lib/dtls/src/server.js.map +1 -1
  11. package/lib/dtls/src/socket.d.ts +1 -0
  12. package/lib/dtls/src/socket.js +3 -0
  13. package/lib/dtls/src/socket.js.map +1 -1
  14. package/lib/ice/src/stun/message.js +2 -10
  15. package/lib/ice/src/stun/message.js.map +1 -1
  16. package/lib/index.mjs +705 -113
  17. package/lib/nonstandard/index.mjs +308 -44
  18. package/lib/rtp/src/index.d.ts +1 -0
  19. package/lib/rtp/src/index.js +1 -0
  20. package/lib/rtp/src/index.js.map +1 -1
  21. package/lib/rtp/src/srtp/cipher/ctr.d.ts +3 -3
  22. package/lib/rtp/src/srtp/cipher/ctr.js +25 -14
  23. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  24. package/lib/rtp/src/srtp/cipher/gcm.d.ts +3 -3
  25. package/lib/rtp/src/srtp/cipher/gcm.js +57 -20
  26. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  27. package/lib/rtp/src/srtp/cipher/index.d.ts +1 -1
  28. package/lib/rtp/src/srtp/cipher/index.js +1 -1
  29. package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
  30. package/lib/rtp/src/srtp/context/srtp.d.ts +2 -1
  31. package/lib/rtp/src/srtp/context/srtp.js +22 -5
  32. package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
  33. package/lib/rtp/src/srtp/error.d.ts +3 -0
  34. package/lib/rtp/src/srtp/error.js +11 -0
  35. package/lib/rtp/src/srtp/error.js.map +1 -0
  36. package/lib/rtp/src/srtp/packet.d.ts +5 -0
  37. package/lib/rtp/src/srtp/packet.js +48 -0
  38. package/lib/rtp/src/srtp/packet.js.map +1 -0
  39. package/lib/sctp/src/chunk.js +3 -6
  40. package/lib/sctp/src/chunk.js.map +1 -1
  41. package/lib/sctp/src/sctp.d.ts +19 -0
  42. package/lib/sctp/src/sctp.js +259 -23
  43. package/lib/sctp/src/sctp.js.map +1 -1
  44. package/lib/webrtc/src/dataChannel.d.ts +1 -0
  45. package/lib/webrtc/src/dataChannel.js +5 -2
  46. package/lib/webrtc/src/dataChannel.js.map +1 -1
  47. package/lib/webrtc/src/peerConnection.d.ts +4 -1
  48. package/lib/webrtc/src/peerConnection.js +26 -5
  49. package/lib/webrtc/src/peerConnection.js.map +1 -1
  50. package/lib/webrtc/src/sctpManager.d.ts +1 -1
  51. package/lib/webrtc/src/sctpManager.js +3 -2
  52. package/lib/webrtc/src/sctpManager.js.map +1 -1
  53. package/lib/webrtc/src/sdpManager.d.ts +1 -1
  54. package/lib/webrtc/src/sdpManager.js +3 -4
  55. package/lib/webrtc/src/sdpManager.js.map +1 -1
  56. package/lib/webrtc/src/secureTransportManager.js +1 -1
  57. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  58. package/lib/webrtc/src/transceiverManager.js +3 -2
  59. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  60. package/lib/webrtc/src/transport/dtls.d.ts +1 -0
  61. package/lib/webrtc/src/transport/dtls.js +117 -12
  62. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  63. package/lib/webrtc/src/transport/sctp.d.ts +9 -3
  64. package/lib/webrtc/src/transport/sctp.js +35 -9
  65. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  66. package/lib/webrtc/src/utils.d.ts +2 -0
  67. package/lib/webrtc/src/utils.js +20 -0
  68. package/lib/webrtc/src/utils.js.map +1 -1
  69. package/package.json +1 -3
@@ -1 +1 @@
1
- {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../sctp/src/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\n\nimport { nextTick } from \"process\";\nimport {\n AbortChunk,\n type Chunk,\n CookieAckChunk,\n CookieEchoChunk,\n DataChunk,\n ErrorChunk,\n ForwardTsnChunk,\n HeartbeatAckChunk,\n HeartbeatChunk,\n InitAckChunk,\n InitChunk,\n ReConfigChunk,\n ReconfigChunk,\n SackChunk,\n ShutdownAckChunk,\n ShutdownChunk,\n ShutdownCompleteChunk,\n parsePacket,\n serializePacket,\n} from \"./chunk\";\nimport { SCTP_STATE } from \"./const\";\nimport { type Unpacked, createEventsFromList, enumerate } from \"./helper\";\nimport {\n Event,\n debug,\n random32,\n uint16Add,\n uint16Gt,\n uint32Gt,\n uint32Gte,\n} from \"./imports/common\";\nimport {\n OutgoingSSNResetRequestParam,\n RECONFIG_PARAM_BY_TYPES,\n ReconfigResponseParam,\n StreamAddOutgoingParam,\n type StreamParam,\n reconfigResult,\n} from \"./param\";\nimport type { Transport } from \"./transport\";\n\nconst log = debug(\"werift/sctp/sctp\");\n\n// SSN: Stream Sequence Number\n\n// # local constants\nconst COOKIE_LENGTH = 24;\nconst COOKIE_LIFETIME = 60;\nconst MAX_STREAMS = 65535;\nconst USERDATA_MAX_LENGTH = 1200;\n\n// # protocol constants\nconst SCTP_DATA_LAST_FRAG = 0x01;\nconst SCTP_DATA_FIRST_FRAG = 0x02;\nconst SCTP_DATA_UNORDERED = 0x04;\n\nconst SCTP_MAX_ASSOCIATION_RETRANS = 10;\nconst SCTP_MAX_INIT_RETRANS = 8;\nconst SCTP_RTO_ALPHA = 1 / 8;\nconst SCTP_RTO_BETA = 1 / 4;\nconst SCTP_RTO_INITIAL = 3;\nconst SCTP_RTO_MIN = 1;\nconst SCTP_RTO_MAX = 60;\nconst SCTP_TSN_MODULO = 2 ** 32;\n\nconst RECONFIG_MAX_STREAMS = 135;\n\n// # parameters\nconst SCTP_STATE_COOKIE = 0x0007;\nconst SCTP_SUPPORTED_CHUNK_EXT = 0x8008; //32778\nconst SCTP_PRSCTP_SUPPORTED = 0xc000; //49152\n\nconst SCTPConnectionStates = [\n \"new\",\n \"closed\",\n \"connected\",\n \"connecting\",\n] as const;\ntype SCTPConnectionState = Unpacked<typeof SCTPConnectionStates>;\n\nexport class SCTP {\n flush = new Event<[void]>();\n readonly stateChanged: {\n [key in SCTPConnectionState]: Event<[]>;\n } = createEventsFromList(SCTPConnectionStates);\n readonly onReconfigStreams = new Event<[number[]]>();\n /**streamId: number, ppId: number, data: Buffer */\n readonly onReceive = new Event<[number, number, Buffer]>();\n onSackReceived: () => Promise<void> = async () => {};\n\n associationState = SCTP_STATE.CLOSED;\n started = false;\n state: SCTPConnectionState = \"new\";\n isServer = true;\n\n private hmacKey = randomBytes(16);\n private localPartialReliability = true;\n private localPort: number;\n private localVerificationTag = random32();\n\n remoteExtensions: number[] = [];\n remotePartialReliability = true;\n private remotePort?: number;\n private remoteVerificationTag = 0;\n\n // inbound\n private advertisedRwnd = 1024 * 1024; // Receiver Window\n private inboundStreams: { [key: number]: InboundStream } = {};\n _inboundStreamsCount = 0;\n _inboundStreamsMax = MAX_STREAMS;\n private lastReceivedTsn?: number; // Transmission Sequence Number\n private sackDuplicates: number[] = [];\n private sackMisOrdered = new Set<number>();\n private sackNeeded = false;\n private sackTimeout: NodeJS.Immediate | undefined;\n\n // # outbound\n private cwnd = 3 * USERDATA_MAX_LENGTH; // Congestion Window\n private fastRecoveryExit?: number;\n private fastRecoveryTransmit = false;\n private forwardTsnChunk?: ForwardTsnChunk;\n private flightSize = 0;\n outboundQueue: DataChunk[] = [];\n private outboundStreamSeq: { [streamId: number]: number } = {};\n _outboundStreamsCount = MAX_STREAMS;\n /**local transmission sequence number */\n private localTsn = Number(random32());\n private lastSackedTsn = tsnMinusOne(this.localTsn);\n private advancedPeerAckTsn = tsnMinusOne(this.localTsn); // acknowledgement\n private partialBytesAcked = 0;\n private sentQueue: DataChunk[] = [];\n\n // # reconfiguration\n\n /**初期TSNと同じ値に初期化される単調に増加する数です. これは、新しいre-configuration requestパラメーターを送信するたびに1ずつ増加します */\n reconfigRequestSeq = this.localTsn;\n /**このフィールドは、incoming要求のre-configuration requestシーケンス番号を保持します. 他の場合では、次に予想されるre-configuration requestシーケンス番号から1を引いた値が保持されます */\n reconfigResponseSeq = 0;\n reconfigRequest?: OutgoingSSNResetRequestParam;\n reconfigQueue: number[] = [];\n\n // rtt calculation\n private srtt?: number;\n private rttvar?: number;\n\n // timers\n private rto = SCTP_RTO_INITIAL;\n /**t1 is wait for initAck or cookieAck */\n private timer1Handle?: any;\n private timer1Chunk?: Chunk;\n private timer1Failures = 0;\n /**t2 is wait for shutdown */\n private timer2Handle?: any;\n private timer2Chunk?: Chunk;\n private timer2Failures = 0;\n /**t3 is wait for data sack */\n private timer3Handle?: any;\n /**Re-configuration Timer */\n private timerReconfigHandle?: any;\n private timerReconfigFailures = 0;\n\n // etc\n private ssthresh?: number; // slow start threshold\n\n constructor(\n public transport: Transport,\n public port = 5000,\n ) {\n this.localPort = this.port;\n this.transport.onData = (buf) => {\n this.handleData(buf);\n };\n }\n\n get maxChannels() {\n if (this._inboundStreamsCount > 0) {\n return Math.min(this._inboundStreamsCount, this._outboundStreamsCount);\n }\n return undefined;\n }\n\n static client(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = false;\n return sctp;\n }\n\n static server(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = true;\n return sctp;\n }\n\n // call from dtls transport\n private async handleData(data: Buffer) {\n let expectedTag: number;\n\n const [, , verificationTag, chunks] = parsePacket(data);\n const initChunk = chunks.filter((v) => v.type === InitChunk.type).length;\n if (initChunk > 0) {\n if (chunks.length != 1) {\n throw new Error();\n }\n expectedTag = 0;\n } else {\n expectedTag = this.localVerificationTag;\n }\n\n if (verificationTag !== expectedTag) {\n return;\n }\n\n for (const chunk of chunks) {\n await this.receiveChunk(chunk);\n }\n\n if (this.sackNeeded) {\n await this.sendSack();\n }\n }\n\n private async sendSack() {\n if (this.sackTimeout) return;\n await new Promise((r) => (this.sackTimeout = setImmediate(r)));\n this.sackTimeout = undefined;\n if (!this.sackNeeded) return;\n\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 // Only add to reconfigQueue if not already present\n if (!this.reconfigQueue.includes(streamId)) {\n this.reconfigQueue.push(streamId);\n }\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 // Reset RTO backoff on successful reconfiguration\n this.rto = SCTP_RTO_INITIAL;\n this.timerReconfigFailures = 0;\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 // Furthermore, this exposed an issue I've seen in v8 in other projects: using an array as a queue seems to result in long calls to shift (it does an array copy under the hood?). The problem seems to get worse the more times it shifts. Resetting the queue to empty array mitigates this.\n if (!this.sentQueue.length) {\n this.sentQueue = [];\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 for (let pos = gap[0]; pos < gap[1] + 1; 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 (let fragment = 0; fragment < fragments; fragment++) {\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 if (this.outboundQueue.length) {\n await this.flush.asPromise();\n } else {\n // unreachable?\n await new Promise((r) => setImmediate(r));\n }\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 // Resetting the queue to empty array mitigates this.\n this.outboundQueue = [];\n this.flush.execute();\n }\n\n async transmitReconfigRequest() {\n if (\n this.reconfigQueue.length > 0 &&\n this.associationState === SCTP_STATE.ESTABLISHED &&\n !this.reconfigRequest\n ) {\n // Remove duplicate stream IDs from reconfigQueue\n const uniqueStreams = [...new Set(this.reconfigQueue)];\n const streams = uniqueStreams.slice(0, RECONFIG_MAX_STREAMS);\n\n this.reconfigQueue = uniqueStreams.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 // Reset failures counter when timer is successfully cancelled\n this.timerReconfigFailures = 0;\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 // Resetting the queue to empty array mitigates this.\n if (!this.sentQueue.length) {\n this.sentQueue = [];\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 (let pos = chunkPos; pos >= 0; pos--) {\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 (let pos = chunkPos; pos < this.sentQueue.length; pos++) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n return true;\n }\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.remotePort = port;\n }\n\n async start(remotePort?: number) {\n if (!this.started) {\n this.started = true;\n this.setConnectionState(\"connecting\");\n\n if (remotePort) {\n this.setRemotePort(remotePort);\n }\n\n if (!this.isServer) {\n await this.init();\n }\n }\n }\n\n private async init() {\n const init = new InitChunk();\n init.initiateTag = this.localVerificationTag;\n init.advertisedRwnd = this.advertisedRwnd;\n init.outboundStreams = this._outboundStreamsCount;\n init.inboundStreams = this._inboundStreamsMax;\n init.initialTsn = this.localTsn;\n this.setExtensions(init.params);\n log(\"send init\", init);\n\n try {\n await this.sendChunk(init);\n\n // # start T1 timer and enter COOKIE-WAIT state\n this.timer1Start(init);\n this.setState(SCTP_STATE.COOKIE_WAIT);\n } catch (error: any) {\n log(\"send init failed\", error.message);\n }\n }\n\n private setExtensions(params: [number, Buffer][]) {\n const extensions: number[] = [];\n if (this.localPartialReliability) {\n params.push([SCTP_PRSCTP_SUPPORTED, Buffer.from(\"\")]);\n extensions.push(ForwardTsnChunk.type);\n }\n\n extensions.push(ReConfigChunk.type);\n params.push([SCTP_SUPPORTED_CHUNK_EXT, Buffer.from(extensions)]);\n }\n\n async sendChunk(chunk: Chunk) {\n if (this.state === \"closed\") return;\n if (this.remotePort === undefined) {\n throw new Error(\"invalid remote port\");\n }\n\n const packet = serializePacket(\n this.localPort,\n this.remotePort,\n this.remoteVerificationTag,\n chunk,\n );\n await this.transport.send(packet);\n }\n\n setState(state: SCTP_STATE) {\n if (state != this.associationState) {\n this.associationState = state;\n }\n if (state === SCTP_STATE.ESTABLISHED) {\n this.setConnectionState(\"connected\");\n } else if (state === SCTP_STATE.CLOSED) {\n this.timer1Cancel();\n this.timer2Cancel();\n this.timer3Cancel();\n this.timerReconfigCancel();\n this.setConnectionState(\"closed\");\n this.removeAllListeners();\n }\n }\n\n setConnectionState(state: SCTPConnectionState) {\n this.state = state;\n log(\"setConnectionState\", state);\n this.stateChanged[state].execute();\n }\n\n async stop() {\n if (this.associationState !== SCTP_STATE.CLOSED) {\n await this.abort();\n }\n this.setState(SCTP_STATE.CLOSED);\n clearTimeout(this.timer1Handle);\n clearTimeout(this.timer2Handle);\n clearTimeout(this.timer3Handle);\n clearTimeout(this.timerReconfigHandle);\n }\n\n async abort() {\n const abort = new AbortChunk();\n await this.sendChunk(abort).catch((err: Error) => {\n log(\"send abort failed\", err.message);\n });\n }\n\n private removeAllListeners() {\n Object.values(this.stateChanged).forEach((v) => v.allUnsubscribe());\n }\n}\n\nexport class InboundStream {\n reassembly: DataChunk[] = [];\n streamSequenceNumber = 0; // SSN\n\n constructor() {}\n\n addChunk(chunk: DataChunk) {\n if (\n this.reassembly.length === 0 ||\n uint32Gt(chunk.tsn, this.reassembly[this.reassembly.length - 1].tsn)\n ) {\n this.reassembly.push(chunk);\n return;\n }\n\n for (const [i, v] of enumerate(this.reassembly)) {\n if (v.tsn === chunk.tsn) throw new Error(\"duplicate chunk in reassembly\");\n\n if (uint32Gt(v.tsn, chunk.tsn)) {\n this.reassembly.splice(i, 0, chunk);\n break;\n }\n }\n }\n\n *popMessages(): Generator<[number, number, Buffer]> {\n let pos = 0;\n let startPos: number | undefined;\n let expectedTsn: number;\n let ordered: boolean | undefined;\n while (pos < this.reassembly.length) {\n const chunk = this.reassembly[pos];\n if (startPos === undefined) {\n ordered = !(chunk.flags & SCTP_DATA_UNORDERED);\n if (!(chunk.flags & SCTP_DATA_FIRST_FRAG)) {\n if (ordered) {\n break;\n } else {\n pos++;\n continue;\n }\n }\n if (\n ordered &&\n uint16Gt(chunk.streamSeqNum, this.streamSequenceNumber)\n ) {\n break;\n }\n expectedTsn = chunk.tsn;\n startPos = pos;\n } else if (chunk.tsn !== expectedTsn!) {\n if (ordered!) {\n break;\n } else {\n startPos = undefined;\n pos++;\n continue;\n }\n }\n\n if (chunk.flags & SCTP_DATA_LAST_FRAG) {\n const arr = this.reassembly\n .slice(startPos, pos + 1)\n .map((c) => c.userData)\n .reduce((acc, cur) => {\n acc.push(cur);\n acc.push(Buffer.from(\"\"));\n return acc;\n }, [] as Buffer[]);\n arr.pop();\n const userData = Buffer.concat(arr);\n\n this.reassembly = [\n ...this.reassembly.slice(0, startPos),\n ...this.reassembly.slice(pos + 1),\n ];\n if (ordered && chunk.streamSeqNum === this.streamSequenceNumber) {\n this.streamSequenceNumber = uint16Add(this.streamSequenceNumber, 1);\n }\n pos = startPos;\n yield [chunk.streamId, chunk.protocol, userData];\n } else {\n pos++;\n }\n expectedTsn = tsnPlusOne(expectedTsn);\n }\n }\n\n pruneChunks(tsn: number) {\n // \"\"\"\n // Prune chunks up to the given TSN.\n // \"\"\"\n\n let pos = -1,\n size = 0;\n\n for (const [i, chunk] of this.reassembly.entries()) {\n if (uint32Gte(tsn, chunk.tsn)) {\n pos = i;\n size += chunk.userData.length;\n } else {\n break;\n }\n }\n\n this.reassembly = this.reassembly.slice(pos + 1);\n return size;\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nfunction tsnMinusOne(a: number) {\n return (a - 1) % SCTP_TSN_MODULO;\n}\n\nfunction tsnPlusOne(a: number) {\n return (a + 1) % SCTP_TSN_MODULO;\n}\n"]}
1
+ {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../sctp/src/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\n\nimport { nextTick } from \"process\";\nimport {\n AbortChunk,\n type Chunk,\n CookieAckChunk,\n CookieEchoChunk,\n DataChunk,\n ErrorChunk,\n ForwardTsnChunk,\n HeartbeatAckChunk,\n HeartbeatChunk,\n InitAckChunk,\n InitChunk,\n ReConfigChunk,\n ReconfigChunk,\n SackChunk,\n ShutdownAckChunk,\n ShutdownChunk,\n ShutdownCompleteChunk,\n parsePacket,\n serializePacket,\n} from \"./chunk\";\nimport { SCTP_STATE } from \"./const\";\nimport { type Unpacked, createEventsFromList, enumerate } from \"./helper\";\nimport {\n Event,\n debug,\n random32,\n uint16Add,\n uint16Gt,\n uint32Gt,\n uint32Gte,\n} from \"./imports/common\";\nimport {\n OutgoingSSNResetRequestParam,\n RECONFIG_PARAM_BY_TYPES,\n ReconfigResponseParam,\n StreamAddOutgoingParam,\n type StreamParam,\n reconfigResult,\n} from \"./param\";\nimport type { Transport } from \"./transport\";\n\nconst log = debug(\"werift/sctp/sctp\");\n\n// SSN: Stream Sequence Number\n\n// # local constants\nconst COOKIE_LENGTH = 24;\nconst COOKIE_LIFETIME = 60;\nconst MAX_STREAMS = 65535;\nconst USERDATA_MAX_LENGTH = 1200;\n\n// # protocol constants\nconst SCTP_DATA_LAST_FRAG = 0x01;\nconst SCTP_DATA_FIRST_FRAG = 0x02;\nconst SCTP_DATA_UNORDERED = 0x04;\n\nconst SCTP_MAX_ASSOCIATION_RETRANS = 10;\nconst SCTP_MAX_INIT_RETRANS = 8;\nconst SCTP_RTO_ALPHA = 1 / 8;\nconst SCTP_RTO_BETA = 1 / 4;\n// RFC 9260 RTO.Initial/RTO.Min/RTO.Max defaults and bounds are in seconds.\nconst SCTP_RTO_INITIAL = 3;\nconst SCTP_RTO_MIN = 1;\nconst SCTP_RTO_MAX = 60;\nconst SCTP_TSN_MODULO = 2 ** 32;\n// RFC 9260 delayed ACK guidance: send SACK within 200ms at the latest.\n// Use a small default delay to keep request/response latency low while still delaying ACKs.\nconst SCTP_SACK_DELAY_MS = 200;\n// RFC 9260 HB.interval recommended default is 30 seconds.\nconst SCTP_HEARTBEAT_INTERVAL = 30;\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 flush = new Event<[void]>();\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 private isStopping = false;\n private isClosed = false;\n\n private hmacKey = randomBytes(16);\n private localPartialReliability = true;\n private localPort: number;\n private localVerificationTag = random32();\n\n remoteExtensions: number[] = [];\n remotePartialReliability = true;\n private remotePort?: number;\n private remoteVerificationTag = 0;\n\n // inbound\n private advertisedRwnd = 1024 * 1024; // Receiver Window\n private peerAdvertisedRwnd = this.advertisedRwnd;\n private get peerRwnd() {\n // RFC 9260 §6.2.1(D-ii): available receiver window = a_rwnd - outstanding DATA.\n return Math.max(0, this.peerAdvertisedRwnd - this.flightSize);\n }\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 private sackPacketCount = 0;\n private sackHasNewDataInPacket = false;\n private sackImmediate = false;\n private sackTimeout: NodeJS.Timeout | undefined;\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 private transmitting = false;\n private transmitRequested = false;\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 private timerHeartbeatHandle?: any;\n private heartbeatInterval = SCTP_HEARTBEAT_INTERVAL;\n\n // etc\n private ssthresh?: number; // slow start threshold\n\n constructor(\n public transport: Transport,\n public port = 5000,\n ) {\n this.localPort = this.port;\n this.transport.onData = (buf) => {\n this.handleData(buf);\n };\n }\n\n private get isStopped() {\n return this.isStopping || this.isClosed;\n }\n\n get maxChannels() {\n if (this._inboundStreamsCount > 0) {\n return Math.min(this._inboundStreamsCount, this._outboundStreamsCount);\n }\n return undefined;\n }\n\n static client(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = false;\n return sctp;\n }\n\n static server(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = true;\n return sctp;\n }\n\n // call from dtls transport\n private async handleData(data: Buffer) {\n if (this.isStopped) return;\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 this.sackHasNewDataInPacket = false;\n for (const chunk of chunks) {\n await this.receiveChunk(chunk);\n }\n\n if (this.sackNeeded) {\n // RFC 9260 delayed ACK guidance is per packet (\"every second packet\").\n if (this.sackHasNewDataInPacket) {\n this.sackPacketCount++;\n }\n if (this.sackPacketCount >= 2) {\n this.sackImmediate = true;\n }\n await this.scheduleSack();\n }\n }\n\n private async scheduleSack() {\n if (this.isStopped) return;\n if (!this.sackNeeded) return;\n if (this.sackImmediate) {\n if (this.sackTimeout) {\n clearTimeout(this.sackTimeout);\n this.sackTimeout = undefined;\n }\n await this.sendSack();\n return;\n }\n if (this.sackTimeout) return;\n\n // RFC 9260 delayed ACK path: defer SACK, but never beyond 200ms.\n this.sackTimeout = setTimeout(() => {\n this.sackTimeout = undefined;\n this.sendSack().catch((err: Error) => {\n log(\"send delayed sack failed\", err.message);\n });\n }, SCTP_SACK_DELAY_MS);\n }\n\n private async sendSack() {\n if (this.isStopped) return;\n if (!this.sackNeeded) return;\n\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 this.sackPacketCount = 0;\n this.sackImmediate = 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.peerAdvertisedRwnd = 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.peerAdvertisedRwnd = 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 // Only add to reconfigQueue if not already present\n if (!this.reconfigQueue.includes(streamId)) {\n this.reconfigQueue.push(streamId);\n }\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 // Reset RTO backoff on successful reconfiguration\n this.rto = SCTP_RTO_INITIAL;\n this.timerReconfigFailures = 0;\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)) {\n this.sackImmediate = true;\n return;\n }\n this.sackHasNewDataInPacket = true;\n // RFC 9260 delayed ACK is optional; prefer immediate DATA ACK to keep ACK-clock responsive.\n this.sackImmediate = true;\n if ((chunk.flags & SCTP_DATA_LAST_FRAG) === 0) {\n // Keep fragmented-message feedback prompt to avoid long tail-loss recovery.\n this.sackImmediate = true;\n }\n if (this.sackMisOrdered.size > 0) {\n // RFC 9260 permits immediate SACK on gap/loss indicators.\n this.sackImmediate = true;\n }\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 // Furthermore, this exposed an issue I've seen in v8 in other projects: using an array as a queue seems to result in long calls to shift (it does an array copy under the hood?). The problem seems to get worse the more times it shifts. Resetting the queue to empty array mitigates this.\n if (!this.sentQueue.length) {\n this.sentQueue = [];\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 for (let pos = gap[0]; pos < gap[1] + 1; 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 // RFC 9260 §6.2.1(D-ii): keep latest peer a_rwnd; available window is derived via flightSize.\n this.peerAdvertisedRwnd = chunk.advertisedRwnd;\n\n this.updateAdvancedPeerAckPoint();\n await this.onSackReceived();\n await this.transmit();\n }\n\n receiveForwardTsnChunk(chunk: ForwardTsnChunk) {\n this.sackNeeded = true;\n this.sackImmediate = 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 (let fragment = 0; fragment < fragments; fragment++) {\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 await this.transmit();\n while (this.outboundQueue.length) {\n await this.flush.asPromise();\n }\n };\n\n private async transmit() {\n if (this.isStopped) return;\n if (this.transmitting) {\n this.transmitRequested = true;\n return;\n }\n\n this.transmitting = true;\n try {\n do {\n this.transmitRequested = false;\n await this.transmitOnce();\n } while (this.transmitRequested);\n } finally {\n this.transmitting = false;\n }\n }\n\n private async transmitOnce() {\n if (this.isStopped) return;\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 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 break;\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 // Drain queued outbound DATA; retransmission pacing is controlled by RTO/T3.\n while (\n this.outboundQueue.length > 0 &&\n this.flightSize < cwnd &&\n this.peerRwnd > 0\n ) {\n const chunk = this.outboundQueue.shift();\n if (!chunk) break;\n if (chunk.bookSize > this.peerRwnd && this.flightSize > 0) {\n this.outboundQueue.unshift(chunk);\n break;\n }\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 if (!this.outboundQueue.length) {\n // Resetting the queue to empty array mitigates this.\n this.outboundQueue = [];\n }\n this.flush.execute();\n }\n\n async transmitReconfigRequest() {\n if (\n this.reconfigQueue.length > 0 &&\n this.associationState === SCTP_STATE.ESTABLISHED &&\n !this.reconfigRequest\n ) {\n // Remove duplicate stream IDs from reconfigQueue\n const uniqueStreams = [...new Set(this.reconfigQueue)];\n const streams = uniqueStreams.slice(0, RECONFIG_MAX_STREAMS);\n\n this.reconfigQueue = uniqueStreams.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 if (this.isStopped) return;\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 if (this.isStopped) return;\n this.sendChunk(this.timer1Chunk!).catch((err: Error) => {\n log(\"send timer1 chunk failed\", err.message);\n });\n });\n if (this.isStopped) return;\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 if (this.isStopped) return;\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 if (this.isStopped) return;\n this.sendChunk(this.timer2Chunk!).catch((err: Error) => {\n log(\"send timer2Chunk failed\", err.message);\n });\n });\n if (this.isStopped) return;\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.isStopped) return;\n if (this.timer3Handle) throw new Error();\n // RFC 9260 T3-rtx runs on current RTO; rto is stored in seconds.\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto * 1000);\n }\n\n private timer3Restart() {\n if (this.isStopped) return;\n this.timer3Cancel();\n // RFC 9260 requires restarting T3-rtx with current RTO (seconds -> JS ms).\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto * 1000);\n }\n\n private timer3Expired = () => {\n if (this.isStopped) return;\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.isStopped) return;\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 if (this.isStopped) return;\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 if (this.isStopped) return;\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 // Reset failures counter when timer is successfully cancelled\n this.timerReconfigFailures = 0;\n }\n }\n\n private heartbeatStart() {\n if (\n this.timerHeartbeatHandle ||\n this.associationState !== SCTP_STATE.ESTABLISHED\n ) {\n return;\n }\n // RFC 9260 heartbeat timer is based on RTO + HB.interval for idle paths.\n this.timerHeartbeatHandle = setTimeout(\n this.timerHeartbeatExpired,\n (this.rto + this.heartbeatInterval) * 1000,\n );\n }\n\n private heartbeatRestart() {\n this.heartbeatCancel();\n this.heartbeatStart();\n }\n\n private heartbeatCancel() {\n if (this.timerHeartbeatHandle) {\n clearTimeout(this.timerHeartbeatHandle);\n this.timerHeartbeatHandle = undefined;\n }\n }\n\n private timerHeartbeatExpired = async () => {\n this.timerHeartbeatHandle = undefined;\n if (this.associationState !== SCTP_STATE.ESTABLISHED) return;\n\n if (this.flightSize === 0 && this.outboundQueue.length === 0) {\n const heartbeat = new HeartbeatChunk();\n heartbeat.params.push([\n 1,\n Buffer.from(jspack.Pack(\"!L\", [Math.floor(Date.now() / 1000)])),\n ]);\n await this.sendChunk(heartbeat).catch((err: Error) => {\n log(\"send heartbeat failed\", err.message);\n });\n }\n this.heartbeatStart();\n };\n\n setHeartbeatInterval(interval: number) {\n if (interval <= 0) {\n throw new Error(\"heartbeat interval must be > 0\");\n }\n this.heartbeatInterval = interval;\n this.heartbeatRestart();\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 // Resetting the queue to empty array mitigates this.\n if (!this.sentQueue.length) {\n this.sentQueue = [];\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 (let pos = chunkPos; pos >= 0; pos--) {\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 (let pos = chunkPos; pos < this.sentQueue.length; pos++) {\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.isStopping = false;\n this.isClosed = false;\n this.setConnectionState(\"connected\");\n this.heartbeatStart();\n } else if (state === SCTP_STATE.CLOSED) {\n this.isClosed = true;\n this.timer1Cancel();\n this.timer2Cancel();\n this.timer3Cancel();\n this.timerReconfigCancel();\n this.heartbeatCancel();\n if (this.sackTimeout) {\n clearTimeout(this.sackTimeout);\n this.sackTimeout = undefined;\n }\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.isStopped) {\n this.setState(SCTP_STATE.CLOSED);\n return;\n }\n this.isStopping = true;\n this.transport.onData = undefined;\n if (this.sackTimeout) {\n clearTimeout(this.sackTimeout);\n this.sackTimeout = undefined;\n }\n if (this.associationState !== SCTP_STATE.CLOSED) {\n await this.abort();\n }\n this.setState(SCTP_STATE.CLOSED);\n clearTimeout(this.timer1Handle);\n clearTimeout(this.timer2Handle);\n clearTimeout(this.timer3Handle);\n clearTimeout(this.timerReconfigHandle);\n clearTimeout(this.timerHeartbeatHandle);\n clearTimeout(this.sackTimeout);\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"]}
@@ -8,6 +8,7 @@ export interface DataChannelStats {
8
8
  messagesReceived: number;
9
9
  bytesReceived: number;
10
10
  }
11
+ export declare function getDataChannelMessageSize(data: Buffer | string): number;
11
12
  export declare class RTCDataChannel extends EventTarget implements DataChannelStats {
12
13
  readonly sctp: RTCSctpTransport;
13
14
  private readonly parameters;
@@ -1,9 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RTCDataChannelParameters = exports.RTCDataChannel = void 0;
4
+ exports.getDataChannelMessageSize = getDataChannelMessageSize;
4
5
  const common_1 = require("./imports/common");
5
6
  const helper_1 = require("./helper");
6
7
  const log = (0, common_1.debug)("werift:packages/webrtc/src/dataChannel.ts");
8
+ function getDataChannelMessageSize(data) {
9
+ return Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data);
10
+ }
7
11
  class RTCDataChannel extends helper_1.EventTarget {
8
12
  constructor(sctp, parameters, sendOpen = true) {
9
13
  super();
@@ -220,10 +224,9 @@ class RTCDataChannel extends helper_1.EventTarget {
220
224
  }
221
225
  }
222
226
  send(data) {
223
- const size = Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data);
227
+ const size = this.sctp.datachannelSend(this, data);
224
228
  this.messagesSent++;
225
229
  this.bytesSent += size;
226
- this.sctp.datachannelSend(this, data);
227
230
  }
228
231
  close() {
229
232
  this.sctp.dataChannelClose(this);
@@ -1 +1 @@
1
- {"version":3,"file":"dataChannel.js","sourceRoot":"","sources":["../../../src/dataChannel.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event, debug } from \"./imports/common\";\n\nimport { EventTarget } from \"./helper\";\nimport type { RTCSctpTransport } from \"./transport/sctp\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\n\nconst log = debug(\"werift:packages/webrtc/src/dataChannel.ts\");\n\nexport interface DataChannelStats {\n messagesSent: number;\n bytesSent: number;\n messagesReceived: number;\n bytesReceived: number;\n}\n\nexport class RTCDataChannel extends EventTarget implements DataChannelStats {\n readonly stateChange = new Event<[DCState]>();\n readonly stateChanged = new Event<[DCState]>();\n readonly onMessage = new Event<[string | Buffer]>();\n // todo impl\n readonly error = new Event<[Error]>();\n readonly bufferedAmountLow = new Event();\n onopen?: Callback;\n onclose?: Callback;\n onclosing?: Callback;\n onmessage?: CallbackWithValue<MessageEvent>;\n // todo impl\n onerror?: CallbackWithValue<RTCErrorEvent>;\n isCreatedByRemote = false;\n id: number;\n readyState: DCState = \"connecting\";\n\n bufferedAmount = 0;\n private _bufferedAmountLowThreshold = 0;\n\n // Statistics\n messagesSent = 0;\n bytesSent = 0;\n messagesReceived = 0;\n bytesReceived = 0;\n\n constructor(\n readonly sctp: RTCSctpTransport,\n private readonly parameters: RTCDataChannelParameters,\n public readonly sendOpen = true,\n ) {\n super();\n\n this.id = this.parameters.id;\n\n if (parameters.negotiated) {\n if (this.id == undefined || this.id < 0 || this.id > 65534) {\n throw new Error(\n \"ID must be in range 0-65534 if data channel is negotiated out-of-band\",\n );\n }\n this.sctp.dataChannelAddNegotiated(this);\n } else {\n if (sendOpen) {\n this.sendOpen = false;\n this.sctp.dataChannelOpen(this);\n }\n }\n }\n\n get ordered() {\n return this.parameters.ordered;\n }\n\n get maxRetransmits() {\n return this.parameters.maxRetransmits;\n }\n\n get maxPacketLifeTime() {\n return this.parameters.maxPacketLifeTime;\n }\n\n get label() {\n return this.parameters.label;\n }\n\n get protocol() {\n return this.parameters.protocol;\n }\n\n get negotiated() {\n return this.parameters.negotiated;\n }\n\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value: number) {\n if (value < 0 || value > 4294967295) {\n throw new Error(\n \"bufferedAmountLowThreshold must be in range 0 - 4294967295\",\n );\n }\n this._bufferedAmountLowThreshold = value;\n }\n\n setId(id: number) {\n this.id = id;\n }\n\n setReadyState(state: DCState) {\n if (state !== this.readyState) {\n this.readyState = state;\n this.stateChange.execute(state);\n this.stateChanged.execute(state);\n\n switch (state) {\n case \"open\":\n if (this.onopen) this.onopen();\n this.emit(\"open\");\n break;\n case \"closed\":\n if (this.onclose) this.onclose();\n this.emit(\"close\");\n break;\n case \"closing\":\n if (this.onclosing) this.onclosing();\n break;\n }\n log(\"change state\", state);\n }\n }\n\n addBufferedAmount(amount: number) {\n const crossesThreshold =\n this.bufferedAmount > this.bufferedAmountLowThreshold &&\n this.bufferedAmount + amount <= this.bufferedAmountLowThreshold;\n this.bufferedAmount += amount;\n if (crossesThreshold) {\n this.bufferedAmountLow.execute();\n this.emit(\"bufferedamountlow\");\n }\n }\n\n send(data: Buffer | string) {\n const size = Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data);\n this.messagesSent++;\n this.bytesSent += size;\n this.sctp.datachannelSend(this, data);\n }\n\n close() {\n this.sctp.dataChannelClose(this);\n }\n}\n\nexport type DCState = \"open\" | \"closed\" | \"connecting\" | \"closing\";\n\nexport class RTCDataChannelParameters {\n label = \"\";\n maxPacketLifeTime?: number; // sec\n maxRetransmits?: number;\n ordered = true;\n protocol = \"\";\n negotiated = false;\n id!: number;\n constructor(props: Partial<RTCDataChannelParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport interface MessageEvent {\n data: string | Buffer;\n}\n\nexport interface RTCErrorEvent {\n error: any;\n}\n"]}
1
+ {"version":3,"file":"dataChannel.js","sourceRoot":"","sources":["../../../src/dataChannel.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event, debug } from \"./imports/common\";\n\nimport { EventTarget } from \"./helper\";\nimport type { RTCSctpTransport } from \"./transport/sctp\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\n\nconst log = debug(\"werift:packages/webrtc/src/dataChannel.ts\");\n\nexport interface DataChannelStats {\n messagesSent: number;\n bytesSent: number;\n messagesReceived: number;\n bytesReceived: number;\n}\n\nexport function getDataChannelMessageSize(data: Buffer | string) {\n return Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data);\n}\n\nexport class RTCDataChannel extends EventTarget implements DataChannelStats {\n readonly stateChange = new Event<[DCState]>();\n readonly stateChanged = new Event<[DCState]>();\n readonly onMessage = new Event<[string | Buffer]>();\n // todo impl\n readonly error = new Event<[Error]>();\n readonly bufferedAmountLow = new Event();\n onopen?: Callback;\n onclose?: Callback;\n onclosing?: Callback;\n onmessage?: CallbackWithValue<MessageEvent>;\n // todo impl\n onerror?: CallbackWithValue<RTCErrorEvent>;\n isCreatedByRemote = false;\n id: number;\n readyState: DCState = \"connecting\";\n\n bufferedAmount = 0;\n private _bufferedAmountLowThreshold = 0;\n\n // Statistics\n messagesSent = 0;\n bytesSent = 0;\n messagesReceived = 0;\n bytesReceived = 0;\n\n constructor(\n readonly sctp: RTCSctpTransport,\n private readonly parameters: RTCDataChannelParameters,\n public readonly sendOpen = true,\n ) {\n super();\n\n this.id = this.parameters.id;\n\n if (parameters.negotiated) {\n if (this.id == undefined || this.id < 0 || this.id > 65534) {\n throw new Error(\n \"ID must be in range 0-65534 if data channel is negotiated out-of-band\",\n );\n }\n this.sctp.dataChannelAddNegotiated(this);\n } else {\n if (sendOpen) {\n this.sendOpen = false;\n this.sctp.dataChannelOpen(this);\n }\n }\n }\n\n get ordered() {\n return this.parameters.ordered;\n }\n\n get maxRetransmits() {\n return this.parameters.maxRetransmits;\n }\n\n get maxPacketLifeTime() {\n return this.parameters.maxPacketLifeTime;\n }\n\n get label() {\n return this.parameters.label;\n }\n\n get protocol() {\n return this.parameters.protocol;\n }\n\n get negotiated() {\n return this.parameters.negotiated;\n }\n\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value: number) {\n if (value < 0 || value > 4294967295) {\n throw new Error(\n \"bufferedAmountLowThreshold must be in range 0 - 4294967295\",\n );\n }\n this._bufferedAmountLowThreshold = value;\n }\n\n setId(id: number) {\n this.id = id;\n }\n\n setReadyState(state: DCState) {\n if (state !== this.readyState) {\n this.readyState = state;\n this.stateChange.execute(state);\n this.stateChanged.execute(state);\n\n switch (state) {\n case \"open\":\n if (this.onopen) this.onopen();\n this.emit(\"open\");\n break;\n case \"closed\":\n if (this.onclose) this.onclose();\n this.emit(\"close\");\n break;\n case \"closing\":\n if (this.onclosing) this.onclosing();\n break;\n }\n log(\"change state\", state);\n }\n }\n\n addBufferedAmount(amount: number) {\n const crossesThreshold =\n this.bufferedAmount > this.bufferedAmountLowThreshold &&\n this.bufferedAmount + amount <= this.bufferedAmountLowThreshold;\n this.bufferedAmount += amount;\n if (crossesThreshold) {\n this.bufferedAmountLow.execute();\n this.emit(\"bufferedamountlow\");\n }\n }\n\n send(data: Buffer | string) {\n const size = this.sctp.datachannelSend(this, data);\n this.messagesSent++;\n this.bytesSent += size;\n }\n\n close() {\n this.sctp.dataChannelClose(this);\n }\n}\n\nexport type DCState = \"open\" | \"closed\" | \"connecting\" | \"closing\";\n\nexport class RTCDataChannelParameters {\n label = \"\";\n maxPacketLifeTime?: number; // sec\n maxRetransmits?: number;\n ordered = true;\n protocol = \"\";\n negotiated = false;\n id!: number;\n constructor(props: Partial<RTCDataChannelParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport interface MessageEvent {\n data: string | Buffer;\n}\n\nexport interface RTCErrorEvent {\n error: any;\n}\n"]}
@@ -23,6 +23,7 @@ export declare class RTCPeerConnection extends EventTarget {
23
23
  private readonly secureManager;
24
24
  private isClosed;
25
25
  private shouldNegotiationneeded;
26
+ private remoteBundleNegotiated;
26
27
  readonly iceGatheringStateChange: Event<["complete" | "new" | "gathering"]>;
27
28
  readonly iceConnectionStateChange: Event<["disconnected" | "closed" | "completed" | "new" | "connected" | "failed" | "checking"]>;
28
29
  readonly signalingStateChange: Event<["closed" | "stable" | "have-local-offer" | "have-remote-offer" | "have-local-pranswer" | "have-remote-pranswer"]>;
@@ -48,7 +49,7 @@ export declare class RTCPeerConnection extends EventTarget {
48
49
  get iceGathererState(): "complete" | "new" | "gathering";
49
50
  get iceGatheringState(): "complete" | "new" | "gathering";
50
51
  get dtlsTransports(): RTCDtlsTransport[];
51
- get sctpTransport(): import(".").RTCSctpTransport | undefined;
52
+ get sctpTransport(): import("./transport/sctp").RTCSctpTransport | undefined;
52
53
  get sctpRemotePort(): number | undefined;
53
54
  get iceTransports(): RTCIceTransport[];
54
55
  get extIdUriMap(): {
@@ -149,6 +150,8 @@ export interface PeerConfig {
149
150
  disableRecvRetransmit: boolean;
150
151
  }>;
151
152
  midSuffix: boolean;
153
+ /** Advertised local SCTP max-message-size in SDP. Use 0 for unlimited. */
154
+ maxMessageSize: number;
152
155
  }
153
156
  export declare const findCodecByMimeType: (codecs: RTCRtpCodecParameters[], target: RTCRtpCodecParameters) => RTCRtpCodecParameters | undefined;
154
157
  export type RTCIceServer = {
@@ -10,6 +10,7 @@ const sctpManager_1 = require("./sctpManager");
10
10
  const sdp_1 = require("./sdp");
11
11
  const sdpManager_1 = require("./sdpManager");
12
12
  const secureTransportManager_1 = require("./secureTransportManager");
13
+ const sctp_1 = require("./transport/sctp");
13
14
  const utils_1 = require("./utils");
14
15
  const log = (0, common_1.debug)("werift:packages/webrtc/src/peerConnection.ts");
15
16
  class RTCPeerConnection extends helper_1.EventTarget {
@@ -87,6 +88,12 @@ class RTCPeerConnection extends helper_1.EventTarget {
87
88
  writable: true,
88
89
  value: false
89
90
  });
91
+ Object.defineProperty(this, "remoteBundleNegotiated", {
92
+ enumerable: true,
93
+ configurable: true,
94
+ writable: true,
95
+ value: false
96
+ });
90
97
  Object.defineProperty(this, "iceGatheringStateChange", {
91
98
  enumerable: true,
92
99
  configurable: true,
@@ -337,6 +344,14 @@ class RTCPeerConnection extends helper_1.EventTarget {
337
344
  if (min >= max)
338
345
  throw new Error("The min must be less than max");
339
346
  }
347
+ if (!Number.isInteger(this.config.maxMessageSize) ||
348
+ this.config.maxMessageSize < 0) {
349
+ throw new Error("maxMessageSize must be a non-negative integer");
350
+ }
351
+ if (this.sctpManager?.sctpTransport) {
352
+ this.sctpManager.sctpTransport.maxMessageSize =
353
+ this.config.maxMessageSize;
354
+ }
340
355
  for (const [i, codecParams] of (0, helper_1.enumerate)([
341
356
  ...(this.config.codecs.audio || []),
342
357
  ...(this.config.codecs.video || []),
@@ -391,7 +406,7 @@ class RTCPeerConnection extends helper_1.EventTarget {
391
406
  return description.toJSON();
392
407
  }
393
408
  createSctpTransport() {
394
- const sctp = this.sctpManager.createSctpTransport();
409
+ const sctp = this.sctpManager.createSctpTransport(this.config.maxMessageSize);
395
410
  const dtlsTransport = this.findOrCreateTransport();
396
411
  sctp.setDtlsTransport(dtlsTransport);
397
412
  return sctp;
@@ -416,13 +431,15 @@ class RTCPeerConnection extends helper_1.EventTarget {
416
431
  this.needNegotiation();
417
432
  }
418
433
  findOrCreateTransport() {
419
- const [existing] = this.iceTransports;
434
+ const existingDtlsTransport = this.dtlsTransports.find((transport) => transport.state !== "closed");
435
+ const existing = existingDtlsTransport?.iceTransport;
420
436
  // Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.
421
437
  // https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum
422
438
  if (this.sdpManager.bundlePolicy === "max-bundle" ||
423
- (this.sdpManager.bundlePolicy !== "disable" && this.remoteIsBundled)) {
424
- if (existing) {
425
- return this.dtlsTransports[0];
439
+ (this.sdpManager.bundlePolicy !== "disable" &&
440
+ (this.remoteIsBundled || this.remoteBundleNegotiated))) {
441
+ if (existingDtlsTransport) {
442
+ return existingDtlsTransport;
426
443
  }
427
444
  }
428
445
  const dtlsTransport = this.secureManager.createTransport();
@@ -593,6 +610,9 @@ class RTCPeerConnection extends helper_1.EventTarget {
593
610
  }
594
611
  // # parse and validate description
595
612
  const remoteSdp = this.sdpManager.setRemoteDescription(sessionDescription, this.signalingState);
613
+ if (remoteSdp.group.some((group) => group.semantic === "BUNDLE" && group.items.length > 0)) {
614
+ this.remoteBundleNegotiated = true;
615
+ }
596
616
  let bundleTransport;
597
617
  // # apply description
598
618
  const matchTransceiverWithMedia = (transceiver, media) => transceiver.kind === media.kind &&
@@ -832,6 +852,7 @@ function generateDefaultPeerConfig() {
832
852
  debug: {},
833
853
  midSuffix: false,
834
854
  forceTurnTCP: false,
855
+ maxMessageSize: sctp_1.DEFAULT_MAX_MESSAGE_SIZE,
835
856
  };
836
857
  }
837
858
  exports.defaultPeerConfig = generateDefaultPeerConfig();