sdk

package
v0.0.0-...-e8b7ea3 Latest Latest
Warning

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

Go to latest
Published: Sep 27, 2025 License: AGPL-3.0, AGPL-3.0-or-later Imports: 27 Imported by: 0

Documentation

Overview

Package sdk provides enterprise-grade Go SDK for secure integration with VXControl Cloud Platform APIs.

The SDK implements a comprehensive security framework featuring memory-hard proof-of-work protection, end-to-end AES-GCM encryption, Ed25519 signatures, and automatic retry logic. It offers 24 strongly-typed function patterns covering all request/response scenarios with built-in connection pooling, HTTP/2 support, and streaming architecture for high-performance integration with cloud services.

Architecture Overview

The SDK consists of several core components working together:

  • Call Generation: 24 strongly-typed function patterns for all API scenarios
  • Transport Layer: HTTP/2 optimized transport with connection pooling
  • Security Engine: PoW challenges, AES-GCM encryption, Ed25519 signatures
  • License System: Cryptographic license validation with tier enforcement
  • Logging Framework: Structured logging with configurable levels and formats

Quick Start

Basic SDK usage involves defining client structure, configuring endpoints, and building:

import "github.com/vxcontrol/cloud/sdk"

// Define client with typed API functions
type Client struct {
    CheckUpdates  sdk.CallReqBytesRespBytes    // JSON request/response
    DownloadFile  sdk.CallReqQueryRespWriter   // Query params, stream response
    UploadData    sdk.CallReqReaderRespBytes   // Stream request, JSON response
}

// Configure endpoints
configs := []sdk.CallConfig{
    {
        Calls:  []any{&client.CheckUpdates},
        Host:   "api.example.com",
        Name:   "check_updates",
        Path:   "/api/v1/updates/check",
        Method: sdk.CallMethodPOST,
    },
    {
        Calls:  []any{&client.DownloadFile},
        Host:   "files.example.com",
        Name:   "download_file",
        Path:   "/files/:id",
        Method: sdk.CallMethodGET,
    },
}

// Initialize SDK with options
err := sdk.Build(configs,
    sdk.WithClient("MyApp", "1.0.0"),
    sdk.WithLicenseKey("XXXX-XXXX-XXXX-XXXX"),
    sdk.WithPowTimeout(30*time.Second),
    sdk.WithMaxRetries(3),
)
if err != nil {
    return err
}

// Use generated functions
updateData := []byte(`{"version": "1.0.0"}`)
response, err := client.CheckUpdates(context.Background(), updateData)

Call Function Types

The SDK provides 24 strongly-typed function patterns covering all request/response scenarios:

## Basic Patterns (No Parameters)

  • CallReqRespBytes: Simple GET endpoints returning JSON/binary data
  • CallReqRespReader: File downloads or large data streams
  • CallReqRespWriter: Direct output streaming to custom writers

## Query Parameter Patterns

  • CallReqQueryRespBytes: Filtered queries (?limit=10&offset=20)
  • CallReqQueryRespReader: Query-based file downloads
  • CallReqQueryRespWriter: Query-based streaming responses

## Path Argument Patterns

  • CallReqWithArgsRespBytes: RESTful resource access (/users/:id)
  • CallReqWithArgsRespReader: Resource-specific file downloads
  • CallReqWithArgsRespWriter: Resource-specific streaming

## Combined Patterns

  • CallReqQueryWithArgsRespBytes: Path args + query params
  • CallReqQueryWithArgsRespReader: Complex resource queries with streaming
  • CallReqQueryWithArgsRespWriter: Advanced query scenarios

## Request Body Patterns

  • CallReqBytesRespBytes: JSON API calls (POST/PUT with JSON payload)
  • CallReqBytesRespReader: JSON request with streaming response
  • CallReqBytesRespWriter: JSON request with writer output
  • CallReqReaderRespBytes: File uploads with JSON response
  • CallReqReaderRespReader: Stream-to-stream processing
  • CallReqReaderRespWriter: Upload streaming with output streaming

