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.
Files changed (169) hide show
  1. package/README.md +46 -0
  2. package/lib/common/src/binary.js +2 -3
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/common/src/transport.d.ts +22 -9
  5. package/lib/common/src/transport.js +152 -25
  6. package/lib/common/src/transport.js.map +1 -1
  7. package/lib/ice/src/candidate.d.ts +16 -1
  8. package/lib/ice/src/candidate.js +99 -15
  9. package/lib/ice/src/candidate.js.map +1 -1
  10. package/lib/ice/src/ice.d.ts +2 -0
  11. package/lib/ice/src/ice.js +175 -50
  12. package/lib/ice/src/ice.js.map +1 -1
  13. package/lib/ice/src/iceBase.d.ts +23 -2
  14. package/lib/ice/src/iceBase.js +63 -1
  15. package/lib/ice/src/iceBase.js.map +1 -1
  16. package/lib/ice/src/index.d.ts +2 -0
  17. package/lib/ice/src/index.js +2 -0
  18. package/lib/ice/src/index.js.map +1 -1
  19. package/lib/ice/src/internal/selectAddresses.d.ts +9 -0
  20. package/lib/ice/src/internal/selectAddresses.js +40 -0
  21. package/lib/ice/src/internal/selectAddresses.js.map +1 -0
  22. package/lib/ice/src/stun/const.d.ts +1 -26
  23. package/lib/ice/src/stun/const.js +15 -54
  24. package/lib/ice/src/stun/const.js.map +1 -1
  25. package/lib/ice/src/stun/message.d.ts +1 -25
  26. package/lib/ice/src/stun/message.js +15 -149
  27. package/lib/ice/src/stun/message.js.map +1 -1
  28. package/lib/ice/src/stun/protocol.d.ts +1 -1
  29. package/lib/ice/src/stun/protocol.js +2 -2
  30. package/lib/ice/src/stun/protocol.js.map +1 -1
  31. package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
  32. package/lib/ice/src/stun/tcpFrame.js +26 -0
  33. package/lib/ice/src/stun/tcpFrame.js.map +1 -0
  34. package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
  35. package/lib/ice/src/stun/tcpProtocol.js +326 -0
  36. package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
  37. package/lib/ice/src/stun/transaction.d.ts +2 -1
  38. package/lib/ice/src/stun/transaction.js +9 -3
  39. package/lib/ice/src/stun/transaction.js.map +1 -1
  40. package/lib/ice/src/turn/frame.d.ts +1 -0
  41. package/lib/ice/src/turn/frame.js +18 -0
  42. package/lib/ice/src/turn/frame.js.map +1 -0
  43. package/lib/ice/src/turn/protocol.d.ts +9 -7
  44. package/lib/ice/src/turn/protocol.js +32 -44
  45. package/lib/ice/src/turn/protocol.js.map +1 -1
  46. package/lib/ice/src/types/model.d.ts +1 -1
  47. package/lib/ice/src/types/model.js.map +1 -1
  48. package/lib/ice/src/utils.js +2 -31
  49. package/lib/ice/src/utils.js.map +1 -1
  50. package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
  51. package/lib/{ice → ice-server}/src/stun/attributes.js +69 -66
  52. package/lib/ice-server/src/stun/attributes.js.map +1 -0
  53. package/lib/ice-server/src/stun/const.d.ts +28 -0
  54. package/lib/ice-server/src/stun/const.js +88 -0
  55. package/lib/ice-server/src/stun/const.js.map +1 -0
  56. package/lib/ice-server/src/stun/ip.d.ts +12 -0
  57. package/lib/ice-server/src/stun/ip.js +88 -0
  58. package/lib/ice-server/src/stun/ip.js.map +1 -0
  59. package/lib/ice-server/src/stun/message.d.ts +37 -0
  60. package/lib/ice-server/src/stun/message.js +190 -0
  61. package/lib/ice-server/src/stun/message.js.map +1 -0
  62. package/lib/ice-server/src/turn/auth.d.ts +1 -0
  63. package/lib/ice-server/src/turn/auth.js +10 -0
  64. package/lib/ice-server/src/turn/auth.js.map +1 -0
  65. package/lib/ice-server/src/turn/frame.d.ts +13 -0
  66. package/lib/ice-server/src/turn/frame.js +69 -0
  67. package/lib/ice-server/src/turn/frame.js.map +1 -0
  68. package/lib/index.mjs +2866 -946
  69. package/lib/nonstandard/index.mjs +1872 -455
  70. package/lib/rtp/src/codec/av1.js +11 -5
  71. package/lib/rtp/src/codec/av1.js.map +1 -1
  72. package/lib/rtp/src/codec/leb128.d.ts +5 -0
  73. package/lib/rtp/src/codec/leb128.js +24 -0
  74. package/lib/rtp/src/codec/leb128.js.map +1 -0
  75. package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
  76. package/lib/rtp/src/extra/container/mp4/container.js +258 -173
  77. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  78. package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
  79. package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
  80. package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
  81. package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
  82. package/lib/rtp/src/extra/processor/mp4.js +115 -60
  83. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  84. package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
  85. package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
  86. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  87. package/lib/rtp/src/rtp/rtx.js +4 -6
  88. package/lib/rtp/src/rtp/rtx.js.map +1 -1
  89. package/lib/rtp/src/srtp/context/context.d.ts +2 -0
  90. package/lib/rtp/src/srtp/context/context.js +12 -12
  91. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  92. package/lib/sctp/src/param.js +31 -15
  93. package/lib/sctp/src/param.js.map +1 -1
  94. package/lib/sctp/src/sctp.js +10 -9
  95. package/lib/sctp/src/sctp.js.map +1 -1
  96. package/lib/webrtc/src/dataChannel.d.ts +3 -2
  97. package/lib/webrtc/src/dataChannel.js +9 -2
  98. package/lib/webrtc/src/dataChannel.js.map +1 -1
  99. package/lib/webrtc/src/errors.d.ts +3 -0
  100. package/lib/webrtc/src/errors.js +11 -0
  101. package/lib/webrtc/src/errors.js.map +1 -0
  102. package/lib/webrtc/src/helper.d.ts +5 -1
  103. package/lib/webrtc/src/helper.js +33 -1
  104. package/lib/webrtc/src/helper.js.map +1 -1
  105. package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
  106. package/lib/webrtc/src/media/receiver/statistics.js +22 -0
  107. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  108. package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
  109. package/lib/webrtc/src/media/rtpReceiver.js +135 -20
  110. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  111. package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
  112. package/lib/webrtc/src/media/rtpSender.js +179 -31
  113. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  114. package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
  115. package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
  116. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  117. package/lib/webrtc/src/media/stats.d.ts +15 -1
  118. package/lib/webrtc/src/media/stats.js +55 -1
  119. package/lib/webrtc/src/media/stats.js.map +1 -1
  120. package/lib/webrtc/src/media/track.d.ts +2 -1
  121. package/lib/webrtc/src/media/track.js +7 -1
  122. package/lib/webrtc/src/media/track.js.map +1 -1
  123. package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
  124. package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
  125. package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
  126. package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
  127. package/lib/webrtc/src/nonstandard/navigator.js +96 -32
  128. package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
  129. package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
  130. package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
  131. package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
  132. package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
  133. package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
  134. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  135. package/lib/webrtc/src/peerConnection.d.ts +183 -50
  136. package/lib/webrtc/src/peerConnection.js +458 -109
  137. package/lib/webrtc/src/peerConnection.js.map +1 -1
  138. package/lib/webrtc/src/sctpManager.d.ts +1 -1
  139. package/lib/webrtc/src/sctpManager.js +27 -7
  140. package/lib/webrtc/src/sctpManager.js.map +1 -1
  141. package/lib/webrtc/src/sdp.d.ts +10 -7
  142. package/lib/webrtc/src/sdp.js +40 -44
  143. package/lib/webrtc/src/sdp.js.map +1 -1
  144. package/lib/webrtc/src/sdpManager.d.ts +4 -3
  145. package/lib/webrtc/src/sdpManager.js +50 -27
  146. package/lib/webrtc/src/sdpManager.js.map +1 -1
  147. package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
  148. package/lib/webrtc/src/secureTransportManager.js +100 -22
  149. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  150. package/lib/webrtc/src/transceiverManager.d.ts +5 -4
  151. package/lib/webrtc/src/transceiverManager.js +61 -62
  152. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  153. package/lib/webrtc/src/transport/dtls.d.ts +15 -4
  154. package/lib/webrtc/src/transport/dtls.js +91 -23
  155. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  156. package/lib/webrtc/src/transport/ice.d.ts +21 -3
  157. package/lib/webrtc/src/transport/ice.js +159 -30
  158. package/lib/webrtc/src/transport/ice.js.map +1 -1
  159. package/lib/webrtc/src/transport/sctp.d.ts +1 -0
  160. package/lib/webrtc/src/transport/sctp.js +26 -22
  161. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  162. package/lib/webrtc/src/utils.d.ts +12 -4
  163. package/lib/webrtc/src/utils.js +118 -16
  164. package/lib/webrtc/src/utils.js.map +1 -1
  165. package/package.json +7 -10
  166. package/lib/ice/src/stun/attributes.js.map +0 -1
  167. package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
  168. package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
  169. 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.default.isV4Format(address) ? const_1.IPV4_PROTOCOL : const_1.IPV6_PROTOCOL;
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.default.toBuffer(address)]);
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 != 4)
73
- throw new Error(`STUN address has invalid length for IPv4`);
74
- return [ip_1.default.toString(address), port];
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 != 16)
44
+ if (address.length !== 16) {
77
45
  throw new Error("STUN address has invalid length for IPv6");
78
- return [ip_1.default.toString(address), port];
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 encode = Buffer.from(value[1], "utf8");
106
- return Buffer.concat([buffer, encode]);
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
- return new Int64.Int64BE(value.toString()).toBuffer();
125
- };
126
- const unpackUnsigned64 = (data) => {
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 = (value) => Buffer.from([]);
135
- const unpackNone = (data) => null;
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
- [0x8022, "SOFTWARE", packString, unpackString],
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 exist = this.attributes.find((a) => a[0] === key);
176
- if (exist) {
177
- exist[1] = value;
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((a) => a[0] === key);
186
- if (!attribute) {
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((a) => a[0]);
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":"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","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;