gRPC Implementation

Implementing gRPC server and client.

Node.js Server

const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");

Load proto file
const packageDef = protoLoader.loadSync("user.proto");
const userProto = grpc.loadPackageDefinition(packageDef).user;

Implement service
function getUser(call, callback) {
  const user = {
    id: call.request.id,
    name: "John",
    email: "[email protected]"
  };
  callback(null, user);
}

Create server
const server = new grpc.Server();
server.addService(userProto.UserService.service, { getUser });
server.bindAsync("0.0.0.0:50051", 
  grpc.ServerCredentials.createInsecure(),
  () => server.start()
);

Node.js Client

const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");

Load proto
const packageDef = protoLoader.loadSync("user.proto");
const userProto = grpc.loadPackageDefinition(packageDef).user;

Create client
const client = new userProto.UserService(
  "localhost:50051",
  grpc.credentials.createInsecure()
);

Make request
client.getUser({ id: "123" }, (error, user) => {
  if (error) console.error(error);
  else console.log(user);
});

Streaming Example

Server streaming implementation
function listUsers(call) {
  users.forEach(user => {
    call.write(user);
  });
  call.end();
}

Client streaming consumption
const stream = client.listUsers({});
stream.on("data", (user) => {
  console.log(user);
});
stream.on("end", () => {
  console.log("Stream ended");
});

Error Handling

Server error
callback({
  code: grpc.status.NOT_FOUND,
  message: "User not found"
});

Client error handling
client.getUser({ id: "123" }, (error, user) => {
  if (error) {
    console.error("Error:", error.message);
    return;
  }
  console.log(user);
});