## Advanced Combined Patterns

  • CallReqBytesWithArgsRespBytes: RESTful updates with JSON payloads
  • CallReqBytesWithArgsRespReader: Resource updates with streaming responses
  • CallReqBytesWithArgsRespWriter: Resource updates with output streaming
  • CallReqReaderWithArgsRespBytes: File uploads to specific resources
  • CallReqReaderWithArgsRespReader: Stream processing with resource targeting
  • CallReqReaderWithArgsRespWriter: Complex stream processing scenarios

Example usage patterns:

// Simple JSON API
type API struct {
    GetUser    sdk.CallReqWithArgsRespBytes      // GET /users/:id
    UpdateUser sdk.CallReqBytesWithArgsRespBytes // PUT /users/:id + JSON body
    ListUsers  sdk.CallReqQueryRespBytes         // GET /users?limit=10
    UploadFile sdk.CallReqReaderRespBytes        // POST /upload + file stream
}

Security Framework

## Proof-of-Work Protection

All API calls require solving memory-hard proof-of-work challenges:

// Automatic PoW solving process:
// 1. Request challenge ticket from server
// 2. Solve memory-hard puzzle (12-1024KB, variable AES iterations)
// 3. Include PoW signature with every API request
// 4. Server validates signature before processing

PoW Algorithm Features:

  • Memory-hard algorithm designed for GPU and FPGA resistance
  • Dynamic difficulty scaling based on server load and license tier
  • Variable parameters prevent hardware optimization (millions of combinations)
  • Configurable timeout support for different hardware capabilities

## Cryptographic Protection

Multi-layer encryption and signature system:

// Session Key Generation
sessionKey := [16]byte{} // AES-128 for request/response encryption
sessionIV := [16]byte{}  // Unique IV per request

// NaCL Key Exchange
clientPublic, clientPrivate := box.GenerateKey(rand.Reader)
sharedKey := box.Precompute(serverPublic, clientPrivate)

// Request Encryption
encryptedBody := EncryptStream(requestBody, sessionKey, sessionIV)

// Response Decryption
decryptedResponse := DecryptStream(responseBody, sessionKey, sessionIV)

Cryptographic Features:

  • AES-GCM streaming encryption with 1KB configurable chunks
  • NaCL (Curve25519) key exchange for session key protection
  • Ed25519 signatures for data integrity verification
  • Forward secrecy through daily server key rotation

## License System

Enterprise license validation with cryptographic verification:

// License introspection
info, err := sdk.IntrospectLicenseKey("XXXX-XXXX-XXXX-XXXX")
if err != nil {
    return err
}

// License properties
switch info.Type {
case sdk.LicenseExpireable:
    fmt.Printf("License expires: %v", info.ExpiredAt)
case sdk.LicensePerpetual:
    fmt.Println("Perpetual license")
}

// Feature flags
for i, flag := range info.Flags {
    fmt.Printf("Feature %d: %v", i, flag)
}

License Features:

  • Base32 encoding with validation checksums
  • Cryptographic verification prevents tampering
  • Expiration time validation with day-aligned precision
  • Feature flags for tier-based access control
  • PBKDF2-based fingerprinting for license correlation

Streaming Architecture

## Encryption Streaming

Memory-efficient encryption for large data transfers:

// Encrypt large files without memory accumulation
file, err := os.Open("large-file.dat")
if err != nil {
    return err
}
defer file.Close()

// Create streaming encryptor
encryptedStream, err := sdk.EncryptStream(file, sessionKey, sessionIV)
if err != nil {
    return err
}
defer encryptedStream.Close()

// Stream encrypted data to destination
_, err = io.Copy(destination, encryptedStream)

## Decryption Streaming

Streaming decryption with authentication validation:

