🏡 index : cold-air-networks/mirror-jetstream.git

class MessagePort {
  constructor() {
    this._otherPort = null;
    this._listeners = new Set();
    this.onmessage = null;
  }

  _link(port) {
    this._otherPort = port;
  }

  _dispatchMessage(data) {
    const event = { data };
    queueMicrotask(() => {
      if (typeof this.onmessage === 'function') {
        this.onmessage(event);
      }
      for (const listener of this._listeners) {
        listener(event);
      }
    });
  }

  postMessage(data) {
    if (!this._otherPort) {
      throw new Error("Port is not connected.");
    }
    const clonedData = JSON.parse(JSON.stringify(data));
    this._otherPort._dispatchMessage(clonedData);
  }

  addEventListener(eventName, listener) {
    if (eventName === 'message' && typeof listener === 'function') {
      this._listeners.add(listener);
    }
  }

  removeEventListener(eventName, listener) {
    if (eventName === 'message') {
      this._listeners.delete(listener);
    }
  }

  start() { }
  close() { }
}

class MessageChannel {
  constructor() {
    this.port1 = new MessagePort();
    this.port2 = new MessagePort();
    this.port1._link(this.port2);
    this.port2._link(this.port1);
  }
}

module.exports = {
  MessageChannel,
};