webtransport.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { Transport } from "../transport.js";
  2. import { nextTick } from "./websocket-constructor.js";
  3. import { createPacketDecoderStream, createPacketEncoderStream, } from "engine.io-parser";
  4. import debugModule from "debug"; // debug()
  5. const debug = debugModule("engine.io-client:webtransport"); // debug()
  6. export class WT extends Transport {
  7. get name() {
  8. return "webtransport";
  9. }
  10. doOpen() {
  11. // @ts-ignore
  12. if (typeof WebTransport !== "function") {
  13. return;
  14. }
  15. // @ts-ignore
  16. this.transport = new WebTransport(this.createUri("https"), this.opts.transportOptions[this.name]);
  17. this.transport.closed
  18. .then(() => {
  19. debug("transport closed gracefully");
  20. this.onClose();
  21. })
  22. .catch((err) => {
  23. debug("transport closed due to %s", err);
  24. this.onError("webtransport error", err);
  25. });
  26. // note: we could have used async/await, but that would require some additional polyfills
  27. this.transport.ready.then(() => {
  28. this.transport.createBidirectionalStream().then((stream) => {
  29. const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);
  30. const reader = stream.readable.pipeThrough(decoderStream).getReader();
  31. const encoderStream = createPacketEncoderStream();
  32. encoderStream.readable.pipeTo(stream.writable);
  33. this.writer = encoderStream.writable.getWriter();
  34. const read = () => {
  35. reader
  36. .read()
  37. .then(({ done, value }) => {
  38. if (done) {
  39. debug("session is closed");
  40. return;
  41. }
  42. debug("received chunk: %o", value);
  43. this.onPacket(value);
  44. read();
  45. })
  46. .catch((err) => {
  47. debug("an error occurred while reading: %s", err);
  48. });
  49. };
  50. read();
  51. const packet = { type: "open" };
  52. if (this.query.sid) {
  53. packet.data = `{"sid":"${this.query.sid}"}`;
  54. }
  55. this.writer.write(packet).then(() => this.onOpen());
  56. });
  57. });
  58. }
  59. write(packets) {
  60. this.writable = false;
  61. for (let i = 0; i < packets.length; i++) {
  62. const packet = packets[i];
  63. const lastPacket = i === packets.length - 1;
  64. this.writer.write(packet).then(() => {
  65. if (lastPacket) {
  66. nextTick(() => {
  67. this.writable = true;
  68. this.emitReserved("drain");
  69. }, this.setTimeoutFn);
  70. }
  71. });
  72. }
  73. }
  74. doClose() {
  75. var _a;
  76. (_a = this.transport) === null || _a === void 0 ? void 0 : _a.close();
  77. }
  78. }