86 lines
3.4 KiB
JavaScript
86 lines
3.4 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.WT = void 0;
|
|
const transport_js_1 = require("../transport.js");
|
|
const websocket_constructor_js_1 = require("./websocket-constructor.js");
|
|
const engine_io_parser_1 = require("engine.io-parser");
|
|
const debug_1 = __importDefault(require("debug")); // debug()
|
|
const debug = (0, debug_1.default)("engine.io-client:webtransport"); // debug()
|
|
class WT extends transport_js_1.Transport {
|
|
get name() {
|
|
return "webtransport";
|
|
}
|
|
doOpen() {
|
|
// @ts-ignore
|
|
if (typeof WebTransport !== "function") {
|
|
return;
|
|
}
|
|
// @ts-ignore
|
|
this.transport = new WebTransport(this.createUri("https"), this.opts.transportOptions[this.name]);
|
|
this.transport.closed
|
|
.then(() => {
|
|
debug("transport closed gracefully");
|
|
this.onClose();
|
|
})
|
|
.catch((err) => {
|
|
debug("transport closed due to %s", err);
|
|
this.onError("webtransport error", err);
|
|
});
|
|
// note: we could have used async/await, but that would require some additional polyfills
|
|
this.transport.ready.then(() => {
|
|
this.transport.createBidirectionalStream().then((stream) => {
|
|
const decoderStream = (0, engine_io_parser_1.createPacketDecoderStream)(Number.MAX_SAFE_INTEGER, this.socket.binaryType);
|
|
const reader = stream.readable.pipeThrough(decoderStream).getReader();
|
|
const encoderStream = (0, engine_io_parser_1.createPacketEncoderStream)();
|
|
encoderStream.readable.pipeTo(stream.writable);
|
|
this.writer = encoderStream.writable.getWriter();
|
|
const read = () => {
|
|
reader
|
|
.read()
|
|
.then(({ done, value }) => {
|
|
if (done) {
|
|
debug("session is closed");
|
|
return;
|
|
}
|
|
debug("received chunk: %o", value);
|
|
this.onPacket(value);
|
|
read();
|
|
})
|
|
.catch((err) => {
|
|
debug("an error occurred while reading: %s", err);
|
|
});
|
|
};
|
|
read();
|
|
const packet = { type: "open" };
|
|
if (this.query.sid) {
|
|
packet.data = `{"sid":"${this.query.sid}"}`;
|
|
}
|
|
this.writer.write(packet).then(() => this.onOpen());
|
|
});
|
|
});
|
|
}
|
|
write(packets) {
|
|
this.writable = false;
|
|
for (let i = 0; i < packets.length; i++) {
|
|
const packet = packets[i];
|
|
const lastPacket = i === packets.length - 1;
|
|
this.writer.write(packet).then(() => {
|
|
if (lastPacket) {
|
|
(0, websocket_constructor_js_1.nextTick)(() => {
|
|
this.writable = true;
|
|
this.emitReserved("drain");
|
|
}, this.setTimeoutFn);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
doClose() {
|
|
var _a;
|
|
(_a = this.transport) === null || _a === void 0 ? void 0 : _a.close();
|
|
}
|
|
}
|
|
exports.WT = WT;
|