data-transport
Version:
A simple and responsive transport
121 lines • 17.6 kB
JavaScript
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==