0

I was just trying out grpc. I made a simple client and server both with nodejs The proto file:

syntax = "proto3";


message Empty {}

message EchoRequest {
  string message = 1;
}

message EchoResponse {
  string message = 1;
  int32 message_count = 2;
}

// A simple echo service.
service EchoService {
  // One request followed by one response
  // The server returns the client message as-is.
  rpc echo(EchoRequest) returns (EchoResponse);
}

client.js

const grpc = require("@grpc/grpc-js");
var protoLoader = require("@grpc/proto-loader");
const PROTO_PATH = "./echo.proto";

const options = {
  keepCase: true,
  longs: String,
  enums: String,
  defaults: true,
  oneofs: true,
};

var packageDefinition = protoLoader.loadSync(PROTO_PATH, options);

const EchoService = grpc.loadPackageDefinition(packageDefinition).EchoService;


const client = new EchoService(
  "165.22.201.129:9090",
  grpc.credentials.createInsecure()
);

client.echo({message: "test"}, (error, response) => {
   console.log("Error:", error)
    console.log("Response message", response.message);
  });

server.js

const grpc = require("@grpc/grpc-js");
const PROTO_PATH = "./echo.proto";
var protoLoader = require("@grpc/proto-loader");

const options = {
  keepCase: true,
  longs: String,
  enums: String,
  defaults: true,
  oneofs: true,
};

var messageCount = 0;

var packageDefinition = protoLoader.loadSync(PROTO_PATH, options);
const echoProto = grpc.loadPackageDefinition(packageDefinition);
const server = new grpc.Server();

server.addService(echoProto.EchoService.service, {
    echo: (call, callback) => {
    console.log("request message:", call.request.message, "index", messageCount)
    callback(null, {message: "response test"});//call.request.message);
  },
});


const ip = "0.0.0.0:9090";
server.bindAsync(
  ip,
  grpc.ServerCredentials.createInsecure(),
  (error, port) => {
    console.log("error is:", error)
    console.log("Server running at", ip);
    server.start();
  }
);

I run both the client and the server normally, without using anything like a docker container. When running locally, everything works creat. However, when I run the server in a digitalocean droplet with the ip: 165.22.201.129. It doesn't work. The server does receive the request without issues, however when using the callback I get the following error on the client:

Error: Error: 13 INTERNAL: Received RST_STREAM with code 0
    at Object.callErrorFromStatus (D:\Github\EpicFlowServer\node_modules\@grpc\grpc-js\build\src\call.js:31:26)    at Object.onReceiveStatus (D:\Github\EpicFlowServer\node_modules\@grpc\grpc-js\build\src\client.js:189:52) 
    at Object.onReceiveStatus (D:\Github\EpicFlowServer\node_modules\@grpc\grpc-js\build\src\client-interceptors.js:365:141)
    at Object.onReceiveStatus (D:\Github\EpicFlowServer\node_modules\@grpc\grpc-js\build\src\client-interceptors.js:328:181)
    at D:\Github\EpicFlowServer\node_modules\@grpc\grpc-js\build\src\call-stream.js:187:78
    at processTicksAndRejections (internal/process/task_queues.js:79:11) {
  code: 13,
  details: 'Received RST_STREAM with code 0',
  metadata: Metadata { internalRepr: Map {}, options: {} }
}

I tried looking online but couldn't find any help. Does anyone have an idea of what could be going wrong?

IsolatedSushi
  • 152
  • 2
  • 10
  • Have you been able to get a setup similar to this working without grpc (meaning just plain client and server). That would help rule out any grpc related issues. It looks like the client received a [RST_STREAM](https://httpwg.org/specs/rfc7540.html#RST_STREAM). Do the logs on the server side indicate anything useful? – Easwar Swaminathan Jun 29 '22 at 17:29

0 Answers0