index.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. "use strict";
  2. var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
  3. if (k2 === undefined) k2 = k;
  4. Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
  5. }) : (function(o, m, k, k2) {
  6. if (k2 === undefined) k2 = k;
  7. o[k2] = m[k];
  8. }));
  9. var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
  10. Object.defineProperty(o, "default", { enumerable: true, value: v });
  11. }) : function(o, v) {
  12. o["default"] = v;
  13. });
  14. var __importStar = (this && this.__importStar) || function (mod) {
  15. if (mod && mod.__esModule) return mod;
  16. var result = {};
  17. if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
  18. __setModuleDefault(result, mod);
  19. return result;
  20. };
  21. Object.defineProperty(exports, "__esModule", { value: true });
  22. exports.generateRtpCapabilities2 = exports.generateRtpCapabilities1 = exports.generateRtpCapabilities0 = exports.createSdpEndpoint = exports.SdpEndpoint = void 0;
  23. const MsSdpUtils = __importStar(require("mediasoup-client/lib/handlers/sdp/commonUtils"));
  24. const RemoteSdp_1 = require("mediasoup-client/lib/handlers/sdp/RemoteSdp");
  25. const SdpTransform = __importStar(require("sdp-transform"));
  26. const uuid_1 = require("uuid");
  27. const BrowserRtpCapabilities = __importStar(require("./BrowserRtpCapabilities"));
  28. const SdpUtils = __importStar(require("./SdpUtils"));
  29. const MediaSection_1 = require("mediasoup-client/lib/handlers/sdp/MediaSection");
  30. require("util").inspect.defaultOptions.depth = null;
  31. class SdpEndpoint {
  32. constructor(webRtcTransport, localCaps) {
  33. this.producers = [];
  34. this.producerMedias = [];
  35. this.consumers = [];
  36. this.webRtcTransport = webRtcTransport;
  37. this.transport = webRtcTransport;
  38. this.localCaps = localCaps;
  39. this.sctpMedia = null;
  40. this.consumeData = false;
  41. }
  42. async processOffer(sdpOffer) {
  43. if (this.remoteSdp) {
  44. console.error("[SdpEndpoint.processOffer] ERROR: A remote description was already set");
  45. return [];
  46. }
  47. this.remoteSdp = sdpOffer;
  48. const remoteSdpObj = SdpTransform.parse(sdpOffer);
  49. await this.webRtcTransport.connect({
  50. dtlsParameters: MsSdpUtils.extractDtlsParameters({
  51. sdpObject: remoteSdpObj,
  52. }),
  53. });
  54. for (const media of remoteSdpObj.media) {
  55. if (media.type == "application") {
  56. this.sctpMedia = media;
  57. console.log("[SdpEndpoint.processOffer] SCTP association received");
  58. }
  59. else {
  60. if (!("rtp" in media)) {
  61. continue;
  62. }
  63. if (!("direction" in media)) {
  64. continue;
  65. }
  66. if (media.direction !== "sendonly") {
  67. continue;
  68. }
  69. const sendParams = SdpUtils.sdpToSendRtpParameters(remoteSdpObj, media, this.localCaps, media.type);
  70. let producer;
  71. try {
  72. producer = await this.transport.produce({
  73. kind: media.type,
  74. rtpParameters: sendParams,
  75. paused: false,
  76. });
  77. }
  78. catch (err) {
  79. console.error("FIXME BUG:", err);
  80. process.exit(1);
  81. }
  82. this.producers.push(producer);
  83. this.producerMedias.push(media);
  84. console.log("[SdpEndpoint.processOffer] mediasoup Producer created, kind: %s, type: %s, paused: %s", producer.kind, producer.type, producer.paused);
  85. }
  86. }
  87. return this.producers;
  88. }
  89. createAnswer() {
  90. if (this.localSdp) {
  91. console.error("[SdpEndpoint.createAnswer] ERROR: A local description was already set");
  92. return "";
  93. }
  94. const sdpBuilder = new RemoteSdp_1.RemoteSdp({
  95. iceParameters: this.webRtcTransport.iceParameters,
  96. iceCandidates: this.webRtcTransport.iceCandidates,
  97. dtlsParameters: this.webRtcTransport.dtlsParameters,
  98. sctpParameters: this.webRtcTransport.sctpParameters,
  99. planB: false,
  100. });
  101. console.log("[SdpEndpoint.createAnswer] Make 'recvonly' SDP Answer");
  102. for (let i = 0; i < this.producers.length; i++) {
  103. const sdpMediaObj = this.producerMedias[i];
  104. const recvParams = this.producers[i].rtpParameters;
  105. sdpBuilder.send({
  106. offerMediaObject: sdpMediaObj,
  107. reuseMid: undefined,
  108. offerRtpParameters: recvParams,
  109. answerRtpParameters: recvParams,
  110. codecOptions: undefined,
  111. extmapAllowMixed: false,
  112. });
  113. }
  114. if (this.sctpMedia != null) {
  115. sdpBuilder.sendSctpAssociation({offerMediaObject: this.sctpMedia});
  116. }
  117. this.localSdp = sdpBuilder.getSdp();
  118. return this.localSdp;
  119. }
  120. addConsumer(consumer) {
  121. this.consumers.push(consumer);
  122. }
  123. addConsumeData() {
  124. this.consumeData = true;
  125. }
  126. createOffer() {
  127. var _a;
  128. if (this.localSdp) {
  129. console.error("[SdpEndpoint.createOffer] ERROR: A local description was already set");
  130. return "";
  131. }
  132. const sdpBuilder = new RemoteSdp_1.RemoteSdp({
  133. iceParameters: this.webRtcTransport.iceParameters,
  134. iceCandidates: this.webRtcTransport.iceCandidates,
  135. dtlsParameters: this.webRtcTransport.dtlsParameters,
  136. sctpParameters: this.webRtcTransport.sctpParameters,
  137. planB: false,
  138. });
  139. const sendMsid = uuid_1.v4().substr(0, 8);
  140. console.log("[SdpEndpoint.createOffer] Make 'sendonly' SDP Offer");
  141. for (let i = 0; i < this.consumers.length; i++) {
  142. const mid = (_a = this.consumers[i].rtpParameters.mid) !== null && _a !== void 0 ? _a : "nomid";
  143. const kind = this.consumers[i].kind;
  144. const sendParams = this.consumers[i].rtpParameters;
  145. sdpBuilder.receive({
  146. mid,
  147. kind,
  148. offerRtpParameters: sendParams,
  149. streamId: sendMsid,
  150. trackId: `${sendMsid}-${kind}`,
  151. });
  152. }
  153. if (this.consumeData) {
  154. sdpBuilder.receiveSctpAssociation();
  155. }
  156. this.localSdp = sdpBuilder.getSdp();
  157. return this.localSdp;
  158. }
  159. async processAnswer(sdpAnswer) {
  160. if (this.remoteSdp) {
  161. console.error("[SdpEndpoint.processAnswer] ERROR: A remote description was already set");
  162. return;
  163. }
  164. this.remoteSdp = sdpAnswer;
  165. const remoteSdpObj = SdpTransform.parse(sdpAnswer);
  166. await this.webRtcTransport.connect({
  167. dtlsParameters: MsSdpUtils.extractDtlsParameters({
  168. sdpObject: remoteSdpObj,
  169. }),
  170. });
  171. {
  172. }
  173. }
  174. }
  175. exports.SdpEndpoint = SdpEndpoint;
  176. function createSdpEndpoint(webRtcTransport, localCaps) {
  177. return new SdpEndpoint(webRtcTransport, localCaps);
  178. }
  179. exports.createSdpEndpoint = createSdpEndpoint;
  180. function generateRtpCapabilities0() {
  181. return BrowserRtpCapabilities.chrome;
  182. }
  183. exports.generateRtpCapabilities0 = generateRtpCapabilities0;
  184. function generateRtpCapabilities1(localCaps, remoteSdp) {
  185. console.error("[SdpEndpoint.generateRtpCapabilities1] BUG: Not implemented");
  186. process.exit(1);
  187. let caps;
  188. return caps;
  189. }
  190. exports.generateRtpCapabilities1 = generateRtpCapabilities1;
  191. function generateRtpCapabilities2(localCaps, remoteCaps) {
  192. console.error("[SdpEndpoint.generateRtpCapabilities2] BUG: Not implemented");
  193. process.exit(1);
  194. let caps;
  195. return caps;
  196. }
  197. exports.generateRtpCapabilities2 = generateRtpCapabilities2;
  198. //# sourceMappingURL=index.js.map