UNPKG

@mattkrick/fast-rtc-swarm

Version:

A full-mesh WebRTC swarm built on top of simple-peer

269 lines (252 loc) 10.8 kB
module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/FastRTCSwarm.ts"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/FastRTCSwarm.ts": /*!*****************************!*\ !*** ./src/FastRTCSwarm.ts ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "tslib"); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(tslib__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _mattkrick_fast_rtc_peer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mattkrick/fast-rtc-peer */ "@mattkrick/fast-rtc-peer"); /* harmony import */ var _mattkrick_fast_rtc_peer__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_mattkrick_fast_rtc_peer__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! eventemitter3 */ "eventemitter3"); /* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(eventemitter3__WEBPACK_IMPORTED_MODULE_2__); class FastRTCSwarm extends eventemitter3__WEBPACK_IMPORTED_MODULE_2___default.a { constructor(config = {}) { super(); this.peers = new Map(); const { userId = _mattkrick_fast_rtc_peer__WEBPACK_IMPORTED_MODULE_1___default.a.generateID(), peerBuffer = 1, maxPeers = 1024, roomId = '' } = config, peerConfig = tslib__WEBPACK_IMPORTED_MODULE_0__["__rest"](config, ["userId", "peerBuffer", "maxPeers", "roomId"]); this.peerBuffer = peerBuffer; this.maxPeers = maxPeers; this.peerConfig = Object.assign({}, peerConfig, { streams: _mattkrick_fast_rtc_peer__WEBPACK_IMPORTED_MODULE_1___default.a.fromStreamShorthand(peerConfig.streams) }); setTimeout(() => this.emit('signal', { type: 'init', userId, roomId })); for (let i = 0; i < this.peerBuffer; i++) { this.createOfferer(); } } createOfferer() { const connectionId = _mattkrick_fast_rtc_peer__WEBPACK_IMPORTED_MODULE_1___default.a.generateID(); const offeringPeer = this.initializePeer(Object.assign({ isOfferer: true, id: connectionId }, this.peerConfig)); this.peers.set(connectionId, offeringPeer); } initializePeer(config) { const peer = new _mattkrick_fast_rtc_peer__WEBPACK_IMPORTED_MODULE_1___default.a(config); peer.on('signal', (signal, peer) => { this.emit('signal', Object.assign({}, signal, { id: peer.id })); }); peer.on('open', (peer) => { this.emit('open', peer); }); peer.on('close', (peer) => { this.peers.delete(peer.id); this.emit('close', peer); }); peer.on('data', (data, peer) => { this.emit('data', data, peer); }); peer.on('stream', (stream, name, peer) => { this.emit('stream', stream, name, peer); }); peer.on('error', (error, peer) => { this.emit('error', error, peer); }); peer.on('connection', (iceConnectionState, peer) => { this.emit('connection', iceConnectionState, peer); }); return peer; } addStreams(streams) { const streamDict = _mattkrick_fast_rtc_peer__WEBPACK_IMPORTED_MODULE_1___default.a.fromStreamShorthand(streams); this.peers.forEach((peer) => { peer.addStreams(streamDict); }); const { streams: configStreams } = this.peerConfig; Object.keys(streamDict).forEach((streamName) => { const trackDict = streamDict[streamName]; const configTracks = configStreams[streamName]; if (!configTracks) { configStreams[streamName] = trackDict; } else { Object.keys(trackDict).forEach((trackName) => { configTracks[trackName] = trackDict[trackName]; }); } }); } broadcast(message) { this.peers.forEach((peer) => { peer.send(message); }); } close() { this.emit('signal', { type: 'close' }); this.peers.forEach((peer) => peer.close()); this.peers.clear(); } dispatch(payload) { switch (payload.type) { case 'accept': const { id, signals, userId } = payload; this.peers.set(id, this.initializePeer(Object.assign({ id: id, userId }, this.peerConfig))); signals.forEach((signal) => { this.dispatch(Object.assign({}, signal, { id })); }); break; case 'offer': case 'answer': case 'candidate': const { id: peerId } = payload, desc = tslib__WEBPACK_IMPORTED_MODULE_0__["__rest"](payload, ["id"]); const descPeer = this.peers.get(peerId); if (descPeer) { descPeer.dispatch(desc); } break; case 'offerRequest': this.createOfferer(); break; case 'offerAccepted': const acceptingPeer = this.peers.get(payload.id); if (acceptingPeer) { acceptingPeer.userId = payload.userId; } break; case 'leaveSwarm': const leavingPeer = this.peers.get(payload.id); leavingPeer && leavingPeer.close(); } } muteTrack(name) { const { streams: configStreams } = this.peerConfig; Object.keys(configStreams).forEach((streamName) => { const trackDict = configStreams[streamName]; Object.keys(trackDict).forEach((transceiverName) => { if (transceiverName !== name) return; const entry = trackDict[transceiverName]; if (entry && typeof entry !== 'string') { entry.track.stop(); entry.track.enabled = false; } }); }); this.peers.forEach((peer) => peer.muteTrack(name)); } } /* harmony default export */ __webpack_exports__["default"] = (FastRTCSwarm); /***/ }), /***/ "@mattkrick/fast-rtc-peer": /*!*******************************************!*\ !*** external "@mattkrick/fast-rtc-peer" ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@mattkrick/fast-rtc-peer"); /***/ }), /***/ "eventemitter3": /*!********************************!*\ !*** external "eventemitter3" ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("eventemitter3"); /***/ }), /***/ "tslib": /*!************************!*\ !*** external "tslib" ***! \************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("tslib"); /***/ }) /******/ }); //# sourceMappingURL=FastRTCSwarm.js.map