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 ¶
- Constants
- Variables
- func Build(configs []CallConfig, options ...Option) error
- func DecryptBytes(encryptedData []byte, key [16]byte, iv [16]byte) ([]byte, error)
- func DecryptProxy(src io.Reader, dst io.Writer, key [16]byte, iv [16]byte) error
- func DecryptStream(src io.Reader, key [16]byte, iv [16]byte) (io.ReadCloser, error)
- func DefaultTransport() *http.Transport
- func EncryptBytes(data []byte, key [16]byte, iv [16]byte) ([]byte, error)
- func EncryptProxy(src io.Reader, dst io.Writer, key [16]byte, iv [16]byte) error
- func EncryptStream(src io.Reader, key [16]byte, iv [16]byte) (io.ReadCloser, error)
- type CallConfig
- type CallMethod
- type CallPointerType
- type CallReqBytesRespBytes
- type CallReqBytesRespReader
- type CallReqBytesRespWriter
- type CallReqBytesWithArgsRespBytes
- type CallReqBytesWithArgsRespReader
- type CallReqBytesWithArgsRespWriter
- type CallReqQueryRespBytes
- type CallReqQueryRespReader
- type CallReqQueryRespWriter
- type CallReqQueryWithArgsRespBytes
- type CallReqQueryWithArgsRespReader
- type CallReqQueryWithArgsRespWriter
- type CallReqReaderRespBytes
- type CallReqReaderRespReader
- type CallReqReaderRespWriter
- type CallReqReaderWithArgsRespBytes
- type CallReqReaderWithArgsRespReader
- type CallReqReaderWithArgsRespWriter
- type CallReqRespBytes
- type CallReqRespReader
- type CallReqRespWriter
- type CallReqWithArgsRespBytes
- type CallReqWithArgsRespReader
- type CallReqWithArgsRespWriter
- type CallType
- type Entry
- type Level
- type LicenseInfo
- type LicenseType
- type Log
- type Logger
- type Option
- func WithClient(name string, version string) Option
- func WithInstallationID(installationID [16]byte) Option
- func WithLicenseKey(key string) Option
- func WithLogger(logger Logger) Option
- func WithMaxRetries(maxRetries int) Option
- func WithPowTimeout(timeout time.Duration) Option
- func WithTransport(transport *http.Transport) Option
- type ServerErrorResponse
Examples ¶
Constants ¶
const ( DefaultClientName = "sdk" DefaultClientVersion = "1.0.0" DefaultPowTimeout = 30 * time.Second DefaultWaitTime = 10 * time.Second DefaultMaxRetries = 3 )
Variables ¶
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") )
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") )
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 ¶
DecryptBytes decrypts data using GCM streaming method
func DecryptProxy ¶
DecryptProxy decrypts data from src and writes to dst in blocking manner
func DecryptStream ¶
DecryptStream creates a true streaming decryptor using AES-GCM
func DefaultTransport ¶
func EncryptBytes ¶
EncryptBytes encrypts data using GCM streaming method
func EncryptProxy ¶
EncryptProxy encrypts data from src and writes to dst in blocking manner
func EncryptStream ¶
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 CallPointerType ¶
type CallPointerType interface {
*CallReqRespBytes |
*CallReqRespReader |
*CallReqRespWriter |
*CallReqQueryRespBytes |
*CallReqQueryRespReader |
*CallReqQueryRespWriter |
*CallReqWithArgsRespBytes |
*CallReqWithArgsRespReader |
*CallReqWithArgsRespWriter |
*CallReqQueryWithArgsRespBytes |
*CallReqQueryWithArgsRespReader |
*CallReqQueryWithArgsRespWriter |
*CallReqBytesRespBytes |
*CallReqBytesRespReader |
*CallReqBytesRespWriter |
*CallReqReaderRespBytes |
*CallReqReaderRespReader |
*CallReqReaderRespWriter |
*CallReqBytesWithArgsRespBytes |
*CallReqBytesWithArgsRespReader |
*CallReqBytesWithArgsRespWriter |
*CallReqReaderWithArgsRespBytes |
*CallReqReaderWithArgsRespReader |
*CallReqReaderWithArgsRespWriter
}
type CallReqBytesRespBytes ¶
returns a response body as bytes and gets request body as bytes
type CallReqBytesRespReader ¶
returns a reader for response body and gets request body as bytes
type CallReqBytesRespWriter ¶
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 ¶
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 ¶
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 ¶
returns a response body as bytes and gets request body as reader and length
type CallReqReaderRespReader ¶
returns a reader for response body and gets request body as reader and length
type CallReqReaderRespWriter ¶
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 ¶
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 ¶
writes response body to writer
type CallReqWithArgsRespBytes ¶
returns a response body as bytes and gets request position arguments and query parameters
type CallReqWithArgsRespReader ¶
returns a reader for response body and gets request position arguments and query parameters
type CallReqWithArgsRespWriter ¶
writes response body to writer and gets request position arguments and query parameters
type CallType ¶
type CallType interface {
CallReqRespBytes |
CallReqRespReader |
CallReqRespWriter |
CallReqQueryRespBytes |
CallReqQueryRespReader |
CallReqQueryRespWriter |
CallReqWithArgsRespBytes |
CallReqWithArgsRespReader |
CallReqWithArgsRespWriter |
CallReqQueryWithArgsRespBytes |
CallReqQueryWithArgsRespReader |
CallReqQueryWithArgsRespWriter |
CallReqBytesRespBytes |
CallReqBytesRespReader |
CallReqBytesRespWriter |
CallReqReaderRespBytes |
CallReqReaderRespReader |
CallReqReaderRespWriter |
CallReqBytesWithArgsRespBytes |
CallReqBytesWithArgsRespReader |
CallReqBytesWithArgsRespWriter |
CallReqReaderWithArgsRespBytes |
CallReqReaderWithArgsRespReader |
CallReqReaderWithArgsRespWriter
}
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 Option ¶
type Option func(*sdk)
func WithClient ¶
func WithInstallationID ¶
func WithLicenseKey ¶
func WithLogger ¶
func WithMaxRetries ¶
func WithPowTimeout ¶
func WithTransport ¶
type ServerErrorResponse ¶
ServerErrorResponse represents server error response format