UNPKG

data-transport

Version:
121 lines 17.6 kB
import { __assign, __extends, __read, __rest, __values } from "tslib"; import { Transport } from '../transport'; var MAX_CHUNK_SIZE = 1024 * 60; var BUFFER_FULL_THRESHOLD = 1024 * 64; var EXPIRED_TIME = 1000 * 60; var WebRTCTransport = /** @class */ (function (_super) { __extends(WebRTCTransport, _super); function WebRTCTransport(_options) { var _this = this; var peer = _options.peer, _a = _options.listener, listener = _a === void 0 ? function (callback) { var handler = function (data) { var e_1, _a; var _b; var message = JSON.parse(data); var key = Object.prototype.hasOwnProperty.call(message, 'request') ? 'request' : 'response'; var buffer = (_b = _this.receiveBuffer.get(message.__DATA_TRANSPORT_UUID__)) !== null && _b !== void 0 ? _b : { data: [], timestamp: Date.now(), }; _this.receiveBuffer.set(message.__DATA_TRANSPORT_UUID__, buffer); buffer.data[message.chunkId] = message[key]; buffer.data.length = message.length; buffer.timestamp = Date.now(); var isComplete = buffer.data.filter(function (item) { return item; }).length === message.length; if (isComplete) { var data_1 = JSON.parse(buffer.data.join('')); message[key] = key === 'request' ? data_1 : data_1[0]; delete message.length; callback(message); _this.receiveBuffer.delete(message.__DATA_TRANSPORT_UUID__); try { for (var _c = __values(_this.receiveBuffer), _d = _c.next(); !_d.done; _d = _c.next()) { var _e = __read(_d.value, 2), id = _e[0], item = _e[1]; if (Date.now() - item.timestamp > EXPIRED_TIME) { _this.receiveBuffer.delete(id); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } } }; peer.on('data', handler); return function () { peer.off('data', handler); }; } : _a, _b = _options.sender, sender = _b === void 0 ? function (message) { var _a; var key = Object.prototype.hasOwnProperty.call(message, 'request') ? 'request' : 'response'; message[key] = JSON.stringify(key === 'request' ? message.request : typeof message.response !== 'undefined' ? [message.response] : []); var chunkId = 0; var allChunksSize = Math.ceil(message[key].length / MAX_CHUNK_SIZE); while (message[key].length > 0) { var data = __assign(__assign({}, message), (_a = {}, _a[key] = message[key].slice(0, MAX_CHUNK_SIZE), _a.chunkId = chunkId, _a.length = allChunksSize, _a)); peer.send(JSON.stringify(data)); message[key] = message[key].slice(MAX_CHUNK_SIZE); chunkId += 1; } } : _b, options = __rest(_options, ["peer", "listener", "sender"]); _this = _super.call(this, __assign(__assign({}, options), { listener: listener, sender: sender })) || this; _this.receiveBuffer = new Map(); if (peer) { var webRTCPaused_1 = false; var webRTCMessageQueue_1 = []; var peerSend_1 = peer.send.bind(peer); var sendMessageQueued_1 = function () { webRTCPaused_1 = false; var message = webRTCMessageQueue_1.shift(); var _loop_1 = function () { if (peer._channel.bufferedAmount && peer._channel.bufferedAmount > BUFFER_FULL_THRESHOLD) { webRTCPaused_1 = true; webRTCMessageQueue_1.unshift(message); var listener_1 = function () { peer._channel.removeEventListener('bufferedamountlow', listener_1); sendMessageQueued_1(); }; peer._channel.addEventListener('bufferedamountlow', listener_1); return { value: void 0 }; } try { peerSend_1(message); message = webRTCMessageQueue_1.shift(); } catch (error) { throw new Error("Error send message to peer: ".concat(error.message)); } }; while (message) { var state_1 = _loop_1(); if (typeof state_1 === "object") return state_1.value; } }; peer.send = function (chunk) { webRTCMessageQueue_1.push(chunk); if (webRTCPaused_1) { return; } sendMessageQueued_1(); }; } return _this; } return WebRTCTransport; }(Transport)); export { WebRTCTransport }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViUlRDVHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydHMvd2ViUlRDVHJhbnNwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFPQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLElBQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFFakMsSUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBRXhDLElBQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFXL0I7SUFFVSxtQ0FBWTtJQUdwQix5QkFBWSxRQUFnQztRQUE1QyxpQkFvSEM7UUFsSEcsSUFBQSxJQUFJLEdBaUVGLFFBQVEsS0FqRU4sRUFDSixLQWdFRSxRQUFRLFNBN0JULEVBbkNELFFBQVEsbUJBQUcsVUFBQyxRQUFRO1lBQ2xCLElBQU0sT0FBTyxHQUFHLFVBQUMsSUFBWTs7O2dCQUMzQixJQUFNLE9BQU8sR0FBK0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0QsSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7b0JBQ2xFLENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQyxVQUFVLENBQUM7Z0JBQ2YsSUFBTSxNQUFNLEdBQUcsTUFBQSxLQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDbkMsT0FBTyxDQUFDLHVCQUF1QixDQUNoQyxtQ0FBSTtvQkFDSCxJQUFJLEVBQUUsRUFBRTtvQkFDUixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDdEIsQ0FBQztnQkFDRixLQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sQ0FBQyxJQUFJ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QUFDLENBQUM7d0JBQ0QsSUFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDckMsbUJBQW1CLEVBQ25CLFVBQVEsQ0FDVCxDQUFDOztvQkFFSixDQUFDO29CQUNELElBQUksQ0FBQzt3QkFDSCxVQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2xCLE9BQU8sR0FBRyxvQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDdkMsQ0FBQztvQkFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO3dCQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUErQixLQUFLLENBQUMsT0FBTyxDQUFFLENBQUMsQ0FBQztvQkFDbEUsQ0FBQzs7Z0JBekJILE9BQU8sT0FBTzs7OztpQkEwQmI7WUFDSCxDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsS0FBVTtnQkFDOUIsb0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixJQUFJLGNBQVksRUFBRSxDQUFDO29CQUNqQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsbUJBQWlCLEVBQUUsQ0FBQztZQUN0QixDQUFDLENBQUM7UUFDSixDQUFDOztJQUNILENBQUM7SUFDSCxzQkFBQztBQUFELENBQUMsQUExSEQsQ0FFVSxTQUFTLEdBd0hsQjtBQUVELE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSW5zdGFuY2UgfSBmcm9tICdzaW1wbGUtcGVlcic7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VJbnRlcmFjdGlvbixcbiAgTGlzdGVuZXJPcHRpb25zLFxuICBTZW5kT3B0aW9ucyxcbiAgVHJhbnNwb3J0T3B0aW9ucyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFRyYW5zcG9ydCB9IGZyb20gJy4uL3RyYW5zcG9ydCc7XG5cbmNvbnN0IE1BWF9DSFVOS19TSVpFID0gMTAyNCAqIDYwO1xuXG5jb25zdCBCVUZGRVJfRlVMTF9USFJFU0hPTEQgPSAxMDI0ICogNjQ7XG5cbmNvbnN0IEVYUElSRURfVElNRSA9IDEwMDAgKiA2MDtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJSVENUcmFuc3BvcnRPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxUcmFuc3BvcnRPcHRpb25zPiB7XG4gIHBlZXI6IEluc3RhbmNlO1xufVxuXG5pbnRlcmZhY2UgV2ViUlRDVHJhbnNwb3J0U2VuZE9wdGlvbnMgZXh0ZW5kcyBTZW5kT3B0aW9uczx7fT4ge1xuICBjaHVua0lkPzogbnVtYmVyO1xuICBsZW5ndGg/OiBudW1iZXI7XG59XG5cbmFic3RyYWN0IGNsYXNzIFdlYlJUQ1RyYW5zcG9ydDxcbiAgVCBleHRlbmRzIEJhc2VJbnRlcmFjdGlvbiA9IGFueVxuPiBleHRlbmRzIFRyYW5zcG9ydDxUPiB7XG4gIHByaXZhdGUgcmVjZWl2ZUJ1ZmZlciA9IG5ldyBNYXA8c3RyaW5nLCB7IGRhdGE6IGFueVtdOyB0aW1lc3RhbXA6IG51bWJlciB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKF9vcHRpb25zOiBXZWJSVENUcmFuc3BvcnRPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcGVlcixcbiAgICAgIGxpc3RlbmVyID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZTogV2ViUlRDVHJhbnNwb3J0U2VuZE9wdGlvbnMgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtZXNzYWdlLCAncmVxdWVzdCcpXG4gICAgICAgICAgICA/ICdyZXF1ZXN0J1xuICAgICAgICAgICAgOiAncmVzcG9uc2UnO1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoXG4gICAgICAgICAgICBtZXNzYWdlLl9fREFUQV9UUkFOU1BPUlRfVVVJRF9fXG4gICAgICAgICAgKSA/PyB7XG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5zZXQobWVzc2FnZS5fX0RBVEFfVFJBTlNQT1JUX1VVSURfXywgYnVmZmVyKTtcbiAgICAgICAgICBidWZmZXIuZGF0YVttZXNzYWdlLmNodW5rSWQhXSA9IG1lc3NhZ2Vba2V5XTtcbiAgICAgICAgICBidWZmZXIuZGF0YS5sZW5ndGggPSBtZXNzYWdlLmxlbmd0aCE7XG4gICAgICAgICAgYnVmZmVyLnRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZSA9XG4gICAgICAgICAgICBidWZmZXIuZGF0YS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0pLmxlbmd0aCA9PT0gbWVzc2FnZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGlzQ29tcGxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGJ1ZmZlci5kYXRhLmpvaW4oJycpKTtcbiAgICAgICAgICAgIG1lc3NhZ2Vba2V5XSA9IGtleSA9PT0gJ3JlcXVlc3QnID8gZGF0YSA6IGRhdGFbMF07XG4gICAgICAgICAgICBkZWxldGUgbWVzc2FnZS5sZW5ndGg7XG4gICAgICAgICAgICBjYWxsYmFjayhtZXNzYWdlIGFzIExpc3RlbmVyT3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIuZGVsZXRlKG1lc3NhZ2UuX19EQVRBX1RSQU5TUE9SVF9VVUlEX18pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaWQsIGl0ZW1dIG9mIHRoaXMucmVjZWl2ZUJ1ZmZlcikge1xuICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGl0ZW0udGltZXN0YW1wID4gRVhQSVJFRF9USU1FKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHBlZXIub24oJ2RhdGEnLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBwZWVyLm9mZignZGF0YScsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHNlbmRlciA9IChtZXNzYWdlOiBXZWJSVENUcmFuc3BvcnRTZW5kT3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWVzc2FnZSwgJ3JlcXVlc3QnKVxuICAgICAgICAgID8gJ3JlcXVlc3QnXG4gICAgICAgICAgOiAncmVzcG9uc2UnO1xuICAgICAgICBtZXNzYWdlW2tleV0gPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBrZXkgPT09ICdyZXF1ZXN0J1xuICAgICAgICAgICAgPyBtZXNzYWdlLnJlcXVlc3RcbiAgICAgICAgICAgIDogdHlwZW9mIG1lc3NhZ2UucmVzcG9uc2UgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IFttZXNzYWdlLnJlc3BvbnNlXVxuICAgICAgICAgICAgOiBbXVxuICAgICAgICApO1xuICAgICAgICBsZXQgY2h1bmtJZCA9IDA7XG4gICAgICAgIGNvbnN0IGFsbENodW5rc1NpemUgPSBNYXRoLmNlaWwoXG4gICAgICAgICAgKG1lc3NhZ2Vba2V5XSBhcyBzdHJpbmcpLmxlbmd0aCAvIE1BWF9DSFVOS19TSVpFXG4gICAgICAgICk7XG4gICAgICAgIHdoaWxlICgobWVzc2FnZVtrZXldIGFzIHN0cmluZykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgW2tleV06IChtZXNzYWdlW2tleV0gYXMgc3RyaW5nKS5zbGljZSgwLCBNQVhfQ0hVTktfU0laRSksXG4gICAgICAgICAgICBjaHVua0lkLFxuICAgICAgICAgICAgbGVuZ3RoOiBhbGxDaHVua3NTaXplLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcGVlci5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgICBtZXNzYWdlW2tleV0gPSAobWVzc2FnZVtrZXldIGFzIHN0cmluZykuc2xpY2UoTUFYX0NIVU5LX1NJWkUpO1xuICAgICAgICAgIGNodW5rSWQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9ID0gX29wdGlvbnM7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgc2VuZGVyLFxuICAgIH0pO1xuICAgIGlmIChwZWVyKSB7XG4gICAgICBsZXQgd2ViUlRDUGF1c2VkID0gZmFsc2U7XG4gICAgICBjb25zdCB3ZWJSVENNZXNzYWdlUXVldWU6IGFueVtdID0gW107XG4gICAgICBjb25zdCBwZWVyU2VuZCA9IHBlZXIuc2VuZC5iaW5kKHBlZXIpO1xuICAgICAgY29uc3Qgc2VuZE1lc3NhZ2VRdWV1ZWQgPSAoKSA9PiB7XG4gICAgICAgIHdlYlJUQ1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHdlYlJUQ01lc3NhZ2VRdWV1ZS5zaGlmdCgpO1xuICAgICAgICB3aGlsZSAobWVzc2FnZSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChwZWVyIGFzIGFueSkuX2NoYW5uZWwuYnVmZmVyZWRBbW91bnQgJiZcbiAgICAgICAgICAgIChwZWVyIGFzIGFueSkuX2NoYW5uZWwuYnVmZmVyZWRBbW91bnQgPiBCVUZGRVJfRlVMTF9USFJFU0hPTERcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHdlYlJUQ1BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB3ZWJSVENNZXNzYWdlUXVldWUudW5zaGlmdChtZXNzYWdlKTtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAocGVlciBhcyBhbnkpLl9jaGFubmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgJ2J1ZmZlcmVkYW1vdW50bG93JyxcbiAgICAgICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBzZW5kTWVzc2FnZVF1ZXVlZCgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChwZWVyIGFzIGFueSkuX2NoYW5uZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgJ2J1ZmZlcmVkYW1vdW50bG93JyxcbiAgICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwZWVyU2VuZChtZXNzYWdlKTtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSB3ZWJSVENNZXNzYWdlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHNlbmQgbWVzc2FnZSB0byBwZWVyOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGVlci5zZW5kID0gZnVuY3Rpb24gKGNodW5rOiBhbnkpIHtcbiAgICAgICAgd2ViUlRDTWVzc2FnZVF1ZXVlLnB1c2goY2h1bmspO1xuICAgICAgICBpZiAod2ViUlRDUGF1c2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbmRNZXNzYWdlUXVldWVkKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBXZWJSVENUcmFuc3BvcnQgfTtcbiJdfQ==