webtransport.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.WebTransport = void 0;
  4. const transport_1 = require("../transport");
  5. const debug_1 = require("debug");
  6. const engine_io_parser_1 = require("engine.io-parser");
  7. const debug = (0, debug_1.default)("engine:webtransport");
  8. /**
  9. * Reference: https://developer.mozilla.org/en-US/docs/Web/API/WebTransport_API
  10. */
  11. class WebTransport extends transport_1.Transport {
  12. constructor(session, stream, reader) {
  13. super({ _query: { EIO: "4" } });
  14. this.session = session;
  15. const transformStream = (0, engine_io_parser_1.createPacketEncoderStream)();
  16. transformStream.readable.pipeTo(stream.writable).catch(() => {
  17. debug("the stream was closed");
  18. });
  19. this.writer = transformStream.writable.getWriter();
  20. (async () => {
  21. try {
  22. while (true) {
  23. const { value, done } = await reader.read();
  24. if (done) {
  25. debug("session is closed");
  26. break;
  27. }
  28. debug("received chunk: %o", value);
  29. this.onPacket(value);
  30. }
  31. }
  32. catch (e) {
  33. debug("error while reading: %s", e.message);
  34. }
  35. })();
  36. session.closed.then(() => this.onClose());
  37. this.writable = true;
  38. }
  39. get name() {
  40. return "webtransport";
  41. }
  42. async send(packets) {
  43. this.writable = false;
  44. try {
  45. for (let i = 0; i < packets.length; i++) {
  46. const packet = packets[i];
  47. await this.writer.write(packet);
  48. }
  49. }
  50. catch (e) {
  51. debug("error while writing: %s", e.message);
  52. }
  53. this.emit("drain");
  54. this.writable = true;
  55. this.emit("ready");
  56. }
  57. doClose(fn) {
  58. debug("closing WebTransport session");
  59. this.session.close();
  60. fn && fn();
  61. }
  62. }
  63. exports.WebTransport = WebTransport;