# Getting Started

# Installation

Install module and required peer dependencies.

$ npm install mali @grpc/grpc-js @grpc/proto-loader

# Sample proto

syntax = "proto3";
package helloworld;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  rpc SayHi (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

# Creating an application

Similar to grpc.Server, Mali application can be created dynamically either by loading a .proto definition file, or by loading the static protoc generated Node.js code.

# Dynamic

When dynamically creating an application from static .proto file include the path to the proto file and the name of the service within the definition.

const path = require('path')
const Mali = require('mali')

const PROTO_PATH = path.resolve(__dirname, './helloworld.proto')
const app = new Mali(PROTO_PATH, 'Greeter')

# Static

When creating from statically generated Node.js code, we need the implementation and the name of the service constrcutor.

const services = require('./static/helloworld_grpc_pb')
const app = new Mali(services, 'GreeterService')

# Handling request

We need to define a handler for the RPC call and set it using the use() method. We can pass an object specifying our handlers.

function sayHello (ctx) {
  ctx.res = { message: 'Hello ' + ctx.req.name }
}

function sayHi (ctx) {
  ctx.res = { message: 'Hi ' + ctx.req.name }
}

const app = new Mali(PROTO_PATH, 'Greeter')
app.use({ sayHello, sayHi })

Alternative usage specifying the name of the method and the handler:

function hello (ctx) {
  ctx.res = { message: 'Hello ' + ctx.req.name }
}

function hi (ctx) {
  ctx.res = { message: 'Hi ' + ctx.req.name }
}

const app = new Mali(PROTO_PATH, 'Greeter')
app.use('sayHello', hello)
app.use('sayHi', hi)

# Starting the service

Just use the start method and passing the port. The method returns a grpc.Server instance.

const path = require('path')
const Mali = require('mali')

const PROTO_PATH = path.resolve(__dirname, '../protos/helloworld.proto')

async function sayHello (ctx) {
  ctx.res = { message: 'Hello '.concat(ctx.req.name) }
}

function main () {
  const app = new Mali(PROTO_PATH, 'Greeter')
  app.use({ sayHello })
  app.start('127.0.0.1:50051')
}

# Stopping the service

To stop and close the service use the asynchronous method close().

  app.close()
    .then(() => console.log('service closed'))

Or using async / await

await app.close()