// Decrypt response stream directly to file
outputFile, err := os.Create("decrypted-output.dat")
if err != nil {
    return err
}
defer outputFile.Close()

// Use DecryptProxy for direct streaming
err = sdk.DecryptProxy(encryptedResponse, outputFile, sessionKey, sessionIV)
if err != nil {
    return fmt.Errorf("decryption failed: %w", err)
}

Streaming Features:

  • Configurable chunk sizes (default 16KB, max 1MB)
  • Per-chunk authentication prevents tampering
  • Random nonces ensure GCM security properties
  • No memory accumulation regardless of data size

Transport Layer

## HTTP/2 Optimization

Production-optimized transport configuration:

transport := sdk.DefaultTransport()

// Customize for specific requirements
transport.MaxConnsPerHost = 500
transport.ResponseHeaderTimeout = 5 * time.Minute

err := sdk.Build(configs, sdk.WithTransport(transport))

Transport Features:

  • HTTP/2 with automatic protocol negotiation
  • Connection pooling with configurable limits
  • TLS 1.2+ with certificate validation
  • Proxy support with environment variable detection

## Request Processing

Complete request lifecycle with automatic security:

// SDK automatically handles:
// 1. PoW ticket acquisition
// 2. Challenge solving with configurable timeout
// 3. Request encryption and signing
// 4. Response decryption and validation
// 5. Error handling and retry logic

Processing Features:

  • Automatic retry logic for temporary errors
  • Exponential backoff with server-provided timing
  • Context cancellation support throughout
  • Comprehensive error classification and handling

Error Handling

## Error Classification

Structured error handling with automatic retry logic:

data, err := api.SomeCall(ctx, requestData)
if err != nil {
    switch {
    case errors.Is(err, sdk.ErrTooManyRequestsRPM):
        // Temporary: Will be retried automatically with server timing
        log.Info("Rate limited, retrying with backoff")

    case errors.Is(err, sdk.ErrForbidden):
        // Fatal: Check license validity or authentication
        log.Error("Access denied - verify license key")

    case errors.Is(err, sdk.ErrExperimentTimeout):
        // Temporary: Increase PoW timeout for slower systems
        log.Warn("PoW timeout - consider increasing timeout")

    default:
        log.Error("Unexpected error:", err)
    }
}

## Error Types

Temporary Errors (automatically retried):

  • ErrBadGateway: Server maintenance or overload
  • ErrServerInternal: Temporary server issues
  • ErrTooManyRequests: Standard rate limiting
  • ErrTooManyRequestsRPM: Rate limiting with server-provided backoff
  • ErrExperimentTimeout: PoW solving timeout (increase timeout or retry)

Fatal Errors (no retry):

  • ErrBadRequest: Invalid request format or parameters
  • ErrForbidden: Invalid license or insufficient permissions
  • ErrNotFound: Unknown endpoint or resource
  • ErrTooManyRequestsRPH/RPD: Long-term rate limits exceeded
  • ErrInvalidSignature: Cryptographic validation failure
  • ErrReplayAttack: Security violation detected

Logging Integration

## Structured Logging

Built-in logging framework with multiple adapters:

import "github.com/sirupsen/logrus"

// Use default logger
logger := sdk.DefaultLogger()
logger.SetLevel(sdk.LevelDebug)

// Or wrap existing logrus instance
logrusLogger := logrus.New()
logrusLogger.SetLevel(logrus.InfoLevel)
wrappedLogger := sdk.WrapLogrus(logrusLogger)

// Configure SDK with logger
err := sdk.Build(configs, sdk.WithLogger(wrappedLogger))

## Custom Logger Integration

Implement Logger interface for custom logging backends:

type CustomLogger struct {
    // Your logging implementation
}

