[DEPRECATED] Go implementation of plcbundle
at main 6.8 kB view raw
1package server 2 3import ( 4 "net/http" 5 "time" 6 7 "tangled.org/atscan.net/plcbundle-go/bundle" 8) 9 10// Server serves bundle data over HTTP 11type Server struct { 12 manager *bundle.Manager 13 addr string 14 config *Config 15 startTime time.Time 16 httpServer *http.Server 17} 18 19// Config configures the server 20type Config struct { 21 Addr string 22 SyncMode bool 23 SyncInterval time.Duration 24 EnableWebSocket bool 25 EnableResolver bool 26 Version string 27} 28 29// StatusResponse is the /status endpoint response 30type StatusResponse struct { 31 Server ServerStatus `json:"server"` 32 Bundles BundleStatus `json:"bundles"` 33 Mempool *MempoolStatus `json:"mempool,omitempty"` 34 DIDIndex *DIDIndexStatus `json:"didindex,omitempty"` 35 Resolver *ResolverStatus `json:"resolver,omitempty"` 36} 37 38// ServerStatus contains server information 39type ServerStatus struct { 40 Version string `json:"version"` 41 Origin string `json:"origin,omitempty"` 42 SyncMode bool `json:"sync_mode"` 43 SyncIntervalSeconds int `json:"sync_interval_seconds,omitempty"` 44 WebSocketEnabled bool `json:"websocket_enabled"` 45 ResolverEnabled bool `json:"resolver_enabled"` 46 HandleResolver string `json:"handle_resolver,omitempty"` 47 UptimeSeconds int `json:"uptime_seconds"` 48} 49 50// DIDIndexStatus contains DID index statistics 51type DIDIndexStatus struct { 52 Enabled bool `json:"enabled"` 53 Exists bool `json:"exists"` 54 TotalDIDs int64 `json:"total_dids"` 55 IndexedDIDs int64 `json:"indexed_dids"` 56 MempoolDIDs int64 `json:"mempool_dids,omitempty"` 57 LastBundle int `json:"last_bundle"` 58 ShardCount int `json:"shard_count"` 59 CachedShards int `json:"cached_shards"` 60 CacheLimit int `json:"cache_limit"` 61 CacheHitRate float64 `json:"cache_hit_rate"` 62 CacheHits int64 `json:"cache_hits"` 63 CacheMisses int64 `json:"cache_misses"` 64 TotalLookups int64 `json:"total_lookups"` 65 UpdatedAt time.Time `json:"updated_at"` 66 Version int `json:"version,omitempty"` 67 Format string `json:"format,omitempty"` 68 HotShards []int `json:"hot_shards,omitempty"` 69 70 // Lookup performance metrics 71 AvgLookupTimeMs float64 `json:"avg_lookup_time_ms"` // All-time average 72 RecentAvgLookupTimeMs float64 `json:"recent_avg_lookup_time_ms"` // Recent average 73 MinLookupTimeMs float64 `json:"min_lookup_time_ms,omitempty"` // Fastest 74 MaxLookupTimeMs float64 `json:"max_lookup_time_ms,omitempty"` // Slowest 75 P50LookupTimeMs float64 `json:"p50_lookup_time_ms,omitempty"` // Median 76 P95LookupTimeMs float64 `json:"p95_lookup_time_ms,omitempty"` // 95th percentile 77 P99LookupTimeMs float64 `json:"p99_lookup_time_ms,omitempty"` // 99th percentile 78 RecentSampleSize int `json:"recent_sample_size,omitempty"` // How many samples 79} 80 81// ResolverStatus contains DID document resolver performance metrics 82type ResolverStatus struct { 83 Enabled bool `json:"enabled"` 84 HandleResolver string `json:"handle_resolver,omitempty"` 85 86 // Resolution counts 87 TotalResolutions int64 `json:"total_resolutions"` 88 MempoolHits int64 `json:"mempool_hits"` 89 BundleHits int64 `json:"bundle_hits"` 90 Errors int64 `json:"errors"` 91 SuccessRate float64 `json:"success_rate"` 92 MempoolHitRate float64 `json:"mempool_hit_rate"` 93 94 // Overall timing (all-time averages) 95 AvgTotalTimeMs float64 `json:"avg_total_time_ms"` 96 AvgMempoolTimeMs float64 `json:"avg_mempool_time_ms"` 97 AvgIndexTimeMs float64 `json:"avg_index_time_ms,omitempty"` 98 AvgLoadOpTimeMs float64 `json:"avg_load_op_time_ms,omitempty"` 99 100 // Recent performance (last N resolutions) 101 RecentAvgTotalTimeMs float64 `json:"recent_avg_total_time_ms"` 102 RecentAvgMempoolTimeMs float64 `json:"recent_avg_mempool_time_ms"` 103 RecentAvgIndexTimeMs float64 `json:"recent_avg_index_time_ms,omitempty"` 104 RecentAvgLoadTimeMs float64 `json:"recent_avg_load_time_ms,omitempty"` 105 RecentSampleSize int `json:"recent_sample_size"` 106 107 // Percentiles (total response time) 108 MinTotalTimeMs float64 `json:"min_total_time_ms,omitempty"` 109 MaxTotalTimeMs float64 `json:"max_total_time_ms,omitempty"` 110 P50TotalTimeMs float64 `json:"p50_total_time_ms,omitempty"` 111 P95TotalTimeMs float64 `json:"p95_total_time_ms,omitempty"` 112 P99TotalTimeMs float64 `json:"p99_total_time_ms,omitempty"` 113 114 // Breakdown percentiles (for bundle resolutions only) 115 P95IndexTimeMs float64 `json:"p95_index_time_ms,omitempty"` 116 P95LoadOpTimeMs float64 `json:"p95_load_op_time_ms,omitempty"` 117} 118 119// BundleStatus contains bundle statistics 120type BundleStatus struct { 121 Count int `json:"count"` 122 FirstBundle int `json:"first_bundle,omitempty"` 123 LastBundle int `json:"last_bundle,omitempty"` 124 TotalSize int64 `json:"total_size"` 125 UncompressedSize int64 `json:"uncompressed_size,omitempty"` 126 CompressionRatio float64 `json:"compression_ratio,omitempty"` 127 TotalOperations int `json:"total_operations,omitempty"` 128 AvgOpsPerHour int `json:"avg_ops_per_hour,omitempty"` 129 StartTime time.Time `json:"start_time,omitempty"` 130 EndTime time.Time `json:"end_time,omitempty"` 131 UpdatedAt time.Time `json:"updated_at"` 132 HeadAgeSeconds int `json:"head_age_seconds,omitempty"` 133 RootHash string `json:"root_hash,omitempty"` 134 HeadHash string `json:"head_hash,omitempty"` 135 Gaps int `json:"gaps,omitempty"` 136 HasGaps bool `json:"has_gaps"` 137 GapNumbers []int `json:"gap_numbers,omitempty"` 138} 139 140// MempoolStatus contains mempool statistics 141type MempoolStatus struct { 142 Count int `json:"count"` 143 TargetBundle int `json:"target_bundle"` 144 CanCreateBundle bool `json:"can_create_bundle"` 145 MinTimestamp time.Time `json:"min_timestamp"` 146 Validated bool `json:"validated"` 147 ProgressPercent float64 `json:"progress_percent"` 148 BundleSize int `json:"bundle_size"` 149 OperationsNeeded int `json:"operations_needed"` 150 FirstTime time.Time `json:"first_time,omitempty"` 151 LastTime time.Time `json:"last_time,omitempty"` 152 TimespanSeconds int `json:"timespan_seconds,omitempty"` 153 LastOpAgeSeconds int `json:"last_op_age_seconds,omitempty"` 154 EtaNextBundleSeconds int `json:"eta_next_bundle_seconds,omitempty"` 155} 156 157// RequestLog represents a logged HTTP request 158type RequestLog struct { 159 Timestamp time.Time `json:"timestamp"` 160 Method string `json:"method"` 161 Path string `json:"path"` 162 UserAgent string `json:"user_agent"` 163 RemoteAddr string `json:"remote_addr"` 164}