You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.6 KiB
94 lines
3.6 KiB
"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 globals_node_js_1 = require("../globals.node.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() |
|
/** |
|
* WebTransport transport based on the built-in `WebTransport` object. |
|
* |
|
* Usage: browser, Node.js (with the `@fails-components/webtransport` package) |
|
* |
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebTransport |
|
* @see https://caniuse.com/webtransport |
|
*/ |
|
class WT extends transport_js_1.Transport { |
|
get name() { |
|
return "webtransport"; |
|
} |
|
doOpen() { |
|
try { |
|
// @ts-ignore |
|
this._transport = new WebTransport(this.createUri("https"), this.opts.transportOptions[this.name]); |
|
} |
|
catch (err) { |
|
return this.emitReserved("error", err); |
|
} |
|
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, globals_node_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;
|
|
|