---
# System prepended metadata

title: Untitled

---

```go!
package main

import "context"

// placeholder
type MQItem struct {
}

// placeholder
type Config struct {
}

// placeholder
type MonitoringEvent struct {
}

type RanApiCLient interface {
	GetConfig(cfgHash string) (*Config, error)
	SendMetrics([]byte) error
	SendHistoryMetrics([][]byte) ([]uint64, error)
}

type LoraClient interface {
	Send(event []byte) error
}

type ConfigStorage interface {
	GetConfig() (*Config, error)
	Store(*Config) error
}

type Storage interface {
	Push(item *MQItem) error
	Pull(count int) ([]*MQItem, error)
	Confirm(ids []int64) error
	Count() int
}

type Scheduler interface {
	Send(e *MonitoringEvent) error
	Run(ctx context.Context) error
}

type MetricsCollector interface {
	Run(ctx context.Context) error
}

type HistorySender interface {
	Run(ctx context.Context) error
}

// dependencies

type RanApiCLientImp struct {    
    addresses []*ServerInstance
    token     string
    ...
}

type LoraClient struct {
    ranProxysocket string
    ...
}

type StorageImp struct {
	options *StorageOptions
    ...
}

type HistorySenderImp struct {
	ranApiCLient *RanApiCLient
	storage      *Storage
    ...
}

// Scheduler вместо "realtime sender" потому, что он будет решать, когда отсылать метрики по лоре (потому что только в этом месте известно состояние "соединения" )
type SchedulerImp struct {
	ranApiCLient *RanApiCLient
	loraClient   *LoraClient
	storage      *Storage
	...
    
	options *SchedulerOptions
	loramon_sending bool
}

func (s *SchedulerImp) prepareLoraMonitoring(event *MonitoringEvent) ([]byte, error) {
    return nil, errors.New("not implemented")
}

type MetricsCollectorImp struct {
	Scheduler *Scheduler
    ...
}
```