nicolasff / webdis

A Redis HTTP interface with JSON output
https://webd.is
BSD 2-Clause "Simplified" License
2.82k stars 307 forks source link

XREAD not receiving messages via websocket #234

Open gmussi opened 1 year ago

gmussi commented 1 year ago

Hi there,

The following code DOES NOT receive messages when XADD is used:

const wsEndpoint = "ws://localhost:7379/.json";
const socket = new WebSocket(wsEndpoint);

socket.onopen = function(event) {
  console.log("WebSocket connection established");
  socket.send(JSON.stringify(["XREAD", "BLOCK", "0", "STREAMS", "test.mystream", "$"]));
  console.log("XREAD SENT");
};
socket.onmessage = function(event) {
  const message = JSON.parse(event.data);
  console.log("WebSocket message received:", message);
}

By comparison, the following code DOES WORK when XADD is used:

var previous_response_length = 0
xhr = new XMLHttpRequest()
xhr.open("GET", `http://localhost:7379/XREAD/BLOCK/0/STREAMS/test.mystream/$`, true);
xhr.onreadystatechange = checkData;
xhr.send(null);

function checkData() {
  if(xhr.readyState == 3)  {
    response = xhr.responseText;
    chunk = response.slice(previous_response_length);
    previous_response_length = response.length;
    console.log("chunk reading", chunk);
    }
  };

I am running the following on my docker-compose.yml:

webdis:
    image: nicolas/webdis:latest
    command: /usr/local/bin/webdis /config/webdis.json
    environment:
      REDIS_HOST: redis
      REDIS_PORT: 6379
    volumes:
      - ./docker/webdis/webdis.json:/config/webdis.json
    depends_on:
      - redis
    ports:  # allow connections from the Docker host on localhost, port 7379
      - "7379:7379"

Also, here is my webdis.config file:

{
    "redis_host":   "redis",

    "redis_port":   6379,
    "redis_auth":   null,

    "http_host":    "0.0.0.0",
    "http_port":    7379,

    "threads":  5,
    "pool_size": 20,

    "daemonize":    false,
    "websockets":   true,

    "database": 0,

    "acl": [
        {
            "disabled": ["DEBUG"]
        },

        {
            "http_basic_auth":  "user:password",
            "enabled":      ["DEBUG"]
        }
    ],

    "verbosity": 4,
    "logfile": "/dev/stderr"
}

The following line is printed on webdis when websocket is attempted: [1] 03 May 08:19:42 D WS: /XREAD/BLOCK/0/STREAMS/test.mychannel/$

Additional information:

After a lot of trial-and-error, I did not manage to make websockets work for XREAD. Any advice would be greatly appreciated.