apiclient

package
v0.0.48 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 9, 2023 License: MIT Imports: 15 Imported by: 0

Documentation

Overview

Package apiclient - пакет API клиента для использования в сервисах (для возможности вызова service to service)

Включает в себя автоматическое обновление jwt токенов через сервис авторизации

Index

Examples

Constants

View Source
const (
	MessageKindAuth     = WsMessageKind(iota) // MessageKindAuth - ответ на запрос авторизации
	MessageKindSub                            // MessageKindSub - сообщение по подписке
	MessageKindResponse                       // MessageKindResponse - ответ на произвольный запрос
)

Variables

View Source
var (
	AddressRequiredErr     = errors.New("address required")      // AddressRequiredErr - пустой адрес
	ConnIndexOutOfRangeErr = errors.New("conn ind out of range") // ConnIndexOutOfRangeErr - в клиенте нет соединения с таким индексом
	UnhandledMessageErr    = errors.New("unhandled message")     // UnhandledMessageErr - для какого-то из сообщений не нашлось обработчика
)
View Source
var (
	RefreshFuncIsRequired = errors.New("refresh function is required")
)

Functions

This section is empty.

Types

type ConnectionInfo

type ConnectionInfo struct {
	Address     string                         // Address - адрес для подключения
	ConnOptions *opts.ClientPrivateConnOptions // ConnOptions - опции подключения
	SubHandler  WsSubHandler                   // SubHandler - обработчик любого сообщения по подписке
	// contains filtered or unexported fields
}

ConnectionInfo - данные соединения

type HttpClient

type HttpClient struct {
	// contains filtered or unexported fields
}

HttpClient - клиент для вызовов с помощью http-запросов

func NewHttpClient

func NewHttpClient(baseUrl string, accessToken string, accessExpiresAt int64,
	refreshToken string, refreshExpiresAt int64, fillVersion func(http.Header),
	refresh refreshFunc, notifier errorNotifier) (*HttpClient, error)

NewHttpClient - функция создания http клиента

func (*HttpClient) MakeRequest

func (c *HttpClient) MakeRequest(ctx context.Context, msg *HttpMessage, handler HttpMessageHandler)
Example
package main

import (
	"context"
	"github.com/custom-app/sdk-go/service/apiclient"
	"log"
	"net/http"
)

func main() {
	client, err := apiclient.NewHttpClient("https://host:port", "access token", 23513,
		"refresh token", 263216, func(header http.Header) {
			// добавление версии в заголовки запроса
		}, func(ctx context.Context, token string) (string, int64, string, int64, error) {
			// код получения новых токенов, как правило, http запрос в сервис авторизации с refresh токенов
			return "", 0, "", 0, nil
		}, func(err error) {
			// код работы с ошибкой (логирование, отправка в тг чат багов)
		})
	if err != nil {
		log.Panicln(err)
	}
	if err := client.Start(); err != nil {
		log.Panicln(err)
	}
	client.MakeRequest(context.Background(), nil,
		func(msg []byte) (needRetry bool, err error) {
			// парсинг сообщения, получение нужной информации
			//
			// при необходимости можно повторить попытку отправки запроса
			return false, nil
		})
}

func (*HttpClient) MakeRequestWithResponse added in v0.0.43

func (c *HttpClient) MakeRequestWithResponse(ctx context.Context, msg *HttpMessage) ([]byte, error)

func (*HttpClient) Start

func (c *HttpClient) Start() error

func (*HttpClient) Stop

func (c *HttpClient) Stop() error

type HttpMessage

type HttpMessage struct {
	Message proto.Message // сообщение
	Url     string        // часть адреса(path), то есть протокол и хост сюда не включены
}

HttpMessage - сообщение для отправки другому сервису

type HttpMessageHandler

type HttpMessageHandler func(msg []byte) (needRetry bool, err error)

HttpMessageHandler - сигнатура функции обработки ответа на http запрос

type WsClient

