Skip to content

LRichi/wcNATS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

wcNATS - RPC client created based on NATS go client

The client allows you to create weak connectivity between objects, but just as efficiently and quickly perform calls and notifications

Installation

# Go client
go get github.com/LRichi/wcNATS/

# Server
go get github.com/nats-io/nats-server

Basic Usage Request

package main

import (
	"context"
	"fmt"
	"os"

	"github.com/LRichi/wcNATS/client"
	"go.uber.org/zap"
)

const subjectRequest = "test.subject.request"

type Request struct {
	Message string
}

type Response struct {
	Message string
}

type right struct {
	log *zap.SugaredLogger
}

func (r *right) receiveCall(ctx context.Context, req *Request) (*Response, error) {
	r.log.Infow("received call", "session", ctx.Value("session"), "request", req)

	if req.Message == "" {
		return &Response{}, fmt.Errorf("no messge")
	}

	return &Response{Message: "Yes, i'm fine"}, nil
}

func (r *right) receiveNotify(ctx context.Context, req *Request) error {
	r.log.Infow("received notify", "session", ctx.Value("session"), "request", req)

	// if use return error, search in NATS client debug
	if req.Message == "" {
		return fmt.Errorf("no message")
	}

	return nil
}

func executeRequest(ctx context.Context, log *zap.SugaredLogger, cli *client.Client) error {
	var (
		r = &right{log: log}
	)

	sub, err := cli.Subscribe(subjectRequest, r.receiveCall)
	if err != nil {
		return fmt.Errorf("failed to subscribe: %w", err)
	}
	defer func() {
		if err = cli.Unsubscribe(sub); err != nil {
			panic(err)
		}
	}()

	var (
		req  = Request{Message: "The one on the right, are you alive?"}
		resp Response
	)

	if err = cli.Request(ctx, subjectRequest, &req, &resp); err != nil {
		return fmt.Errorf("failed to request: %w", err)
	}

	return nil
}

func main() {
	lc := zap.NewDevelopmentConfig()
	lc.DisableStacktrace = true
	lc.DisableCaller = true

	log, err := lc.Build()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	var (
		ctx = context.Background()
		cli = client.New(log.Sugar().Named("CLIENT"), "127.0.0.1:4222", "test", 100)
	)
	defer cli.Close()

	if err = executeRequest(ctx, log.Sugar(), cli); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

Or see tests examples

About

Weak connectivity with NATS

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages