werift 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/lib/common/src/event.d.ts +45 -0
  2. package/lib/common/src/event.js +229 -0
  3. package/lib/common/src/event.js.map +1 -0
  4. package/lib/common/src/index.d.ts +1 -0
  5. package/lib/common/src/index.js +1 -0
  6. package/lib/common/src/index.js.map +1 -1
  7. package/lib/dtls/src/flight/client/flight5.js +6 -1
  8. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  9. package/lib/dtls/src/flight/server/flight2.js +5 -3
  10. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  11. package/lib/dtls/src/imports/common.d.ts +1 -0
  12. package/lib/dtls/src/imports/common.js +18 -0
  13. package/lib/dtls/src/imports/common.js.map +1 -0
  14. package/lib/dtls/src/index.d.ts +1 -1
  15. package/lib/dtls/src/index.js.map +1 -1
  16. package/lib/dtls/src/record/receive.js +1 -1
  17. package/lib/dtls/src/record/receive.js.map +1 -1
  18. package/lib/dtls/src/socket.d.ts +1 -1
  19. package/lib/dtls/src/socket.js +5 -5
  20. package/lib/dtls/src/socket.js.map +1 -1
  21. package/lib/ice/src/candidate.d.ts +3 -2
  22. package/lib/ice/src/candidate.js +19 -5
  23. package/lib/ice/src/candidate.js.map +1 -1
  24. package/lib/ice/src/helper.d.ts +6 -6
  25. package/lib/ice/src/helper.js +20 -17
  26. package/lib/ice/src/helper.js.map +1 -1
  27. package/lib/ice/src/ice.d.ts +29 -71
  28. package/lib/ice/src/ice.js +417 -417
  29. package/lib/ice/src/ice.js.map +1 -1
  30. package/lib/ice/src/iceBase.d.ts +109 -0
  31. package/lib/ice/src/iceBase.js +166 -0
  32. package/lib/ice/src/iceBase.js.map +1 -0
  33. package/lib/ice/src/imports/common.d.ts +1 -0
  34. package/lib/ice/src/imports/common.js +18 -0
  35. package/lib/ice/src/imports/common.js.map +1 -0
  36. package/lib/ice/src/index.d.ts +5 -0
  37. package/lib/ice/src/index.js +5 -0
  38. package/lib/ice/src/index.js.map +1 -1
  39. package/lib/ice/src/stun/message.d.ts +7 -0
  40. package/lib/ice/src/stun/message.js +20 -6
  41. package/lib/ice/src/stun/message.js.map +1 -1
  42. package/lib/ice/src/stun/protocol.d.ts +6 -6
  43. package/lib/ice/src/stun/protocol.js +29 -23
  44. package/lib/ice/src/stun/protocol.js.map +1 -1
  45. package/lib/ice/src/stun/transaction.js +10 -4
  46. package/lib/ice/src/stun/transaction.js.map +1 -1
  47. package/lib/ice/src/transport.d.ts +21 -4
  48. package/lib/ice/src/transport.js +115 -7
  49. package/lib/ice/src/transport.js.map +1 -1
  50. package/lib/ice/src/turn/protocol.d.ts +54 -37
  51. package/lib/ice/src/turn/protocol.js +219 -94
  52. package/lib/ice/src/turn/protocol.js.map +1 -1
  53. package/lib/ice/src/types/model.d.ts +9 -5
  54. package/lib/ice/src/types/model.js.map +1 -1
  55. package/lib/ice/src/utils.d.ts +1 -0
  56. package/lib/ice/src/utils.js +15 -16
  57. package/lib/ice/src/utils.js.map +1 -1
  58. package/lib/rtp/src/extra/container/mp4/container.d.ts +1 -1
  59. package/lib/rtp/src/extra/container/mp4/container.js +2 -5
  60. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  61. package/lib/rtp/src/extra/container/webm/container.d.ts +3 -1
  62. package/lib/rtp/src/extra/container/webm/container.js +8 -2
  63. package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
  64. package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +6 -0
  65. package/lib/rtp/src/extra/container/webm/ebml/id.js +6 -0
  66. package/lib/rtp/src/extra/container/webm/ebml/id.js.map +1 -1
  67. package/lib/rtp/src/extra/processor/depacketizer.d.ts +1 -1
  68. package/lib/rtp/src/extra/processor/depacketizer.js +2 -2
  69. package/lib/rtp/src/extra/processor/depacketizer.js.map +1 -1
  70. package/lib/rtp/src/extra/processor/mp4.d.ts +1 -1
  71. package/lib/rtp/src/extra/processor/mp4.js +2 -5
  72. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  73. package/lib/rtp/src/extra/processor/nack.d.ts +1 -1
  74. package/lib/rtp/src/extra/processor/nack.js +3 -3
  75. package/lib/rtp/src/extra/processor/nack.js.map +1 -1
  76. package/lib/rtp/src/extra/processor/rtcpCallback.d.ts +1 -1
  77. package/lib/rtp/src/extra/processor/rtcpCallback.js +2 -5
  78. package/lib/rtp/src/extra/processor/rtcpCallback.js.map +1 -1
  79. package/lib/rtp/src/extra/processor/rtpCallback.d.ts +1 -1
  80. package/lib/rtp/src/extra/processor/rtpCallback.js +2 -5
  81. package/lib/rtp/src/extra/processor/rtpCallback.js.map +1 -1
  82. package/lib/rtp/src/extra/processor/webm.d.ts +12 -17
  83. package/lib/rtp/src/extra/processor/webm.js +2 -5
  84. package/lib/rtp/src/extra/processor/webm.js.map +1 -1
  85. package/lib/rtp/src/extra/processor/webmCallback.d.ts +1 -10
  86. package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
  87. package/lib/rtp/src/imports/common.d.ts +1 -0
  88. package/lib/rtp/src/imports/common.js +18 -0
  89. package/lib/rtp/src/imports/common.js.map +1 -0
  90. package/lib/rtp/src/rtp/headerExtension.d.ts +45 -3
  91. package/lib/rtp/src/rtp/headerExtension.js +15 -0
  92. package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
  93. package/lib/sctp/src/helper.js +2 -5
  94. package/lib/sctp/src/helper.js.map +1 -1
  95. package/lib/sctp/src/imports/common.d.ts +1 -0
  96. package/lib/sctp/src/imports/common.js +18 -0
  97. package/lib/sctp/src/imports/common.js.map +1 -0
  98. package/lib/sctp/src/index.d.ts +1 -1
  99. package/lib/sctp/src/index.js.map +1 -1
  100. package/lib/sctp/src/sctp.d.ts +1 -1
  101. package/lib/sctp/src/sctp.js +3 -3
  102. package/lib/sctp/src/sctp.js.map +1 -1
  103. package/lib/webrtc/src/const.d.ts +2 -2
  104. package/lib/webrtc/src/const.js.map +1 -1
  105. package/lib/webrtc/src/dataChannel.d.ts +1 -1
  106. package/lib/webrtc/src/dataChannel.js +5 -5
  107. package/lib/webrtc/src/dataChannel.js.map +1 -1
  108. package/lib/webrtc/src/imports/common.d.ts +1 -0
  109. package/lib/webrtc/src/imports/common.js +18 -0
  110. package/lib/webrtc/src/imports/common.js.map +1 -0
  111. package/lib/webrtc/src/media/extension/rtpExtension.d.ts +1 -0
  112. package/lib/webrtc/src/media/extension/rtpExtension.js +6 -0
  113. package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
  114. package/lib/webrtc/src/media/receiver/nack.d.ts +1 -1
  115. package/lib/webrtc/src/media/receiver/nack.js +2 -2
  116. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  117. package/lib/webrtc/src/media/router.d.ts +0 -3
  118. package/lib/webrtc/src/media/router.js.map +1 -1
  119. package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -4
  120. package/lib/webrtc/src/media/rtpReceiver.js +4 -7
  121. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  122. package/lib/webrtc/src/media/rtpSender.d.ts +1 -1
  123. package/lib/webrtc/src/media/rtpSender.js +5 -5
  124. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  125. package/lib/webrtc/src/media/rtpTransceiver.d.ts +1 -1
  126. package/lib/webrtc/src/media/rtpTransceiver.js +2 -5
  127. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  128. package/lib/webrtc/src/media/sender/senderBWE.d.ts +1 -1
  129. package/lib/webrtc/src/media/sender/senderBWE.js +4 -7
  130. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  131. package/lib/webrtc/src/media/track.d.ts +3 -3
  132. package/lib/webrtc/src/media/track.js +4 -7
  133. package/lib/webrtc/src/media/track.js.map +1 -1
  134. package/lib/webrtc/src/nonstandard/recorder/index.d.ts +3 -1
  135. package/lib/webrtc/src/nonstandard/recorder/index.js +2 -5
  136. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  137. package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
  138. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  139. package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +1 -1
  140. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +3 -2
  141. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  142. package/lib/webrtc/src/peerConnection.d.ts +15 -8
  143. package/lib/webrtc/src/peerConnection.js +107 -93
  144. package/lib/webrtc/src/peerConnection.js.map +1 -1
  145. package/lib/webrtc/src/sdp.js +15 -3
  146. package/lib/webrtc/src/sdp.js.map +1 -1
  147. package/lib/webrtc/src/transport/dtls.d.ts +6 -6
  148. package/lib/webrtc/src/transport/dtls.js +19 -26
  149. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  150. package/lib/webrtc/src/transport/ice.d.ts +22 -11
  151. package/lib/webrtc/src/transport/ice.js +106 -38
  152. package/lib/webrtc/src/transport/ice.js.map +1 -1
  153. package/lib/webrtc/src/transport/sctp.d.ts +1 -1
  154. package/lib/webrtc/src/transport/sctp.js +2 -2
  155. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  156. package/package.json +1 -1
  157. package/src/const.ts +2 -2
  158. package/src/dataChannel.ts +1 -1
  159. package/src/imports/common.ts +1 -0
  160. package/src/media/extension/rtpExtension.ts +6 -0
  161. package/src/media/receiver/nack.ts +1 -1
  162. package/src/media/router.ts +2 -3
  163. package/src/media/rtpReceiver.ts +5 -4
  164. package/src/media/rtpSender.ts +1 -1
  165. package/src/media/rtpTransceiver.ts +1 -1
  166. package/src/media/sender/senderBWE.ts +1 -1
  167. package/src/media/track.ts +9 -4
  168. package/src/nonstandard/recorder/index.ts +4 -1
  169. package/src/nonstandard/recorder/writer/index.ts +1 -1
  170. package/src/nonstandard/recorder/writer/webm.ts +48 -44
  171. package/src/peerConnection.ts +122 -89
  172. package/src/sdp.ts +16 -3
  173. package/src/transport/dtls.ts +22 -14
  174. package/src/transport/ice.ts +83 -31
  175. package/src/transport/sctp.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../ice/src/imports/common.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC","sourcesContent":["export * from \"../../../common/src\";\n"]}
