[DEPRECATED] Go implementation of plcbundle
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}