func (l *CustomLogger) SetLevel(level sdk.Level) { /* ... */ }
func (l *CustomLogger) GetLevel() sdk.Level { /* ... */ }
func (l *CustomLogger) WithError(err error) sdk.Entry { /* ... */ }
func (l *CustomLogger) WithField(key string, value any) sdk.Entry { /* ... */ }
// ... implement all Logger interface methods

Logging Features:

  • Contextual logging with fields and errors
  • Configurable log levels (Trace, Debug, Info, Warn, Error, Fatal, Panic)
  • Request tracing with timing and retry information
  • Cryptographic operation logging for security auditing

Advanced Configuration

## Option Pattern

Flexible SDK configuration using functional options:

err := sdk.Build(configs,
    // Required: Client identification
    sdk.WithClient("MySecurityTool", "2.1.0"),

    // Optional: License for premium features
    sdk.WithLicenseKey("XXXX-XXXX-XXXX-XXXX"),

    // Optional: Performance tuning
    sdk.WithPowTimeout(60*time.Second),    // For slower systems
    sdk.WithMaxRetries(5),                 // For unreliable networks

    // Optional: Custom transport
    sdk.WithTransport(customTransport),

    // Optional: Structured logging
    sdk.WithLogger(customLogger),

    // Optional: Installation tracking
    sdk.WithInstallationID(installationUUID),
)

## Transport Customization

Advanced HTTP transport configuration:

transport := sdk.DefaultTransport()

// Corporate proxy configuration
proxyURL, _ := url.Parse("http://proxy.company.com:8080")
transport.Proxy = http.ProxyURL(proxyURL)

// Custom TLS configuration
transport.TLSClientConfig = &tls.Config{
    MinVersion: tls.VersionTLS12,
    // Add custom certificate validation
}

// Performance tuning
transport.MaxConnsPerHost = 500
transport.ResponseHeaderTimeout = 5 * time.Minute

err := sdk.Build(configs, sdk.WithTransport(transport))

Path Templates

## RESTful Resource Patterns

Automatic path argument substitution for RESTful APIs:

// Configure endpoint with path arguments
{
    Calls:  []any{&client.GetUserPosts},
    Path:   "/users/:userId/posts/:postId",  // Path template
    Method: sdk.CallMethodGET,
}

// Generated function signature includes args parameter
posts, err := client.GetUserPosts(ctx, []string{"123", "456"})
// Generates: GET /users/123/posts/456

## Query Parameter Generation

Automatic query string generation from Go models:

type QueryParams struct {
    Limit  int    `url:"limit"`
    Offset int    `url:"offset"`
    Filter string `url:"filter"`
}

params := QueryParams{Limit: 10, Offset: 20, Filter: "active"}

// Convert to query map for SDK
queryMap := map[string]string{
    "limit":  "10",
    "offset": "20",
    "filter": "active",
}

results, err := client.SearchItems(ctx, queryMap)
// Generates: GET /search?limit=10&offset=20&filter=active

Performance Optimization

## Connection Management

Optimized connection pooling and reuse:

// Default settings optimized for production
transport := sdk.DefaultTransport()
// MaxIdleConns: 50 (total idle connections)
// MaxIdleConnsPerHost: 10 (per-host idle connections)
// MaxConnsPerHost: 300 (max active connections per host)
// IdleConnTimeout: 90s (idle connection lifetime)

## Streaming Performance

Memory-efficient processing for large data:

// Upload large file without loading into memory
file, err := os.Open("large-dataset.json")
if err != nil {
    return err
}
defer file.Close()

stat, _ := file.Stat()
response, err := client.ProcessLargeData(ctx, file, stat.Size())

// Download large response directly to file
outputFile, err := os.Create("processed-result.json")
if err != nil {
    return err
}
defer outputFile.Close()

err = client.GetLargeResult(ctx, queryParams, outputFile)

License Management

## License Validation

Comprehensive license verification and introspection:

// Validate license before SDK initialization
licenseInfo, err := sdk.IntrospectLicenseKey("XXXX-XXXX-XXXX-XXXX")
if err != nil {
    return fmt.Errorf("invalid license: %w", err)
}

if !licenseInfo.IsValid() {
    return fmt.Errorf("license is invalid or expired")
}

// Check license type and permissions
switch licenseInfo.Type {
case sdk.LicenseExpireable:
    if licenseInfo.IsExpired() {
        return fmt.Errorf("license expired on %v", licenseInfo.ExpiredAt)
    }
    fmt.Printf("License valid until %v", licenseInfo.ExpiredAt)

case sdk.LicensePerpetual:
    fmt.Println("Perpetual license - no expiration")
}

// Feature flag checking
if licenseInfo.Flags[0] {
    fmt.Println("Premium feature enabled")
}

## License Encoding

Base32 encoding with multiple validation layers:

// License key format: XXXX-XXXX-XXXX-XXXX

Production Deployment

## Configuration Best Practices

Recommended production configuration:

// Production-ready SDK setup
configs := []sdk.CallConfig{
    // ... your API endpoints
}

err := sdk.Build(configs,
    // Required: Application identification
    sdk.WithClient("YourApp", appVersion),

    // Recommended: License for premium features
    sdk.WithLicenseKey(os.Getenv("VXCONTROL_LICENSE")),

    // Performance: Adjust for your hardware
    sdk.WithPowTimeout(45*time.Second),
    sdk.WithMaxRetries(5),

    // Monitoring: Production logging
    sdk.WithLogger(productionLogger),

    // Identity: Stable installation tracking
    sdk.WithInstallationID(persistentInstallationID),
)

## Monitoring Integration

SDK provides comprehensive metrics for monitoring:

// Logger captures:
// - Request timing and retry information
// - PoW solving performance and difficulty
// - Cryptographic operation success/failure
// - Network errors and recovery attempts
// - License validation and tier information

## Error Recovery

Robust error handling for production environments:

// Automatic recovery scenarios:
// - Network timeouts: Automatic retry with exponential backoff
// - Rate limiting: Server-provided backoff timing respected
// - PoW timeouts: Configurable timeout with retry support
// - Server overload: Automatic retry with jittered delays
// - License issues: Clear error messages for resolution

Thread Safety

All SDK operations are thread-safe and optimized for concurrent usage:

// Single SDK instance can handle concurrent requests
var client Client
sdk.Build(configs, options...)

// Safe concurrent API calls
go func() {
    client.CheckUpdates(ctx1, data1)
}()
go func() {
    client.ReportError(ctx2, data2)
}()

Concurrency Features:

  • Thread-safe connection pooling
  • Concurrent PoW solving (one per request)
  • Shared session key generation
  • Atomic retry counters and statistics

Thread Safety Implementation:

  • Immutable configuration after Build()
  • Per-request context isolation
  • Lock-free hot paths for performance
  • Safe concurrent access to shared resources

Index

Examples

Constants

View Source
const (
	DefaultClientName    = "sdk"
	DefaultClientVersion = "1.0.0"
	DefaultPowTimeout    = 30 * time.Second
	DefaultWaitTime      = 10 * time.Second
	DefaultMaxRetries    = 3
)

Variables