type WsClient struct {
	// contains filtered or unexported fields
}

WsClient - клиент для отправки сообщения по WebSocket

func NewWsClient

func NewWsClient(connections []*ConnectionInfo, accessToken string, accessExpiresAt int64,
	refreshToken string, refreshExpiresAt int64,
	refresh refreshFunc, notifier errorNotifier, msgParser WsMsgParser) (*WsClient, error)

func (*WsClient) IsAlive

func (c *WsClient) IsAlive() bool

func (*WsClient) SendMessage

func (c *WsClient) SendMessage(connInd int, msg WsMessage, handler WsMessageHandler) error
Example
package main

import (
	"context"
	"github.com/custom-app/sdk-go/service/apiclient"
	"github.com/custom-app/sdk-go/service/wsservice/opts"
	"google.golang.org/protobuf/proto"
	"log"
)

func main() {
	client, err := apiclient.NewWsClient([]*apiclient.ConnectionInfo{
		{
			Address:     "ws://localhost:1337/connect",
			ConnOptions: &opts.ClientPrivateConnOptions{}, // подробно останавливаться не буду
			SubHandler: func(msg proto.Message) (err error) {
				// обработка сообщения по подписке
				return nil
			},
		},
	}, "access token", 236135, "refresh token", 3612623,
		func(ctx context.Context, token string) (string, int64, string, int64, error) {
			// код получения новых токенов, как правило, http запрос в сервис авторизации с refresh токенов
			return "", 0, "", 0, nil
		}, func(err error) {
			// код работы с ошибкой (логирование, отправка в тг чат багов)
		}, func(bytes []byte) (apiclient.WsMessageKind, apiclient.WsMessage, error) {
			var res proto.Message // в реальности здесь Request
			if err := proto.Unmarshal(bytes, res); err != nil {
				return 0, nil, err
			}
			// определяем тип сообщения по распаршенному прото и возвращаем
			return 0, nil, nil
		})
	if err != nil {
		log.Panicln(err)
	}
	if err := client.Start(); err != nil {
		log.Panicln(err)
	}
	if err := client.SendMessage(0, nil, func(msg proto.Message) (needRetry bool, err error) {
		// обработка ответа на запрос
		//
		// может быть необходимо получить какие-то данные из ответа
		//
		// при возврате needRetry == true запрос будет переотправлен
		return false, nil
	}); err != nil {
		log.Panicln(err)
	}
}

func (*WsClient) SendMessageWithResponse added in v0.0.43

func (c *WsClient) SendMessageWithResponse(connInd int, msg WsMessage) (WsMessage, error)

func (*WsClient) Start

func (c *WsClient) Start() error

func (*WsClient) Stop

func (c *WsClient) Stop() error

func (*WsClient) Sub

func (c *WsClient) Sub(connInd int, kind structs.SubKind, req WsMessage, handler WsMessageHandler) error

type WsMessage

type WsMessage interface {
	proto.Message
	GetId() uint64
	SetId(id uint64)
}

WsMessage - сообщения для отправки по WS, обязательна возможность получения/присваивания id запроса

Если в прото сообщении сделать поле id, то функция GetId сгенерится сама, а вот функцию SetId надо добавить самостоятельно, это можно сделать с помощью объявления нового типа, в который будет встроен(embedding) тип запроса

type WsMessageHandler

type WsMessageHandler func(msg WsMessage) (needRetry bool, err error)

WsMessageHandler - сигнатура функции обработчика ws-сообщения

type WsMessageKind

type WsMessageKind int

WsMessageKind - вспомогательный тип для определения типа сообщения

type WsMsgParser

type WsMsgParser func([]byte) (WsMessageKind, WsMessage, error)

WsMsgParser - сигнатура функции парсинга сообщения

type WsSubHandler

type WsSubHandler func(msg proto.Message) error

WsSubHandler - сигнатура функции обработчика ws-сообщения по подписке. Отличие в том, что здесь нет такого понятия как retry

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL