werift 0.22.1 → 0.22.3
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.
- package/lib/common/src/binary.d.ts +8 -7
- package/lib/common/src/binary.js +5 -2
- package/lib/common/src/binary.js.map +1 -1
- package/lib/common/src/event.d.ts +1 -0
- package/lib/common/src/event.js +5 -0
- package/lib/common/src/event.js.map +1 -1
- package/lib/common/src/log.d.ts +1 -2
- package/lib/common/src/transport.d.ts +4 -1
- package/lib/common/src/transport.js +35 -14
- package/lib/common/src/transport.js.map +1 -1
- package/lib/dtls/src/cipher/create.d.ts +2 -1
- package/lib/dtls/src/cipher/create.js.map +1 -1
- package/lib/dtls/src/cipher/prf.d.ts +12 -12
- package/lib/dtls/src/cipher/suites/abstract.d.ts +2 -1
- package/lib/dtls/src/cipher/suites/abstract.js.map +1 -1
- package/lib/dtls/src/cipher/suites/aead.d.ts +3 -2
- package/lib/dtls/src/cipher/suites/aead.js +34 -41
- package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
- package/lib/dtls/src/context/cipher.d.ts +4 -4
- package/lib/dtls/src/context/cipher.js +25 -15
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/context/srtp.d.ts +3 -3
- package/lib/dtls/src/context/srtp.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/signature.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/useSrtp.js +4 -7
- package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
- package/lib/dtls/src/handshake/message/alert.d.ts +1 -1
- package/lib/dtls/src/handshake/message/certificate.d.ts +1 -1
- package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/message/finished.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/certificateRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloDone.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/random.d.ts +3 -3
- package/lib/dtls/src/record/message/fragment.d.ts +1 -1
- package/lib/dtls/src/record/message/header.d.ts +2 -19
- package/lib/dtls/src/record/message/header.js +1 -60
- package/lib/dtls/src/record/message/header.js.map +1 -1
- package/lib/dtls/src/record/message/plaintext.d.ts +6 -27
- package/lib/dtls/src/record/message/plaintext.js +34 -16
- package/lib/dtls/src/record/message/plaintext.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +4 -4
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/dtls/src/util/binary.d.ts +1 -1
- package/lib/ice/src/candidate.js +1 -5
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/helper.d.ts +1 -1
- package/lib/ice/src/ice.d.ts +4 -3
- package/lib/ice/src/ice.js +93 -72
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +21 -2
- package/lib/ice/src/iceBase.js +47 -1
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/attributes.d.ts +2 -2
- package/lib/ice/src/stun/attributes.js +48 -29
- package/lib/ice/src/stun/attributes.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +2 -2
- package/lib/ice/src/stun/message.js +22 -23
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +2 -2
- package/lib/ice/src/stun/protocol.js +6 -0
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +2 -2
- package/lib/ice/src/turn/protocol.js +3 -0
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/index.mjs +2707 -1883
- package/lib/nonstandard/index.mjs +737 -698
- package/lib/rtp/src/codec/av1.d.ts +2 -2
- package/lib/rtp/src/codec/opus.d.ts +1 -1
- package/lib/rtp/src/extra/container/mp4/container.js +18 -8
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +2 -2
- package/lib/rtp/src/extra/container/mp4/sps-parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/ogg/parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/webm/container.d.ts +9 -9
- package/lib/rtp/src/extra/container/webm/container.js +24 -12
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.d.ts +35 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.js +75 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +222 -222
- package/lib/rtp/src/extra/container/webm/index.d.ts +1 -0
- package/lib/rtp/src/extra/container/webm/index.js +1 -0
- package/lib/rtp/src/extra/container/webm/index.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/util.d.ts +8 -0
- package/lib/rtp/src/extra/container/webm/util.js +100 -0
- package/lib/rtp/src/extra/container/webm/util.js.map +1 -0
- package/lib/rtp/src/extra/processor/depacketizerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/depacketizerTransformer.d.ts +6 -1
- package/lib/rtp/src/extra/processor/dtx.d.ts +1 -1
- package/lib/rtp/src/extra/processor/dtx.js +1 -1
- package/lib/rtp/src/extra/processor/dtx.js.map +1 -1
- package/lib/rtp/src/extra/processor/dtxCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/interface.d.ts +1 -1
- package/lib/rtp/src/extra/processor/jitterBufferCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/lipsync.js +1 -1
- package/lib/rtp/src/extra/processor/lipsync.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +3 -0
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mute.d.ts +1 -1
- package/lib/rtp/src/extra/processor/mute.js +1 -1
- package/lib/rtp/src/extra/processor/mute.js.map +1 -1
- package/lib/rtp/src/extra/processor/nackHandlerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/ntpTime.d.ts +1 -1
- package/lib/rtp/src/extra/processor/ntpTime.js +1 -1
- package/lib/rtp/src/extra/processor/ntpTime.js.map +1 -1
- package/lib/rtp/src/extra/processor/ntpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/rtpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webm.d.ts +3 -3
- package/lib/rtp/src/extra/processor/webm.js.map +1 -1
- package/lib/rtp/src/extra/processor/webmStream.d.ts +2 -2
- package/lib/rtp/src/extra/processor/webmStream.js.map +1 -1
- package/lib/rtp/src/helper.d.ts +1 -1
- package/lib/rtp/src/rtcp/header.d.ts +2 -1
- package/lib/rtp/src/rtcp/header.js +10 -0
- package/lib/rtp/src/rtcp/header.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/fullIntraRequest.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/index.d.ts +2 -2
- package/lib/rtp/src/rtcp/psfb/index.js +2 -2
- package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/pictureLossIndication.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/remb.d.ts +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -2
- package/lib/rtp/src/rtcp/rr.js +2 -2
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtcp.d.ts +0 -1
- package/lib/rtp/src/rtcp/rtcp.js +0 -10
- package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/const.d.ts +1 -0
- package/lib/rtp/src/rtcp/rtpfb/const.js +5 -0
- package/lib/rtp/src/rtcp/rtpfb/const.js.map +1 -0
- package/lib/rtp/src/rtcp/rtpfb/index.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js +2 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.js +2 -2
- package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/twcc.d.ts +4 -4
- package/lib/rtp/src/rtcp/sdes.d.ts +4 -4
- package/lib/rtp/src/rtcp/sdes.js +2 -2
- package/lib/rtp/src/rtcp/sdes.js.map +1 -1
- package/lib/rtp/src/rtcp/sr.d.ts +2 -2
- package/lib/rtp/src/rtcp/sr.js +2 -2
- package/lib/rtp/src/rtcp/sr.js.map +1 -1
- package/lib/rtp/src/rtp/headerExtension.d.ts +6 -6
- package/lib/rtp/src/rtp/red/packet.d.ts +2 -2
- package/lib/rtp/src/rtp/rtp.d.ts +2 -2
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +4 -4
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +4 -4
- package/lib/rtp/src/srtp/const.d.ts +3 -3
- package/lib/rtp/src/srtp/const.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +10 -10
- package/lib/rtp/src/srtp/context/context.js +10 -4
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/srtcp.d.ts +2 -2
- package/lib/rtp/src/srtp/srtp.d.ts +2 -2
- package/lib/sctp/src/chunk.d.ts +12 -12
- package/lib/sctp/src/chunk.js +87 -66
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/param.d.ts +3 -3
- package/lib/sctp/src/param.js +4 -5
- package/lib/sctp/src/param.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +3 -1
- package/lib/sctp/src/sctp.js +58 -15
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +15 -4
- package/lib/webrtc/src/dataChannel.js +42 -7
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +1 -0
- package/lib/webrtc/src/index.js +1 -0
- package/lib/webrtc/src/index.js.map +1 -1
- package/lib/webrtc/src/media/index.d.ts +2 -0
- package/lib/webrtc/src/media/index.js +2 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/parameters.d.ts +2 -2
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.js +3 -7
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.d.ts +2 -2
- package/lib/webrtc/src/media/receiver/receiverTwcc.js +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
- package/lib/webrtc/src/media/router.js +2 -1
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -3
- package/lib/webrtc/src/media/rtpReceiver.js +53 -4
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +6 -0
- package/lib/webrtc/src/media/rtpSender.js +64 -26
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +12 -9
- package/lib/webrtc/src/media/rtpTransceiver.js +30 -26
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +279 -0
- package/lib/webrtc/src/media/stats.js +35 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/media/track.js +3 -3
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.js +2 -2
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +35 -64
- package/lib/webrtc/src/peerConnection.js +337 -1034
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +27 -0
- package/lib/webrtc/src/sctpManager.js +147 -0
- package/lib/webrtc/src/sctpManager.js.map +1 -0
- package/lib/webrtc/src/sdp.d.ts +3 -2
- package/lib/webrtc/src/sdp.js +17 -7
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +78 -0
- package/lib/webrtc/src/sdpManager.js +391 -0
- package/lib/webrtc/src/sdpManager.js.map +1 -0
- package/lib/webrtc/src/secureTransportManager.d.ts +56 -0
- package/lib/webrtc/src/secureTransportManager.js +349 -0
- package/lib/webrtc/src/secureTransportManager.js.map +1 -0
- package/lib/webrtc/src/transceiverManager.d.ts +40 -0
- package/lib/webrtc/src/transceiverManager.js +355 -0
- package/lib/webrtc/src/transceiverManager.js.map +1 -0
- package/lib/webrtc/src/transport/dtls.d.ts +18 -6
- package/lib/webrtc/src/transport/dtls.js +128 -13
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +24 -0
- package/lib/webrtc/src/transport/ice.js +88 -2
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +13 -26
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +9 -4
- package/lib/webrtc/src/utils.js +34 -13
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +12 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../../sctp/src/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["// ID Value Chunk Type\n// ----- ----------\n// 0 - Payload Data (DATA)\n// 1 - Initiation (INIT)\n// 2 - Initiation Acknowledgement (INIT ACK)\n// 3 - Selective Acknowledgement (SACK)\n// 4 - Heartbeat Request (HEARTBEAT)\n// 5 - Heartbeat Acknowledgement (HEARTBEAT ACK)\n// 6 - Abort (ABORT)\n// 7 - Shutdown (SHUTDOWN)\n// 8 - Shutdown Acknowledgement (SHUTDOWN ACK)\n// 9 - Operation Error (ERROR)\n// 10 - State Cookie (COOKIE ECHO)\n// 11 - Cookie Acknowledgement (COOKIE ACK)\n// 12 - Reserved for Explicit Congestion Notification Echo\n// (ECNE)\n// 13 - Reserved for Congestion Window Reduced (CWR)\n// 14 - Shutdown Complete (SHUTDOWN COMPLETE)\n// 15 to 62 - available\n// 63 - reserved for IETF-defined Chunk Extensions\n// 64 to 126 - available\n// 127 - reserved for IETF-defined Chunk Extensions\n// 128 to 190 - available\n// 191 - reserved for IETF-defined Chunk Extensions\n// 192 to 254 - available\n// 255 - reserved for IETF-defined Chunk Extensions\n\nimport { jspack } from \"@shinyoshiaki/jspack\";\nimport crc32c from \"turbo-crc32/crc32c.js\";\n\nexport class Chunk {\n public get body(): Buffer | undefined {\n return this._body;\n }\n public set body(value: Buffer | undefined) {\n this._body = value;\n }\n static type = -1;\n\n constructor(\n public flags = 0,\n private _body: Buffer | undefined = Buffer.from(\"\"),\n ) {}\n\n get type() {\n return Chunk.type;\n }\n\n get bytes() {\n if (!this.body) throw new Error();\n\n const data = Buffer.concat([\n Buffer.from(\n jspack.Pack(\"!BBH\", [this.type, this.flags, this.body.length + 4]),\n ),\n this.body,\n ...[...Array(padL(this.body.length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n return data;\n }\n}\n\nexport class BaseInitChunk extends Chunk {\n initiateTag: number;\n advertisedRwnd: number;\n outboundStreams: number;\n inboundStreams: number;\n initialTsn: number;\n params: [number, Buffer][];\n constructor(\n public flags = 0,\n body?: Buffer,\n ) {\n super(flags, body);\n\n if (body) {\n [\n this.initiateTag,\n this.advertisedRwnd,\n this.outboundStreams,\n this.inboundStreams,\n this.initialTsn,\n ] = jspack.Unpack(\"!LLHHL\", body);\n this.params = decodeParams(body.slice(16));\n } else {\n this.initiateTag = 0;\n this.advertisedRwnd = 0;\n this.outboundStreams = 0;\n this.inboundStreams = 0;\n this.initialTsn = 0;\n this.params = [];\n }\n }\n\n get body() {\n let body = Buffer.from(\n jspack.Pack(\"!LLHHL\", [\n this.initiateTag,\n this.advertisedRwnd,\n this.outboundStreams,\n this.inboundStreams,\n this.initialTsn,\n ]),\n );\n body = Buffer.concat([body, encodeParams(this.params)]);\n return body;\n }\n}\n\nexport class InitChunk extends BaseInitChunk {\n static type = 1 as const;\n\n get type() {\n return InitChunk.type;\n }\n}\n\nexport class InitAckChunk extends BaseInitChunk {\n static type = 2 as const;\n\n get type() {\n return InitAckChunk.type;\n }\n}\n\nexport class ReConfigChunk extends BaseInitChunk {\n static type = 130 as const;\n\n get type() {\n return ReConfigChunk.type;\n }\n}\n\nexport class ForwardTsnChunk extends Chunk {\n static type = 192 as const;\n streams: [number, number][] = [];\n cumulativeTsn: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = jspack.Unpack(\"!L\", body)[0];\n let pos = 4;\n while (pos < body.length) {\n this.streams.push(\n jspack.Unpack(\"!HH\", body.slice(pos)) as [number, number],\n );\n pos += 4;\n }\n } else {\n this.cumulativeTsn = 0;\n }\n }\n\n get type() {\n return ForwardTsnChunk.type;\n }\n\n set body(_: Buffer) {}\n\n get body() {\n const body = Buffer.from(jspack.Pack(\"!L\", [this.cumulativeTsn]));\n return Buffer.concat([\n body,\n ...this.streams.map(([id, seq]) =>\n Buffer.from(jspack.Pack(\"!HH\", [id, seq])),\n ),\n ]);\n }\n}\n\nexport class DataChunk extends Chunk {\n static type = 0 as const;\n get type() {\n return DataChunk.type;\n }\n tsn: number = 0;\n streamId: number = 0;\n streamSeqNum: number = 0;\n protocol: number = 0;\n userData: Buffer = Buffer.from(\"\");\n abandoned: boolean = false;\n acked: boolean = false;\n misses: number = 0;\n retransmit: boolean = false;\n sentCount: number = 0;\n bookSize: number = 0;\n expiry?: number;\n maxRetransmits?: number;\n sentTime?: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n if (body) {\n [this.tsn, this.streamId, this.streamSeqNum, this.protocol] =\n jspack.Unpack(\"!LHHL\", body);\n this.userData = body.slice(12);\n }\n }\n\n get bytes() {\n const length = 16 + this.userData.length;\n let data = Buffer.concat([\n Buffer.from(\n jspack.Pack(\"!BBHLHHL\", [\n this.type,\n this.flags,\n length,\n this.tsn,\n this.streamId,\n this.streamSeqNum,\n this.protocol,\n ]),\n ),\n this.userData,\n ]);\n if (length % 4) {\n data = Buffer.concat([\n data,\n ...[...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n return data;\n }\n}\n\nexport class CookieEchoChunk extends Chunk {\n static type = 10 as const;\n\n get type() {\n return CookieEchoChunk.type;\n }\n}\n\nexport class CookieAckChunk extends Chunk {\n static type = 11 as const;\n\n get type() {\n return CookieAckChunk.type;\n }\n}\n\nexport class BaseParamsChunk extends Chunk {\n params: [number, Buffer][] = [];\n constructor(\n public flags = 0,\n body: Buffer | undefined = undefined,\n ) {\n super(flags, body);\n if (body) {\n this.params = decodeParams(body);\n }\n }\n\n get body() {\n return encodeParams(this.params);\n }\n}\n\nexport class AbortChunk extends BaseParamsChunk {\n static type = 6 as const;\n\n get type() {\n return AbortChunk.type;\n }\n}\n\nexport class ErrorChunk extends BaseParamsChunk {\n static type = 9 as const;\n static readonly CODE = {\n InvalidStreamIdentifier: 1,\n MissingMandatoryParameter: 2,\n StaleCookieError: 3,\n OutofResource: 4,\n UnresolvableAddress: 5,\n UnrecognizedChunkType: 6,\n InvalidMandatoryParameter: 7,\n UnrecognizedParameters: 8,\n NoUserData: 9,\n CookieReceivedWhileShuttingDown: 10,\n RestartofanAssociationwithNewAddresses: 11,\n UserInitiatedAbort: 12,\n ProtocolViolation: 13,\n } as const;\n\n get type() {\n return ErrorChunk.type;\n }\n\n get descriptions() {\n return this.params.map(([code, body]) => {\n const name = (Object.entries(ErrorChunk.CODE).find(\n ([, num]) => num === code,\n ) || [])[0];\n return { name, body };\n });\n }\n}\n\nexport class HeartbeatChunk extends BaseParamsChunk {\n static type = 4 as const;\n\n get type() {\n return HeartbeatChunk.type;\n }\n}\n\nexport class HeartbeatAckChunk extends BaseParamsChunk {\n static type = 5 as const;\n\n get type() {\n return HeartbeatAckChunk.type;\n }\n}\n\n// https://tools.ietf.org/html/rfc6525#section-3.1\n// chunkReconfig represents an SCTP Chunk used to reconfigure streams.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Type = 130 | Chunk Flags | Chunk Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter (optional) /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class ReconfigChunk extends BaseParamsChunk {\n static type = 130 as const;\n\n get type() {\n return ReconfigChunk.type;\n }\n}\n\nexport class SackChunk extends Chunk {\n static type = 3;\n get type() {\n return SackChunk.type;\n }\n\n gaps: [number, number][] = [];\n duplicates: number[] = [];\n cumulativeTsn = 0;\n advertisedRwnd = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n const [cumulativeTsn, advertisedRwnd, nbGaps, nbDuplicates] =\n jspack.Unpack(\"!LLHH\", body);\n this.cumulativeTsn = cumulativeTsn;\n this.advertisedRwnd = advertisedRwnd;\n\n let pos = 12;\n\n [...Array(nbGaps)].forEach(() => {\n this.gaps.push(\n jspack.Unpack(\"!HH\", body.slice(pos)) as [number, number],\n );\n pos += 4;\n });\n\n [...Array(nbDuplicates)].forEach(() => {\n this.duplicates.push(jspack.Unpack(\"!L\", body.slice(pos))[0]);\n pos += 4;\n });\n }\n }\n\n get bytes() {\n const length = 16 + 4 * (this.gaps.length + this.duplicates.length);\n let data = Buffer.from(\n jspack.Pack(\"!BBHLLHH\", [\n this.type,\n this.flags,\n length,\n this.cumulativeTsn,\n this.advertisedRwnd,\n this.gaps.length,\n this.duplicates.length,\n ]),\n );\n data = Buffer.concat([\n data,\n ...this.gaps.map((gap) => Buffer.from(jspack.Pack(\"!HH\", gap))),\n ]);\n data = Buffer.concat([\n data,\n ...this.duplicates.map((tsn) => Buffer.from(jspack.Pack(\"!L\", [tsn]))),\n ]);\n return data;\n }\n}\n\nexport class ShutdownChunk extends Chunk {\n static type = 7;\n get type() {\n return ShutdownChunk.type;\n }\n\n cumulativeTsn = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = jspack.Unpack(\"!L\", body)[0];\n }\n }\n\n get body() {\n return Buffer.from(jspack.Pack(\"!L\", [this.cumulativeTsn]));\n }\n}\n\nexport class ShutdownAckChunk extends Chunk {\n static type = 8;\n get type() {\n return ShutdownAckChunk.type;\n }\n}\n\nexport class ShutdownCompleteChunk extends Chunk {\n static type = 14;\n get type() {\n return ShutdownCompleteChunk.type;\n }\n}\n\nconst CHUNK_CLASSES: (typeof Chunk)[] = [\n DataChunk,\n InitChunk,\n InitAckChunk,\n SackChunk,\n HeartbeatChunk,\n HeartbeatAckChunk,\n AbortChunk,\n ShutdownChunk,\n ShutdownAckChunk,\n ErrorChunk,\n CookieEchoChunk,\n CookieAckChunk,\n ShutdownCompleteChunk,\n ReconfigChunk,\n ForwardTsnChunk,\n];\n\nexport const CHUNK_BY_TYPE = CHUNK_CLASSES.reduce(\n (acc: { [key: string]: typeof Chunk }, cur) => {\n acc[cur.type] = cur;\n return acc;\n },\n {},\n);\n\nfunction padL(l: number) {\n const m = l % 4;\n return m ? 4 - m : 0;\n}\n\nfunction encodeParams(params: [number, Buffer][]) {\n let body = Buffer.from(\"\");\n let padding = Buffer.from(\"\");\n params.forEach(([type, value]) => {\n const length = value.length + 4;\n body = Buffer.concat([\n body,\n padding,\n Buffer.from(jspack.Pack(\"!HH\", [type, length])),\n value,\n ]);\n padding = Buffer.concat(\n [...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n );\n });\n return body;\n}\n\nexport function decodeParams(body: Buffer): [number, Buffer][] {\n const params: [number, Buffer][] = [];\n let pos = 0;\n while (pos <= body.length - 4) {\n const [type, length] = jspack.Unpack(\"!HH\", body.slice(pos));\n params.push([type, body.slice(pos + 4, pos + length)]);\n pos += length + padL(length);\n }\n return params;\n}\n\nexport function parsePacket(data: Buffer): [number, number, number, Chunk[]] {\n if (data.length < 12)\n throw new Error(\"SCTP packet length is less than 12 bytes\");\n\n const [sourcePort, destinationPort, verificationTag] = jspack.Unpack(\n \"!HHL\",\n data,\n );\n\n const checkSum = data.readUInt32LE(8);\n\n const expect = crc32c(\n Buffer.concat([\n data.slice(0, 8),\n Buffer.from(\"\\x00\\x00\\x00\\x00\"),\n data.slice(12),\n ]),\n );\n\n if (checkSum !== expect) throw new Error(\"SCTP packet has invalid checksum\");\n\n const chunks: Chunk[] = [];\n let pos = 12;\n while (pos + 4 <= data.length) {\n const [chunkType, chunkFlags, chunkLength] = jspack.Unpack(\n \"!BBH\",\n data.slice(pos),\n );\n const chunkBody = data.slice(pos + 4, pos + chunkLength);\n const ChunkClass = CHUNK_BY_TYPE[chunkType.toString()];\n if (ChunkClass) {\n chunks.push(new ChunkClass(chunkFlags, chunkBody));\n } else {\n throw new Error(\"unknown\");\n }\n pos += chunkLength + padL(chunkLength);\n }\n return [sourcePort, destinationPort, verificationTag, chunks];\n}\n\nexport function serializePacket(\n sourcePort: number,\n destinationPort: number,\n verificationTag: number,\n chunk: Chunk,\n) {\n const header = Buffer.from(\n jspack.Pack(\"!HHL\", [sourcePort, destinationPort, verificationTag]),\n );\n const body = chunk.bytes;\n\n const checksum: number = crc32c(\n Buffer.concat([header, Buffer.from(\"\\x00\\x00\\x00\\x00\"), body]),\n );\n const checkSumBuf = Buffer.alloc(4);\n checkSumBuf.writeUInt32LE(checksum, 0);\n\n const packet = Buffer.concat([header, checkSumBuf, body]);\n\n return packet;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../../sctp/src/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["// ID Value Chunk Type\n// ----- ----------\n// 0 - Payload Data (DATA)\n// 1 - Initiation (INIT)\n// 2 - Initiation Acknowledgement (INIT ACK)\n// 3 - Selective Acknowledgement (SACK)\n// 4 - Heartbeat Request (HEARTBEAT)\n// 5 - Heartbeat Acknowledgement (HEARTBEAT ACK)\n// 6 - Abort (ABORT)\n// 7 - Shutdown (SHUTDOWN)\n// 8 - Shutdown Acknowledgement (SHUTDOWN ACK)\n// 9 - Operation Error (ERROR)\n// 10 - State Cookie (COOKIE ECHO)\n// 11 - Cookie Acknowledgement (COOKIE ACK)\n// 12 - Reserved for Explicit Congestion Notification Echo\n// (ECNE)\n// 13 - Reserved for Congestion Window Reduced (CWR)\n// 14 - Shutdown Complete (SHUTDOWN COMPLETE)\n// 15 to 62 - available\n// 63 - reserved for IETF-defined Chunk Extensions\n// 64 to 126 - available\n// 127 - reserved for IETF-defined Chunk Extensions\n// 128 to 190 - available\n// 191 - reserved for IETF-defined Chunk Extensions\n// 192 to 254 - available\n// 255 - reserved for IETF-defined Chunk Extensions\n\nimport crc32c from \"turbo-crc32/crc32c.js\";\n\nexport class Chunk {\n public get body(): Buffer | undefined {\n return this._body;\n }\n public set body(value: Buffer | undefined) {\n this._body = value;\n }\n static type = -1;\n\n constructor(\n public flags = 0,\n private _body: Buffer | undefined = Buffer.from(\"\"),\n ) {}\n\n get type() {\n return Chunk.type;\n }\n\n get bytes() {\n if (!this.body) throw new Error();\n\n const header = Buffer.alloc(4);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(this.body.length + 4, 2);\n\n const data = Buffer.concat([\n header,\n this.body,\n ...[...Array(padL(this.body.length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n return data;\n }\n}\n\nexport class BaseInitChunk extends Chunk {\n initiateTag: number;\n advertisedRwnd: number;\n outboundStreams: number;\n inboundStreams: number;\n initialTsn: number;\n params: [number, Buffer][];\n\n constructor(\n public flags = 0,\n body?: Buffer,\n ) {\n super(flags, body);\n\n if (body) {\n this.initiateTag = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n this.outboundStreams = body.readUInt16BE(8);\n this.inboundStreams = body.readUInt16BE(10);\n this.initialTsn = body.readUInt32BE(12);\n this.params = decodeParams(body.slice(16));\n } else {\n this.initiateTag = 0;\n this.advertisedRwnd = 0;\n this.outboundStreams = 0;\n this.inboundStreams = 0;\n this.initialTsn = 0;\n this.params = [];\n }\n }\n\n get body() {\n const body = Buffer.alloc(16);\n body.writeUInt32BE(this.initiateTag, 0);\n body.writeUInt32BE(this.advertisedRwnd, 4);\n body.writeUInt16BE(this.outboundStreams, 8);\n body.writeUInt16BE(this.inboundStreams, 10);\n body.writeUInt32BE(this.initialTsn, 12);\n return Buffer.concat([body, encodeParams(this.params)]);\n }\n}\n\nexport class InitChunk extends BaseInitChunk {\n static type = 1 as const;\n\n get type() {\n return InitChunk.type;\n }\n}\n\nexport class InitAckChunk extends BaseInitChunk {\n static type = 2 as const;\n\n get type() {\n return InitAckChunk.type;\n }\n}\n\nexport class ReConfigChunk extends BaseInitChunk {\n static type = 130 as const;\n\n get type() {\n return ReConfigChunk.type;\n }\n}\n\nexport class ForwardTsnChunk extends Chunk {\n static type = 192 as const;\n streams: [number, number][] = [];\n cumulativeTsn: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n let pos = 4;\n while (pos < body.length) {\n this.streams.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n }\n } else {\n this.cumulativeTsn = 0;\n }\n }\n\n get type() {\n return ForwardTsnChunk.type;\n }\n\n set body(_: Buffer) {}\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return Buffer.concat([\n body,\n ...this.streams.map(([id, seq]) => {\n const streamBuffer = Buffer.alloc(4);\n streamBuffer.writeUInt16BE(id, 0);\n streamBuffer.writeUInt16BE(seq, 2);\n return streamBuffer;\n }),\n ]);\n }\n}\n\nexport class DataChunk extends Chunk {\n static type = 0 as const;\n get type() {\n return DataChunk.type;\n }\n tsn: number = 0;\n streamId: number = 0;\n streamSeqNum: number = 0;\n protocol: number = 0;\n userData: Buffer = Buffer.from(\"\");\n abandoned: boolean = false;\n acked: boolean = false;\n misses: number = 0;\n retransmit: boolean = false;\n sentCount: number = 0;\n bookSize: number = 0;\n expiry?: number;\n maxRetransmits?: number;\n sentTime?: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n if (body) {\n this.tsn = body.readUInt32BE(0);\n this.streamId = body.readUInt16BE(4);\n this.streamSeqNum = body.readUInt16BE(6);\n this.protocol = body.readUInt32BE(8);\n this.userData = body.slice(12);\n }\n }\n\n get bytes() {\n const length = 16 + this.userData.length;\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.tsn, 4);\n header.writeUInt16BE(this.streamId, 8);\n header.writeUInt16BE(this.streamSeqNum, 10);\n header.writeUInt32BE(this.protocol, 12);\n\n let data = Buffer.concat([header, this.userData]);\n if (length % 4) {\n data = Buffer.concat([\n data,\n ...[...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n return data;\n }\n}\n\nexport class CookieEchoChunk extends Chunk {\n static type = 10 as const;\n\n get type() {\n return CookieEchoChunk.type;\n }\n}\n\nexport class CookieAckChunk extends Chunk {\n static type = 11 as const;\n\n get type() {\n return CookieAckChunk.type;\n }\n}\n\nexport class BaseParamsChunk extends Chunk {\n params: [number, Buffer][] = [];\n constructor(\n public flags = 0,\n body: Buffer | undefined = undefined,\n ) {\n super(flags, body);\n if (body) {\n this.params = decodeParams(body);\n }\n }\n\n get body() {\n return encodeParams(this.params);\n }\n}\n\nexport class AbortChunk extends BaseParamsChunk {\n static type = 6 as const;\n\n get type() {\n return AbortChunk.type;\n }\n}\n\nexport class ErrorChunk extends BaseParamsChunk {\n static type = 9 as const;\n static readonly CODE = {\n InvalidStreamIdentifier: 1,\n MissingMandatoryParameter: 2,\n StaleCookieError: 3,\n OutofResource: 4,\n UnresolvableAddress: 5,\n UnrecognizedChunkType: 6,\n InvalidMandatoryParameter: 7,\n UnrecognizedParameters: 8,\n NoUserData: 9,\n CookieReceivedWhileShuttingDown: 10,\n RestartofanAssociationwithNewAddresses: 11,\n UserInitiatedAbort: 12,\n ProtocolViolation: 13,\n } as const;\n\n get type() {\n return ErrorChunk.type;\n }\n\n get descriptions() {\n return this.params.map(([code, body]) => {\n const name = (Object.entries(ErrorChunk.CODE).find(\n ([, num]) => num === code,\n ) || [])[0];\n return { name, body };\n });\n }\n}\n\nexport class HeartbeatChunk extends BaseParamsChunk {\n static type = 4 as const;\n\n get type() {\n return HeartbeatChunk.type;\n }\n}\n\nexport class HeartbeatAckChunk extends BaseParamsChunk {\n static type = 5 as const;\n\n get type() {\n return HeartbeatAckChunk.type;\n }\n}\n\n// https://tools.ietf.org/html/rfc6525#section-3.1\n// chunkReconfig represents an SCTP Chunk used to reconfigure streams.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Type = 130 | Chunk Flags | Chunk Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter (optional) /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class ReconfigChunk extends BaseParamsChunk {\n static type = 130 as const;\n\n get type() {\n return ReconfigChunk.type;\n }\n}\n\nexport class SackChunk extends Chunk {\n static type = 3;\n get type() {\n return SackChunk.type;\n }\n\n gaps: [number, number][] = [];\n duplicates: number[] = [];\n cumulativeTsn = 0;\n advertisedRwnd = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n const nbGaps = body.readUInt16BE(8);\n const nbDuplicates = body.readUInt16BE(10);\n\n let pos = 12;\n\n [...Array(nbGaps)].forEach(() => {\n this.gaps.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n });\n\n [...Array(nbDuplicates)].forEach(() => {\n this.duplicates.push(body.readUInt32BE(pos));\n pos += 4;\n });\n }\n }\n\n get bytes() {\n const length = 16 + 4 * (this.gaps.length + this.duplicates.length);\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.cumulativeTsn, 4);\n header.writeUInt32BE(this.advertisedRwnd, 8);\n header.writeUInt16BE(this.gaps.length, 12);\n header.writeUInt16BE(this.duplicates.length, 14);\n\n let data = Buffer.concat([\n header,\n ...this.gaps.map((gap) => {\n const gapBuffer = Buffer.alloc(4);\n gapBuffer.writeUInt16BE(gap[0], 0);\n gapBuffer.writeUInt16BE(gap[1], 2);\n return gapBuffer;\n }),\n ]);\n data = Buffer.concat([\n data,\n ...this.duplicates.map((tsn) => {\n const tsnBuffer = Buffer.alloc(4);\n tsnBuffer.writeUInt32BE(tsn, 0);\n return tsnBuffer;\n }),\n ]);\n return data;\n }\n}\n\nexport class ShutdownChunk extends Chunk {\n static type = 7;\n get type() {\n return ShutdownChunk.type;\n }\n\n cumulativeTsn = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n }\n }\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return body;\n }\n}\n\nexport class ShutdownAckChunk extends Chunk {\n static type = 8;\n get type() {\n return ShutdownAckChunk.type;\n }\n}\n\nexport class ShutdownCompleteChunk extends Chunk {\n static type = 14;\n get type() {\n return ShutdownCompleteChunk.type;\n }\n}\n\nconst CHUNK_CLASSES: (typeof Chunk)[] = [\n DataChunk,\n InitChunk,\n InitAckChunk,\n SackChunk,\n HeartbeatChunk,\n HeartbeatAckChunk,\n AbortChunk,\n ShutdownChunk,\n ShutdownAckChunk,\n ErrorChunk,\n CookieEchoChunk,\n CookieAckChunk,\n ShutdownCompleteChunk,\n ReconfigChunk,\n ForwardTsnChunk,\n];\n\nexport const CHUNK_BY_TYPE = CHUNK_CLASSES.reduce(\n (acc: { [key: string]: typeof Chunk }, cur) => {\n acc[cur.type] = cur;\n return acc;\n },\n {},\n);\n\nfunction padL(l: number) {\n const m = l % 4;\n return m ? 4 - m : 0;\n}\n\nfunction encodeParams(params: [number, Buffer][]) {\n let body = Buffer.from(\"\");\n let padding = Buffer.from(\"\");\n params.forEach(([type, value]) => {\n const length = value.length + 4;\n const paramHeader = Buffer.alloc(4);\n paramHeader.writeUInt16BE(type, 0);\n paramHeader.writeUInt16BE(length, 2);\n body = Buffer.concat([body, padding, paramHeader, value]);\n padding = Buffer.concat(\n [...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n );\n });\n return body;\n}\n\nexport function decodeParams(body: Buffer): [number, Buffer][] {\n const params: [number, Buffer][] = [];\n let pos = 0;\n while (pos <= body.length - 4) {\n const type = body.readUInt16BE(pos);\n const length = body.readUInt16BE(pos + 2);\n params.push([type, body.slice(pos + 4, pos + length)]);\n pos += length + padL(length);\n }\n return params;\n}\n\nexport function parsePacket(data: Buffer): [number, number, number, Chunk[]] {\n if (data.length < 12)\n throw new Error(\"SCTP packet length is less than 12 bytes\");\n\n const sourcePort = data.readUInt16BE(0);\n const destinationPort = data.readUInt16BE(2);\n const verificationTag = data.readUInt32BE(4);\n\n const checkSum = data.readUInt32LE(8);\n\n const expect = crc32c(\n Buffer.concat([\n data.slice(0, 8),\n Buffer.from(\"\\x00\\x00\\x00\\x00\"),\n data.slice(12),\n ]),\n );\n\n if (checkSum !== expect) throw new Error(\"SCTP packet has invalid checksum\");\n\n const chunks: Chunk[] = [];\n let pos = 12;\n while (pos + 4 <= data.length) {\n const chunkType = data.readUInt8(pos);\n const chunkFlags = data.readUInt8(pos + 1);\n const chunkLength = data.readUInt16BE(pos + 2);\n const chunkBody = data.slice(pos + 4, pos + chunkLength);\n const ChunkClass = CHUNK_BY_TYPE[chunkType.toString()];\n if (ChunkClass) {\n chunks.push(new ChunkClass(chunkFlags, chunkBody));\n } else {\n throw new Error(\"unknown\");\n }\n pos += chunkLength + padL(chunkLength);\n }\n return [sourcePort, destinationPort, verificationTag, chunks];\n}\n\nexport function serializePacket(\n sourcePort: number,\n destinationPort: number,\n verificationTag: number,\n chunk: Chunk,\n) {\n const header = Buffer.alloc(8);\n header.writeUInt16BE(sourcePort, 0);\n header.writeUInt16BE(destinationPort, 2);\n header.writeUInt32BE(verificationTag, 4);\n\n const body = chunk.bytes;\n\n const checksum: number = crc32c(\n Buffer.concat([header, Buffer.from(\"\\x00\\x00\\x00\\x00\"), body]),\n );\n const checkSumBuf = Buffer.alloc(4);\n checkSumBuf.writeUInt32LE(checksum, 0);\n\n const packet = Buffer.concat([header, checkSumBuf, body]);\n\n return packet;\n}\n"]}
|
package/lib/sctp/src/param.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export declare class OutgoingSSNResetRequestParam {
|
|
|
6
6
|
static type: number;
|
|
7
7
|
constructor(requestSequence: number, responseSequence: number, lastTsn: number, streams: number[]);
|
|
8
8
|
get type(): number;
|
|
9
|
-
get bytes(): Buffer
|
|
9
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
10
10
|
static parse(data: Buffer): OutgoingSSNResetRequestParam;
|
|
11
11
|
}
|
|
12
12
|
export declare class StreamAddOutgoingParam {
|
|
@@ -15,7 +15,7 @@ export declare class StreamAddOutgoingParam {
|
|
|
15
15
|
static type: number;
|
|
16
16
|
constructor(requestSequence: number, newStreams: number);
|
|
17
17
|
get type(): number;
|
|
18
|
-
get bytes(): Buffer
|
|
18
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
19
19
|
static parse(data: Buffer): StreamAddOutgoingParam;
|
|
20
20
|
}
|
|
21
21
|
export declare const reconfigResult: {
|
|
@@ -29,7 +29,7 @@ export declare class ReconfigResponseParam {
|
|
|
29
29
|
static type: number;
|
|
30
30
|
constructor(responseSequence: number, result: ReconfigResult);
|
|
31
31
|
get type(): number;
|
|
32
|
-
get bytes(): Buffer
|
|
32
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
33
33
|
static parse(data: Buffer): ReconfigResponseParam;
|
|
34
34
|
}
|
|
35
35
|
export type StreamParam = OutgoingSSNResetRequestParam | StreamAddOutgoingParam | ReconfigResponseParam;
|
package/lib/sctp/src/param.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.RECONFIG_PARAM_BY_TYPES = exports.ReconfigResponseParam = exports.reconfigResult = exports.StreamAddOutgoingParam = exports.OutgoingSSNResetRequestParam = void 0;
|
|
7
4
|
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
8
|
-
const range_js_1 = __importDefault(require("lodash/range.js"));
|
|
9
5
|
// This parameter is used by the sender to request the reset of some or
|
|
10
6
|
// all outgoing streams.
|
|
11
7
|
// 0 1 2 3
|
|
@@ -68,7 +64,10 @@ class OutgoingSSNResetRequestParam {
|
|
|
68
64
|
}
|
|
69
65
|
static parse(data) {
|
|
70
66
|
const [requestSequence, responseSequence, lastTsn] = jspack_1.jspack.Unpack("!LLL", data);
|
|
71
|
-
const stream =
|
|
67
|
+
const stream = [];
|
|
68
|
+
for (let pos = 12; pos < data.length; pos += 2) {
|
|
69
|
+
stream.push(jspack_1.jspack.Unpack("!H", data.slice(pos))[0]);
|
|
70
|
+
}
|
|
72
71
|
return new OutgoingSSNResetRequestParam(requestSequence, responseSequence, lastTsn, stream);
|
|
73
72
|
}
|
|
74
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"param.js","sourceRoot":"","sources":["../../../../sctp/src/param.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"param.js","sourceRoot":"","sources":["../../../../sctp/src/param.ts"],"names":[],"mappings":"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","sourcesContent":["import { jspack } from \"@shinyoshiaki/jspack\";\n\n// This parameter is used by the sender to request the reset of some or\n// all outgoing streams.\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Parameter Type = 13 | Parameter Length = 16 + 2 * N |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Re-configuration Request Sequence Number |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Re-configuration Response Sequence Number |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Sender's Last Assigned TSN |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Stream Number 1 (optional) | Stream Number 2 (optional) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// / ...... /\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Stream Number N-1 (optional) | Stream Number N (optional) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nexport class OutgoingSSNResetRequestParam {\n static type = 13; // Outgoing SSN Reset Request Parameter\n\n constructor(\n public requestSequence: number,\n public responseSequence: number,\n public lastTsn: number,\n public streams: number[],\n ) {}\n\n get type() {\n return OutgoingSSNResetRequestParam.type;\n }\n\n get bytes() {\n const data = Buffer.from(\n jspack.Pack(\"!LLL\", [\n this.requestSequence,\n this.responseSequence,\n this.lastTsn,\n ]),\n );\n\n return Buffer.concat([\n data,\n ...this.streams.map((stream) => Buffer.from(jspack.Pack(\"!H\", [stream]))),\n ]);\n }\n\n static parse(data: Buffer) {\n const [requestSequence, responseSequence, lastTsn] = jspack.Unpack(\n \"!LLL\",\n data,\n );\n const stream: number[] = [];\n\n for (let pos = 12; pos < data.length; pos += 2) {\n stream.push(jspack.Unpack(\"!H\", data.slice(pos))[0]);\n }\n\n return new OutgoingSSNResetRequestParam(\n requestSequence,\n responseSequence,\n lastTsn,\n stream,\n );\n }\n}\n\nexport class StreamAddOutgoingParam {\n static type = 17; // Add Outgoing Streams Request Parameter\n\n constructor(\n public requestSequence: number,\n public newStreams: number,\n ) {}\n\n get type() {\n return StreamAddOutgoingParam.type;\n }\n\n get bytes() {\n return Buffer.from(\n jspack.Pack(\"!LHH\", [this.requestSequence, this.newStreams, 0]),\n );\n }\n\n static parse(data: Buffer) {\n const [requestSequence, newStreams] = jspack.Unpack(\"!LHH\", data);\n return new StreamAddOutgoingParam(requestSequence, newStreams);\n }\n}\n\n// This parameter is used by the receiver of a Re-configuration Request\n// Parameter to respond to the request.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Parameter Type = 16 | Parameter Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Re-configuration Response Sequence Number |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Result |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Sender's Next TSN (optional) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Receiver's Next TSN (optional) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nexport const reconfigResult = {\n ReconfigResultSuccessPerformed: 1,\n BadSequenceNumber: 5,\n} as const;\ntype ReconfigResult = (typeof reconfigResult)[keyof typeof reconfigResult];\n\nexport class ReconfigResponseParam {\n static type = 16; // Re-configuration Response Parameter\n constructor(\n public responseSequence: number,\n public result: ReconfigResult,\n ) {}\n\n get type() {\n return ReconfigResponseParam.type;\n }\n\n get bytes() {\n return Buffer.from(\n jspack.Pack(\"!LL\", [this.responseSequence, this.result]),\n );\n }\n\n static parse(data: Buffer) {\n const [requestSequence, result] = jspack.Unpack(\"!LL\", data);\n return new ReconfigResponseParam(requestSequence, result as ReconfigResult);\n }\n}\n\nexport type StreamParam =\n | OutgoingSSNResetRequestParam\n | StreamAddOutgoingParam\n | ReconfigResponseParam;\n\nexport type StreamParamType =\n | typeof OutgoingSSNResetRequestParam\n | typeof StreamAddOutgoingParam\n | typeof ReconfigResponseParam;\n\nexport const RECONFIG_PARAM_BY_TYPES: { [type: number]: StreamParamType } = {\n 13: OutgoingSSNResetRequestParam, // Outgoing SSN Reset Request Parameter\n 16: ReconfigResponseParam, // Re-configuration Response Parameter\n 17: StreamAddOutgoingParam, // Add Outgoing Streams Request Parameter\n};\n"]}
|
package/lib/sctp/src/sctp.d.ts
CHANGED
|
@@ -9,12 +9,13 @@ type SCTPConnectionState = Unpacked<typeof SCTPConnectionStates>;
|
|
|
9
9
|
export declare class SCTP {
|
|
10
10
|
transport: Transport;
|
|
11
11
|
port: number;
|
|
12
|
+
flush: Event<[void]>;
|
|
12
13
|
readonly stateChanged: {
|
|
13
14
|
[key in SCTPConnectionState]: Event<[]>;
|
|
14
15
|
};
|
|
15
16
|
readonly onReconfigStreams: Event<[number[]]>;
|
|
16
17
|
/**streamId: number, ppId: number, data: Buffer */
|
|
17
|
-
readonly onReceive: Event<[number, number, Buffer]>;
|
|
18
|
+
readonly onReceive: Event<[number, number, Buffer<ArrayBufferLike>]>;
|
|
18
19
|
onSackReceived: () => Promise<void>;
|
|
19
20
|
associationState: SCTP_STATE;
|
|
20
21
|
started: boolean;
|
|
@@ -36,6 +37,7 @@ export declare class SCTP {
|
|
|
36
37
|
private sackDuplicates;
|
|
37
38
|
private sackMisOrdered;
|
|
38
39
|
private sackNeeded;
|
|
40
|
+
private sackTimeout;
|
|
39
41
|
private cwnd;
|
|
40
42
|
private fastRecoveryExit?;
|
|
41
43
|
private fastRecoveryTransmit;
|
package/lib/sctp/src/sctp.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.RTCSctpCapabilities = exports.InboundStream = exports.SCTP = void 0;
|
|
7
4
|
const crypto_1 = require("crypto");
|
|
8
5
|
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
9
|
-
const range_js_1 = __importDefault(require("lodash/range.js"));
|
|
10
6
|
const chunk_1 = require("./chunk");
|
|
11
7
|
const const_1 = require("./const");
|
|
12
8
|
const helper_1 = require("./helper");
|
|
@@ -56,6 +52,12 @@ class SCTP {
|
|
|
56
52
|
writable: true,
|
|
57
53
|
value: port
|
|
58
54
|
});
|
|
55
|
+
Object.defineProperty(this, "flush", {
|
|
56
|
+
enumerable: true,
|
|
57
|
+
configurable: true,
|
|
58
|
+
writable: true,
|
|
59
|
+
value: new common_1.Event()
|
|
60
|
+
});
|
|
59
61
|
Object.defineProperty(this, "stateChanged", {
|
|
60
62
|
enumerable: true,
|
|
61
63
|
configurable: true,
|
|
@@ -202,6 +204,12 @@ class SCTP {
|
|
|
202
204
|
writable: true,
|
|
203
205
|
value: false
|
|
204
206
|
});
|
|
207
|
+
Object.defineProperty(this, "sackTimeout", {
|
|
208
|
+
enumerable: true,
|
|
209
|
+
configurable: true,
|
|
210
|
+
writable: true,
|
|
211
|
+
value: void 0
|
|
212
|
+
});
|
|
205
213
|
// # outbound
|
|
206
214
|
Object.defineProperty(this, "cwnd", {
|
|
207
215
|
enumerable: true,
|
|
@@ -403,7 +411,7 @@ class SCTP {
|
|
|
403
411
|
const fragments = Math.ceil(userData.length / USERDATA_MAX_LENGTH);
|
|
404
412
|
let pos = 0;
|
|
405
413
|
const chunks = [];
|
|
406
|
-
for (
|
|
414
|
+
for (let fragment = 0; fragment < fragments; fragment++) {
|
|
407
415
|
const chunk = new chunk_1.DataChunk(0, undefined);
|
|
408
416
|
chunk.flags = 0;
|
|
409
417
|
if (!ordered) {
|
|
@@ -437,7 +445,13 @@ class SCTP {
|
|
|
437
445
|
await this.transmit();
|
|
438
446
|
}
|
|
439
447
|
else {
|
|
440
|
-
|
|
448
|
+
if (this.outboundQueue.length) {
|
|
449
|
+
await this.flush.asPromise();
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
// unreachable?
|
|
453
|
+
await new Promise((r) => setImmediate(r));
|
|
454
|
+
}
|
|
441
455
|
}
|
|
442
456
|
}
|
|
443
457
|
});
|
|
@@ -569,6 +583,12 @@ class SCTP {
|
|
|
569
583
|
}
|
|
570
584
|
}
|
|
571
585
|
async sendSack() {
|
|
586
|
+
if (this.sackTimeout)
|
|
587
|
+
return;
|
|
588
|
+
await new Promise((r) => (this.sackTimeout = setImmediate(r)));
|
|
589
|
+
this.sackTimeout = undefined;
|
|
590
|
+
if (!this.sackNeeded)
|
|
591
|
+
return;
|
|
572
592
|
const gaps = [];
|
|
573
593
|
let gapNext;
|
|
574
594
|
[...this.sackMisOrdered].sort().forEach((tsn) => {
|
|
@@ -794,7 +814,10 @@ class SCTP {
|
|
|
794
814
|
await Promise.all(p.streams.map(async (streamId) => {
|
|
795
815
|
delete this.inboundStreams[streamId];
|
|
796
816
|
if (this.outboundStreamSeq[streamId]) {
|
|
797
|
-
|
|
817
|
+
// Only add to reconfigQueue if not already present
|
|
818
|
+
if (!this.reconfigQueue.includes(streamId)) {
|
|
819
|
+
this.reconfigQueue.push(streamId);
|
|
820
|
+
}
|
|
798
821
|
// await this.sendResetRequest(streamId);
|
|
799
822
|
}
|
|
800
823
|
}));
|
|
@@ -817,6 +840,9 @@ class SCTP {
|
|
|
817
840
|
this.onReconfigStreams.execute(streamIds);
|
|
818
841
|
this.reconfigRequest = undefined;
|
|
819
842
|
this.timerReconfigCancel();
|
|
843
|
+
// Reset RTO backoff on successful reconfiguration
|
|
844
|
+
this.rto = SCTP_RTO_INITIAL;
|
|
845
|
+
this.timerReconfigFailures = 0;
|
|
820
846
|
if (this.reconfigQueue.length > 0) {
|
|
821
847
|
await this.transmitReconfigRequest();
|
|
822
848
|
}
|
|
@@ -869,15 +895,21 @@ class SCTP {
|
|
|
869
895
|
this.updateRto(receivedTime - sChunk.sentTime);
|
|
870
896
|
}
|
|
871
897
|
}
|
|
898
|
+
// 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.
|
|
899
|
+
if (!this.sentQueue.length) {
|
|
900
|
+
this.sentQueue = [];
|
|
901
|
+
}
|
|
872
902
|
// # handle gap blocks
|
|
873
903
|
let loss = false;
|
|
874
904
|
if (chunk.gaps.length > 0) {
|
|
875
905
|
const seen = new Set();
|
|
876
906
|
let highestSeenTsn;
|
|
877
|
-
chunk.gaps.forEach((gap) =>
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
907
|
+
chunk.gaps.forEach((gap) => {
|
|
908
|
+
for (let pos = gap[0]; pos < gap[1] + 1; pos++) {
|
|
909
|
+
highestSeenTsn = (chunk.cumulativeTsn + pos) % SCTP_TSN_MODULO;
|
|
910
|
+
seen.add(highestSeenTsn);
|
|
911
|
+
}
|
|
912
|
+
});
|
|
881
913
|
let highestNewlyAcked = chunk.cumulativeTsn;
|
|
882
914
|
for (const sChunk of this.sentQueue) {
|
|
883
915
|
if ((0, common_1.uint32Gt)(sChunk.tsn, highestSeenTsn)) {
|
|
@@ -1077,13 +1109,18 @@ class SCTP {
|
|
|
1077
1109
|
this.timer3Start();
|
|
1078
1110
|
}
|
|
1079
1111
|
}
|
|
1112
|
+
// Resetting the queue to empty array mitigates this.
|
|
1113
|
+
this.outboundQueue = [];
|
|
1114
|
+
this.flush.execute();
|
|
1080
1115
|
}
|
|
1081
1116
|
async transmitReconfigRequest() {
|
|
1082
1117
|
if (this.reconfigQueue.length > 0 &&
|
|
1083
1118
|
this.associationState === const_1.SCTP_STATE.ESTABLISHED &&
|
|
1084
1119
|
!this.reconfigRequest) {
|
|
1085
|
-
|
|
1086
|
-
|
|
1120
|
+
// Remove duplicate stream IDs from reconfigQueue
|
|
1121
|
+
const uniqueStreams = [...new Set(this.reconfigQueue)];
|
|
1122
|
+
const streams = uniqueStreams.slice(0, RECONFIG_MAX_STREAMS);
|
|
1123
|
+
this.reconfigQueue = uniqueStreams.slice(RECONFIG_MAX_STREAMS);
|
|
1087
1124
|
const param = new param_1.OutgoingSSNResetRequestParam(this.reconfigRequestSeq, this.reconfigResponseSeq, tsnMinusOne(this.localTsn), streams);
|
|
1088
1125
|
this.reconfigRequestSeq = tsnPlusOne(this.reconfigRequestSeq);
|
|
1089
1126
|
this.reconfigRequest = param;
|
|
@@ -1176,6 +1213,8 @@ class SCTP {
|
|
|
1176
1213
|
log("timerReconfigCancel");
|
|
1177
1214
|
clearTimeout(this.timerReconfigHandle);
|
|
1178
1215
|
this.timerReconfigHandle = undefined;
|
|
1216
|
+
// Reset failures counter when timer is successfully cancelled
|
|
1217
|
+
this.timerReconfigFailures = 0;
|
|
1179
1218
|
}
|
|
1180
1219
|
}
|
|
1181
1220
|
updateAdvancedPeerAckPoint() {
|
|
@@ -1192,6 +1231,10 @@ class SCTP {
|
|
|
1192
1231
|
streams[chunk.streamId] = chunk.streamSeqNum;
|
|
1193
1232
|
}
|
|
1194
1233
|
}
|
|
1234
|
+
// Resetting the queue to empty array mitigates this.
|
|
1235
|
+
if (!this.sentQueue.length) {
|
|
1236
|
+
this.sentQueue = [];
|
|
1237
|
+
}
|
|
1195
1238
|
if (done) {
|
|
1196
1239
|
this.forwardTsnChunk = new chunk_1.ForwardTsnChunk(0, undefined);
|
|
1197
1240
|
this.forwardTsnChunk.cumulativeTsn = this.advancedPeerAckTsn;
|
|
@@ -1209,7 +1252,7 @@ class SCTP {
|
|
|
1209
1252
|
if (!abandon)
|
|
1210
1253
|
return false;
|
|
1211
1254
|
const chunkPos = this.sentQueue.findIndex((v) => v.type === chunk.type);
|
|
1212
|
-
for (
|
|
1255
|
+
for (let pos = chunkPos; pos >= 0; pos--) {
|
|
1213
1256
|
const oChunk = this.sentQueue[pos];
|
|
1214
1257
|
oChunk.abandoned = true;
|
|
1215
1258
|
oChunk.retransmit = false;
|
|
@@ -1217,7 +1260,7 @@ class SCTP {
|
|
|
1217
1260
|
break;
|
|
1218
1261
|
}
|
|
1219
1262
|
}
|
|
1220
|
-
for (
|
|
1263
|
+
for (let pos = chunkPos; pos < this.sentQueue.length; pos++) {
|
|
1221
1264
|
const oChunk = this.sentQueue[pos];
|
|
1222
1265
|
oChunk.abandoned = true;
|
|
1223
1266
|
oChunk.retransmit = false;
|