public addMessageListener()

in src/Explorer/Tabs/CloudShellTab/Utils/AttachAddOn.tsx [94:151]


  public addMessageListener(terminal: Terminal): void {
    this._disposables.push(
      addSocketListener(this._socket, "message", (ev) => {
        let data: ArrayBuffer | string = ev.data;
        const startStatusJson = "ie_us";
        const endStatusJson = "ie_ue";

        if (typeof data === "object") {
          const enc = new TextDecoder("utf-8");
          data = enc.decode(ev.data as ArrayBuffer);
        }

        // for example of json object look in TerminalHelper in the socket.onMessage
        if (data.includes(startStatusJson) && data.includes(endStatusJson)) {
          // process as one line
          const statusData = data.split(startStatusJson)[1].split(endStatusJson)[0];
          data = data.replace(statusData, "");
          data = data.replace(startStatusJson, "");
          data = data.replace(endStatusJson, "");
        } else if (data.includes(startStatusJson)) {
          // check for start
          const partialStatusData = data.split(startStatusJson)[1];
          this._socketData += partialStatusData;
          data = data.replace(partialStatusData, "");
          data = data.replace(startStatusJson, "");
        } else if (data.includes(endStatusJson)) {
          // check for end and process the command
          const partialStatusData = data.split(endStatusJson)[0];
          this._socketData += partialStatusData;
          data = data.replace(partialStatusData, "");
          data = data.replace(endStatusJson, "");
          this._socketData = "";
        } else if (this._socketData.length > 0) {
          // check if the line is all data then just concatenate
          this._socketData += data;
          data = "";
        }

        if (this._allowTerminalWrite && data.includes(this._startMarker)) {
          this._allowTerminalWrite = false;
          terminal.write(`Preparing ${this._shellHandler.getShellName()} environment...\r\n`);
        }

        if (this._allowTerminalWrite) {
          const suppressedData = this._shellHandler?.getTerminalSuppressedData();
          const hasSuppressedData = suppressedData && suppressedData.length > 0;

          if (!hasSuppressedData || !data.includes(suppressedData)) {
            terminal.write(data);
          }
        }

        if (data.includes(this._shellHandler.getConnectionCommand())) {
          this._allowTerminalWrite = true;
        }
      }),
    );
  }