werift 0.23.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -0
- package/lib/common/src/binary.js +2 -3
- package/lib/common/src/binary.js.map +1 -1
- package/lib/common/src/transport.d.ts +22 -9
- package/lib/common/src/transport.js +152 -25
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/candidate.d.ts +16 -1
- package/lib/ice/src/candidate.js +99 -15
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/ice.d.ts +2 -0
- package/lib/ice/src/ice.js +175 -50
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +23 -2
- package/lib/ice/src/iceBase.js +63 -1
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/index.d.ts +2 -0
- package/lib/ice/src/index.js +2 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/internal/selectAddresses.d.ts +9 -0
- package/lib/ice/src/internal/selectAddresses.js +40 -0
- package/lib/ice/src/internal/selectAddresses.js.map +1 -0
- package/lib/ice/src/stun/const.d.ts +1 -26
- package/lib/ice/src/stun/const.js +15 -54
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +1 -25
- package/lib/ice/src/stun/message.js +15 -149
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +1 -1
- package/lib/ice/src/stun/protocol.js +2 -2
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
- package/lib/ice/src/stun/tcpFrame.js +26 -0
- package/lib/ice/src/stun/tcpFrame.js.map +1 -0
- package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
- package/lib/ice/src/stun/tcpProtocol.js +326 -0
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
- package/lib/ice/src/stun/transaction.d.ts +2 -1
- package/lib/ice/src/stun/transaction.js +9 -3
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/frame.d.ts +1 -0
- package/lib/ice/src/turn/frame.js +18 -0
- package/lib/ice/src/turn/frame.js.map +1 -0
- package/lib/ice/src/turn/protocol.d.ts +9 -7
- package/lib/ice/src/turn/protocol.js +32 -44
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +1 -1
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/ice/src/utils.js +2 -31
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
- package/lib/{ice → ice-server}/src/stun/attributes.js +69 -66
- package/lib/ice-server/src/stun/attributes.js.map +1 -0
- package/lib/ice-server/src/stun/const.d.ts +28 -0
- package/lib/ice-server/src/stun/const.js +88 -0
- package/lib/ice-server/src/stun/const.js.map +1 -0
- package/lib/ice-server/src/stun/ip.d.ts +12 -0
- package/lib/ice-server/src/stun/ip.js +88 -0
- package/lib/ice-server/src/stun/ip.js.map +1 -0
- package/lib/ice-server/src/stun/message.d.ts +37 -0
- package/lib/ice-server/src/stun/message.js +190 -0
- package/lib/ice-server/src/stun/message.js.map +1 -0
- package/lib/ice-server/src/turn/auth.d.ts +1 -0
- package/lib/ice-server/src/turn/auth.js +10 -0
- package/lib/ice-server/src/turn/auth.js.map +1 -0
- package/lib/ice-server/src/turn/frame.d.ts +13 -0
- package/lib/ice-server/src/turn/frame.js +69 -0
- package/lib/ice-server/src/turn/frame.js.map +1 -0
- package/lib/index.mjs +2866 -946
- package/lib/nonstandard/index.mjs +1872 -455
- package/lib/rtp/src/codec/av1.js +11 -5
- package/lib/rtp/src/codec/av1.js.map +1 -1
- package/lib/rtp/src/codec/leb128.d.ts +5 -0
- package/lib/rtp/src/codec/leb128.js +24 -0
- package/lib/rtp/src/codec/leb128.js.map +1 -0
- package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
- package/lib/rtp/src/extra/container/mp4/container.js +258 -173
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
- package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
- package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
- package/lib/rtp/src/extra/processor/mp4.js +115 -60
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/rtp/src/rtp/rtx.js +4 -6
- package/lib/rtp/src/rtp/rtx.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +2 -0
- package/lib/rtp/src/srtp/context/context.js +12 -12
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/sctp/src/param.js +31 -15
- package/lib/sctp/src/param.js.map +1 -1
- package/lib/sctp/src/sctp.js +10 -9
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +3 -2
- package/lib/webrtc/src/dataChannel.js +9 -2
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +3 -0
- package/lib/webrtc/src/errors.js +11 -0
- package/lib/webrtc/src/errors.js.map +1 -0
- package/lib/webrtc/src/helper.d.ts +5 -1
- package/lib/webrtc/src/helper.js +33 -1
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
- package/lib/webrtc/src/media/receiver/statistics.js +22 -0
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
- package/lib/webrtc/src/media/rtpReceiver.js +135 -20
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
- package/lib/webrtc/src/media/rtpSender.js +179 -31
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
- package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +15 -1
- package/lib/webrtc/src/media/stats.js +55 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +2 -1
- package/lib/webrtc/src/media/track.js +7 -1
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
- package/lib/webrtc/src/nonstandard/navigator.js +96 -32
- package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
- package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +183 -50
- package/lib/webrtc/src/peerConnection.js +458 -109
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +1 -1
- package/lib/webrtc/src/sctpManager.js +27 -7
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +10 -7
- package/lib/webrtc/src/sdp.js +40 -44
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +4 -3
- package/lib/webrtc/src/sdpManager.js +50 -27
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
- package/lib/webrtc/src/secureTransportManager.js +100 -22
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +5 -4
- package/lib/webrtc/src/transceiverManager.js +61 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +15 -4
- package/lib/webrtc/src/transport/dtls.js +91 -23
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +21 -3
- package/lib/webrtc/src/transport/ice.js +159 -30
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +1 -0
- package/lib/webrtc/src/transport/sctp.js +26 -22
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +12 -4
- package/lib/webrtc/src/utils.js +118 -16
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +7 -10
- package/lib/ice/src/stun/attributes.js.map +0 -1
- package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
- package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
- package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
|
@@ -1,81 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
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
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
3
|
exports.ATTRIBUTES_BY_NAME = exports.ATTRIBUTES_BY_TYPE = exports.AttributeRepository = void 0;
|
|
40
4
|
exports.unpackErrorCode = unpackErrorCode;
|
|
41
5
|
exports.unpackXorAddress = unpackXorAddress;
|
|
42
6
|
exports.packErrorCode = packErrorCode;
|
|
7
|
+
exports.packUnknownAttributes = packUnknownAttributes;
|
|
8
|
+
exports.unpackUnknownAttributes = unpackUnknownAttributes;
|
|
43
9
|
exports.packXorAddress = packXorAddress;
|
|
44
|
-
const Int64 = __importStar(require("int64-buffer"));
|
|
45
|
-
const ip_1 = __importDefault(require("ip"));
|
|
46
10
|
const const_1 = require("./const");
|
|
11
|
+
const ip_1 = require("./ip");
|
|
47
12
|
function packAddress(value) {
|
|
48
13
|
const [address] = value;
|
|
49
|
-
const protocol = ip_1.
|
|
14
|
+
const protocol = (0, ip_1.isIpV4Address)(address) ? const_1.IPV4_PROTOCOL : const_1.IPV6_PROTOCOL;
|
|
50
15
|
const buffer = Buffer.alloc(4);
|
|
51
16
|
buffer.writeUInt8(0, 0);
|
|
52
17
|
buffer.writeUInt8(protocol, 1);
|
|
53
18
|
buffer.writeUInt16BE(value[1], 2);
|
|
54
|
-
return Buffer.concat([buffer, ip_1.
|
|
19
|
+
return Buffer.concat([buffer, (0, ip_1.ipAddressToBuffer)(address)]);
|
|
55
20
|
}
|
|
56
21
|
function unpackErrorCode(data) {
|
|
57
|
-
if (data.length < 4)
|
|
22
|
+
if (data.length < 4) {
|
|
58
23
|
throw new Error("STUN error code is less than 4 bytes");
|
|
24
|
+
}
|
|
59
25
|
const codeHigh = data.readUInt8(2);
|
|
60
26
|
const codeLow = data.readUInt8(3);
|
|
61
27
|
const reason = data.slice(4).toString("utf8");
|
|
62
28
|
return [codeHigh * 100 + codeLow, reason];
|
|
63
29
|
}
|
|
64
30
|
function unpackAddress(data) {
|
|
65
|
-
if (data.length < 4)
|
|
31
|
+
if (data.length < 4) {
|
|
66
32
|
throw new Error("STUN address length is less than 4 bytes");
|
|
33
|
+
}
|
|
67
34
|
const protocol = data.readUInt8(1);
|
|
68
35
|
const port = data.readUInt16BE(2);
|
|
69
36
|
const address = data.slice(4);
|
|
70
37
|
switch (protocol) {
|
|
71
38
|
case const_1.IPV4_PROTOCOL:
|
|
72
|
-
if (address.length
|
|
73
|
-
throw new Error(
|
|
74
|
-
|
|
39
|
+
if (address.length !== 4) {
|
|
40
|
+
throw new Error("STUN address has invalid length for IPv4");
|
|
41
|
+
}
|
|
42
|
+
return [(0, ip_1.bufferToIpAddress)(address), port];
|
|
75
43
|
case const_1.IPV6_PROTOCOL:
|
|
76
|
-
if (address.length
|
|
44
|
+
if (address.length !== 16) {
|
|
77
45
|
throw new Error("STUN address has invalid length for IPv6");
|
|
78
|
-
|
|
46
|
+
}
|
|
47
|
+
return [(0, ip_1.bufferToIpAddress)(address), port];
|
|
79
48
|
default:
|
|
80
49
|
throw new Error("STUN address has unknown protocol");
|
|
81
50
|
}
|
|
@@ -102,8 +71,25 @@ function packErrorCode(value) {
|
|
|
102
71
|
buffer.writeUInt16BE(0, 0);
|
|
103
72
|
buffer.writeUInt8(Math.floor(value[0] / 100), 2);
|
|
104
73
|
buffer.writeUInt8(value[0] % 100, 3);
|
|
105
|
-
const
|
|
106
|
-
return Buffer.concat([buffer,
|
|
74
|
+
const encoded = Buffer.from(value[1], "utf8");
|
|
75
|
+
return Buffer.concat([buffer, encoded]);
|
|
76
|
+
}
|
|
77
|
+
function packUnknownAttributes(value) {
|
|
78
|
+
const buffer = Buffer.alloc(value.length * 2);
|
|
79
|
+
value.forEach((attributeType, index) => {
|
|
80
|
+
buffer.writeUInt16BE(attributeType, index * 2);
|
|
81
|
+
});
|
|
82
|
+
return buffer;
|
|
83
|
+
}
|
|
84
|
+
function unpackUnknownAttributes(data) {
|
|
85
|
+
if (data.length % 2 !== 0) {
|
|
86
|
+
throw new Error("UNKNOWN-ATTRIBUTES must have an even length");
|
|
87
|
+
}
|
|
88
|
+
const attributes = [];
|
|
89
|
+
for (let offset = 0; offset < data.length; offset += 2) {
|
|
90
|
+
attributes.push(data.readUInt16BE(offset));
|
|
91
|
+
}
|
|
92
|
+
return attributes;
|
|
107
93
|
}
|
|
108
94
|
function packXorAddress(value, transactionId) {
|
|
109
95
|
return xorAddress(packAddress(value), transactionId);
|
|
@@ -121,18 +107,23 @@ const packUnsignedShort = (value) => {
|
|
|
121
107
|
};
|
|
122
108
|
const unpackUnsignedShort = (data) => data.readUInt16BE(0);
|
|
123
109
|
const packUnsigned64 = (value) => {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const int = new Int64.Int64BE(data);
|
|
128
|
-
return BigInt(int.toString());
|
|
110
|
+
const buffer = Buffer.allocUnsafe(8);
|
|
111
|
+
buffer.writeBigUInt64BE(value, 0);
|
|
112
|
+
return buffer;
|
|
129
113
|
};
|
|
114
|
+
const unpackUnsigned64 = (data) => data.readBigUInt64BE(0);
|
|
130
115
|
const packString = (value) => Buffer.from(value, "utf8");
|
|
131
116
|
const unpackString = (data) => data.toString("utf8");
|
|
117
|
+
const packSoftware = (value) => {
|
|
118
|
+
if ([...value].length >= 128) {
|
|
119
|
+
throw new Error("SOFTWARE must be shorter than 128 characters");
|
|
120
|
+
}
|
|
121
|
+
return packString(value);
|
|
122
|
+
};
|
|
132
123
|
const packBytes = (value) => value;
|
|
133
124
|
const unpackBytes = (data) => data;
|
|
134
|
-
const packNone = (
|
|
135
|
-
const unpackNone = (
|
|
125
|
+
const packNone = () => Buffer.alloc(0);
|
|
126
|
+
const unpackNone = () => null;
|
|
136
127
|
const ATTRIBUTES = [
|
|
137
128
|
[0x0001, "MAPPED-ADDRESS", packAddress, unpackAddress],
|
|
138
129
|
[0x0003, "CHANGE-REQUEST", packUnsigned, unpackUnsigned],
|
|
@@ -141,6 +132,12 @@ const ATTRIBUTES = [
|
|
|
141
132
|
[0x0006, "USERNAME", packString, unpackString],
|
|
142
133
|
[0x0008, "MESSAGE-INTEGRITY", packBytes, unpackBytes],
|
|
143
134
|
[0x0009, "ERROR-CODE", packErrorCode, unpackErrorCode],
|
|
135
|
+
[
|
|
136
|
+
0x000a,
|
|
137
|
+
"UNKNOWN-ATTRIBUTES",
|
|
138
|
+
packUnknownAttributes,
|
|
139
|
+
unpackUnknownAttributes,
|
|
140
|
+
],
|
|
144
141
|
[0x000c, "CHANNEL-NUMBER", packUnsignedShort, unpackUnsignedShort],
|
|
145
142
|
[0x000d, "LIFETIME", packUnsigned, unpackUnsigned],
|
|
146
143
|
[0x0012, "XOR-PEER-ADDRESS", packXorAddress, unpackXorAddress],
|
|
@@ -148,11 +145,20 @@ const ATTRIBUTES = [
|
|
|
148
145
|
[0x0014, "REALM", packString, unpackString],
|
|
149
146
|
[0x0015, "NONCE", packBytes, unpackBytes],
|
|
150
147
|
[0x0016, "XOR-RELAYED-ADDRESS", packXorAddress, unpackXorAddress],
|
|
148
|
+
[0x0017, "REQUESTED-ADDRESS-FAMILY", packUnsigned, unpackUnsigned],
|
|
149
|
+
[0x0018, "EVEN-PORT", packBytes, unpackBytes],
|
|
151
150
|
[0x0019, "REQUESTED-TRANSPORT", packUnsigned, unpackUnsigned],
|
|
151
|
+
[0x001c, "MESSAGE-INTEGRITY-SHA256", packBytes, unpackBytes],
|
|
152
|
+
[0x001d, "PASSWORD-ALGORITHM", packBytes, unpackBytes],
|
|
153
|
+
[0x001e, "USERHASH", packBytes, unpackBytes],
|
|
152
154
|
[0x0020, "XOR-MAPPED-ADDRESS", packXorAddress, unpackXorAddress],
|
|
155
|
+
[0x0022, "RESERVATION-TOKEN", packBytes, unpackBytes],
|
|
153
156
|
[0x0024, "PRIORITY", packUnsigned, unpackUnsigned],
|
|
154
157
|
[0x0025, "USE-CANDIDATE", packNone, unpackNone],
|
|
155
|
-
[
|
|
158
|
+
[0x8002, "PASSWORD-ALGORITHMS", packBytes, unpackBytes],
|
|
159
|
+
[0x8003, "ALTERNATE-DOMAIN", packString, unpackString],
|
|
160
|
+
[0x8022, "SOFTWARE", packSoftware, unpackString],
|
|
161
|
+
[0x8023, "ALTERNATE-SERVER", packAddress, unpackAddress],
|
|
156
162
|
[0x8028, "FINGERPRINT", packUnsigned, unpackUnsigned],
|
|
157
163
|
[0x8029, "ICE-CONTROLLED", packUnsigned64, unpackUnsigned64],
|
|
158
164
|
[0x802a, "ICE-CONTROLLING", packUnsigned64, unpackUnsigned64],
|
|
@@ -172,9 +178,9 @@ class AttributeRepository {
|
|
|
172
178
|
return this.attributes;
|
|
173
179
|
}
|
|
174
180
|
setAttribute(key, value) {
|
|
175
|
-
const
|
|
176
|
-
if (
|
|
177
|
-
|
|
181
|
+
const existing = this.attributes.find((attribute) => attribute[0] === key);
|
|
182
|
+
if (existing) {
|
|
183
|
+
existing[1] = value;
|
|
178
184
|
}
|
|
179
185
|
else {
|
|
180
186
|
this.attributes.push([key, value]);
|
|
@@ -182,14 +188,11 @@ class AttributeRepository {
|
|
|
182
188
|
return this;
|
|
183
189
|
}
|
|
184
190
|
getAttributeValue(key) {
|
|
185
|
-
const attribute = this.attributes.find((
|
|
186
|
-
|
|
187
|
-
return undefined;
|
|
188
|
-
}
|
|
189
|
-
return attribute[1];
|
|
191
|
+
const attribute = this.attributes.find((candidate) => candidate[0] === key);
|
|
192
|
+
return attribute?.[1];
|
|
190
193
|
}
|
|
191
194
|
get attributesKeys() {
|
|
192
|
-
return this.attributes.map((
|
|
195
|
+
return this.attributes.map((attribute) => attribute[0]);
|
|
193
196
|
}
|
|
194
197
|
clear() {
|
|
195
198
|
this.attributes = [];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../../../../ice-server/src/stun/attributes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Address } from \"../../../common/src\";\n\nimport {\n type AttributeKeys,\n COOKIE,\n IPV4_PROTOCOL,\n IPV6_PROTOCOL,\n} from \"./const\";\nimport { bufferToIpAddress, ipAddressToBuffer, isIpV4Address } from \"./ip\";\n\nfunction packAddress(value: Address) {\n const [address] = value;\n const protocol = isIpV4Address(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, ipAddressToBuffer(address)]);\n}\n\nexport function unpackErrorCode(data: Buffer): [number, string] {\n if (data.length < 4) {\n throw new Error(\"STUN error code is less than 4 bytes\");\n }\n\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 }\n\n const protocol = data.readUInt8(1);\n const port = data.readUInt16BE(2);\n const address = data.slice(4);\n\n switch (protocol) {\n case IPV4_PROTOCOL:\n if (address.length !== 4) {\n throw new Error(\"STUN address has invalid length for IPv4\");\n }\n return [bufferToIpAddress(address), port];\n case IPV6_PROTOCOL:\n if (address.length !== 16) {\n throw new Error(\"STUN address has invalid length for IPv6\");\n }\n return [bufferToIpAddress(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 encoded = Buffer.from(value[1], \"utf8\");\n return Buffer.concat([buffer, encoded]);\n}\n\nexport function packUnknownAttributes(value: number[]) {\n const buffer = Buffer.alloc(value.length * 2);\n value.forEach((attributeType, index) => {\n buffer.writeUInt16BE(attributeType, index * 2);\n });\n return buffer;\n}\n\nexport function unpackUnknownAttributes(data: Buffer) {\n if (data.length % 2 !== 0) {\n throw new Error(\"UNKNOWN-ATTRIBUTES must have an even length\");\n }\n\n const attributes: number[] = [];\n for (let offset = 0; offset < data.length; offset += 2) {\n attributes.push(data.readUInt16BE(offset));\n }\n return attributes;\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 const buffer = Buffer.allocUnsafe(8);\n buffer.writeBigUInt64BE(value, 0);\n return buffer;\n};\n\nconst unpackUnsigned64 = (data: Buffer) => data.readBigUInt64BE(0);\n\nconst packString = (value: string) => Buffer.from(value, \"utf8\");\nconst unpackString = (data: Buffer) => data.toString(\"utf8\");\n\nconst packSoftware = (value: string) => {\n if ([...value].length >= 128) {\n throw new Error(\"SOFTWARE must be shorter than 128 characters\");\n }\n return packString(value);\n};\n\nconst packBytes = (value: Buffer) => value;\nconst unpackBytes = (data: Buffer) => data;\n\nconst packNone = () => Buffer.alloc(0);\nconst unpackNone = () => null;\n\nexport type ATTRIBUTE = [\n number,\n AttributeKey,\n (...args: any[]) => Buffer,\n (...args: any[]) => any,\n];\n\nexport type RawAttribute = {\n type: number;\n length?: number;\n value: Buffer;\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 [\n 0x000a,\n \"UNKNOWN-ATTRIBUTES\",\n packUnknownAttributes,\n unpackUnknownAttributes,\n ],\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 [0x0017, \"REQUESTED-ADDRESS-FAMILY\", packUnsigned, unpackUnsigned],\n [0x0018, \"EVEN-PORT\", packBytes, unpackBytes],\n [0x0019, \"REQUESTED-TRANSPORT\", packUnsigned, unpackUnsigned],\n [0x001c, \"MESSAGE-INTEGRITY-SHA256\", packBytes, unpackBytes],\n [0x001d, \"PASSWORD-ALGORITHM\", packBytes, unpackBytes],\n [0x001e, \"USERHASH\", packBytes, unpackBytes],\n [0x0020, \"XOR-MAPPED-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0022, \"RESERVATION-TOKEN\", packBytes, unpackBytes],\n [0x0024, \"PRIORITY\", packUnsigned, unpackUnsigned],\n [0x0025, \"USE-CANDIDATE\", packNone, unpackNone],\n [0x8002, \"PASSWORD-ALGORITHMS\", packBytes, unpackBytes],\n [0x8003, \"ALTERNATE-DOMAIN\", packString, unpackString],\n [0x8022, \"SOFTWARE\", packSoftware, unpackString],\n [0x8023, \"ALTERNATE-SERVER\", packAddress, unpackAddress],\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: AttributeKey, value: any) {\n const existing = this.attributes.find((attribute) => attribute[0] === key);\n if (existing) {\n existing[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((candidate) => candidate[0] === key);\n return attribute?.[1];\n }\n\n get attributesKeys(): AttributeKey[] {\n return this.attributes.map((attribute) => attribute[0]);\n }\n\n clear() {\n this.attributes = [];\n }\n}\n\nexport type AttributeKey = (typeof AttributeKeys)[number];\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"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const COOKIE = 554869826;
|
|
2
|
+
export declare const FINGERPRINT_LENGTH = 8;
|
|
3
|
+
export declare const FINGERPRINT_XOR = 1398035790;
|
|
4
|
+
export declare const HEADER_LENGTH = 20;
|
|
5
|
+
export declare const INTEGRITY_LENGTH = 24;
|
|
6
|
+
export declare const IPV4_PROTOCOL = 1;
|
|
7
|
+
export declare const IPV6_PROTOCOL = 2;
|
|
8
|
+
export declare const RETRY_MAX = 6;
|
|
9
|
+
export declare const RETRY_RTO = 50;
|
|
10
|
+
export declare const AttributeKeys: readonly ["FINGERPRINT", "MESSAGE-INTEGRITY", "MESSAGE-INTEGRITY-SHA256", "CHANGE-REQUEST", "PRIORITY", "USERNAME", "USERHASH", "ICE-CONTROLLING", "SOURCE-ADDRESS", "USE-CANDIDATE", "ICE-CONTROLLED", "ERROR-CODE", "UNKNOWN-ATTRIBUTES", "XOR-MAPPED-ADDRESS", "CHANGED-ADDRESS", "LIFETIME", "REQUESTED-TRANSPORT", "NONCE", "REALM", "REQUESTED-ADDRESS-FAMILY", "EVEN-PORT", "PASSWORD-ALGORITHM", "PASSWORD-ALGORITHMS", "XOR-RELAYED-ADDRESS", "RESERVATION-TOKEN", "CHANNEL-NUMBER", "XOR-PEER-ADDRESS", "DATA", "SOFTWARE", "MAPPED-ADDRESS", "ALTERNATE-DOMAIN", "ALTERNATE-SERVER", "RESPONSE-ORIGIN", "OTHER-ADDRESS"];
|
|
11
|
+
export declare enum classes {
|
|
12
|
+
REQUEST = 0,
|
|
13
|
+
INDICATION = 16,
|
|
14
|
+
RESPONSE = 256,
|
|
15
|
+
ERROR = 272
|
|
16
|
+
}
|
|
17
|
+
export declare enum methods {
|
|
18
|
+
BINDING = 1,
|
|
19
|
+
SHARED_SECRET = 2,
|
|
20
|
+
ALLOCATE = 3,
|
|
21
|
+
REFRESH = 4,
|
|
22
|
+
SEND = 6,
|
|
23
|
+
DATA = 7,
|
|
24
|
+
CREATE_PERMISSION = 8,
|
|
25
|
+
CHANNEL_BIND = 9
|
|
26
|
+
}
|
|
27
|
+
export declare function isComprehensionRequiredAttribute(type: number): boolean;
|
|
28
|
+
export declare function isStunMessage(data: Buffer): boolean;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.methods = exports.classes = exports.AttributeKeys = exports.RETRY_RTO = exports.RETRY_MAX = exports.IPV6_PROTOCOL = exports.IPV4_PROTOCOL = exports.INTEGRITY_LENGTH = exports.HEADER_LENGTH = exports.FINGERPRINT_XOR = exports.FINGERPRINT_LENGTH = exports.COOKIE = void 0;
|
|
4
|
+
exports.isComprehensionRequiredAttribute = isComprehensionRequiredAttribute;
|
|
5
|
+
exports.isStunMessage = isStunMessage;
|
|
6
|
+
exports.COOKIE = 0x2112a442;
|
|
7
|
+
exports.FINGERPRINT_LENGTH = 8;
|
|
8
|
+
exports.FINGERPRINT_XOR = 0x5354554e;
|
|
9
|
+
exports.HEADER_LENGTH = 20;
|
|
10
|
+
exports.INTEGRITY_LENGTH = 24;
|
|
11
|
+
exports.IPV4_PROTOCOL = 1;
|
|
12
|
+
exports.IPV6_PROTOCOL = 2;
|
|
13
|
+
exports.RETRY_MAX = 6;
|
|
14
|
+
exports.RETRY_RTO = 50;
|
|
15
|
+
exports.AttributeKeys = [
|
|
16
|
+
"FINGERPRINT",
|
|
17
|
+
"MESSAGE-INTEGRITY",
|
|
18
|
+
"MESSAGE-INTEGRITY-SHA256",
|
|
19
|
+
"CHANGE-REQUEST",
|
|
20
|
+
"PRIORITY",
|
|
21
|
+
"USERNAME",
|
|
22
|
+
"USERHASH",
|
|
23
|
+
"ICE-CONTROLLING",
|
|
24
|
+
"SOURCE-ADDRESS",
|
|
25
|
+
"USE-CANDIDATE",
|
|
26
|
+
"ICE-CONTROLLED",
|
|
27
|
+
"ERROR-CODE",
|
|
28
|
+
"UNKNOWN-ATTRIBUTES",
|
|
29
|
+
"XOR-MAPPED-ADDRESS",
|
|
30
|
+
"CHANGED-ADDRESS",
|
|
31
|
+
"LIFETIME",
|
|
32
|
+
"REQUESTED-TRANSPORT",
|
|
33
|
+
"NONCE",
|
|
34
|
+
"REALM",
|
|
35
|
+
"REQUESTED-ADDRESS-FAMILY",
|
|
36
|
+
"EVEN-PORT",
|
|
37
|
+
"PASSWORD-ALGORITHM",
|
|
38
|
+
"PASSWORD-ALGORITHMS",
|
|
39
|
+
"XOR-RELAYED-ADDRESS",
|
|
40
|
+
"RESERVATION-TOKEN",
|
|
41
|
+
"CHANNEL-NUMBER",
|
|
42
|
+
"XOR-PEER-ADDRESS",
|
|
43
|
+
"DATA",
|
|
44
|
+
"SOFTWARE",
|
|
45
|
+
"MAPPED-ADDRESS",
|
|
46
|
+
"ALTERNATE-DOMAIN",
|
|
47
|
+
"ALTERNATE-SERVER",
|
|
48
|
+
"RESPONSE-ORIGIN",
|
|
49
|
+
"OTHER-ADDRESS",
|
|
50
|
+
];
|
|
51
|
+
var classes;
|
|
52
|
+
(function (classes) {
|
|
53
|
+
classes[classes["REQUEST"] = 0] = "REQUEST";
|
|
54
|
+
classes[classes["INDICATION"] = 16] = "INDICATION";
|
|
55
|
+
classes[classes["RESPONSE"] = 256] = "RESPONSE";
|
|
56
|
+
classes[classes["ERROR"] = 272] = "ERROR";
|
|
57
|
+
})(classes || (exports.classes = classes = {}));
|
|
58
|
+
var methods;
|
|
59
|
+
(function (methods) {
|
|
60
|
+
methods[methods["BINDING"] = 1] = "BINDING";
|
|
61
|
+
methods[methods["SHARED_SECRET"] = 2] = "SHARED_SECRET";
|
|
62
|
+
methods[methods["ALLOCATE"] = 3] = "ALLOCATE";
|
|
63
|
+
methods[methods["REFRESH"] = 4] = "REFRESH";
|
|
64
|
+
methods[methods["SEND"] = 6] = "SEND";
|
|
65
|
+
methods[methods["DATA"] = 7] = "DATA";
|
|
66
|
+
methods[methods["CREATE_PERMISSION"] = 8] = "CREATE_PERMISSION";
|
|
67
|
+
methods[methods["CHANNEL_BIND"] = 9] = "CHANNEL_BIND";
|
|
68
|
+
})(methods || (exports.methods = methods = {}));
|
|
69
|
+
function isComprehensionRequiredAttribute(type) {
|
|
70
|
+
return type >= 0x0000 && type <= 0x7fff;
|
|
71
|
+
}
|
|
72
|
+
function isStunMessage(data) {
|
|
73
|
+
if (data.length < exports.HEADER_LENGTH) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if ((data[0] & 0xc0) !== 0) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
if (data.readUInt32BE(4) !== exports.COOKIE) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
const length = data.readUInt16BE(2);
|
|
83
|
+
if (length % 4 !== 0) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
return data.length === exports.HEADER_LENGTH + length;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=const.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../ice-server/src/stun/const.ts"],"names":[],"mappings":";;;AAkEA,4EAEC;AAED,sCAmBC;AAzFY,QAAA,MAAM,GAAG,UAAU,CAAC;AACpB,QAAA,kBAAkB,GAAG,CAAC,CAAC;AACvB,QAAA,eAAe,GAAG,UAAU,CAAC;AAC7B,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,gBAAgB,GAAG,EAAE,CAAC;AACtB,QAAA,aAAa,GAAG,CAAC,CAAC;AAClB,QAAA,aAAa,GAAG,CAAC,CAAC;AAElB,QAAA,SAAS,GAAG,CAAC,CAAC;AACd,QAAA,SAAS,GAAG,EAAE,CAAC;AAEf,QAAA,aAAa,GAAG;IAC3B,aAAa;IACb,mBAAmB;IACnB,0BAA0B;IAC1B,gBAAgB;IAChB,UAAU;IACV,UAAU;IACV,UAAU;IACV,iBAAiB;IACjB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,YAAY;IACZ,oBAAoB;IACpB,oBAAoB;IACpB,iBAAiB;IACjB,UAAU;IACV,qBAAqB;IACrB,OAAO;IACP,OAAO;IACP,0BAA0B;IAC1B,WAAW;IACX,oBAAoB;IACpB,qBAAqB;IACrB,qBAAqB;IACrB,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,MAAM;IACN,UAAU;IACV,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;CACP,CAAC;AAEX,IAAY,OAKX;AALD,WAAY,OAAO;IACjB,2CAAe,CAAA;IACf,kDAAkB,CAAA;IAClB,+CAAgB,CAAA;IAChB,yCAAa,CAAA;AACf,CAAC,EALW,OAAO,uBAAP,OAAO,QAKlB;AAED,IAAY,OASX;AATD,WAAY,OAAO;IACjB,2CAAa,CAAA;IACb,uDAAmB,CAAA;IACnB,6CAAc,CAAA;IACd,2CAAa,CAAA;IACb,qCAAU,CAAA;IACV,qCAAU,CAAA;IACV,+DAAuB,CAAA;IACvB,qDAAkB,CAAA;AACpB,CAAC,EATW,OAAO,uBAAP,OAAO,QASlB;AAED,SAAgB,gCAAgC,CAAC,IAAY;IAC3D,OAAO,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;AAC1C,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAa,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,cAAM,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,KAAK,qBAAa,GAAG,MAAM,CAAC;AAChD,CAAC","sourcesContent":["export const COOKIE = 0x2112a442;\nexport const FINGERPRINT_LENGTH = 8;\nexport const FINGERPRINT_XOR = 0x5354554e;\nexport const HEADER_LENGTH = 20;\nexport const INTEGRITY_LENGTH = 24;\nexport const IPV4_PROTOCOL = 1;\nexport const IPV6_PROTOCOL = 2;\n\nexport const RETRY_MAX = 6;\nexport const RETRY_RTO = 50;\n\nexport const AttributeKeys = [\n \"FINGERPRINT\",\n \"MESSAGE-INTEGRITY\",\n \"MESSAGE-INTEGRITY-SHA256\",\n \"CHANGE-REQUEST\",\n \"PRIORITY\",\n \"USERNAME\",\n \"USERHASH\",\n \"ICE-CONTROLLING\",\n \"SOURCE-ADDRESS\",\n \"USE-CANDIDATE\",\n \"ICE-CONTROLLED\",\n \"ERROR-CODE\",\n \"UNKNOWN-ATTRIBUTES\",\n \"XOR-MAPPED-ADDRESS\",\n \"CHANGED-ADDRESS\",\n \"LIFETIME\",\n \"REQUESTED-TRANSPORT\",\n \"NONCE\",\n \"REALM\",\n \"REQUESTED-ADDRESS-FAMILY\",\n \"EVEN-PORT\",\n \"PASSWORD-ALGORITHM\",\n \"PASSWORD-ALGORITHMS\",\n \"XOR-RELAYED-ADDRESS\",\n \"RESERVATION-TOKEN\",\n \"CHANNEL-NUMBER\",\n \"XOR-PEER-ADDRESS\",\n \"DATA\",\n \"SOFTWARE\",\n \"MAPPED-ADDRESS\",\n \"ALTERNATE-DOMAIN\",\n \"ALTERNATE-SERVER\",\n \"RESPONSE-ORIGIN\",\n \"OTHER-ADDRESS\",\n] as const;\n\nexport enum classes {\n REQUEST = 0x000,\n INDICATION = 0x010,\n RESPONSE = 0x100,\n ERROR = 0x110,\n}\n\nexport enum methods {\n BINDING = 0x1,\n SHARED_SECRET = 0x2,\n ALLOCATE = 0x3,\n REFRESH = 0x4,\n SEND = 0x6,\n DATA = 0x7,\n CREATE_PERMISSION = 0x8,\n CHANNEL_BIND = 0x9,\n}\n\nexport function isComprehensionRequiredAttribute(type: number) {\n return type >= 0x0000 && type <= 0x7fff;\n}\n\nexport function isStunMessage(data: Buffer) {\n if (data.length < HEADER_LENGTH) {\n return false;\n }\n\n if ((data[0] & 0xc0) !== 0) {\n return false;\n }\n\n if (data.readUInt32BE(4) !== COOKIE) {\n return false;\n }\n\n const length = data.readUInt16BE(2);\n if (length % 4 !== 0) {\n return false;\n }\n\n return data.length === HEADER_LENGTH + length;\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert an IPv4 / IPv6 text address to the STUN wire binary form.
|
|
3
|
+
* IPv4 → 4 bytes, IPv6 → 16 bytes (supports :: compression and IPv4-mapped).
|
|
4
|
+
*/
|
|
5
|
+
export declare function ipAddressToBuffer(address: string): Buffer;
|
|
6
|
+
/**
|
|
7
|
+
* Convert STUN address bytes (4 or 16) back to a text IP address.
|
|
8
|
+
* IPv6 uses the same zero-run compression style as the previous `ip` helper.
|
|
9
|
+
*/
|
|
10
|
+
export declare function bufferToIpAddress(buf: Buffer): string;
|
|
11
|
+
export declare function isIpV4Address(address: string): boolean;
|
|
12
|
+
export declare function isIpV6Address(address: string): boolean;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ipAddressToBuffer = ipAddressToBuffer;
|
|
4
|
+
exports.bufferToIpAddress = bufferToIpAddress;
|
|
5
|
+
exports.isIpV4Address = isIpV4Address;
|
|
6
|
+
exports.isIpV6Address = isIpV6Address;
|
|
7
|
+
const node_net_1 = require("node:net");
|
|
8
|
+
/**
|
|
9
|
+
* Convert an IPv4 / IPv6 text address to the STUN wire binary form.
|
|
10
|
+
* IPv4 → 4 bytes, IPv6 → 16 bytes (supports :: compression and IPv4-mapped).
|
|
11
|
+
*/
|
|
12
|
+
function ipAddressToBuffer(address) {
|
|
13
|
+
if ((0, node_net_1.isIPv4)(address)) {
|
|
14
|
+
const buf = Buffer.allocUnsafe(4);
|
|
15
|
+
const parts = address.split(".");
|
|
16
|
+
for (let i = 0; i < 4; i++) {
|
|
17
|
+
buf[i] = Number(parts[i]) & 0xff;
|
|
18
|
+
}
|
|
19
|
+
return buf;
|
|
20
|
+
}
|
|
21
|
+
if (!(0, node_net_1.isIPv6)(address)) {
|
|
22
|
+
throw new Error(`Invalid ip address: ${address}`);
|
|
23
|
+
}
|
|
24
|
+
const sections = address.split(":", 8);
|
|
25
|
+
for (let i = 0; i < sections.length; i++) {
|
|
26
|
+
let v4Buffer;
|
|
27
|
+
if ((0, node_net_1.isIPv4)(sections[i])) {
|
|
28
|
+
v4Buffer = ipAddressToBuffer(sections[i]);
|
|
29
|
+
sections[i] = v4Buffer.subarray(0, 2).toString("hex");
|
|
30
|
+
}
|
|
31
|
+
if (v4Buffer && ++i < 8) {
|
|
32
|
+
sections.splice(i, 0, v4Buffer.subarray(2, 4).toString("hex"));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (sections[0] === "") {
|
|
36
|
+
while (sections.length < 8)
|
|
37
|
+
sections.unshift("0");
|
|
38
|
+
}
|
|
39
|
+
else if (sections[sections.length - 1] === "") {
|
|
40
|
+
while (sections.length < 8)
|
|
41
|
+
sections.push("0");
|
|
42
|
+
}
|
|
43
|
+
else if (sections.length < 8) {
|
|
44
|
+
let emptyIndex = 0;
|
|
45
|
+
for (; emptyIndex < sections.length && sections[emptyIndex] !== ""; emptyIndex++)
|
|
46
|
+
;
|
|
47
|
+
const zeros = [];
|
|
48
|
+
for (let n = 9 - sections.length; n > 0; n--) {
|
|
49
|
+
zeros.push("0");
|
|
50
|
+
}
|
|
51
|
+
sections.splice(emptyIndex, 1, ...zeros);
|
|
52
|
+
}
|
|
53
|
+
const result = Buffer.allocUnsafe(16);
|
|
54
|
+
let offset = 0;
|
|
55
|
+
for (const section of sections) {
|
|
56
|
+
const word = Number.parseInt(section, 16) || 0;
|
|
57
|
+
result[offset++] = (word >> 8) & 0xff;
|
|
58
|
+
result[offset++] = word & 0xff;
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Convert STUN address bytes (4 or 16) back to a text IP address.
|
|
64
|
+
* IPv6 uses the same zero-run compression style as the previous `ip` helper.
|
|
65
|
+
*/
|
|
66
|
+
function bufferToIpAddress(buf) {
|
|
67
|
+
if (buf.length === 4) {
|
|
68
|
+
return `${buf[0]}.${buf[1]}.${buf[2]}.${buf[3]}`;
|
|
69
|
+
}
|
|
70
|
+
if (buf.length !== 16) {
|
|
71
|
+
throw new Error(`Invalid ip address buffer length: ${buf.length}`);
|
|
72
|
+
}
|
|
73
|
+
const hextets = [];
|
|
74
|
+
for (let i = 0; i < 16; i += 2) {
|
|
75
|
+
hextets.push(buf.readUInt16BE(i).toString(16));
|
|
76
|
+
}
|
|
77
|
+
let result = hextets.join(":");
|
|
78
|
+
result = result.replace(/(^|:)0(:0)*:0(:|$)/, "$1::$3");
|
|
79
|
+
result = result.replace(/:{3,4}/, "::");
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
function isIpV4Address(address) {
|
|
83
|
+
return (0, node_net_1.isIPv4)(address);
|
|
84
|
+
}
|
|
85
|
+
function isIpV6Address(address) {
|
|
86
|
+
return (0, node_net_1.isIPv6)(address);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=ip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip.js","sourceRoot":"","sources":["../../../../../ice-server/src/stun/ip.ts"],"names":[],"mappings":";;AAMA,8CAoDC;AAMD,8CAiBC;AAED,sCAEC;AAED,sCAEC;AAzFD,uCAA0C;AAE1C;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,IAAI,IAAA,iBAAM,EAAC,OAAO,CAAC,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC,IAAA,iBAAM,EAAC,OAAO,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,QAA4B,CAAC;QACjC,IAAI,IAAA,iBAAM,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,QAAQ,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,OAEE,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,EAC3D,UAAU,EAAE;YACb,CAAC;QACF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QACtC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,GAAW;IAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAA,iBAAM,EAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAA,iBAAM,EAAC,OAAO,CAAC,CAAC;AACzB,CAAC","sourcesContent":["import { isIPv4, isIPv6 } from \"node:net\";\n\n/**\n * Convert an IPv4 / IPv6 text address to the STUN wire binary form.\n * IPv4 → 4 bytes, IPv6 → 16 bytes (supports :: compression and IPv4-mapped).\n */\nexport function ipAddressToBuffer(address: string): Buffer {\n if (isIPv4(address)) {\n const buf = Buffer.allocUnsafe(4);\n const parts = address.split(\".\");\n for (let i = 0; i < 4; i++) {\n buf[i] = Number(parts[i]) & 0xff;\n }\n return buf;\n }\n\n if (!isIPv6(address)) {\n throw new Error(`Invalid ip address: ${address}`);\n }\n\n const sections = address.split(\":\", 8);\n for (let i = 0; i < sections.length; i++) {\n let v4Buffer: Buffer | undefined;\n if (isIPv4(sections[i])) {\n v4Buffer = ipAddressToBuffer(sections[i]);\n sections[i] = v4Buffer.subarray(0, 2).toString(\"hex\");\n }\n if (v4Buffer && ++i < 8) {\n sections.splice(i, 0, v4Buffer.subarray(2, 4).toString(\"hex\"));\n }\n }\n\n if (sections[0] === \"\") {\n while (sections.length < 8) sections.unshift(\"0\");\n } else if (sections[sections.length - 1] === \"\") {\n while (sections.length < 8) sections.push(\"0\");\n } else if (sections.length < 8) {\n let emptyIndex = 0;\n for (\n ;\n emptyIndex < sections.length && sections[emptyIndex] !== \"\";\n emptyIndex++\n );\n const zeros: string[] = [];\n for (let n = 9 - sections.length; n > 0; n--) {\n zeros.push(\"0\");\n }\n sections.splice(emptyIndex, 1, ...zeros);\n }\n\n const result = Buffer.allocUnsafe(16);\n let offset = 0;\n for (const section of sections) {\n const word = Number.parseInt(section, 16) || 0;\n result[offset++] = (word >> 8) & 0xff;\n result[offset++] = word & 0xff;\n }\n return result;\n}\n\n/**\n * Convert STUN address bytes (4 or 16) back to a text IP address.\n * IPv6 uses the same zero-run compression style as the previous `ip` helper.\n */\nexport function bufferToIpAddress(buf: Buffer): string {\n if (buf.length === 4) {\n return `${buf[0]}.${buf[1]}.${buf[2]}.${buf[3]}`;\n }\n\n if (buf.length !== 16) {\n throw new Error(`Invalid ip address buffer length: ${buf.length}`);\n }\n\n const hextets: string[] = [];\n for (let i = 0; i < 16; i += 2) {\n hextets.push(buf.readUInt16BE(i).toString(16));\n }\n let result = hextets.join(\":\");\n result = result.replace(/(^|:)0(:0)*:0(:|$)/, \"$1::$3\");\n result = result.replace(/:{3,4}/, \"::\");\n return result;\n}\n\nexport function isIpV4Address(address: string): boolean {\n return isIPv4(address);\n}\n\nexport function isIpV6Address(address: string): boolean {\n return isIPv6(address);\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type AttributePair, AttributeRepository, type RawAttribute } from "./attributes";
|
|
2
|
+
import { type classes, type methods } from "./const";
|
|
3
|
+
export declare function parseMessage(data: Buffer, integrityKey?: Buffer): Message | undefined;
|
|
4
|
+
export declare class Message extends AttributeRepository {
|
|
5
|
+
messageMethod: methods;
|
|
6
|
+
messageClass: classes;
|
|
7
|
+
transactionId: Buffer;
|
|
8
|
+
rawAttributes: RawAttribute[];
|
|
9
|
+
constructor(messageMethod: methods, messageClass: classes, transactionId?: Buffer, attributes?: AttributePair[], rawAttributes?: RawAttribute[]);
|
|
10
|
+
toJSON(): {
|
|
11
|
+
messageMethod: methods;
|
|
12
|
+
messageClass: classes;
|
|
13
|
+
attributes: AttributePair[];
|
|
14
|
+
rawAttributes: {
|
|
15
|
+
type: number;
|
|
16
|
+
length: number;
|
|
17
|
+
}[];
|
|
18
|
+
};
|
|
19
|
+
get json(): {
|
|
20
|
+
messageMethod: methods;
|
|
21
|
+
messageClass: classes;
|
|
22
|
+
attributes: AttributePair[];
|
|
23
|
+
rawAttributes: {
|
|
24
|
+
type: number;
|
|
25
|
+
length: number;
|
|
26
|
+
}[];
|
|
27
|
+
};
|
|
28
|
+
get transactionIdHex(): string;
|
|
29
|
+
appendRawAttribute(type: number, value: Buffer): this;
|
|
30
|
+
get unknownAttributeTypes(): number[];
|
|
31
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
32
|
+
addMessageIntegrity(key: Buffer): this;
|
|
33
|
+
messageIntegrity(key: Buffer): Buffer<ArrayBuffer>;
|
|
34
|
+
addFingerprint(): this;
|
|
35
|
+
private get serializedAttributes();
|
|
36
|
+
}
|
|
37
|
+
export declare function paddingLength(length: number): number;
|