1

My setup

  • macOS 10.15.7
  • zeromq.js: v6.0.0-beta.6
  • node.js: v14.4.0

I'm using ZeroMQ.js to communicate between my app's frontend and backend.

The pattern in use is zmq.Pair. And the client, a.k.a. the frontend, can receive messages from the server, a.k.a. the backend, just fine.

Code



class UiBridge {
    constructor(address="tcp://127.0.0.1:25555") {
        this.address = address;
        this.socket = new zmq.Pair();
    }

    async Start() {
        await this.socket.connect(this.address);

        console.log("frontend: Connected to backend.");

        const listen = async () => {
            for await (const [backendRequest] of this.socket) {
              switch (backendRequest.toString()) {
                case 'msg1':
                  onMsg1();

                  // THIS Send works!
                  // the receiver gets the reply.

                  this.Send("reply");
                  break;

                case 'term':
                  this.Stop();
                  break;

                default:
                  console.error(`undefined message from backend: ${backendRequest}`);
              }
            }
        }
      
        listen();
    }
    
    async Stop() {
        if (!this.socket.closed) {
          this.socket.close()
        }
    }

    async Send(cmd) {
        try {
            await this.socket.send(cmd);
            alert(`sent msg: ${msg}`);
        } catch (err) {
            alert(`send failed due to : ${err}`);
        }
    }
}

Note that if I send message inside the listening loop on receiving any message from the other side, then the send works.

Problem

But if I send messages outside of this listening loop anywhere else in the frontend code, then the other end never receives the sent message, and no exceptions are caught. Like in a button callback


function onToggleButton() {

    // This is never received!

    gUiBridge.Send("from frontend");
}

The button callback is triggered and I see the alert coming up. I've made sure that I can already receive messages from the server before clicking on buttons.

Workaround

I had to create another pair of PUSH/PULL to send messages from anywhere of my frontend to backend, so that I'm not blocked by this issue. But this is suboptimal.

Question

Is this by design or am I doing anything wrong?

kakyo
  • 10,460
  • 14
  • 76
  • 140

0 Answers0