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
package/lib/ice/src/iceBase.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export interface IceConnection {
|
|
|
13
13
|
remoteIsLite: boolean;
|
|
14
14
|
checkList: CandidatePair[];
|
|
15
15
|
localCandidates: Candidate[];
|
|
16
|
+
remoteCandidates: Candidate[];
|
|
17
|
+
candidatePairs: CandidatePair[];
|
|
16
18
|
stunServer?: Address;
|
|
17
19
|
turnServer?: Address;
|
|
18
20
|
generation: number;
|
|
@@ -39,16 +41,32 @@ export interface IceConnection {
|
|
|
39
41
|
getDefaultCandidate(): Candidate | undefined;
|
|
40
42
|
resetNominatedPair(): void;
|
|
41
43
|
}
|
|
42
|
-
export
|
|
44
|
+
export interface CandidatePairStats {
|
|
45
|
+
packetsSent: number;
|
|
46
|
+
packetsReceived: number;
|
|
47
|
+
bytesSent: number;
|
|
48
|
+
bytesReceived: number;
|
|
49
|
+
rtt?: number;
|
|
50
|
+
totalRoundTripTime: number;
|
|
51
|
+
roundTripTimeMeasurements: number;
|
|
52
|
+
}
|
|
53
|
+
export declare class CandidatePair implements CandidatePairStats {
|
|
43
54
|
protocol: Protocol;
|
|
44
55
|
remoteCandidate: Candidate;
|
|
45
56
|
iceControlling: boolean;
|
|
46
|
-
readonly id:
|
|
57
|
+
readonly id: string;
|
|
47
58
|
handle?: Cancelable<void>;
|
|
48
59
|
nominated: boolean;
|
|
49
60
|
remoteNominated: boolean;
|
|
50
61
|
private _state;
|
|
51
62
|
get state(): CandidatePairState;
|
|
63
|
+
packetsSent: number;
|
|
64
|
+
packetsReceived: number;
|
|
65
|
+
bytesSent: number;
|
|
66
|
+
bytesReceived: number;
|
|
67
|
+
rtt?: number;
|
|
68
|
+
totalRoundTripTime: number;
|
|
69
|
+
roundTripTimeMeasurements: number;
|
|
52
70
|
toJSON(): {
|
|
53
71
|
protocol: string;
|
|
54
72
|
localCandidate: string;
|
|
@@ -65,6 +83,7 @@ export declare class CandidatePair {
|
|
|
65
83
|
get remoteAddr(): Address;
|
|
66
84
|
get component(): number;
|
|
67
85
|
get priority(): number;
|
|
86
|
+
get foundation(): string;
|
|
68
87
|
}
|
|
69
88
|
export declare const ICE_COMPLETED: 1;
|
|
70
89
|
export declare const ICE_FAILED: 2;
|
package/lib/ice/src/iceBase.js
CHANGED
|
@@ -49,7 +49,7 @@ class CandidatePair {
|
|
|
49
49
|
enumerable: true,
|
|
50
50
|
configurable: true,
|
|
51
51
|
writable: true,
|
|
52
|
-
value: (0, crypto_1.randomUUID)()
|
|
52
|
+
value: (0, crypto_1.randomUUID)().toString()
|
|
53
53
|
});
|
|
54
54
|
Object.defineProperty(this, "handle", {
|
|
55
55
|
enumerable: true,
|
|
@@ -76,6 +76,49 @@ class CandidatePair {
|
|
|
76
76
|
writable: true,
|
|
77
77
|
value: CandidatePairState.FROZEN
|
|
78
78
|
});
|
|
79
|
+
// Statistics tracking
|
|
80
|
+
Object.defineProperty(this, "packetsSent", {
|
|
81
|
+
enumerable: true,
|
|
82
|
+
configurable: true,
|
|
83
|
+
writable: true,
|
|
84
|
+
value: 0
|
|
85
|
+
});
|
|
86
|
+
Object.defineProperty(this, "packetsReceived", {
|
|
87
|
+
enumerable: true,
|
|
88
|
+
configurable: true,
|
|
89
|
+
writable: true,
|
|
90
|
+
value: 0
|
|
91
|
+
});
|
|
92
|
+
Object.defineProperty(this, "bytesSent", {
|
|
93
|
+
enumerable: true,
|
|
94
|
+
configurable: true,
|
|
95
|
+
writable: true,
|
|
96
|
+
value: 0
|
|
97
|
+
});
|
|
98
|
+
Object.defineProperty(this, "bytesReceived", {
|
|
99
|
+
enumerable: true,
|
|
100
|
+
configurable: true,
|
|
101
|
+
writable: true,
|
|
102
|
+
value: 0
|
|
103
|
+
});
|
|
104
|
+
Object.defineProperty(this, "rtt", {
|
|
105
|
+
enumerable: true,
|
|
106
|
+
configurable: true,
|
|
107
|
+
writable: true,
|
|
108
|
+
value: void 0
|
|
109
|
+
});
|
|
110
|
+
Object.defineProperty(this, "totalRoundTripTime", {
|
|
111
|
+
enumerable: true,
|
|
112
|
+
configurable: true,
|
|
113
|
+
writable: true,
|
|
114
|
+
value: 0
|
|
115
|
+
});
|
|
116
|
+
Object.defineProperty(this, "roundTripTimeMeasurements", {
|
|
117
|
+
enumerable: true,
|
|
118
|
+
configurable: true,
|
|
119
|
+
writable: true,
|
|
120
|
+
value: 0
|
|
121
|
+
});
|
|
79
122
|
}
|
|
80
123
|
updateState(state) {
|
|
81
124
|
this._state = state;
|
|
@@ -95,6 +138,9 @@ class CandidatePair {
|
|
|
95
138
|
get priority() {
|
|
96
139
|
return candidatePairPriority(this.localCandidate, this.remoteCandidate, this.iceControlling);
|
|
97
140
|
}
|
|
141
|
+
get foundation() {
|
|
142
|
+
return this.localCandidate.foundation;
|
|
143
|
+
}
|
|
98
144
|
}
|
|
99
145
|
exports.CandidatePair = CandidatePair;
|
|
100
146
|
exports.ICE_COMPLETED = 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iceBase.js","sourceRoot":"","sources":["../../../../ice/src/iceBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport type { MdnsLookup } from \"./dns/lookup\";\nimport type { Cancelable } from \"./helper\";\nimport {\n type Address,\n type Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport type { Protocol } from \"./types/model\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport interface IceConnection {\n iceControlling: boolean;\n localUsername: string;\n localPassword: string;\n remotePassword: string;\n remoteUsername: string;\n remoteIsLite: boolean;\n checkList: CandidatePair[];\n localCandidates: Candidate[];\n stunServer?: Address;\n turnServer?: Address;\n generation: number;\n options: IceOptions;\n remoteCandidatesEnd: boolean;\n localCandidatesEnd: boolean;\n state: IceState;\n lookup?: MdnsLookup;\n nominated?: CandidatePair;\n\n readonly onData: Event<[Buffer]>;\n readonly stateChanged: Event<[IceState]>;\n readonly onIceCandidate: Event<[Candidate]>;\n\n restart(): void;\n\n setRemoteParams(params: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }): void;\n\n gatherCandidates(): Promise<void>;\n\n connect(): Promise<void>;\n\n close(): Promise<void>;\n\n addRemoteCandidate(remoteCandidate: Candidate | undefined): Promise<void>;\n\n send(data: Buffer): Promise<void>;\n\n getDefaultCandidate(): Candidate | undefined;\n resetNominatedPair(): void;\n}\n\nexport class CandidatePair {\n readonly id = randomUUID();\n handle?: Cancelable<void>;\n nominated = false;\n remoteNominated = false;\n // 5.7.4. Computing States\n private _state = CandidatePairState.FROZEN;\n get state() {\n return this._state;\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n protocol: this.protocol.type,\n localCandidate: this.localCandidate.toSdp(),\n remoteCandidate: this.remoteCandidate.toSdp(),\n };\n }\n\n constructor(\n public protocol: Protocol,\n public remoteCandidate: Candidate,\n public iceControlling: boolean,\n ) {}\n\n updateState(state: CandidatePairState) {\n this._state = state;\n }\n\n get localCandidate() {\n if (!this.protocol.localCandidate) {\n throw new Error(\"localCandidate not exist\");\n }\n return this.protocol.localCandidate;\n }\n\n get remoteAddr(): Address {\n return [this.remoteCandidate.host, this.remoteCandidate.port];\n }\n\n get component() {\n return this.localCandidate.component;\n }\n\n get priority() {\n return candidatePairPriority(\n this.localCandidate,\n this.remoteCandidate,\n this.iceControlling,\n );\n }\n}\n\nexport const ICE_COMPLETED = 1 as const;\nexport const ICE_FAILED = 2 as const;\n\nexport const CONSENT_INTERVAL = 5;\nexport const CONSENT_FAILURES = 6;\n\nexport enum CandidatePairState {\n FROZEN = 0,\n WAITING = 1,\n IN_PROGRESS = 2,\n SUCCEEDED = 3,\n FAILED = 4,\n}\n\nexport type IceState =\n | \"disconnected\"\n | \"closed\"\n | \"completed\"\n | \"new\"\n | \"connected\";\n\nexport interface IceOptions {\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnTransport?: \"udp\" | \"tcp\";\n forceTurn?: boolean;\n localPasswordPrefix?: string;\n useIpv4: boolean;\n useIpv6: boolean;\n useLinkLocalAddress?: boolean;\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n additionalHostAddresses?: string[];\n filterStunResponse?: (\n message: Message,\n addr: Address,\n protocol: Protocol,\n ) => boolean;\n filterCandidatePair?: (pair: CandidatePair) => boolean;\n}\n\nexport const defaultOptions: IceOptions = {\n useIpv4: true,\n useIpv6: true,\n};\n\nexport function validateRemoteCandidate(candidate: Candidate) {\n // \"\"\"\n // Check the remote candidate is supported.\n // \"\"\"\n if (![\"host\", \"relay\", \"srflx\"].includes(candidate.type))\n throw new Error(`Unexpected candidate type \"${candidate.type}\"`);\n\n // ipaddress.ip_address(candidate.host)\n return candidate;\n}\n\nexport function sortCandidatePairs(\n pairs: {\n localCandidate: Pick<Candidate, \"priority\">;\n remoteCandidate: Pick<Candidate, \"priority\">;\n }[],\n iceControlling: boolean,\n) {\n return pairs\n .sort(\n (a, b) =>\n candidatePairPriority(\n a.localCandidate,\n a.remoteCandidate,\n iceControlling,\n ) -\n candidatePairPriority(\n b.localCandidate,\n b.remoteCandidate,\n iceControlling,\n ),\n )\n .reverse();\n}\n\n// 5.7.2. Computing Pair Priority and Ordering Pairs\nexport function candidatePairPriority(\n local: Pick<Candidate, \"priority\">,\n remote: Pick<Candidate, \"priority\">,\n iceControlling: boolean,\n) {\n const G = (iceControlling && local.priority) || remote.priority;\n const D = (iceControlling && remote.priority) || local.priority;\n return (1 << 32) * Math.min(G, D) + 2 * Math.max(G, D) + (G > D ? 1 : 0);\n}\n\nexport async function serverReflexiveCandidate(\n protocol: Protocol,\n stunServer: Address,\n) {\n // \"\"\"\n // Query STUN server to obtain a server-reflexive candidate.\n // \"\"\"\n\n // # perform STUN query\n const request = new Message(methods.BINDING, classes.REQUEST);\n try {\n const [response] = await protocol.request(request, stunServer);\n\n const localCandidate = protocol.localCandidate;\n if (!localCandidate) {\n throw new Error(\"not exist\");\n }\n\n const candidate = new Candidate(\n candidateFoundation(\"srflx\", \"udp\", localCandidate.host),\n localCandidate.component,\n localCandidate.transport,\n candidatePriority(\"srflx\"),\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[0],\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[1],\n \"srflx\",\n localCandidate.host,\n localCandidate.port,\n );\n return candidate;\n } catch (error) {\n // todo fix\n log(\"error serverReflexiveCandidate\", error);\n }\n}\n\nexport function validateAddress(addr?: Address): Address | undefined {\n if (addr && Number.isNaN(addr[1])) {\n return [addr[0], 443];\n }\n return addr;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"iceBase.js","sourceRoot":"","sources":["../../../../ice/src/iceBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport type { MdnsLookup } from \"./dns/lookup\";\nimport type { Cancelable } from \"./helper\";\nimport {\n type Address,\n type Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport type { Protocol } from \"./types/model\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport interface IceConnection {\n iceControlling: boolean;\n localUsername: string;\n localPassword: string;\n remotePassword: string;\n remoteUsername: string;\n remoteIsLite: boolean;\n checkList: CandidatePair[];\n localCandidates: Candidate[];\n remoteCandidates: Candidate[];\n candidatePairs: CandidatePair[];\n stunServer?: Address;\n turnServer?: Address;\n generation: number;\n options: IceOptions;\n remoteCandidatesEnd: boolean;\n localCandidatesEnd: boolean;\n state: IceState;\n lookup?: MdnsLookup;\n nominated?: CandidatePair;\n\n readonly onData: Event<[Buffer]>;\n readonly stateChanged: Event<[IceState]>;\n readonly onIceCandidate: Event<[Candidate]>;\n\n restart(): void;\n\n setRemoteParams(params: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }): void;\n\n gatherCandidates(): Promise<void>;\n\n connect(): Promise<void>;\n\n close(): Promise<void>;\n\n addRemoteCandidate(remoteCandidate: Candidate | undefined): Promise<void>;\n\n send(data: Buffer): Promise<void>;\n\n getDefaultCandidate(): Candidate | undefined;\n resetNominatedPair(): void;\n}\n\nexport interface CandidatePairStats {\n packetsSent: number;\n packetsReceived: number;\n bytesSent: number;\n bytesReceived: number;\n rtt?: number;\n totalRoundTripTime: number;\n roundTripTimeMeasurements: number;\n}\n\nexport class CandidatePair implements CandidatePairStats {\n readonly id = randomUUID().toString();\n handle?: Cancelable<void>;\n nominated = false;\n remoteNominated = false;\n // 5.7.4. Computing States\n private _state = CandidatePairState.FROZEN;\n get state() {\n return this._state;\n }\n\n // Statistics tracking\n packetsSent = 0;\n packetsReceived = 0;\n bytesSent = 0;\n bytesReceived = 0;\n rtt?: number;\n totalRoundTripTime = 0;\n roundTripTimeMeasurements = 0;\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n protocol: this.protocol.type,\n localCandidate: this.localCandidate.toSdp(),\n remoteCandidate: this.remoteCandidate.toSdp(),\n };\n }\n\n constructor(\n public protocol: Protocol,\n public remoteCandidate: Candidate,\n public iceControlling: boolean,\n ) {}\n\n updateState(state: CandidatePairState) {\n this._state = state;\n }\n\n get localCandidate() {\n if (!this.protocol.localCandidate) {\n throw new Error(\"localCandidate not exist\");\n }\n return this.protocol.localCandidate;\n }\n\n get remoteAddr(): Address {\n return [this.remoteCandidate.host, this.remoteCandidate.port];\n }\n\n get component() {\n return this.localCandidate.component;\n }\n\n get priority() {\n return candidatePairPriority(\n this.localCandidate,\n this.remoteCandidate,\n this.iceControlling,\n );\n }\n\n get foundation() {\n return this.localCandidate.foundation;\n }\n}\n\nexport const ICE_COMPLETED = 1 as const;\nexport const ICE_FAILED = 2 as const;\n\nexport const CONSENT_INTERVAL = 5;\nexport const CONSENT_FAILURES = 6;\n\nexport enum CandidatePairState {\n FROZEN = 0,\n WAITING = 1,\n IN_PROGRESS = 2,\n SUCCEEDED = 3,\n FAILED = 4,\n}\n\nexport type IceState =\n | \"disconnected\"\n | \"closed\"\n | \"completed\"\n | \"new\"\n | \"connected\";\n\nexport interface IceOptions {\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnTransport?: \"udp\" | \"tcp\";\n forceTurn?: boolean;\n localPasswordPrefix?: string;\n useIpv4: boolean;\n useIpv6: boolean;\n useLinkLocalAddress?: boolean;\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n additionalHostAddresses?: string[];\n filterStunResponse?: (\n message: Message,\n addr: Address,\n protocol: Protocol,\n ) => boolean;\n filterCandidatePair?: (pair: CandidatePair) => boolean;\n}\n\nexport const defaultOptions: IceOptions = {\n useIpv4: true,\n useIpv6: true,\n};\n\nexport function validateRemoteCandidate(candidate: Candidate) {\n // \"\"\"\n // Check the remote candidate is supported.\n // \"\"\"\n if (![\"host\", \"relay\", \"srflx\"].includes(candidate.type))\n throw new Error(`Unexpected candidate type \"${candidate.type}\"`);\n\n // ipaddress.ip_address(candidate.host)\n return candidate;\n}\n\nexport function sortCandidatePairs(\n pairs: {\n localCandidate: Pick<Candidate, \"priority\">;\n remoteCandidate: Pick<Candidate, \"priority\">;\n }[],\n iceControlling: boolean,\n) {\n return pairs\n .sort(\n (a, b) =>\n candidatePairPriority(\n a.localCandidate,\n a.remoteCandidate,\n iceControlling,\n ) -\n candidatePairPriority(\n b.localCandidate,\n b.remoteCandidate,\n iceControlling,\n ),\n )\n .reverse();\n}\n\n// 5.7.2. Computing Pair Priority and Ordering Pairs\nexport function candidatePairPriority(\n local: Pick<Candidate, \"priority\">,\n remote: Pick<Candidate, \"priority\">,\n iceControlling: boolean,\n) {\n const G = (iceControlling && local.priority) || remote.priority;\n const D = (iceControlling && remote.priority) || local.priority;\n return (1 << 32) * Math.min(G, D) + 2 * Math.max(G, D) + (G > D ? 1 : 0);\n}\n\nexport async function serverReflexiveCandidate(\n protocol: Protocol,\n stunServer: Address,\n) {\n // \"\"\"\n // Query STUN server to obtain a server-reflexive candidate.\n // \"\"\"\n\n // # perform STUN query\n const request = new Message(methods.BINDING, classes.REQUEST);\n try {\n const [response] = await protocol.request(request, stunServer);\n\n const localCandidate = protocol.localCandidate;\n if (!localCandidate) {\n throw new Error(\"not exist\");\n }\n\n const candidate = new Candidate(\n candidateFoundation(\"srflx\", \"udp\", localCandidate.host),\n localCandidate.component,\n localCandidate.transport,\n candidatePriority(\"srflx\"),\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[0],\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[1],\n \"srflx\",\n localCandidate.host,\n localCandidate.port,\n );\n return candidate;\n } catch (error) {\n // todo fix\n log(\"error serverReflexiveCandidate\", error);\n }\n}\n\nexport function validateAddress(addr?: Address): Address | undefined {\n if (addr && Number.isNaN(addr[1])) {\n return [addr[0], 443];\n }\n return addr;\n}\n"]}
|
|
@@ -2,8 +2,8 @@ import type { Address } from "../imports/common";
|
|
|
2
2
|
import { type AttributeKeys } from "./const";
|
|
3
3
|
export declare function unpackErrorCode(data: Buffer): [number, string];
|
|
4
4
|
export declare function unpackXorAddress(data: Buffer, transactionId: Buffer): Address;
|
|
5
|
-
export declare function packErrorCode(value: [number, string]): Buffer
|
|
6
|
-
export declare function packXorAddress(value: Address, transactionId: Buffer): Buffer
|
|
5
|
+
export declare function packErrorCode(value: [number, string]): Buffer<ArrayBuffer>;
|
|
6
|
+
export declare function packXorAddress(value: Address, transactionId: Buffer): Buffer<ArrayBuffer>;
|
|
7
7
|
export type ATTRIBUTE = [
|
|
8
8
|
number,
|
|
9
9
|
AttributeKey,
|
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
37
|
};
|
|
@@ -31,30 +41,31 @@ exports.unpackErrorCode = unpackErrorCode;
|
|
|
31
41
|
exports.unpackXorAddress = unpackXorAddress;
|
|
32
42
|
exports.packErrorCode = packErrorCode;
|
|
33
43
|
exports.packXorAddress = packXorAddress;
|
|
34
|
-
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
35
44
|
const Int64 = __importStar(require("int64-buffer"));
|
|
36
45
|
const ip_1 = __importDefault(require("ip"));
|
|
37
|
-
const range_js_1 = __importDefault(require("lodash/range.js"));
|
|
38
46
|
const const_1 = require("./const");
|
|
39
47
|
function packAddress(value) {
|
|
40
48
|
const [address] = value;
|
|
41
49
|
const protocol = ip_1.default.isV4Format(address) ? const_1.IPV4_PROTOCOL : const_1.IPV6_PROTOCOL;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
]);
|
|
50
|
+
const buffer = Buffer.alloc(4);
|
|
51
|
+
buffer.writeUInt8(0, 0);
|
|
52
|
+
buffer.writeUInt8(protocol, 1);
|
|
53
|
+
buffer.writeUInt16BE(value[1], 2);
|
|
54
|
+
return Buffer.concat([buffer, ip_1.default.toBuffer(address)]);
|
|
46
55
|
}
|
|
47
56
|
function unpackErrorCode(data) {
|
|
48
57
|
if (data.length < 4)
|
|
49
58
|
throw new Error("STUN error code is less than 4 bytes");
|
|
50
|
-
const
|
|
59
|
+
const codeHigh = data.readUInt8(2);
|
|
60
|
+
const codeLow = data.readUInt8(3);
|
|
51
61
|
const reason = data.slice(4).toString("utf8");
|
|
52
62
|
return [codeHigh * 100 + codeLow, reason];
|
|
53
63
|
}
|
|
54
64
|
function unpackAddress(data) {
|
|
55
65
|
if (data.length < 4)
|
|
56
66
|
throw new Error("STUN address length is less than 4 bytes");
|
|
57
|
-
const
|
|
67
|
+
const protocol = data.readUInt8(1);
|
|
68
|
+
const port = data.readUInt16BE(2);
|
|
58
69
|
const address = data.slice(4);
|
|
59
70
|
switch (protocol) {
|
|
60
71
|
case const_1.IPV4_PROTOCOL:
|
|
@@ -69,13 +80,13 @@ function unpackAddress(data) {
|
|
|
69
80
|
throw new Error("STUN address has unknown protocol");
|
|
70
81
|
}
|
|
71
82
|
}
|
|
83
|
+
const cookieBuffer = Buffer.alloc(6);
|
|
84
|
+
cookieBuffer.writeUInt16BE(const_1.COOKIE >> 16, 0);
|
|
85
|
+
cookieBuffer.writeUInt32BE(const_1.COOKIE, 2);
|
|
72
86
|
function xorAddress(data, transactionId) {
|
|
73
|
-
const xPad = [
|
|
74
|
-
...jspack_1.jspack.Pack("!HI", [const_1.COOKIE >> 16, const_1.COOKIE]),
|
|
75
|
-
...transactionId,
|
|
76
|
-
];
|
|
87
|
+
const xPad = [...cookieBuffer, ...transactionId];
|
|
77
88
|
let xData = data.slice(0, 2);
|
|
78
|
-
for (
|
|
89
|
+
for (let i = 2; i < data.length; i++) {
|
|
79
90
|
const num = data[i] ^ xPad[i - 2];
|
|
80
91
|
const buf = Buffer.alloc(1);
|
|
81
92
|
buf.writeUIntBE(num, 0, 1);
|
|
@@ -87,20 +98,28 @@ function unpackXorAddress(data, transactionId) {
|
|
|
87
98
|
return unpackAddress(xorAddress(data, transactionId));
|
|
88
99
|
}
|
|
89
100
|
function packErrorCode(value) {
|
|
90
|
-
const
|
|
101
|
+
const buffer = Buffer.alloc(4);
|
|
102
|
+
buffer.writeUInt16BE(0, 0);
|
|
103
|
+
buffer.writeUInt8(Math.floor(value[0] / 100), 2);
|
|
104
|
+
buffer.writeUInt8(value[0] % 100, 3);
|
|
91
105
|
const encode = Buffer.from(value[1], "utf8");
|
|
92
|
-
return Buffer.concat([
|
|
106
|
+
return Buffer.concat([buffer, encode]);
|
|
93
107
|
}
|
|
94
108
|
function packXorAddress(value, transactionId) {
|
|
95
109
|
return xorAddress(packAddress(value), transactionId);
|
|
96
110
|
}
|
|
97
|
-
const packUnsigned = (value) =>
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const
|
|
111
|
+
const packUnsigned = (value) => {
|
|
112
|
+
const buffer = Buffer.alloc(4);
|
|
113
|
+
buffer.writeUInt32BE(value, 0);
|
|
114
|
+
return buffer;
|
|
115
|
+
};
|
|
116
|
+
const unpackUnsigned = (data) => data.readUInt32BE(0);
|
|
117
|
+
const packUnsignedShort = (value) => {
|
|
118
|
+
const buffer = Buffer.alloc(4);
|
|
119
|
+
buffer.writeUInt16BE(value, 0);
|
|
120
|
+
return buffer;
|
|
121
|
+
};
|
|
122
|
+
const unpackUnsignedShort = (data) => data.readUInt16BE(0);
|
|
104
123
|
const packUnsigned64 = (value) => {
|
|
105
124
|
return new Int64.Int64BE(value.toString()).toBuffer();
|
|
106
125
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../../../../ice/src/stun/attributes.ts"],"names":[],"mappings":"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","sourcesContent":["import { jspack } from \"@shinyoshiaki/jspack\";\nimport * as Int64 from \"int64-buffer\";\nimport nodeIp from \"ip\";\nimport range from \"lodash/range.js\";\n\nimport type { Address } from \"../imports/common\";\nimport {\n type AttributeKeys,\n COOKIE,\n IPV4_PROTOCOL,\n IPV6_PROTOCOL,\n} from \"./const\";\n\nfunction packAddress(value: Address) {\n const [address] = value;\n\n const protocol = nodeIp.isV4Format(address) ? IPV4_PROTOCOL : IPV6_PROTOCOL;\n\n return Buffer.concat([\n Buffer.from(jspack.Pack(\"!BBH\", [0, protocol, value[1]])),\n nodeIp.toBuffer(address),\n ]);\n}\n\nexport function unpackErrorCode(data: Buffer): [number, string] {\n if (data.length < 4) throw new Error(\"STUN error code is less than 4 bytes\");\n const [, codeHigh, codeLow] = jspack.Unpack(\"!HBB\", data.slice(0, 4));\n const reason = data.slice(4).toString(\"utf8\");\n return [codeHigh * 100 + codeLow, reason];\n}\n\nfunction unpackAddress(data: Buffer): Address {\n if (data.length < 4)\n throw new Error(\"STUN address length is less than 4 bytes\");\n const [, protocol, port] = jspack.Unpack(\"!BBH\", data.slice(0, 4));\n const address = data.slice(4);\n switch (protocol) {\n case IPV4_PROTOCOL:\n if (address.length != 4)\n throw new Error(`STUN address has invalid length for IPv4`);\n return [nodeIp.toString(address), port];\n case IPV6_PROTOCOL:\n if (address.length != 16)\n throw new Error(\"STUN address has invalid length for IPv6\");\n return [nodeIp.toString(address), port];\n default:\n throw new Error(\"STUN address has unknown protocol\");\n }\n}\n\nfunction xorAddress(data: Buffer, transactionId: Buffer) {\n const xPad = [\n ...jspack.Pack(\"!HI\", [COOKIE >> 16, COOKIE]),\n ...transactionId,\n ];\n let xData = data.slice(0, 2);\n\n for (const i of range(2, data.length)) {\n const num = data[i] ^ xPad[i - 2];\n const buf = Buffer.alloc(1);\n buf.writeUIntBE(num, 0, 1);\n xData = Buffer.concat([xData, buf]);\n }\n return xData;\n}\n\nexport function unpackXorAddress(data: Buffer, transactionId: Buffer): Address {\n return unpackAddress(xorAddress(data, transactionId));\n}\n\nexport function packErrorCode(value: [number, string]) {\n const pack = Buffer.from(\n jspack.Pack(\"!HBB\", [0, Math.floor(value[0] / 100), value[0] % 100]),\n );\n const encode = Buffer.from(value[1], \"utf8\");\n return Buffer.concat([pack, encode]);\n}\n\nexport function packXorAddress(value: Address, transactionId: Buffer) {\n return xorAddress(packAddress(value), transactionId);\n}\n\nconst packUnsigned = (value: number) => Buffer.from(jspack.Pack(\"!I\", [value]));\nconst unpackUnsigned = (data: Buffer) => jspack.Unpack(\"!I\", data)[0];\n\nconst packUnsignedShort = (value: number) =>\n Buffer.concat([\n Buffer.from(jspack.Pack(\"!H\", [value])),\n Buffer.from(\"\\x00\\x00\"),\n ]);\nconst unpackUnsignedShort = (data: Buffer) =>\n jspack.Unpack(\"!H\", data.slice(0, 2))[0];\n\nconst packUnsigned64 = (value: bigint) => {\n return new Int64.Int64BE(value.toString()).toBuffer();\n};\nconst unpackUnsigned64 = (data: Buffer) => {\n const int = new Int64.Int64BE(data);\n return BigInt(int.toString());\n};\n\nconst packString = (value: string) => Buffer.from(value, \"utf8\");\nconst unpackString = (data: Buffer) => data.toString(\"utf8\");\n\nconst packBytes = (value: Buffer) => value;\nconst unpackBytes = (data: Buffer) => data;\n\nconst packNone = (value: Buffer) => Buffer.from([]);\nconst unpackNone = (data: Buffer) => null;\n\nexport type ATTRIBUTE = [\n number,\n AttributeKey,\n (...args: any) => Buffer,\n (...args: any) => any,\n];\n\nconst ATTRIBUTES: ATTRIBUTE[] = [\n [0x0001, \"MAPPED-ADDRESS\", packAddress, unpackAddress],\n [0x0003, \"CHANGE-REQUEST\", packUnsigned, unpackUnsigned],\n [0x0004, \"SOURCE-ADDRESS\", packAddress, unpackAddress],\n [0x0005, \"CHANGED-ADDRESS\", packAddress, unpackAddress],\n [0x0006, \"USERNAME\", packString, unpackString],\n [0x0008, \"MESSAGE-INTEGRITY\", packBytes, unpackBytes],\n [0x0009, \"ERROR-CODE\", packErrorCode, unpackErrorCode],\n [0x000c, \"CHANNEL-NUMBER\", packUnsignedShort, unpackUnsignedShort],\n [0x000d, \"LIFETIME\", packUnsigned, unpackUnsigned],\n [0x0012, \"XOR-PEER-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0013, \"DATA\", packBytes, unpackBytes],\n [0x0014, \"REALM\", packString, unpackString],\n [0x0015, \"NONCE\", packBytes, unpackBytes],\n [0x0016, \"XOR-RELAYED-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0019, \"REQUESTED-TRANSPORT\", packUnsigned, unpackUnsigned],\n [0x0020, \"XOR-MAPPED-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0024, \"PRIORITY\", packUnsigned, unpackUnsigned],\n [0x0025, \"USE-CANDIDATE\", packNone, unpackNone],\n [0x8022, \"SOFTWARE\", packString, unpackString],\n [0x8028, \"FINGERPRINT\", packUnsigned, unpackUnsigned],\n [0x8029, \"ICE-CONTROLLED\", packUnsigned64, unpackUnsigned64],\n [0x802a, \"ICE-CONTROLLING\", packUnsigned64, unpackUnsigned64],\n [0x802b, \"RESPONSE-ORIGIN\", packAddress, unpackAddress],\n [0x802c, \"OTHER-ADDRESS\", packAddress, unpackAddress],\n];\n\nexport class AttributeRepository {\n constructor(protected attributes: AttributePair[] = []) {}\n\n getAttributes() {\n return this.attributes;\n }\n\n setAttribute(key: (typeof AttributeKeys)[number], value: any) {\n const exist = this.attributes.find((a) => a[0] === key);\n if (exist) {\n exist[1] = value;\n } else {\n this.attributes.push([key, value]);\n }\n return this;\n }\n\n getAttributeValue(key: AttributeKey) {\n const attribute = this.attributes.find((a) => a[0] === key);\n if (!attribute) {\n return undefined;\n }\n return attribute[1];\n }\n\n get attributesKeys(): (typeof AttributeKeys)[number][] {\n return this.attributes.map((a) => a[0]);\n }\n\n clear() {\n this.attributes = [];\n }\n}\n\nexport type AttributeKey = (typeof AttributeKeys)[number];\n\nexport type AttributePair = [AttributeKey, any];\n\nexport const ATTRIBUTES_BY_TYPE = ATTRIBUTES.reduce(\n (acc, cur) => {\n acc[cur[0]] = cur;\n return acc;\n },\n {} as { [key: string]: ATTRIBUTE },\n);\n\nexport const ATTRIBUTES_BY_NAME = ATTRIBUTES.reduce(\n (acc, cur) => {\n acc[cur[1]] = cur;\n return acc;\n },\n {} as { [key: string]: ATTRIBUTE },\n);\n"]}
|
|
1
|
+
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../../../../ice/src/stun/attributes.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Int64 from \"int64-buffer\";\nimport nodeIp from \"ip\";\n\nimport type { Address } from \"../imports/common\";\nimport {\n type AttributeKeys,\n COOKIE,\n IPV4_PROTOCOL,\n IPV6_PROTOCOL,\n} from \"./const\";\n\nfunction packAddress(value: Address) {\n const [address] = value;\n\n const protocol = nodeIp.isV4Format(address) ? IPV4_PROTOCOL : IPV6_PROTOCOL;\n\n const buffer = Buffer.alloc(4);\n buffer.writeUInt8(0, 0);\n buffer.writeUInt8(protocol, 1);\n buffer.writeUInt16BE(value[1], 2);\n\n return Buffer.concat([buffer, nodeIp.toBuffer(address)]);\n}\n\nexport function unpackErrorCode(data: Buffer): [number, string] {\n if (data.length < 4) throw new Error(\"STUN error code is less than 4 bytes\");\n const codeHigh = data.readUInt8(2);\n const codeLow = data.readUInt8(3);\n const reason = data.slice(4).toString(\"utf8\");\n return [codeHigh * 100 + codeLow, reason];\n}\n\nfunction unpackAddress(data: Buffer): Address {\n if (data.length < 4)\n throw new Error(\"STUN address length is less than 4 bytes\");\n const protocol = data.readUInt8(1);\n const port = data.readUInt16BE(2);\n const address = data.slice(4);\n switch (protocol) {\n case IPV4_PROTOCOL:\n if (address.length != 4)\n throw new Error(`STUN address has invalid length for IPv4`);\n return [nodeIp.toString(address), port];\n case IPV6_PROTOCOL:\n if (address.length != 16)\n throw new Error(\"STUN address has invalid length for IPv6\");\n return [nodeIp.toString(address), port];\n default:\n throw new Error(\"STUN address has unknown protocol\");\n }\n}\n\nconst cookieBuffer = Buffer.alloc(6);\ncookieBuffer.writeUInt16BE(COOKIE >> 16, 0);\ncookieBuffer.writeUInt32BE(COOKIE, 2);\n\nfunction xorAddress(data: Buffer, transactionId: Buffer) {\n const xPad = [...cookieBuffer, ...transactionId];\n let xData = data.slice(0, 2);\n\n for (let i = 2; i < data.length; i++) {\n const num = data[i] ^ xPad[i - 2];\n const buf = Buffer.alloc(1);\n buf.writeUIntBE(num, 0, 1);\n xData = Buffer.concat([xData, buf]);\n }\n return xData;\n}\n\nexport function unpackXorAddress(data: Buffer, transactionId: Buffer): Address {\n return unpackAddress(xorAddress(data, transactionId));\n}\n\nexport function packErrorCode(value: [number, string]) {\n const buffer = Buffer.alloc(4);\n buffer.writeUInt16BE(0, 0);\n buffer.writeUInt8(Math.floor(value[0] / 100), 2);\n buffer.writeUInt8(value[0] % 100, 3);\n const encode = Buffer.from(value[1], \"utf8\");\n return Buffer.concat([buffer, encode]);\n}\n\nexport function packXorAddress(value: Address, transactionId: Buffer) {\n return xorAddress(packAddress(value), transactionId);\n}\n\nconst packUnsigned = (value: number) => {\n const buffer = Buffer.alloc(4);\n buffer.writeUInt32BE(value, 0);\n return buffer;\n};\n\nconst unpackUnsigned = (data: Buffer) => data.readUInt32BE(0);\n\nconst packUnsignedShort = (value: number) => {\n const buffer = Buffer.alloc(4);\n buffer.writeUInt16BE(value, 0);\n return buffer;\n};\n\nconst unpackUnsignedShort = (data: Buffer) => data.readUInt16BE(0);\n\nconst packUnsigned64 = (value: bigint) => {\n return new Int64.Int64BE(value.toString()).toBuffer();\n};\nconst unpackUnsigned64 = (data: Buffer) => {\n const int = new Int64.Int64BE(data);\n return BigInt(int.toString());\n};\n\nconst packString = (value: string) => Buffer.from(value, \"utf8\");\nconst unpackString = (data: Buffer) => data.toString(\"utf8\");\n\nconst packBytes = (value: Buffer) => value;\nconst unpackBytes = (data: Buffer) => data;\n\nconst packNone = (value: Buffer) => Buffer.from([]);\nconst unpackNone = (data: Buffer) => null;\n\nexport type ATTRIBUTE = [\n number,\n AttributeKey,\n (...args: any) => Buffer,\n (...args: any) => any,\n];\n\nconst ATTRIBUTES: ATTRIBUTE[] = [\n [0x0001, \"MAPPED-ADDRESS\", packAddress, unpackAddress],\n [0x0003, \"CHANGE-REQUEST\", packUnsigned, unpackUnsigned],\n [0x0004, \"SOURCE-ADDRESS\", packAddress, unpackAddress],\n [0x0005, \"CHANGED-ADDRESS\", packAddress, unpackAddress],\n [0x0006, \"USERNAME\", packString, unpackString],\n [0x0008, \"MESSAGE-INTEGRITY\", packBytes, unpackBytes],\n [0x0009, \"ERROR-CODE\", packErrorCode, unpackErrorCode],\n [0x000c, \"CHANNEL-NUMBER\", packUnsignedShort, unpackUnsignedShort],\n [0x000d, \"LIFETIME\", packUnsigned, unpackUnsigned],\n [0x0012, \"XOR-PEER-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0013, \"DATA\", packBytes, unpackBytes],\n [0x0014, \"REALM\", packString, unpackString],\n [0x0015, \"NONCE\", packBytes, unpackBytes],\n [0x0016, \"XOR-RELAYED-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0019, \"REQUESTED-TRANSPORT\", packUnsigned, unpackUnsigned],\n [0x0020, \"XOR-MAPPED-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0024, \"PRIORITY\", packUnsigned, unpackUnsigned],\n [0x0025, \"USE-CANDIDATE\", packNone, unpackNone],\n [0x8022, \"SOFTWARE\", packString, unpackString],\n [0x8028, \"FINGERPRINT\", packUnsigned, unpackUnsigned],\n [0x8029, \"ICE-CONTROLLED\", packUnsigned64, unpackUnsigned64],\n [0x802a, \"ICE-CONTROLLING\", packUnsigned64, unpackUnsigned64],\n [0x802b, \"RESPONSE-ORIGIN\", packAddress, unpackAddress],\n [0x802c, \"OTHER-ADDRESS\", packAddress, unpackAddress],\n];\n\nexport class AttributeRepository {\n constructor(protected attributes: AttributePair[] = []) {}\n\n getAttributes() {\n return this.attributes;\n }\n\n setAttribute(key: (typeof AttributeKeys)[number], value: any) {\n const exist = this.attributes.find((a) => a[0] === key);\n if (exist) {\n exist[1] = value;\n } else {\n this.attributes.push([key, value]);\n }\n return this;\n }\n\n getAttributeValue(key: AttributeKey) {\n const attribute = this.attributes.find((a) => a[0] === key);\n if (!attribute) {\n return undefined;\n }\n return attribute[1];\n }\n\n get attributesKeys(): (typeof AttributeKeys)[number][] {\n return this.attributes.map((a) => a[0]);\n }\n\n clear() {\n this.attributes = [];\n }\n}\n\nexport type AttributeKey = (typeof AttributeKeys)[number];\n\nexport type AttributePair = [AttributeKey, any];\n\nexport const ATTRIBUTES_BY_TYPE = ATTRIBUTES.reduce(\n (acc, cur) => {\n acc[cur[0]] = cur;\n return acc;\n },\n {} as { [key: string]: ATTRIBUTE },\n);\n\nexport const ATTRIBUTES_BY_NAME = ATTRIBUTES.reduce(\n (acc, cur) => {\n acc[cur[1]] = cur;\n return acc;\n },\n {} as { [key: string]: ATTRIBUTE },\n);\n"]}
|
|
@@ -17,9 +17,9 @@ export declare class Message extends AttributeRepository {
|
|
|
17
17
|
attributes: AttributePair[];
|
|
18
18
|
};
|
|
19
19
|
get transactionIdHex(): string;
|
|
20
|
-
get bytes(): Buffer
|
|
20
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
21
21
|
addMessageIntegrity(key: Buffer): this;
|
|
22
|
-
messageIntegrity(key: Buffer): Buffer
|
|
22
|
+
messageIntegrity(key: Buffer): Buffer<ArrayBuffer>;
|
|
23
23
|
addFingerprint(): void;
|
|
24
24
|
}
|
|
25
25
|
export declare function paddingLength(length: number): number;
|
|
@@ -7,7 +7,7 @@ exports.Message = void 0;
|
|
|
7
7
|
exports.parseMessage = parseMessage;
|
|
8
8
|
exports.paddingLength = paddingLength;
|
|
9
9
|
const crypto_1 = require("crypto");
|
|
10
|
-
|
|
10
|
+
//@ts-ignore
|
|
11
11
|
const buffer_crc32_1 = __importDefault(require("buffer-crc32"));
|
|
12
12
|
const helper_1 = require("../helper");
|
|
13
13
|
const attributes_1 = require("./attributes");
|
|
@@ -16,16 +16,18 @@ function parseMessage(data, integrityKey) {
|
|
|
16
16
|
if (data.length < const_1.HEADER_LENGTH) {
|
|
17
17
|
return undefined;
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
const transactionId = Buffer.from(data.subarray(const_1.HEADER_LENGTH - 12, const_1.HEADER_LENGTH));
|
|
19
|
+
const length = data.readUint16BE(2);
|
|
21
20
|
if (data.length !== const_1.HEADER_LENGTH + length) {
|
|
22
21
|
return undefined;
|
|
23
22
|
}
|
|
23
|
+
const messageType = data.readUint16BE(0);
|
|
24
|
+
const transactionId = Buffer.from(data.slice(const_1.HEADER_LENGTH - 12, const_1.HEADER_LENGTH));
|
|
24
25
|
const attributeRepository = new attributes_1.AttributeRepository();
|
|
25
26
|
for (let pos = const_1.HEADER_LENGTH; pos <= data.length - 4;) {
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
27
|
+
const attrType = data.readUInt16BE(pos);
|
|
28
|
+
const attrLen = data.readUInt16BE(pos + 2);
|
|
29
|
+
const payload = data.slice(pos + 4, pos + 4 + attrLen);
|
|
30
|
+
const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;
|
|
29
31
|
const attributesTypes = Object.keys(attributes_1.ATTRIBUTES_BY_TYPE);
|
|
30
32
|
if (attributesTypes.includes(attrType.toString())) {
|
|
31
33
|
const [, attrName, , attrUnpack] = attributes_1.ATTRIBUTES_BY_TYPE[attrType];
|
|
@@ -102,19 +104,16 @@ class Message extends attributes_1.AttributeRepository {
|
|
|
102
104
|
? attrPack(attrValue, this.transactionId)
|
|
103
105
|
: attrPack(attrValue);
|
|
104
106
|
const attrLen = v.length;
|
|
105
|
-
const padLen =
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
...[...Array(padLen)].map(() => Buffer.from("\x00")),
|
|
111
|
-
]);
|
|
107
|
+
const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;
|
|
108
|
+
const attrHeader = Buffer.alloc(4);
|
|
109
|
+
attrHeader.writeUInt16BE(attrType, 0);
|
|
110
|
+
attrHeader.writeUInt16BE(attrLen, 2);
|
|
111
|
+
data = Buffer.concat([data, attrHeader, v, Buffer.alloc(padLen, 0)]);
|
|
112
112
|
}
|
|
113
|
-
const buf = Buffer.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
]));
|
|
113
|
+
const buf = Buffer.alloc(8);
|
|
114
|
+
buf.writeUInt16BE(this.messageMethod | this.messageClass, 0);
|
|
115
|
+
buf.writeUInt16BE(data.length, 2);
|
|
116
|
+
buf.writeUInt32BE(const_1.COOKIE, 4);
|
|
118
117
|
return Buffer.concat([buf, this.transactionId, data]);
|
|
119
118
|
}
|
|
120
119
|
addMessageIntegrity(key) {
|
|
@@ -131,11 +130,11 @@ class Message extends attributes_1.AttributeRepository {
|
|
|
131
130
|
}
|
|
132
131
|
exports.Message = Message;
|
|
133
132
|
const setBodyLength = (data, length) => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
133
|
+
const output = Buffer.alloc(data.length);
|
|
134
|
+
data.copy(output, 0, 0, 2);
|
|
135
|
+
output.writeUInt16BE(length, 2);
|
|
136
|
+
data.copy(output, 4, 4);
|
|
137
|
+
return output;
|
|
139
138
|
};
|
|
140
139
|
function messageFingerprint(data) {
|
|
141
140
|
const checkData = setBodyLength(data, data.length - const_1.HEADER_LENGTH + const_1.FINGERPRINT_LENGTH);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../ice/src/stun/message.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\nimport crc32 from \"buffer-crc32\";\n\nimport { bufferXor, randomTransactionId } from \"../helper\";\nimport {\n ATTRIBUTES_BY_NAME,\n ATTRIBUTES_BY_TYPE,\n type AttributeKey,\n type AttributePair,\n AttributeRepository,\n packXorAddress,\n unpackXorAddress,\n} from \"./attributes\";\nimport {\n COOKIE,\n FINGERPRINT_LENGTH,\n FINGERPRINT_XOR,\n HEADER_LENGTH,\n INTEGRITY_LENGTH,\n classes,\n methods,\n} from \"./const\";\n\nexport function parseMessage(\n data: Buffer,\n integrityKey?: Buffer,\n): Message | undefined {\n if (data.length < HEADER_LENGTH) {\n return undefined;\n }\n const [messageType, length] = jspack.Unpack(\n \"!HHI\",\n data.subarray(0, HEADER_LENGTH),\n );\n\n const transactionId = Buffer.from(\n data.subarray(HEADER_LENGTH - 12, HEADER_LENGTH),\n );\n\n if (data.length !== HEADER_LENGTH + length) {\n return undefined;\n }\n\n const attributeRepository = new AttributeRepository();\n\n for (let pos = HEADER_LENGTH; pos <= data.length - 4; ) {\n const [attrType, attrLen] = jspack.Unpack(\n \"!HH\",\n data.subarray(pos, pos + 4),\n );\n const payload = data.subarray(pos + 4, pos + 4 + attrLen);\n const padLen = paddingLength(attrLen);\n const attributesTypes = Object.keys(ATTRIBUTES_BY_TYPE);\n if (attributesTypes.includes(attrType.toString())) {\n const [, attrName, , attrUnpack] = ATTRIBUTES_BY_TYPE[attrType];\n if (attrUnpack.name === unpackXorAddress.name) {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload, transactionId),\n );\n } else {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload),\n );\n }\n\n if (attrName === \"FINGERPRINT\") {\n const fingerprint = messageFingerprint(data.slice(0, pos));\n const expect = attributeRepository.getAttributeValue(\"FINGERPRINT\");\n if (expect !== fingerprint) {\n return undefined;\n }\n } else if (attrName === \"MESSAGE-INTEGRITY\") {\n if (integrityKey) {\n const integrity = messageIntegrity(data.slice(0, pos), integrityKey);\n const expect =\n attributeRepository.getAttributeValue(\"MESSAGE-INTEGRITY\");\n if (!integrity.equals(expect)) {\n return undefined;\n }\n }\n }\n }\n pos += 4 + attrLen + padLen;\n }\n\n const attributes = attributeRepository.getAttributes();\n attributeRepository.clear();\n\n return new Message(\n messageType & 0x3eef,\n messageType & 0x0110,\n transactionId,\n attributes,\n );\n}\n\nexport class Message extends AttributeRepository {\n constructor(\n public messageMethod: methods,\n public messageClass: classes,\n public transactionId: Buffer = randomTransactionId(),\n attributes: AttributePair[] = [],\n ) {\n super(attributes);\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n messageMethod: methods[this.messageMethod],\n messageClass: classes[this.messageClass],\n attributes: this.attributes,\n };\n }\n\n get transactionIdHex() {\n return this.transactionId.toString(\"hex\");\n }\n\n get bytes() {\n let data = Buffer.from([]);\n for (const attrName of this.attributesKeys) {\n const attrValue = this.getAttributeValue(attrName);\n const [attrType, , attrPack] = ATTRIBUTES_BY_NAME[attrName];\n const v =\n attrPack.name === packXorAddress.name\n ? attrPack(attrValue, this.transactionId)\n : attrPack(attrValue);\n const attrLen = v.length;\n const padLen = paddingLength(attrLen);\n data = Buffer.concat([\n data,\n Buffer.from(jspack.Pack(\"!HH\", [attrType, attrLen])),\n v,\n ...[...Array(padLen)].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n const buf = Buffer.from(\n jspack.Pack(\"!HHI\", [\n this.messageMethod | this.messageClass,\n data.length,\n COOKIE,\n ]),\n );\n\n return Buffer.concat([buf, this.transactionId, data]);\n }\n\n addMessageIntegrity(key: Buffer) {\n this.setAttribute(\"MESSAGE-INTEGRITY\", this.messageIntegrity(key));\n return this;\n }\n\n messageIntegrity(key: Buffer) {\n const checkData = setBodyLength(\n this.bytes,\n this.bytes.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n }\n\n addFingerprint() {\n this.setAttribute(\"FINGERPRINT\", messageFingerprint(this.bytes));\n }\n}\n\nconst setBodyLength = (data: Buffer, length: number) => {\n return Buffer.concat([\n data.slice(0, 2),\n Buffer.from(jspack.Pack(\"!H\", [length])),\n data.slice(4),\n ]);\n};\n\nfunction messageFingerprint(data: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + FINGERPRINT_LENGTH,\n );\n const crc32Buf = crc32(checkData);\n const xorBuf = Buffer.alloc(4);\n xorBuf.writeInt32BE(FINGERPRINT_XOR, 0);\n const fingerprint = bufferXor(crc32Buf, xorBuf);\n return fingerprint.readUInt32BE(0);\n}\n\nfunction messageIntegrity(data: Buffer, key: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n}\n\nexport function paddingLength(length: number) {\n const rest = length % 4;\n if (rest === 0) {\n return 0;\n } else {\n return 4 - rest;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../ice/src/stun/message.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac } from \"crypto\";\n//@ts-ignore\nimport crc32 from \"buffer-crc32\";\n\nimport { bufferXor, randomTransactionId } from \"../helper\";\nimport {\n ATTRIBUTES_BY_NAME,\n ATTRIBUTES_BY_TYPE,\n type AttributeKey,\n type AttributePair,\n AttributeRepository,\n packXorAddress,\n unpackXorAddress,\n} from \"./attributes\";\nimport {\n COOKIE,\n FINGERPRINT_LENGTH,\n FINGERPRINT_XOR,\n HEADER_LENGTH,\n INTEGRITY_LENGTH,\n classes,\n methods,\n} from \"./const\";\n\nexport function parseMessage(\n data: Buffer,\n integrityKey?: Buffer,\n): Message | undefined {\n if (data.length < HEADER_LENGTH) {\n return undefined;\n }\n\n const length = data.readUint16BE(2);\n\n if (data.length !== HEADER_LENGTH + length) {\n return undefined;\n }\n\n const messageType = data.readUint16BE(0);\n const transactionId = Buffer.from(\n data.slice(HEADER_LENGTH - 12, HEADER_LENGTH),\n );\n\n const attributeRepository = new AttributeRepository();\n\n for (let pos = HEADER_LENGTH; pos <= data.length - 4; ) {\n const attrType = data.readUInt16BE(pos);\n const attrLen = data.readUInt16BE(pos + 2);\n const payload = data.slice(pos + 4, pos + 4 + attrLen);\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attributesTypes = Object.keys(ATTRIBUTES_BY_TYPE);\n if (attributesTypes.includes(attrType.toString())) {\n const [, attrName, , attrUnpack] = ATTRIBUTES_BY_TYPE[attrType];\n if (attrUnpack.name === unpackXorAddress.name) {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload, transactionId),\n );\n } else {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload),\n );\n }\n\n if (attrName === \"FINGERPRINT\") {\n const fingerprint = messageFingerprint(data.slice(0, pos));\n const expect = attributeRepository.getAttributeValue(\"FINGERPRINT\");\n if (expect !== fingerprint) {\n return undefined;\n }\n } else if (attrName === \"MESSAGE-INTEGRITY\") {\n if (integrityKey) {\n const integrity = messageIntegrity(data.slice(0, pos), integrityKey);\n const expect =\n attributeRepository.getAttributeValue(\"MESSAGE-INTEGRITY\");\n if (!integrity.equals(expect)) {\n return undefined;\n }\n }\n }\n }\n pos += 4 + attrLen + padLen;\n }\n\n const attributes = attributeRepository.getAttributes();\n attributeRepository.clear();\n\n return new Message(\n messageType & 0x3eef,\n messageType & 0x0110,\n transactionId,\n attributes,\n );\n}\n\nexport class Message extends AttributeRepository {\n constructor(\n public messageMethod: methods,\n public messageClass: classes,\n public transactionId: Buffer = randomTransactionId(),\n attributes: AttributePair[] = [],\n ) {\n super(attributes);\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n messageMethod: methods[this.messageMethod],\n messageClass: classes[this.messageClass],\n attributes: this.attributes,\n };\n }\n\n get transactionIdHex() {\n return this.transactionId.toString(\"hex\");\n }\n\n get bytes() {\n let data = Buffer.from([]);\n for (const attrName of this.attributesKeys) {\n const attrValue = this.getAttributeValue(attrName);\n const [attrType, , attrPack] = ATTRIBUTES_BY_NAME[attrName];\n const v =\n attrPack.name === packXorAddress.name\n ? attrPack(attrValue, this.transactionId)\n : attrPack(attrValue);\n const attrLen = v.length;\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attrHeader = Buffer.alloc(4);\n attrHeader.writeUInt16BE(attrType, 0);\n attrHeader.writeUInt16BE(attrLen, 2);\n data = Buffer.concat([data, attrHeader, v, Buffer.alloc(padLen, 0)]);\n }\n const buf = Buffer.alloc(8);\n buf.writeUInt16BE(this.messageMethod | this.messageClass, 0);\n buf.writeUInt16BE(data.length, 2);\n buf.writeUInt32BE(COOKIE, 4);\n\n return Buffer.concat([buf, this.transactionId, data]);\n }\n\n addMessageIntegrity(key: Buffer) {\n this.setAttribute(\"MESSAGE-INTEGRITY\", this.messageIntegrity(key));\n return this;\n }\n\n messageIntegrity(key: Buffer) {\n const checkData = setBodyLength(\n this.bytes,\n this.bytes.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n }\n\n addFingerprint() {\n this.setAttribute(\"FINGERPRINT\", messageFingerprint(this.bytes));\n }\n}\n\nconst setBodyLength = (data: Buffer, length: number) => {\n const output = Buffer.alloc(data.length);\n data.copy(output, 0, 0, 2);\n output.writeUInt16BE(length, 2);\n data.copy(output, 4, 4);\n return output;\n};\n\nfunction messageFingerprint(data: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + FINGERPRINT_LENGTH,\n );\n const crc32Buf = crc32(checkData);\n const xorBuf = Buffer.alloc(4);\n xorBuf.writeInt32BE(FINGERPRINT_XOR, 0);\n const fingerprint = bufferXor(crc32Buf, xorBuf);\n return fingerprint.readUInt32BE(0);\n}\n\nfunction messageIntegrity(data: Buffer, key: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n}\n\nexport function paddingLength(length: number) {\n const rest = length % 4;\n if (rest === 0) {\n return 0;\n } else {\n return 4 - rest;\n }\n}\n"]}
|
|
@@ -15,8 +15,8 @@ export declare class StunProtocol implements Protocol {
|
|
|
15
15
|
localCandidate?: Candidate;
|
|
16
16
|
sentMessage?: Message;
|
|
17
17
|
localIp?: string;
|
|
18
|
-
readonly onRequestReceived: Event<[Message, readonly [string, number], Buffer]>;
|
|
19
|
-
readonly onDataReceived: Event<[Buffer]>;
|
|
18
|
+
readonly onRequestReceived: Event<[Message, readonly [string, number], Buffer<ArrayBufferLike>]>;
|
|
19
|
+
readonly onDataReceived: Event<[Buffer<ArrayBufferLike>]>;
|
|
20
20
|
constructor();
|
|
21
21
|
connectionMade: (useIpv4: boolean, portRange?: [number, number], interfaceAddresses?: InterfaceAddresses) => Promise<void>;
|
|
22
22
|
private datagramReceived;
|
|
@@ -111,12 +111,18 @@ class StunProtocol {
|
|
|
111
111
|
return [host, port];
|
|
112
112
|
}
|
|
113
113
|
async sendStun(message, addr) {
|
|
114
|
+
if (this.transport.closed) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
114
117
|
const data = message.bytes;
|
|
115
118
|
await this.transport.send(data, addr).catch(() => {
|
|
116
119
|
log("sendStun failed", addr, message);
|
|
117
120
|
});
|
|
118
121
|
}
|
|
119
122
|
async sendData(data, addr) {
|
|
123
|
+
if (this.transport.closed) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
120
126
|
await this.transport.send(data, addr);
|
|
121
127
|
}
|
|
122
128
|
async request(request, addr, integrityKey, retransmissions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/stun/protocol.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/stun/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event, UdpTransport, debug } from \"../imports/common\";\n\nimport type { Address, InterfaceAddresses } from \"../../../common/src/network\";\nimport type { Candidate } from \"../candidate\";\n\nimport type { Protocol } from \"../types/model\";\nimport { classes } from \"./const\";\nimport { type Message, parseMessage } from \"./message\";\nimport { Transaction } from \"./transaction\";\n\nconst log = debug(\"werift-ice : packages/ice/src/stun/protocol.ts\");\n\nexport class StunProtocol implements Protocol {\n static readonly type = \"stun\";\n readonly type = StunProtocol.type;\n transport!: UdpTransport;\n transactions: { [key: string]: Transaction } = {};\n get transactionsKeys() {\n return Object.keys(this.transactions);\n }\n localCandidate?: Candidate;\n sentMessage?: Message;\n localIp?: string;\n\n readonly onRequestReceived = new Event<[Message, Address, Buffer]>();\n readonly onDataReceived = new Event<[Buffer]>();\n\n constructor() {}\n\n connectionMade = async (\n useIpv4: boolean,\n portRange?: [number, number],\n interfaceAddresses?: InterfaceAddresses,\n ) => {\n if (useIpv4) {\n this.transport = await UdpTransport.init(\"udp4\", {\n portRange,\n interfaceAddresses,\n });\n } else {\n this.transport = await UdpTransport.init(\"udp6\", {\n portRange,\n interfaceAddresses,\n });\n }\n\n this.transport.onData = (data, addr) => {\n this.datagramReceived(data, addr);\n };\n };\n\n private datagramReceived(data: Buffer, addr: Address) {\n try {\n const message = parseMessage(data);\n if (!message) {\n if (this.localCandidate) {\n this.onDataReceived.execute(data);\n }\n return;\n }\n // log(\"parseMessage\", addr, message.toJSON());\n if (\n (message.messageClass === classes.RESPONSE ||\n message.messageClass === classes.ERROR) &&\n this.transactionsKeys.includes(message.transactionIdHex)\n ) {\n const transaction = this.transactions[message.transactionIdHex];\n transaction.responseReceived(message, addr);\n } else if (message.messageClass === classes.REQUEST) {\n this.onRequestReceived.execute(message, addr, data);\n }\n } catch (error) {\n log(\"datagramReceived error\", error);\n }\n }\n\n getExtraInfo(): Address {\n const { address: host, port } = this.transport.address;\n return [host, port];\n }\n\n async sendStun(message: Message, addr: Address) {\n if (this.transport.closed) {\n return;\n }\n\n const data = message.bytes;\n await this.transport.send(data, addr).catch(() => {\n log(\"sendStun failed\", addr, message);\n });\n }\n\n async sendData(data: Buffer, addr: Address) {\n if (this.transport.closed) {\n return;\n }\n\n await this.transport.send(data, addr);\n }\n\n async request(\n request: Message,\n addr: Address,\n integrityKey?: Buffer,\n retransmissions?: number,\n ) {\n // \"\"\"\n // Execute a STUN transaction and return the response.\n // \"\"\"\n if (this.transactionsKeys.includes(request.transactionIdHex))\n throw new Error(\"already request ed\");\n\n if (integrityKey) {\n request.addMessageIntegrity(integrityKey);\n request.addFingerprint();\n }\n\n const transaction: Transaction = new Transaction(\n request,\n addr,\n this,\n retransmissions,\n );\n this.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } catch (e) {\n throw e;\n } finally {\n delete this.transactions[request.transactionIdHex];\n }\n }\n\n async close() {\n Object.values(this.transactions).forEach((transaction) => {\n transaction.cancel();\n });\n await this.transport.close();\n this.onRequestReceived.complete();\n this.onDataReceived.complete();\n }\n}\n"]}
|
|
@@ -31,7 +31,7 @@ export declare class TurnProtocol implements Protocol {
|
|
|
31
31
|
};
|
|
32
32
|
static type: string;
|
|
33
33
|
readonly type: string;
|
|
34
|
-
readonly onData: Event<[Buffer
|
|
34
|
+
readonly onData: Event<[Buffer<ArrayBufferLike>, readonly [string, number]]>;
|
|
35
35
|
onRequestReceived: Event<[Message, Address, Buffer]>;
|
|
36
36
|
onDataReceived: Event<[Buffer]>;
|
|
37
37
|
integrityKey?: Buffer;
|
|
@@ -101,4 +101,4 @@ export declare function createStunOverTurnClient({ address, username, password,
|
|
|
101
101
|
portRange?: [number, number];
|
|
102
102
|
interfaceAddresses?: InterfaceAddresses;
|
|
103
103
|
}): Promise<StunOverTurnProtocol>;
|
|
104
|
-
export declare function makeIntegrityKey(username: string, realm: string, password: string): Buffer
|
|
104
|
+
export declare function makeIntegrityKey(username: string, realm: string, password: string): Buffer<ArrayBufferLike>;
|
|
@@ -404,6 +404,9 @@ class TurnProtocol {
|
|
|
404
404
|
}
|
|
405
405
|
}
|
|
406
406
|
async send(data, addr) {
|
|
407
|
+
if (this.transport.closed) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
407
410
|
if (this.transport.type === "tcp") {
|
|
408
411
|
const padding = (0, message_1.paddingLength)(data.length);
|
|
409
412
|
await this.transport.send(padding > 0 ? Buffer.concat([data, Buffer.alloc(padding)]) : data, addr);
|