View Source
var (
	ErrInvalidFormula    = errors.New("corrupted formula")
	ErrCauldronBlocked   = errors.New("elixir brewing failed")
	ErrAlchemicalFailure = errors.New("mystical process disrupted")
	ErrExperimentTimeout = errors.New("transmutation time exceeded")
	ErrPhilosopherStone  = errors.New("philosopher stone not found")
)
View Source
var (
	ErrInvalidRequest       = errors.New("invalid request")
	ErrInvalidConfiguration = errors.New("invalid configuration")
	ErrClientInternal       = errors.New("internal client error")

	// server errors - needs exact match with server response.code
	ErrBadGateway         = errors.New("bad gateway")           // temporary - can retry
	ErrServerInternal     = errors.New("internal server error") // temporary - can retry
	ErrBadRequest         = errors.New("bad request")           // fatal - don't retry
	ErrForbidden          = errors.New("forbidden")             // fatal - don't retry
	ErrNotFound           = errors.New("not found")             // fatal - don't retry
	ErrTooManyRequests    = errors.New("rate limit exceeded")   // temporary - can retry with default delay
	ErrTooManyRequestsRPM = errors.New("RPM limit exceeded")    // temporary - can retry with RestTime
	ErrTooManyRequestsRPH = errors.New("RPH limit exceeded")    // fatal - too long wait
	ErrTooManyRequestsRPD = errors.New("RPD limit exceeded")    // fatal - too long wait
	ErrInvalidSignature   = errors.New("invalid signature")     // fatal - crypto issue
	ErrReplayAttack       = errors.New("replay attack")         // fatal - security issue

	// client errors
	ErrTicketFailed       = errors.New("failed to get ticket")
	ErrPoWFailed          = errors.New("proof of work failed")
	ErrCryptoFailed       = errors.New("cryptographic operation failed")
	ErrRequestFailed      = errors.New("request execution failed")
	ErrMaxRetriesExceeded = errors.New("maximum retry attempts exceeded")
)
View Source
var ErrInvalidLicence = errors.New("invalid license")

Functions

func Build

func Build(configs []CallConfig, options ...Option) error
Example
var calls struct {
	DownloadInstaller CallReqRespWriter
	SendError         CallReqBytesRespBytes
}
callsConfig := []CallConfig{
	{
		Calls:  []any{&calls.DownloadInstaller},
		Host:   "localhost",
		Name:   "download-installer",
		Path:   "/api/v1/downloads/installer",
		Method: CallMethodGET,
	},
	{
		Calls:  []any{&calls.SendError},
		Host:   "localhost",
		Name:   "send-error",
		Path:   "/api/v1/support/errors",
		Method: CallMethodPOST,
	},
}
if err := Build(callsConfig); err != nil {
	panic(fmt.Sprintf("failed to build SDK: %v", err))
}

fmt.Println(calls.DownloadInstaller != nil)
fmt.Println(calls.SendError != nil)
Output:

true
true

func DecryptBytes

func DecryptBytes(encryptedData []byte, key [16]byte, iv [16]byte) ([]byte, error)

DecryptBytes decrypts data using GCM streaming method

func DecryptProxy

func DecryptProxy(src io.Reader, dst io.Writer, key [16]byte, iv [16]byte) error

DecryptProxy decrypts data from src and writes to dst in blocking manner

func DecryptStream

func DecryptStream(src io.Reader, key [16]byte, iv [16]byte) (io.ReadCloser, error)

DecryptStream creates a true streaming decryptor using AES-GCM

func DefaultTransport

func DefaultTransport() *http.Transport

func EncryptBytes

func EncryptBytes(data []byte, key [16]byte, iv [16]byte) ([]byte, error)

EncryptBytes encrypts data using GCM streaming method

func EncryptProxy

func EncryptProxy(src io.Reader, dst io.Writer, key [16]byte, iv [16]byte) error

EncryptProxy encrypts data from src and writes to dst in blocking manner

func EncryptStream

func EncryptStream(src io.Reader, key [16]byte, iv [16]byte) (io.ReadCloser, error)

EncryptStream creates a true streaming encryptor using AES-GCM

Types

type CallConfig

type CallConfig struct {
	Calls  []any      // slice of pointers to CallType function (each must be CallPointerType)
	Host   string     // server host (domain name or IP address)
	Name   string     // unique route name on the server side
	Path   string     // route path may contain position arguments (e.g. /users/:id)
	Method CallMethod // HTTP method (supports: GET, POST, PUT, PATCH, DELETE)
}

type CallMethod