@@ -1,6 +1,11 @@
1
1
  export { randomPort } from "../../common/src";
2
+ export * from "./transport";
3
+ export * from "./stun/const";
4
+ export * from "./stun/message";
5
+ export * from "./stun/protocol";
2
6
  export * from "./turn/protocol";
3
7
  export * from "./candidate";
4
8
  export * from "./ice";
5
9
  export * from "./types/model";
6
10
  export * from "./utils";
11
+ export * from "./iceBase";
@@ -17,9 +17,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.randomPort = void 0;
18
18
  var src_1 = require("../../common/src");
19
19
  Object.defineProperty(exports, "randomPort", { enumerable: true, get: function () { return src_1.randomPort; } });
20
+ __exportStar(require("./transport"), exports);
21
+ __exportStar(require("./stun/const"), exports);
22
+ __exportStar(require("./stun/message"), exports);
23
+ __exportStar(require("./stun/protocol"), exports);
20
24
  __exportStar(require("./turn/protocol"), exports);
21
25
  __exportStar(require("./candidate"), exports);
22
26
  __exportStar(require("./ice"), exports);
23
27
  __exportStar(require("./types/model"), exports);
24
28
  __exportStar(require("./utils"), exports);
29
+ __exportStar(require("./iceBase"), exports);
25
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../ice/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wCAA8C;AAArC,iGAAA,UAAU,OAAA;AAEnB,kDAAgC;AAChC,8CAA4B;AAC5B,wCAAsB;AACtB,gDAA8B;AAC9B,0CAAwB","sourcesContent":["export { randomPort } from \"../../common/src\";\n\nexport * from \"./turn/protocol\";\nexport * from \"./candidate\";\nexport * from \"./ice\";\nexport * from \"./types/model\";\nexport * from \"./utils\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../ice/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wCAA8C;AAArC,iGAAA,UAAU,OAAA;AACnB,8CAA4B;AAC5B,+CAA6B;AAC7B,iDAA+B;AAC/B,kDAAgC;AAChC,kDAAgC;AAChC,8CAA4B;AAC5B,wCAAsB;AACtB,gDAA8B;AAC9B,0CAAwB;AACxB,4CAA0B","sourcesContent":["export { randomPort } from \"../../common/src\";\nexport * from \"./transport\";\nexport * from \"./stun/const\";\nexport * from \"./stun/message\";\nexport * from \"./stun/protocol\";\nexport * from \"./turn/protocol\";\nexport * from \"./candidate\";\nexport * from \"./ice\";\nexport * from \"./types/model\";\nexport * from \"./utils\";\nexport * from \"./iceBase\";\n"]}
@@ -9,6 +9,12 @@ export declare class Message extends AttributeRepository {
9
9
  toJSON(): {
10
10
  messageMethod: string;
11
11
  messageClass: string;
12
+ attributes: AttributePair[];
13
+ };
14
+ get json(): {
15
+ messageMethod: string;
16
+ messageClass: string;
17
+ attributes: AttributePair[];
12
18
  };
13
19
  get transactionIdHex(): string;
14
20
  get bytes(): Buffer;
@@ -16,3 +22,4 @@ export declare class Message extends AttributeRepository {
16
22
  messageIntegrity(key: Buffer): Buffer;
17
23
  addFingerprint(): void;
18
24
  }
25
+ export declare function paddingLength(length: number): number;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Message = void 0;
7
7
  exports.parseMessage = parseMessage;
8
+ exports.paddingLength = paddingLength;
8
9
  const crypto_1 = require("crypto");
9
10
  const jspack_1 = require("@shinyoshiaki/jspack");
10
11
  const buffer_crc32_1 = __importDefault(require("buffer-crc32"));
@@ -15,16 +16,16 @@ function parseMessage(data, integrityKey) {
15
16
  if (data.length < const_1.HEADER_LENGTH) {
16
17
  return undefined;
17
18
  }
18
- const [messageType, length] = jspack_1.jspack.Unpack("!HHI", data.slice(0, const_1.HEADER_LENGTH));
19
- const transactionId = Buffer.from(data.slice(const_1.HEADER_LENGTH - 12, const_1.HEADER_LENGTH));
19
+ const [messageType, length] = jspack_1.jspack.Unpack("!HHI", data.subarray(0, const_1.HEADER_LENGTH));
20
+ const transactionId = Buffer.from(data.subarray(const_1.HEADER_LENGTH - 12, const_1.HEADER_LENGTH));
20
21
  if (data.length !== const_1.HEADER_LENGTH + length) {
21
22
  return undefined;
22
23
  }
23
24
  const attributeRepository = new attributes_1.AttributeRepository();
24
25
  for (let pos = const_1.HEADER_LENGTH; pos <= data.length - 4;) {
25
- const [attrType, attrLen] = jspack_1.jspack.Unpack("!HH", data.slice(pos, pos + 4));
26
- const payload = data.slice(pos + 4, pos + 4 + attrLen);
27
- const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;
26
+ const [attrType, attrLen] = jspack_1.jspack.Unpack("!HH", data.subarray(pos, pos + 4));
27
+ const payload = data.subarray(pos + 4, pos + 4 + attrLen);
28
+ const padLen = paddingLength(attrLen);
28
29
  const attributesTypes = Object.keys(attributes_1.ATTRIBUTES_BY_TYPE);
29
30
  if (attributesTypes.includes(attrType.toString())) {
30
31
  const [, attrName, , attrUnpack] = attributes_1.ATTRIBUTES_BY_TYPE[attrType];
@@ -80,9 +81,13 @@ class Message extends attributes_1.AttributeRepository {
80
81
  });
81
82
  }
82
83
  toJSON() {
84
+ return this.json;
85
+ }
86
+ get json() {
83
87
  return {
84
88
  messageMethod: const_1.methods[this.messageMethod],
85
89
  messageClass: const_1.classes[this.messageClass],
90
+ attributes: this.attributes,
86
91
  };
87
92
  }
88
93
  get transactionIdHex() {
@@ -97,7 +102,7 @@ class Message extends attributes_1.AttributeRepository {
97
102
  ? attrPack(attrValue, this.transactionId)
98
103
  : attrPack(attrValue);
99
104
  const attrLen = v.length;
100
- const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;
105
+ const padLen = paddingLength(attrLen);
101
106
  data = Buffer.concat([
102
107
  data,
103
108
  Buffer.from(jspack_1.jspack.Pack("!HH", [attrType, attrLen])),
@@ -144,4 +149,13 @@ function messageIntegrity(data, key) {
144
149
  const checkData = setBodyLength(data, data.length - const_1.HEADER_LENGTH + const_1.INTEGRITY_LENGTH);
145
150
  return Buffer.from((0, crypto_1.createHmac)("sha1", key).update(checkData).digest("hex"), "hex");
146
151
  }
152
+ function paddingLength(length) {
153
+ const rest = length % 4;
154
+ if (rest === 0) {
155
+ return 0;
156
+ }
157
+ else {
158
+ return 4 - rest;
159
+ }
160
+ }
147
161
  //# sourceMappingURL=message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../ice/src/stun/message.ts"],"names":[],"mappings":";;;;;;AAwBA,oCAsEC;AA9FD,mCAAoC;AACpC,iDAA8C;AAC9C,gEAAiC;AAEjC,sCAA2D;AAC3D,6CAQsB;AACtB,mCAQiB;AAEjB,SAAgB,YAAY,CAC1B,IAAY,EACZ,YAAqB;IAErB,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAa,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,eAAM,CAAC,MAAM,CACzC,MAAM,EACN,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAa,CAAC,CAC7B,CAAC;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAC/B,IAAI,CAAC,KAAK,CAAC,qBAAa,GAAG,EAAE,EAAE,qBAAa,CAAC,CAC9C,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAa,GAAG,MAAM,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,gCAAmB,EAAE,CAAC;IAEtD,KAAK,IAAI,GAAG,GAAG,qBAAa,EAAE,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAI,CAAC;QACvD,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,eAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;QAC3D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,+BAAkB,CAAC,CAAC;QACxD,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,EAAE,QAAQ,EAAE,AAAD,EAAG,UAAU,CAAC,GAAG,+BAAkB,CAAC,QAAQ,CAAC,CAAC;YAChE,IAAI,UAAU,CAAC,IAAI,KAAK,6BAAgB,CAAC,IAAI,EAAE,CAAC;gBAC9C,mBAAmB,CAAC,YAAY,CAC9B,QAAwB,EACxB,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CACnC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,mBAAmB,CAAC,YAAY,CAC9B,QAAwB,EACxB,UAAU,CAAC,OAAO,CAAC,CACpB,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;gBACpE,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC3B,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;gBAC5C,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;oBACrE,MAAM,MAAM,GACV,mBAAmB,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;oBAC7D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC9B,OAAO,SAAS,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,EAAE,CAAC;IACvD,mBAAmB,CAAC,KAAK,EAAE,CAAC;IAE5B,OAAO,IAAI,OAAO,CAChB,WAAW,GAAG,MAAM,EACpB,WAAW,GAAG,MAAM,EACpB,aAAa,EACb,UAAU,CACX,CAAC;AACJ,CAAC;AAED,MAAa,OAAQ,SAAQ,gCAAmB;IAC9C,YACS,aAAsB,EACtB,YAAqB,EACrB,gBAAwB,IAAA,4BAAmB,GAAE,EACpD,aAA8B,EAAE;QAEhC,KAAK,CAAC,UAAU,CAAC,CAAC;QALlB;;;;mBAAO,aAAa;WAAS;QAC7B;;;;mBAAO,YAAY;WAAS;QAC5B;;;;mBAAO,aAAa;WAAgC;IAItD,CAAC;IAED,MAAM;QACJ,OAAO;YACL,aAAa,EAAE,eAAO,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1C,YAAY,EAAE,eAAO,CAAC,IAAI,CAAC,YAAY,CAAC;SACzC,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,KAAK;QACP,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,EAAE,AAAD,EAAG,QAAQ,CAAC,GAAG,+BAAkB,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,GACL,QAAQ,CAAC,IAAI,KAAK,2BAAc,CAAC,IAAI;gBACnC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;gBACzC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;YACzB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;YAC3D,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI;gBACJ,MAAM,CAAC,IAAI,CAAC,eAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpD,CAAC;gBACD,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CACrB,eAAM,CAAC,IAAI,CAAC,MAAM,EAAE;YAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY;YACtC,IAAI,CAAC,MAAM;YACX,cAAM;SACP,CAAC,CACH,CAAC;QAEF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,mBAAmB,CAAC,GAAW;QAC7B,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,MAAM,SAAS,GAAG,aAAa,CAC7B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,qBAAa,GAAG,wBAAgB,CACrD,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAChB,IAAA,mBAAU,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACvD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;CACF;AArED,0BAqEC;AAED,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;IACrD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KACd,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,SAAS,GAAG,aAAa,CAC7B,IAAI,EACJ,IAAI,CAAC,MAAM,GAAG,qBAAa,GAAG,0BAAkB,CACjD,CAAC;IACF,MAAM,QAAQ,GAAG,IAAA,sBAAK,EAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,YAAY,CAAC,uBAAe,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAA,kBAAS,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,GAAW;IACjD,MAAM,SAAS,GAAG,aAAa,CAC7B,IAAI,EACJ,IAAI,CAAC,MAAM,GAAG,qBAAa,GAAG,wBAAgB,CAC/C,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAChB,IAAA,mBAAU,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACvD,KAAK,CACN,CAAC;AACJ,CAAC","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.slice(0, HEADER_LENGTH),\n );\n\n const transactionId = Buffer.from(\n data.slice(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(\"!HH\", data.slice(pos, pos + 4));\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 {\n messageMethod: methods[this.messageMethod],\n messageClass: classes[this.messageClass],\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 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"]}
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,12 +1,12 @@
1
+ import { Event } from "../imports/common";
1
2
  import type { InterfaceAddresses } from "../../../common/src/network";
2
3
  import type { Candidate } from "../candidate";
3
- import type { Connection } from "../ice";
4
4
  import { UdpTransport } from "../transport";
5
5
  import type { Address, Protocol } from "../types/model";
6
6
  import { type Message } from "./message";
7
7
  import { Transaction } from "./transaction";
8
8
  export declare class StunProtocol implements Protocol {
9
- receiver: Connection;
9
+ static readonly type = "stun";
10
10
  readonly type = "stun";
11
11
  transport: UdpTransport;
12
12
  transactions: {
@@ -15,10 +15,10 @@ export declare class StunProtocol implements Protocol {
15
15
  get transactionsKeys(): string[];
16
16
  localCandidate?: Candidate;
17
17
  sentMessage?: Message;
18
- localAddress?: string;
19
- private readonly closed;
20
- constructor(receiver: Connection);
21
- connectionLost(): void;
18
+ localIp?: string;
19
+ readonly onRequestReceived: Event<[Message, readonly [string, number], Buffer]>;
20
+ readonly onDataReceived: Event<[Buffer]>;
21
+ constructor();
22
22
  connectionMade: (useIpv4: boolean, portRange?: [number, number], interfaceAddresses?: InterfaceAddresses) => Promise<void>;
23
23
  private datagramReceived;
24
24
  getExtraInfo(): Address;
@@ -5,28 +5,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.StunProtocol = void 0;
7
7
  const debug_1 = __importDefault(require("debug"));
8
- const rx_mini_1 = require("rx.mini");
8
+ const common_1 = require("../imports/common");
9
9
  const transport_1 = require("../transport");
10
10
  const const_1 = require("./const");
11
11
  const message_1 = require("./message");
12
12
  const transaction_1 = require("./transaction");
13
- const log = (0, debug_1.default)("packages/ice/src/stun/protocol.ts");
13
+ const log = (0, debug_1.default)("werift-ice : packages/ice/src/stun/protocol.ts");
14
14
  class StunProtocol {
15
15
  get transactionsKeys() {
16
16
  return Object.keys(this.transactions);
17
17
  }
18
- constructor(receiver) {
19
- Object.defineProperty(this, "receiver", {
20
- enumerable: true,
21
- configurable: true,
22
- writable: true,
23
- value: receiver
24
- });
18
+ constructor() {
25
19
  Object.defineProperty(this, "type", {
26
20
  enumerable: true,
27
21
  configurable: true,
28
22
  writable: true,
29
- value: "stun"
23
+ value: StunProtocol.type
30
24
  });
31
25
  Object.defineProperty(this, "transport", {
32
26
  enumerable: true,
@@ -52,17 +46,23 @@ class StunProtocol {
52
46
  writable: true,
53
47
  value: void 0
54
48
  });
55
- Object.defineProperty(this, "localAddress", {
49
+ Object.defineProperty(this, "localIp", {
56
50
  enumerable: true,
57
51
  configurable: true,
58
52
  writable: true,
59
53
  value: void 0
60
54
  });
61
- Object.defineProperty(this, "closed", {
55
+ Object.defineProperty(this, "onRequestReceived", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: new common_1.Event()
60
+ });
61
+ Object.defineProperty(this, "onDataReceived", {
62
62
  enumerable: true,
63
63
  configurable: true,
64
64
  writable: true,
65
- value: new rx_mini_1.Event()
65
+ value: new common_1.Event()
66
66
  });
67
67
  Object.defineProperty(this, "connectionMade", {
68
68
  enumerable: true,
@@ -75,24 +75,22 @@ class StunProtocol {
75
75
  else {
76
76
  this.transport = await transport_1.UdpTransport.init("udp6", portRange, interfaceAddresses);
77
77
  }
78
- this.transport.onData = (data, addr) => this.datagramReceived(data, addr);
78
+ this.transport.onData = (data, addr) => {
79
+ this.datagramReceived(data, addr);
80
+ };
79
81
  }
80
82
  });
81
83
  }
82
- connectionLost() {
83
- this.closed.execute();
84
- this.closed.complete();
85
- }
86
84
  datagramReceived(data, addr) {
87
85
  try {
88
- if (!this.localCandidate)
89
- throw new Error("not exist");
90
86
  const message = (0, message_1.parseMessage)(data);
91
87
  if (!message) {
92
- this.receiver.dataReceived(data, this.localCandidate.component);
88
+ if (this.localCandidate) {
89
+ this.onDataReceived.execute(data);
90
+ }
93
91
  return;
94
92
  }
95
- // log("parseMessage", addr, message);
93
+ // log("parseMessage", addr, message.toJSON());
96
94
  if ((message.messageClass === const_1.classes.RESPONSE ||
97
95
  message.messageClass === const_1.classes.ERROR) &&
98
96
  this.transactionsKeys.includes(message.transactionIdHex)) {
@@ -100,7 +98,7 @@ class StunProtocol {
100
98
  transaction.responseReceived(message, addr);
101
99
  }
102
100
  else if (message.messageClass === const_1.classes.REQUEST) {
103
- this.receiver.requestReceived(message, addr, this, data);
101
+ this.onRequestReceived.execute(message, addr, data);
104
102
  }
105
103
  }
106
104
  catch (error) {
@@ -147,7 +145,15 @@ class StunProtocol {
147
145
  transaction.cancel();
148
146
  });
149
147
  await this.transport.close();
148
+ this.onRequestReceived.complete();
149
+ this.onDataReceived.complete();
150
150
  }
151
151
  }
152
152
  exports.StunProtocol = StunProtocol;
153
+ Object.defineProperty(StunProtocol, "type", {
154
+ enumerable: true,
155
+ configurable: true,
156
+ writable: true,
157
+ value: "stun"
158
+ });
153
159
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/stun/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport type { InterfaceAddresses } from \"../../../common/src/network\";\nimport type { Candidate } from \"../candidate\";\nimport type { Connection } from \"../ice\";\nimport { UdpTransport } from \"../transport\";\nimport type { Address, Protocol } from \"../types/model\";\nimport { classes } from \"./const\";\nimport { type Message, parseMessage } from \"./message\";\nimport { Transaction } from \"./transaction\";\n\nconst log = debug(\"packages/ice/src/stun/protocol.ts\");\n\nexport class StunProtocol implements Protocol {\n readonly type = \"stun\";\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 localAddress?: string;\n\n private readonly closed = new Event();\n\n constructor(public receiver: Connection) {}\n\n connectionLost() {\n this.closed.execute();\n this.closed.complete();\n }\n\n connectionMade = async (\n useIpv4: boolean,\n portRange?: [number, number],\n interfaceAddresses?: InterfaceAddresses,\n ) => {\n if (useIpv4) {\n this.transport = await UdpTransport.init(\n \"udp4\",\n portRange,\n interfaceAddresses,\n );\n } else {\n this.transport = await UdpTransport.init(\n \"udp6\",\n portRange,\n interfaceAddresses,\n );\n }\n\n this.transport.onData = (data, addr) => this.datagramReceived(data, addr);\n };\n\n private datagramReceived(data: Buffer, addr: Address) {\n try {\n if (!this.localCandidate) throw new Error(\"not exist\");\n\n const message = parseMessage(data);\n if (!message) {\n this.receiver.dataReceived(data, this.localCandidate.component);\n return;\n }\n // log(\"parseMessage\", addr, message);\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.receiver.requestReceived(message, addr, this, 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 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 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 }\n}\n"]}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/stun/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"../imports/common\";\n\nimport type { InterfaceAddresses } from \"../../../common/src/network\";\nimport type { Candidate } from \"../candidate\";\nimport { UdpTransport } from \"../transport\";\nimport type { Address, 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(\n \"udp4\",\n portRange,\n interfaceAddresses,\n );\n } else {\n this.transport = await UdpTransport.init(\n \"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 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 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"]}
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Transaction = void 0;
7
7
  const debug_1 = __importDefault(require("debug"));
8
- const rx_mini_1 = require("rx.mini");
8
+ const common_1 = require("../imports/common");
9
9
  const exceptions_1 = require("../exceptions");
10
10
  const const_1 = require("./const");
11
11
  const log = (0, debug_1.default)("werift-ice:packages/ice/src/stun/transaction.ts");
@@ -63,7 +63,7 @@ class Transaction {
63
63
  enumerable: true,
64
64
  configurable: true,
65
65
  writable: true,
66
- value: new rx_mini_1.Event()
66
+ value: new common_1.Event()
67
67
  });
68
68
  Object.defineProperty(this, "responseReceived", {
69
69
  enumerable: true,
@@ -88,10 +88,16 @@ class Transaction {
88
88
  value: async () => {
89
89
  try {
90
90
  this.retry();
91
- return await this.onResponse.asPromise();
91
+ const res = await this.onResponse.asPromise();
92
+ return res;
92
93
  }
93
94
  catch (error) {
94
- log("transaction run failed", error, this.protocol.type, this.request.toJSON());
95
+ // log(
96
+ // "transaction run failed",
97
+ // error,
98
+ // this.protocol.type,
99
+ // this.request.toJSON(),
100
+ // );
95
101
  throw error;
96
102
  }
97
103
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../ice/src/stun/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { TransactionFailed, TransactionTimeout } from \"../exceptions\";\nimport type { Address, Protocol } from \"../types/model\";\nimport { RETRY_MAX, RETRY_RTO, classes } from \"./const\";\nimport type { Message } from \"./message\";\n\nconst log = debug(\"werift-ice:packages/ice/src/stun/transaction.ts\");\n\nexport class Transaction {\n private timeoutDelay = RETRY_RTO;\n private timeoutHandle?: any;\n private tries = 0;\n private readonly triesMax: number;\n private readonly onResponse = new Event<[Message, Address]>();\n\n constructor(\n private request: Message,\n private addr: Address,\n private protocol: Protocol,\n private retransmissions?: number,\n ) {\n this.triesMax =\n 1 + (this.retransmissions ? this.retransmissions : RETRY_MAX);\n }\n\n responseReceived = (message: Message, addr: Address) => {\n if (this.onResponse.length > 0) {\n if (message.messageClass === classes.RESPONSE) {\n this.onResponse.execute(message, addr);\n this.onResponse.complete();\n } else {\n this.onResponse.error(new TransactionFailed(message, addr));\n }\n }\n };\n\n run = async () => {\n try {\n this.retry();\n return await this.onResponse.asPromise();\n } catch (error) {\n log(\n \"transaction run failed\",\n error,\n this.protocol.type,\n this.request.toJSON(),\n );\n\n throw error;\n } finally {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n }\n }\n };\n\n private retry = () => {\n if (this.tries >= this.triesMax) {\n log(`retry failed times:${this.tries} maxLimit:${this.triesMax}`);\n this.onResponse.error(new TransactionTimeout());\n return;\n }\n this.protocol.sendStun(this.request, this.addr).catch((e) => {\n log(\"send stun failed\", e);\n });\n this.timeoutHandle = setTimeout(this.retry, this.timeoutDelay);\n this.timeoutDelay *= 2;\n this.tries++;\n };\n\n cancel() {\n if (this.timeoutHandle) clearTimeout(this.timeoutHandle);\n }\n}\n"]}
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../ice/src/stun/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"../imports/common\";\n\nimport { TransactionFailed, TransactionTimeout } from \"../exceptions\";\nimport type { Address, Protocol } from \"../types/model\";\nimport { RETRY_MAX, RETRY_RTO, classes } from \"./const\";\nimport type { Message } from \"./message\";\n\nconst log = debug(\"werift-ice:packages/ice/src/stun/transaction.ts\");\n\nexport class Transaction {\n private timeoutDelay = RETRY_RTO;\n private timeoutHandle?: any;\n private tries = 0;\n private readonly triesMax: number;\n private readonly onResponse = new Event<[Message, Address]>();\n\n constructor(\n private request: Message,\n private addr: Address,\n private protocol: Protocol,\n private retransmissions?: number,\n ) {\n this.triesMax =\n 1 + (this.retransmissions ? this.retransmissions : RETRY_MAX);\n }\n\n responseReceived = (message: Message, addr: Address) => {\n if (this.onResponse.length > 0) {\n if (message.messageClass === classes.RESPONSE) {\n this.onResponse.execute(message, addr);\n this.onResponse.complete();\n } else {\n this.onResponse.error(new TransactionFailed(message, addr));\n }\n }\n };\n\n run = async () => {\n try {\n this.retry();\n const res = await this.onResponse.asPromise();\n return res;\n } catch (error) {\n // log(\n // \"transaction run failed\",\n // error,\n // this.protocol.type,\n // this.request.toJSON(),\n // );\n\n throw error;\n } finally {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n }\n }\n };\n\n private retry = () => {\n if (this.tries >= this.triesMax) {\n log(`retry failed times:${this.tries} maxLimit:${this.triesMax}`);\n this.onResponse.error(new TransactionTimeout());\n return;\n }\n this.protocol.sendStun(this.request, this.addr).catch((e) => {\n log(\"send stun failed\", e);\n });\n this.timeoutHandle = setTimeout(this.retry, this.timeoutDelay);\n this.timeoutDelay *= 2;\n this.tries++;\n };\n\n cancel() {\n if (this.timeoutHandle) clearTimeout(this.timeoutHandle);\n }\n}\n"]}
@@ -1,20 +1,37 @@
1
- import { type SocketType } from "dgram";
1
+ import { type Socket, type SocketType } from "dgram";
2
2
  import { type InterfaceAddresses } from "../../common/src";
3
3
  import type { Address } from "./types/model";
4
4
  export declare class UdpTransport implements Transport {
5
- private type;
5
+ private socketType;
6
6
  private portRange?;
7
7
  private interfaceAddresses?;
8
- private socket;
8
+ readonly type = "udp";
9
+ readonly socket: Socket;
9
10
  onData: (data: Buffer, addr: Address) => void;
10
- constructor(type: SocketType, portRange?: [number, number] | undefined, interfaceAddresses?: InterfaceAddresses | undefined);
11
+ private constructor();
11
12
  static init(type: SocketType, portRange?: [number, number], interfaceAddresses?: InterfaceAddresses): Promise<UdpTransport>;
12
13
  private init;
13
14
  send: (data: Buffer, addr: Address) => Promise<void>;
14
15
  address(): import("net").AddressInfo;
15
16
  close: () => Promise<void>;
16
17
  }
18
+ export declare class TcpTransport implements Transport {
19
+ private addr;
20
+ readonly type = "tcp";
21
+ private connecting;
22
+ private client;
23
+ onData: (data: Buffer, addr: Address) => void;
24
+ closed: boolean;
25
+ private constructor();
26
+ private connect;
27
+ private init;
28
+ static init(addr: Address): Promise<TcpTransport>;
29
+ send: (data: Buffer, addr: Address) => Promise<void>;
30
+ close: () => Promise<void>;
31
+ }
17
32
  export interface Transport {
33
+ type: string;
18
34
  onData: (data: Buffer, addr: Address) => void;
19
35
  send: (data: Buffer, addr: Address) => Promise<void>;
36
+ close: () => Promise<void>;
20
37
  }
@@ -3,19 +3,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.UdpTransport = void 0;
6
+ exports.TcpTransport = exports.UdpTransport = void 0;
7
7
  const dgram_1 = require("dgram");
8
8
  const debug_1 = __importDefault(require("debug"));
9
+ const net_1 = require("net");
9
10
  const src_1 = require("../../common/src");
10
11
  const utils_1 = require("./utils");
11
12
  const log = (0, debug_1.default)("werift-ice:packages/ice/src/transport.ts");
12
13
  class UdpTransport {
13
- constructor(type, portRange, interfaceAddresses) {
14
- Object.defineProperty(this, "type", {
14
+ constructor(socketType, portRange, interfaceAddresses) {
15
+ Object.defineProperty(this, "socketType", {
15
16
  enumerable: true,
16
17
  configurable: true,
17
18
  writable: true,
18
- value: type
19
+ value: socketType
19
20
  });
20
21
  Object.defineProperty(this, "portRange", {
21
22
  enumerable: true,
@@ -29,6 +30,12 @@ class UdpTransport {
29
30
  writable: true,
30
31
  value: interfaceAddresses
31
32
  });
33
+ Object.defineProperty(this, "type", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: "udp"
38
+ });
32
39
  Object.defineProperty(this, "socket", {
33
40
  enumerable: true,
34
41
  configurable: true,
@@ -71,7 +78,7 @@ class UdpTransport {
71
78
  }
72
79
  })
73
80
  });
74
- this.socket = (0, dgram_1.createSocket)(this.type);
81
+ this.socket = (0, dgram_1.createSocket)(socketType);
75
82
  this.socket.on("message", (data, info) => {
76
83
  if ((0, utils_1.normalizeFamilyNodeV18)(info.family) === 6) {
77
84
  [info.address] = info.address.split("%"); // example fe80::1d3a:8751:4ffd:eb80%wlp82s0
@@ -90,9 +97,9 @@ class UdpTransport {
90
97
  return transport;
91
98
  }
92
99
  async init() {
93
- const address = (0, src_1.interfaceAddress)(this.type, this.interfaceAddresses);
100
+ const address = (0, src_1.interfaceAddress)(this.socketType, this.interfaceAddresses);
94
101
  if (this.portRange) {
95
- const port = await (0, src_1.findPort)(this.portRange[0], this.portRange[1], this.type, this.interfaceAddresses);
102
+ const port = await (0, src_1.findPort)(this.portRange[0], this.portRange[1], this.socketType, this.interfaceAddresses);
96
103
  this.socket.bind({ port, address });
97
104
  }
98
105
  else {
@@ -105,4 +112,105 @@ class UdpTransport {
105
112
  }
106
113
  }
107
114
  exports.UdpTransport = UdpTransport;
115
+ class TcpTransport {
116
+ constructor(addr) {
117
+ Object.defineProperty(this, "addr", {
118
+ enumerable: true,
119
+ configurable: true,
120
+ writable: true,
121
+ value: addr
122
+ });
123
+ Object.defineProperty(this, "type", {
124
+ enumerable: true,
125
+ configurable: true,
126
+ writable: true,
127
+ value: "tcp"
128
+ });
129
+ Object.defineProperty(this, "connecting", {
130
+ enumerable: true,
131
+ configurable: true,
132
+ writable: true,
133
+ value: void 0
134
+ });
135
+ Object.defineProperty(this, "client", {
136
+ enumerable: true,
137
+ configurable: true,
138
+ writable: true,
139
+ value: void 0
140
+ });
141
+ Object.defineProperty(this, "onData", {
142
+ enumerable: true,
143
+ configurable: true,
144
+ writable: true,
145
+ value: () => { }
146
+ });
147
+ Object.defineProperty(this, "closed", {
148
+ enumerable: true,
149
+ configurable: true,
150
+ writable: true,
151
+ value: false
152
+ });
153
+ Object.defineProperty(this, "send", {
154
+ enumerable: true,
155
+ configurable: true,
156
+ writable: true,
157
+ value: async (data, addr) => {
158
+ await this.connecting;
159
+ this.client.write(data, (err) => {
160
+ if (err) {
161
+ console.log("err", err);
162
+ }
163
+ });
164
+ }
165
+ });
166
+ Object.defineProperty(this, "close", {
167
+ enumerable: true,
168
+ configurable: true,
169
+ writable: true,
170
+ value: async () => {
171
+ this.closed = true;
172
+ this.client.destroy();
173
+ }
174
+ });
175
+ this.connect();
176
+ }
177
+ connect() {
178
+ if (this.closed) {
179
+ return;
180
+ }
181
+ if (this.client) {
182
+ this.client.destroy();
183
+ }
184
+ this.connecting = new Promise((r, f) => {
185
+ try {
186
+ this.client = (0, net_1.connect)({ port: this.addr[1], host: this.addr[0] }, r);
187
+ }
188
+ catch (error) {
189
+ f(error);
190
+ }
191
+ });
192
+ this.client.on("data", (data) => {
193
+ const addr = [
194
+ this.client.remoteAddress,
195
+ this.client.remotePort,
196
+ ];
197
+ this.onData(data, addr);
198
+ });
199
+ this.client.on("end", () => {
200
+ this.connect();
201
+ });
202
+ this.client.on("error", (error) => {
203
+ console.log("error", error);
204
+ });
205
+ }
206
+ async init() {
207
+ await this.connecting;
208
+ }
209
+ static async init(addr) {
210
+ const transport = new TcpTransport(addr);
211
+ await transport.init();
212
+ return transport;
213
+ }
214
+ }
215
+ exports.TcpTransport = TcpTransport;
108
216
  //# sourceMappingURL=transport.js.map