npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

basic-grpc

v0.0.3

Published

a small wrapper over grpc and @grpc/proto-loader

Downloads

1

Readme

A simple grpc Wrapper for nodejs

basic-grpc is a small wrapper over grpc and @grpc/proto-loader its goal is to make the implementation very basic with minimal setup.

Usage:

Example proto file

protos/login.proto

  syntax = "proto3";

  package login;

  service Login {
    rpc login (Credentials) returns (Token) {}
  }

  message Credentials {
    string username = 1;
    string password = 2;
  }

  message Token {
    string token = 1;
  }

if you are using typescript you can also create a declaration file:

protos/login.d.ts

  import { rpc } from "simple-grpc";

  export interface ILogin {
    login: rpc<ICredentials, IToken>;
  }

  export interface ICredentials {
    username: string;
    password: string;
  }

  export interface IToken {
    token: string;
  }

Create a service

grpcServer.ts

import { 
  createServer, 
  ISetup,
  IProtoService, 
  RPCError, 
  createServerCreds
} from "simple-grpc";

import { join } from "path";
import { ILogin } from "../protos/login";

const loginService: IProtoService<ILogin> = {
  protoFile: "login.proto", // the .proto fileName
  packageName: "login", // packageName (what is defined in the .proto file as package)
  serviceName: "Login",  // serviceName (what is defined in the .proto file as Service)
  handlers: { // the function handlers for every rpc call
    login: async ({ username, password }) => {
      if(password === "awesomeSecretPassword") 
        return  {
          token: generateToken(username)
        };
        
      // you can throw an RPCError  with a code and details for the error 
      // the first 15 are gRPC generic you can add custom errors from 15+
      // see: https://github.com/grpc/grpc/blob/master/doc/statuscodes.md
      throw new RPCError(22, "Invalid Credentials");
    }
  },
};

const gRPCSetup: ISetup = {
  protoRoot: join(__dirname, "..", "protos"), // root folder where all your .proto files live
  services: [ // a list of services for this particular server
    loginService
  ]
};

// options for the protoloader
const protoLoaderOptions = {
  keepCase: true,
  longs: String,
  enums: String,
  defaults: true,
  oneofs: true
};

// the host of your gRPC server
const domain = "localhost:50051";

// accepts and array of Buffers or strings (truple) [ rootCerts, cert_chain, private_key ] 
// or it can create an insecure connection if nothing is passed
const credentials = createServerCreds();

// returns a gRPC server instance 
const server = createServer({
  gRPCSetup,
  domain,
  options: protoLoaderOptions, // if not passed it will use the default values
  credentials, // if not passed it will create an insecure connection
});

// starts the server :)
server.start();
console.log("Server Started");

Create a client

client.ts

import { createClient, createClientCreds } from "simple-grpc";
import { ILogin } from "../protos/login";
import { join } from "path";

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

// accepts and array of Buffers or strings (truple) [ rootCerts, cert_chain, private_key ] 
// or it can create an insecure connection if nothing is passed
const credentials = createClientCreds();

const loginService = createClient<ILogin>({
  url: "localhost", // url of the gRPC Server 
  port: "50051", // port of the gRPC server 
  protoPath: join(__dirname, ".." , "protos", "login.proto"), // root folder of your .protoFiles
  packageName: "login",  // packageName (what is defined in the .proto file as package)
  serviceName: "Login", // serviceName (what is defined in the .proto file as Service)
  options: protoLoaderOptions, // if not passed it will use the default values
  credentials, // if not passed it will create an insecure connection
  calls: [ "login" ] // the available rpc calls to that service defined in the .proto file
});


try {
  // you can then call the login function for the loginService :)
  // it will return a promise with the data or it Will throw an RPCError with code and details.
  const data = await loginService.login({ username: "JohnDoe", password: "awesomeSecretPassword" });
  console.log(JSON.stringify(data, undefined, 2));
} catch ({ code, details }) {
  console.log("ERR", code, details);
}

check this repo for an example: https://github.com/Flaavius/basic-grpc-example