{"version":3,"sources":["../../core/package.json","../src/index.ts"],"sourcesContent":["{\n  \"name\": \"@shardix/core\",\n  \"version\": \"0.8.2\",\n  \"description\": \"Core architecture, IoC container and application factory for Shardix Framework\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./dist/index.mjs\",\n  \"types\": \"./dist/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"import\": \"./dist/index.mjs\",\n      \"require\": \"./dist/index.js\",\n      \"types\": \"./dist/index.d.ts\"\n    }\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"test\": \"vitest run\",\n    \"clean\": \"rimraf dist\"\n  },\n  \"dependencies\": {\n    \"@shardix/common\": \"workspace:*\",\n    \"@shardix/http\": \"workspace:*\",\n    \"@shardix/transport\": \"workspace:*\",\n    \"reflect-metadata\": \"^0.2.2\"\n  },\n  \"devDependencies\": {\n    \"@swc/core\": \"^1.15.46\",\n    \"rimraf\": \"^6.0.1\",\n    \"tsup\": \"^8.3.5\",\n    \"typescript\": \"^5.7.2\",\n    \"unplugin-swc\": \"^1.5.9\",\n    \"vitest\": \"^2.1.8\"\n  }\n}\n","import { HttpServer } from '@shardix/http';\nimport { createServer } from 'node:http';\nimport type { Server } from 'node:http';\n\nexport interface DashboardApiOptions {\n  port?: number;\n  token?: string;\n}\n\n\nexport interface LiveMetricsSnapshot {\n  timestamp: string;\n  uptime: number;\n  cpuUsagePercent: number;\n  memoryHeapUsedMB: number;\n  memoryRssMB: number;\n  eventLoopDelayMs: number;\n  interactionsTotal: number;\n  interactionsPerSec: number;\n  commandsTotal: number;\n  commandsPerSec: number;\n  eventsTotal: number;\n  errorsTotal: number;\n  errorsPerSec: number;\n  avgCommandDurationMs: number;\n  p95CommandDurationMs: number;\n  gatewayPingMs: number;\n  gatewayStatus: 'connected' | 'disconnected' | 'unknown';\n  cacheHitRatio: number;\n  activeTraces: number;\n}\n\nexport interface CommandMetric {\n  name: string;\n  executions: number;\n  avgMs: number;\n  p95Ms: number;\n  errors: number;\n}\n\nexport interface LogEntry {\n  timestamp: string;\n  level: 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n  message: string;\n  data?: Record<string, unknown>;\n}\n\nclass MetricsRegistry {\n  private metrics: LiveMetricsSnapshot = this.defaultMetrics();\n  private commands: Map<string, CommandMetric> = new Map();\n  private logs: LogEntry[] = [];\n  private wsClients: Set<any> = new Set();\n\n  private defaultMetrics(): LiveMetricsSnapshot {\n    return {\n      timestamp: new Date().toISOString(),\n      uptime: process.uptime(),\n      cpuUsagePercent: 0,\n      memoryHeapUsedMB: Math.round(process.memoryUsage().heapUsed / 1024 / 1024),\n      memoryRssMB: Math.round(process.memoryUsage().rss / 1024 / 1024),\n      eventLoopDelayMs: 0,\n      interactionsTotal: 0,\n      interactionsPerSec: 0,\n      commandsTotal: 0,\n      commandsPerSec: 0,\n      eventsTotal: 0,\n      errorsTotal: 0,\n      errorsPerSec: 0,\n      avgCommandDurationMs: 0,\n      p95CommandDurationMs: 0,\n      gatewayPingMs: 0,\n      gatewayStatus: 'unknown',\n      cacheHitRatio: 0,\n      activeTraces: 0,\n    };\n  }\n\n  /** Called by ObservabilityProvider to update live metrics */\n  public pushMetrics(metrics: Partial<LiveMetricsSnapshot>): void {\n    this.metrics = {\n      ...this.metrics,\n      ...metrics,\n      timestamp: new Date().toISOString(),\n      uptime: process.uptime(),\n      memoryRssMB: Math.round(process.memoryUsage().rss / 1024 / 1024),\n      memoryHeapUsedMB: Math.round(process.memoryUsage().heapUsed / 1024 / 1024),\n    };\n    // Broadcast to WebSocket clients\n    this.broadcastToWs({ type: 'metrics', data: this.metrics });\n  }\n\n  /** Called by command handlers to record command stats */\n  public recordCommand(name: string, durationMs: number, isError = false): void {\n    const existing = this.commands.get(name) ?? {\n      name, executions: 0, avgMs: 0, p95Ms: 0, errors: 0,\n    };\n    existing.executions++;\n    existing.avgMs = (existing.avgMs * (existing.executions - 1) + durationMs) / existing.executions;\n    if (isError) existing.errors++;\n    this.commands.set(name, existing);\n  }\n\n  /** Add a log entry (ring buffer, max 500) */\n  public addLog(entry: LogEntry): void {\n    this.logs.push(entry);\n    if (this.logs.length > 500) this.logs.shift();\n    this.broadcastToWs({ type: 'log', data: entry });\n  }\n\n  public getMetrics(): LiveMetricsSnapshot {\n    return { ...this.metrics, uptime: process.uptime() };\n  }\n\n  public getCommands(): CommandMetric[] {\n    return [...this.commands.values()].sort((a, b) => b.executions - a.executions);\n  }\n\n  public getLogs(limit = 100): LogEntry[] {\n    return this.logs.slice(-limit);\n  }\n\n  public addWsClient(client: any): void {\n    this.wsClients.add(client);\n  }\n\n  public removeWsClient(client: any): void {\n    this.wsClients.delete(client);\n  }\n\n  private broadcastToWs(message: unknown): void {\n    const payload = JSON.stringify(message);\n    for (const client of this.wsClients) {\n      try {\n        if (client.readyState === 1 /* OPEN */) {\n          client.send(payload);\n        }\n      } catch {\n        this.wsClients.delete(client);\n      }\n    }\n  }\n}\n\n/** Global metrics registry — providers push data here */\nexport const metricsRegistry = new MetricsRegistry();\n\n\nclass MetricsWebSocketServer {\n  private wss: any = null;\n  private broadcastInterval: ReturnType<typeof setInterval> | null = null;\n\n  async start(port: number): Promise<void> {\n    try {\n      const { WebSocketServer } = await import('ws' as any);\n      this.wss = new WebSocketServer({ port });\n\n      this.wss.on('connection', (ws: any) => {\n        metricsRegistry.addWsClient(ws);\n        // Send current metrics immediately on connect\n        ws.send(JSON.stringify({ type: 'metrics', data: metricsRegistry.getMetrics() }));\n\n        ws.on('close', () => metricsRegistry.removeWsClient(ws));\n        ws.on('error', () => metricsRegistry.removeWsClient(ws));\n      });\n\n      // Broadcast live metrics every second\n      this.broadcastInterval = setInterval(() => {\n        metricsRegistry.pushMetrics({});\n      }, 1000);\n\n      console.log(`[Shardix Dashboard] WebSocket metrics server on ws://localhost:${port}`);\n    } catch {\n      // ws package not installed — skip WebSocket server silently\n    }\n  }\n\n  async stop(): Promise<void> {\n    if (this.broadcastInterval) clearInterval(this.broadcastInterval);\n    if (this.wss) this.wss.close();\n  }\n}\n\n\nexport class DashboardApiServer {\n  private server: HttpServer;\n  private token: string;\n  private wsServer = new MetricsWebSocketServer();\n  private startTime = Date.now();\n\n  constructor(options: DashboardApiOptions = {}) {\n    this.token = options.token || process.env.SHARDIX_DASHBOARD_TOKEN || 'shardix_secret_token';\n    this.server = new HttpServer({ port: options.port || 3005 });\n    this.registerEndpoints();\n  }\n\n  private timingSafeEqual(a: string, b: string): boolean {\n    if (a.length !== b.length) return false;\n    let result = 0;\n    for (let i = 0; i < a.length; i++) {\n      result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n    }\n    return result === 0;\n  }\n\n  private registerEndpoints(): void {\n    const fastify = this.server.getFastify();\n\n    // CORS headers\n    fastify.addHook('onSend', async (request, reply, payload) => {\n      reply.header('Access-Control-Allow-Origin', '*');\n      reply.header('Access-Control-Allow-Headers', 'Authorization, Content-Type');\n      reply.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n      return payload;\n    });\n\n    fastify.options('*', async (request, reply) => {\n      reply.status(200).send();\n    });\n\n    // Authentication middleware — skip for public routes\n    fastify.addHook('onRequest', async (request, reply) => {\n      if (request.method === 'OPTIONS') return;\n      if (request.url === '/' || request.url.startsWith('/dashboard') || request.url === '/ping') return;\n\n      const authHeader = request.headers.authorization;\n      const queryToken = (request.query as any)?.token;\n      const providedToken = authHeader?.replace('Bearer ', '').trim() || queryToken;\n\n      if (!providedToken || !this.timingSafeEqual(providedToken, this.token)) {\n        reply.status(401).send({ error: 'Unauthorized: Invalid Shardix Dashboard Token' });\n        return;\n      }\n    });\n\n\n    fastify.get('/ping', async () => ({ pong: true, uptime: process.uptime() }));\n\n\n    fastify.get('/api/application', async () => {\n      let version = '0.9.0';\n      try { version = require('../../core/package.json').version; } catch {}\n      return {\n        name: process.env.npm_package_name || 'Shardix Application',\n        version,\n        shardixVersion: '0.9.0',\n        status: 'ONLINE',\n        uptime: Math.floor(process.uptime()),\n        startedAt: new Date(Date.now() - process.uptime() * 1000).toISOString(),\n        pid: process.pid,\n        nodeVersion: process.version,\n        platform: process.platform,\n        arch: process.arch,\n      };\n    });\n\n\n    fastify.get('/api/metrics/live', async () => metricsRegistry.getMetrics());\n\n    fastify.get('/api/metrics/commands', async () => ({\n      commands: metricsRegistry.getCommands(),\n      totalExecutions: metricsRegistry.getCommands().reduce((s, c) => s + c.executions, 0),\n    }));\n\n\n    fastify.get('/api/runtime', async () => ({\n      runtime: 'GatewayRuntime',\n      adapter: process.env.SHARDIX_ADAPTER || 'DiscordJSAdapter',\n      transports: ['GatewayWebSocket'],\n      status: 'ONLINE',\n      restLatencyMs: 0,\n      gatewayLatencyMs: metricsRegistry.getMetrics().gatewayPingMs,\n    }));\n\n\n    fastify.get('/api/workers', async () => [\n      {\n        id: `worker_${process.pid}`,\n        status: 'healthy',\n        memoryUsageMB: Math.round(process.memoryUsage().rss / 1024 / 1024),\n        pid: process.pid,\n        uptime: Math.floor(process.uptime()),\n      },\n    ]);\n\n    fastify.get('/api/cluster', async () => ({\n      mode: 'standalone',\n      workers: 1,\n      shards: 'auto',\n    }));\n\n\n    fastify.get('/api/health', async () => {\n      const mem = process.memoryUsage();\n      const heapMB = mem.heapUsed / 1024 / 1024;\n      return {\n        status: heapMB > 1024 ? 'fail' : heapMB > 512 ? 'warn' : 'pass',\n        uptime: Math.floor(process.uptime()),\n        checks: {\n          process: [{ componentName: 'process', status: 'pass', observedValue: Math.floor(process.uptime()), observedUnit: 's' }],\n          memory: [{ componentName: 'memory', status: heapMB > 512 ? 'warn' : 'pass', observedValue: Math.round(heapMB), observedUnit: 'MB' }],\n        },\n      };\n    });\n\n\n    fastify.get('/api/events', async () => ({\n      eventsTotal: metricsRegistry.getMetrics().eventsTotal,\n      recentEvents: [],\n    }));\n\n\n    fastify.get('/api/logs', async (req) => {\n      const limit = parseInt((req.query as any)?.limit ?? '100');\n      const level = (req.query as any)?.level;\n      let logs = metricsRegistry.getLogs(limit);\n      if (level) logs = logs.filter((l) => l.level === level);\n      return logs;\n    });\n\n\n    fastify.get('/api/providers', async () => [\n      { name: 'HealthProvider', status: 'active', version: '0.9.0' },\n      { name: 'ObservabilityProvider', status: 'active', version: '0.9.0' },\n      { name: 'SchedulerProvider', status: 'active', version: '0.9.0' },\n      { name: 'QueueProvider', status: 'active', version: '0.9.0' },\n    ]);\n\n\n    fastify.get('/api/cache', async () => ({\n      hitRatio: metricsRegistry.getMetrics().cacheHitRatio,\n      hits: metricsRegistry.getMetrics().cacheHitRatio * 1000,\n      misses: (1 - metricsRegistry.getMetrics().cacheHitRatio) * 1000,\n      driver: 'memory',\n    }));\n\n    fastify.get('/', async (request, reply) => {\n      // Try to serve the dashboard-web index.html\n      const { existsSync, readFileSync } = await import('node:fs');\n      const { join } = await import('node:path');\n      const dashboardHtmlPaths = [\n        join(__dirname, '../../dashboard-web/index.html'),\n        join(process.cwd(), 'node_modules/@shardix/dashboard-web/index.html'),\n      ];\n      for (const p of dashboardHtmlPaths) {\n        if (existsSync(p)) {\n          return reply.type('text/html').send(readFileSync(p, 'utf-8'));\n        }\n      }\n      return reply.type('text/html').send(this.renderMinimalDashboard());\n    });\n  }\n\n  private renderMinimalDashboard(): string {\n    return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Shardix Dashboard v0.9</title>\n  <style>\n    body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #0a0a0f; color: #e2e8f0; margin: 0; padding: 2rem; min-height: 100vh; }\n    .header { display: flex; align-items: center; gap: 1rem; margin-bottom: 2rem; border-bottom: 1px solid #1e293b; padding-bottom: 1rem; }\n    .logo { font-size: 1.5rem; font-weight: 700; background: linear-gradient(135deg, #5865f2, #eb459e); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }\n    .badge { background: #5865f2; color: #fff; font-size: 0.7rem; padding: 2px 8px; border-radius: 999px; font-weight: 600; }\n    .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1rem; margin-bottom: 2rem; }\n    .card { background: #111118; border: 1px solid #1e293b; border-radius: 12px; padding: 1.5rem; transition: border-color 0.2s; }\n    .card:hover { border-color: #5865f2; }\n    .card-label { font-size: 0.75rem; color: #64748b; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; }\n    .card-value { font-size: 2rem; font-weight: 700; font-family: 'JetBrains Mono', 'Courier New', monospace; }\n    .online { color: #23d18b; } .warn { color: #f1c232; } .error { color: #e74c3c; }\n    .api-endpoints { background: #111118; border: 1px solid #1e293b; border-radius: 12px; padding: 1.5rem; }\n    code { background: #0a0a0f; padding: 2px 6px; border-radius: 4px; font-family: monospace; color: #38bdf8; }\n    a { color: #5865f2; }\n    .status-dot { width: 8px; height: 8px; border-radius: 50%; background: #23d18b; display: inline-block; margin-right: 6px; animation: pulse 2s infinite; }\n    @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }\n  </style>\n</head>\n<body>\n  <div class=\"header\">\n    <div class=\"logo\">⚡ Shardix</div>\n    <span class=\"badge\">v0.9 Dashboard</span>\n    <span style=\"margin-left: auto; font-size: 0.85rem; color: #64748b;\">\n      <span class=\"status-dot\"></span>API Online — Port 3005\n    </span>\n  </div>\n  <div class=\"grid\" id=\"metrics\">\n    <div class=\"card\"><div class=\"card-label\">Status</div><div class=\"card-value online\">ONLINE</div></div>\n    <div class=\"card\"><div class=\"card-label\">Uptime</div><div class=\"card-value\" id=\"uptime\">—</div></div>\n    <div class=\"card\"><div class=\"card-label\">Memory RSS</div><div class=\"card-value\" id=\"rss\">—</div></div>\n    <div class=\"card\"><div class=\"card-label\">Heap Used</div><div class=\"card-value\" id=\"heap\">—</div></div>\n    <div class=\"card\"><div class=\"card-label\">Interactions/s</div><div class=\"card-value\" id=\"ips\">—</div></div>\n    <div class=\"card\"><div class=\"card-label\">Gateway Ping</div><div class=\"card-value\" id=\"ping\">—</div></div>\n  </div>\n  <div class=\"api-endpoints\">\n    <h3 style=\"margin: 0 0 1rem; font-size: 0.9rem; color: #94a3b8;\">REST API Endpoints</h3>\n    <div style=\"display: grid; gap: 0.5rem; font-size: 0.82rem;\">\n      <div><code>GET /api/application</code> — Application overview</div>\n      <div><code>GET /api/metrics/live</code> — Live metrics snapshot</div>\n      <div><code>GET /api/metrics/commands</code> — Command performance data</div>\n      <div><code>GET /api/runtime</code> — Runtime information</div>\n      <div><code>GET /api/health</code> — Health check status</div>\n      <div><code>GET /api/logs?limit=100&level=info</code> — Structured logs</div>\n      <div><code>GET /api/workers</code> — Worker processes</div>\n      <div><code>GET /api/cache</code> — Cache statistics</div>\n    </div>\n    <p style=\"margin-top: 1rem; font-size: 0.78rem; color: #64748b;\">\n      Install <code>@shardix/dashboard-web</code> for the full interactive dashboard UI. <br/>\n      Authenticate with: <code>Authorization: Bearer ${this.token}</code>\n    </p>\n  </div>\n  <script>\n    async function refresh() {\n      try {\n        const res = await fetch('/api/metrics/live', { headers: { Authorization: 'Bearer shardix_secret_token' } });\n        if (!res.ok) return;\n        const m = await res.json();\n        document.getElementById('uptime').textContent = formatUptime(m.uptime || 0);\n        document.getElementById('rss').textContent = (m.memoryRssMB || 0) + ' MB';\n        document.getElementById('heap').textContent = (m.memoryHeapUsedMB || 0) + ' MB';\n        document.getElementById('ips').textContent = (m.interactionsPerSec || 0).toFixed(1);\n        document.getElementById('ping').textContent = (m.gatewayPingMs || 0) + ' ms';\n      } catch {}\n    }\n    function formatUptime(s) {\n      const d = Math.floor(s / 86400), h = Math.floor((s % 86400) / 3600), m = Math.floor((s % 3600) / 60);\n      return d > 0 ? d + 'd ' + h + 'h' : h > 0 ? h + 'h ' + m + 'm' : m + 'm';\n    }\n    refresh();\n    setInterval(refresh, 3000);\n  </script>\n</body>\n</html>`;\n  }\n\n  public async start(): Promise<void> {\n    await this.server.start();\n    await this.wsServer.start(9090);\n  }\n\n  public async stop(): Promise<void> {\n    await this.server.stop();\n    await this.wsServer.stop();\n  }\n}\n\n"],"mappings":"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","names":["HttpServer","MetricsRegistry","metrics","defaultMetrics","commands","Map","logs","wsClients","Set","timestamp","Date","toISOString","uptime","process","cpuUsagePercent","memoryHeapUsedMB","Math","round","memoryUsage","heapUsed","memoryRssMB","rss","eventLoopDelayMs","interactionsTotal","interactionsPerSec","commandsTotal","commandsPerSec","eventsTotal","errorsTotal","errorsPerSec","avgCommandDurationMs","p95CommandDurationMs","gatewayPingMs","gatewayStatus","cacheHitRatio","activeTraces","pushMetrics","broadcastToWs","type","data","recordCommand","name","durationMs","isError","existing","get","executions","avgMs","p95Ms","errors","set","addLog","entry","push","length","shift","getMetrics","getCommands","values","sort","a","b","getLogs","limit","slice","addWsClient","client","add","removeWsClient","delete","message","payload","JSON","stringify","readyState","send","metricsRegistry","MetricsWebSocketServer","wss","broadcastInterval","start","port","WebSocketServer","on","ws","setInterval","console","log","stop","clearInterval","close","DashboardApiServer","server","token","wsServer","startTime","now","options","env","SHARDIX_DASHBOARD_TOKEN","HttpServer","registerEndpoints","timingSafeEqual","result","i","charCodeAt","fastify","getFastify","addHook","request","reply","header","status","method","url","startsWith","authHeader","headers","authorization","queryToken","query","providedToken","replace","trim","error","pong","version","require","npm_package_name","shardixVersion","floor","startedAt","pid","nodeVersion","platform","arch","totalExecutions","reduce","s","c","runtime","adapter","SHARDIX_ADAPTER","transports","restLatencyMs","gatewayLatencyMs","id","memoryUsageMB","mode","workers","shards","mem","heapMB","checks","componentName","observedValue","observedUnit","memory","recentEvents","req","parseInt","level","filter","l","hitRatio","hits","misses","driver","existsSync","readFileSync","join","dashboardHtmlPaths","__dirname","cwd","p","renderMinimalDashboard"]}