type CallMethod string
const (
	CallMethodGET    CallMethod = "GET"
	CallMethodPOST   CallMethod = "POST"
	CallMethodPUT    CallMethod = "PUT"
	CallMethodPATCH  CallMethod = "PATCH"
	CallMethodDELETE CallMethod = "DELETE"
)

type CallReqBytesRespBytes

type CallReqBytesRespBytes func(ctx context.Context, body []byte) ([]byte, error)

returns a response body as bytes and gets request body as bytes

type CallReqBytesRespReader

type CallReqBytesRespReader func(ctx context.Context, body []byte) (io.ReadCloser, error)

returns a reader for response body and gets request body as bytes

type CallReqBytesRespWriter

type CallReqBytesRespWriter func(ctx context.Context, body []byte, w io.Writer) error

writes response body to writer and gets request body as bytes

type CallReqBytesWithArgsRespBytes

type CallReqBytesWithArgsRespBytes func(ctx context.Context, args []string, body []byte) ([]byte, error)

returns a response body as bytes and gets request position arguments and request body as bytes

type CallReqBytesWithArgsRespReader

type CallReqBytesWithArgsRespReader func(ctx context.Context, args []string, body []byte) (io.ReadCloser, error)

returns a reader for response body and gets request position arguments and request body as bytes

type CallReqBytesWithArgsRespWriter

type CallReqBytesWithArgsRespWriter func(ctx context.Context, args []string, body []byte, w io.Writer) error

writes response body to writer and gets request position arguments and request body as bytes

type CallReqQueryRespBytes

type CallReqQueryRespBytes func(ctx context.Context, query map[string]string) ([]byte, error)

returns a response body as bytes and gets request query parameters

type CallReqQueryRespReader

type CallReqQueryRespReader func(ctx context.Context, query map[string]string) (io.ReadCloser, error)

returns a reader for response body and gets request query parameters

type CallReqQueryRespWriter

type CallReqQueryRespWriter func(ctx context.Context, query map[string]string, w io.Writer) error

writes response body to writer and gets request query parameters

type CallReqQueryWithArgsRespBytes

type CallReqQueryWithArgsRespBytes func(ctx context.Context, args []string, query map[string]string) ([]byte, error)

returns a response body as bytes and gets request position arguments and query parameters

type CallReqQueryWithArgsRespReader

type CallReqQueryWithArgsRespReader func(ctx context.Context, args []string, query map[string]string) (io.ReadCloser, error)

returns a reader for response body and gets request position arguments and query parameters

type CallReqQueryWithArgsRespWriter

type CallReqQueryWithArgsRespWriter func(ctx context.Context, args []string, query map[string]string, w io.Writer) error

writes response body to writer and gets request position arguments and query parameters

type CallReqReaderRespBytes

type CallReqReaderRespBytes func(ctx context.Context, r io.Reader, l int64) ([]byte, error)

returns a response body as bytes and gets request body as reader and length

type CallReqReaderRespReader

type CallReqReaderRespReader func(ctx context.Context, r io.Reader, l int64) (io.ReadCloser, error)

returns a reader for response body and gets request body as reader and length

type CallReqReaderRespWriter

type CallReqReaderRespWriter func(ctx context.Context, r io.Reader, l int64, w io.Writer) error

writes response body to writer and gets request body as reader and length

type CallReqReaderWithArgsRespBytes

type CallReqReaderWithArgsRespBytes func(ctx context.Context, args []string, r io.Reader, l int64) ([]byte, error)

returns a response body as bytes and gets position arguments and request body as reader and length

type CallReqReaderWithArgsRespReader

type CallReqReaderWithArgsRespReader func(ctx context.Context, args []string, r io.Reader, l int64) (io.ReadCloser, error)

returns a reader for response body and gets position arguments and request body as reader and length

type CallReqReaderWithArgsRespWriter

