paambaati / node-liftbridge

๐ŸŒ‰ Node.js client for Liftbridge
https://paambaati.github.io/node-liftbridge/globals.html
MIT License
13 stars 4 forks source link

Failed to parse server response #2

Open akoenig opened 4 years ago

akoenig commented 4 years ago

Thanks for compiling this library ๐Ÿ‘‹ ๐Ÿ‘ I just tried to build a little prototype in order to get a feeling of how everything is like in Node.js land.

Started liftbridge as described in the quick start:

docker run -d --name=liftbridge-main -p 4222:4222 -p 9292:9292 -p 8222:8222 -p 6222:6222 liftbridge/liftbridge-docker

Created a stream, published a message and read via a subscription:

import LiftbridgeClient, { Message } from "liftbridge";
import LiftbridgeMessage from "liftbridge/lib/message";
import LiftbridgeStream from "liftbridge/lib/stream";

const app = async () => {
  const client = new LiftbridgeClient("localhost:9292");

  await client.connect();

  const name = `my-stream-v${Date.now()}`;
  const subject = `my-subject-v${Date.now()}`;

  const streamDef = new LiftbridgeStream({
    name,
    subject,
    partitions: 1,
    maxReplication: true
  });

  await client.createStream(streamDef);

  await client.publish(
    new LiftbridgeMessage({
      subject,
      key: Date.now().toString(),
      value: JSON.stringify({
        foo: "bar"
      })
    })
  );

  const subscription = client.subscribe(
    new LiftbridgeStream({
      subject,
      name
    })
  );

  subscription.on("data", (data: Message) => {
    console.log("message");
    console.log(data);
  });
};

app().catch(err => {
  process.exitCode = 1;

  console.error(err);
});

Creating the stream and publishing the message seems to work. Consuming the stream fails with a:

Error: 13 INTERNAL: Failed to parse server response

I also tried to generate a new gRPC binding, but this leads to the same result above ๐Ÿ™

paambaati commented 4 years ago

@akoenig It is a known issue, and hence the note about the project being under development.

I've spent considerable time tracing the issue, and you can see the issues I've reported โ€”

  1. https://github.com/liftbridge-io/go-liftbridge/issues/11#issuecomment-531716121
  2. https://github.com/grpc/grpc-node/issues/1022
  3. https://github.com/protobufjs/protobuf.js/issues/1293
  4. protocolbuffers/protobuf-javascript#43

tl;dr

protocolbuffers/protobuf-javascript#43 needs to be fixed before this library can work, but I've been unable to come up with a fix for it because - a) I'm unfamiliar with the protobuf codebase and b) The maintainers haven't responded to the issue yet.

tylertreat commented 4 years ago

Btw we are planning to replace Protocol Buffers with Flatbuffers, so maybe this issue will go away with that. https://github.com/liftbridge-io/liftbridge-api/pull/8

paambaati commented 4 years ago

@tylertreat Oh wow, thatโ€™ll be great! Although Flatbuffers is once again a Google project and support has been abysmal so far on even widely reported issues. Hopefully the situation is better for Flatbuffers; Iโ€™ll start looking at it.

llchan commented 4 years ago

In my experience Flatbuffers folks have generally been pretty responsive, esp compared to the larger projects like protobuf/bazel/TF/etc. If there's a real bug I think they'd be more than willing to work on solving it. That said, I don't know what the nodejs support looks like (I'm most familiar with the C++/Go interfaces).

paambaati commented 4 years ago

@llchan Thanks for chiming in!

I don't know what the nodejs support looks like

This is exactly what Iโ€™m worried about.

minicuper commented 4 years ago

I get this one

Error: Unknown base64 encoding at char: { at c (.../nats/nodemodules/google-protobuf/google-protobuf.js:186:210) at Object.goog.crypt.base64.decodeStringInternal (.../nats/node_modules/google-protobuf/google-protobuf.js:186:312) at Object.goog.crypt.base64.decodeStringToUint8Array (.../nats/node_modules/google-protobuf/google-protobuf.js:185:385) at Function.jspb.Message.bytesAsU8 (.../nats/node_modules/google-protobuf/google-protobuf.js:200:385)

digitalsanity commented 4 years ago

@paambaati Can you confirm that it runs correctly (npm run debug) if you manually add the final "" arg to the _pb.js file generated as in my example below? I think it is working but the debug app isn't exiting -- just hanging at the end?


proto.proto.Message.deserializeBinaryFromReader = function(msg, reader) {
// ..
   case 7:
      var value = msg.getHeadersMap();
      reader.readMessage(value, function(message, reader) {
        // NOTICE THE NUMBER OF ARGUMENTS HERE -->>
        jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readBytes, null, "", "");
      });
      break;
// ...
}
paambaati commented 4 years ago

@zag2art @digitalsanity Hey Iโ€™m terribly sorry folks, but I plan to resume work here only once https://github.com/liftbridge-io/liftbridge-api/pull/8 lands. It anyways requires changing a lot of the core stuff, so Iโ€™d rather wait for it than spending more time with Protobuf errors.

paambaati commented 4 years ago

@zag2art @digitalsanity https://github.com/protobufjs/protobuf.js/pull/1348 should hopefully fix this issue.

Also, I recently learnt that Liftbridge v1.0.0 (expected to ship in March) is sticking to gRPC for now.