type CallReqReaderWithArgsRespWriter func(ctx context.Context, args []string, r io.Reader, l int64, w io.Writer) error

writes response body to writer and gets position arguments and request body as reader and length

type CallReqRespBytes

type CallReqRespBytes func(ctx context.Context) ([]byte, error)

returns a response body as bytes

type CallReqRespReader

type CallReqRespReader func(ctx context.Context) (io.ReadCloser, error)

returns a reader for response body

type CallReqRespWriter

type CallReqRespWriter func(ctx context.Context, w io.Writer) error

writes response body to writer

type CallReqWithArgsRespBytes

type CallReqWithArgsRespBytes func(ctx context.Context, args []string) ([]byte, error)

returns a response body as bytes and gets request position arguments and query parameters

type CallReqWithArgsRespReader

type CallReqWithArgsRespReader func(ctx context.Context, args []string) (io.ReadCloser, error)

returns a reader for response body and gets request position arguments and query parameters

type CallReqWithArgsRespWriter

type CallReqWithArgsRespWriter func(ctx context.Context, args []string, w io.Writer) error

writes response body to writer and gets request position arguments and query parameters

type Entry

type Entry interface {
	WithError(err error) Entry
	WithField(key string, value any) Entry
	WithFields(fields map[string]any) Entry
	WithContext(ctx context.Context) Entry
	Log
}

type Level

type Level string
const (
	LevelTrace Level = "trace"
	LevelDebug Level = "debug"
	LevelInfo  Level = "info"
	LevelWarn  Level = "warn"
	LevelError Level = "error"
	LevelFatal Level = "fatal"
	LevelPanic Level = "panic"
)

type LicenseInfo

type LicenseInfo struct {
	Type      LicenseType // license type (expireable or perpetual)
	Flags     [7]bool     // permission flags
	ExpiredAt time.Time   // license expired at
	CreatedAt time.Time   // license created at
}

func IntrospectLicenseKey

func IntrospectLicenseKey(key string) (*LicenseInfo, error)

func (*LicenseInfo) IsExpired

func (l *LicenseInfo) IsExpired() bool

func (*LicenseInfo) IsValid

func (l *LicenseInfo) IsValid() bool

type LicenseType

type LicenseType uint8
const (
	LicenseUnknown LicenseType = iota
	LicenseExpireable
	LicensePerpetual
)

func (*LicenseType) Scan

func (t *LicenseType) Scan(value any) error

func (LicenseType) String

func (t LicenseType) String() string

type Log

type Log interface {
	Trace(args ...any)
	Tracef(format string, args ...any)
	Debug(args ...any)
	Debugf(format string, args ...any)
	Info(args ...any)
	Infof(format string, args ...any)
	Warn(args ...any)
	Warnf(format string, args ...any)
	Error(args ...any)
	Errorf(format string, args ...any)
	Fatal(args ...any)
	Fatalf(format string, args ...any)
	Panic(args ...any)
	Panicf(format string, args ...any)
}

type Logger

type Logger interface {
	SetLevel(level Level)
	GetLevel() Level
	Entry
}

func DefaultLogger

func DefaultLogger() Logger

func WrapLogrus

func WrapLogrus(l *logrus.Logger) Logger

type Option

type Option func(*sdk)

func WithClient

func WithClient(name string, version string) Option

func WithInstallationID

func WithInstallationID(installationID [16]byte) Option

func WithLicenseKey

func WithLicenseKey(key string) Option

func WithLogger

func WithLogger(logger Logger) Option

func WithMaxRetries

func WithMaxRetries(maxRetries int) Option

func WithPowTimeout

func WithPowTimeout(timeout time.Duration) Option

func WithTransport

func WithTransport(transport *http.Transport) Option

type ServerErrorResponse

type ServerErrorResponse struct {
	Status string `json:"status"`
	Code   string `json:"code"`
}

ServerErrorResponse represents server error response format

Jump to

Keyboard shortcuts

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