@http-client-toolkit/dashboard 0.1.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/cache/generic.ts","../src/adapters/cache/memory.ts","../src/adapters/cache/sqlite.ts","../src/adapters/dedup/generic.ts","../src/adapters/dedup/memory.ts","../src/adapters/dedup/sqlite.ts","../src/adapters/rate-limit/generic.ts","../src/adapters/rate-limit/memory.ts","../src/adapters/rate-limit/sqlite.ts","../src/adapters/detect.ts","../src/config.ts","../src/server/request-helpers.ts","../src/server/response-helpers.ts","../src/server/handlers/cache.ts","../src/server/handlers/dedup.ts","../src/server/handlers/health.ts","../src/server/handlers/rate-limit.ts","../src/server/handlers/stores.ts","../src/server/api-router.ts","../src/server/static-server.ts","../src/server/middleware.ts","../src/server/web-handler.ts","../src/server/standalone.ts"],"names":["MIME_TYPES","cachedIndexHtml","clientDir","getCurrentDir","dirname","fileURLToPath","getClientDir","join","getIndexHtml","existsSync","readFileSync","extname","CLIENT_ROUTE_REGEX","clientStoreInfo","routeClientApi"],"mappings":"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","file":"index.js","sourcesContent":["import type { CacheStore } from '@http-client-toolkit/core';\nimport type { CacheStoreAdapter, CacheEntryInfo } from '../types.js';\n\nexport function createGenericCacheAdapter(\n store: CacheStore,\n): CacheStoreAdapter {\n return {\n type: 'generic',\n capabilities: {\n canList: false,\n canDelete: true,\n canClear: true,\n canGetStats: false,\n },\n\n async getStats() {\n return { message: 'Stats not available for this store type' };\n },\n\n async listEntries(): Promise<{ entries: Array<CacheEntryInfo> }> {\n return { entries: [] };\n },\n\n async getEntry(hash: string) {\n return store.get(hash);\n },\n\n async deleteEntry(hash: string) {\n await store.delete(hash);\n },\n\n async clearAll() {\n await store.clear();\n },\n };\n}\n","import type { CacheStore } from '@http-client-toolkit/core';\nimport type { CacheStoreAdapter, CacheEntryInfo } from '../types.js';\n\ninterface InMemoryCacheStoreLike extends CacheStore {\n getStats(): {\n totalItems: number;\n expired: number;\n memoryUsageBytes: number;\n maxItems: number;\n maxMemoryBytes: number;\n memoryUtilization: number;\n itemUtilization: number;\n };\n listEntries(\n offset?: number,\n limit?: number,\n ): Array<{\n hash: string;\n expiresAt: number;\n lastAccessed: number;\n size: number;\n }>;\n}\n\nexport function createMemoryCacheAdapter(store: CacheStore): CacheStoreAdapter {\n const memStore = store as InMemoryCacheStoreLike;\n\n return {\n type: 'memory',\n capabilities: {\n canList: true,\n canDelete: true,\n canClear: true,\n canGetStats: true,\n },\n\n async getStats() {\n return memStore.getStats();\n },\n\n async listEntries(\n page: number,\n limit: number,\n ): Promise<{ entries: Array<CacheEntryInfo> }> {\n const offset = page * limit;\n const entries = memStore.listEntries(offset, limit);\n return { entries };\n },\n\n async getEntry(hash: string) {\n return memStore.get(hash);\n },\n\n async deleteEntry(hash: string) {\n await memStore.delete(hash);\n },\n\n async clearAll() {\n await memStore.clear();\n },\n };\n}\n","import type { CacheStore } from '@http-client-toolkit/core';\nimport type { CacheStoreAdapter, CacheEntryInfo } from '../types.js';\n\ninterface SQLiteCacheStoreLike extends CacheStore {\n getStats(): Promise<{\n totalItems: number;\n expiredItems: number;\n databaseSizeKB: number;\n }>;\n listEntries(\n offset?: number,\n limit?: number,\n ): Promise<\n Array<{\n hash: string;\n expiresAt: number;\n createdAt: number;\n }>\n >;\n}\n\nexport function createSqliteCacheAdapter(store: CacheStore): CacheStoreAdapter {\n const sqlStore = store as SQLiteCacheStoreLike;\n\n return {\n type: 'sqlite',\n capabilities: {\n canList: true,\n canDelete: true,\n canClear: true,\n canGetStats: true,\n },\n\n async getStats() {\n return sqlStore.getStats();\n },\n\n async listEntries(\n page: number,\n limit: number,\n ): Promise<{ entries: Array<CacheEntryInfo> }> {\n const offset = page * limit;\n const results = await sqlStore.listEntries(offset, limit);\n const entries: Array<CacheEntryInfo> = results.map((r) => ({\n hash: r.hash,\n expiresAt: r.expiresAt,\n createdAt: r.createdAt,\n }));\n return { entries };\n },\n\n async getEntry(hash: string) {\n return sqlStore.get(hash);\n },\n\n async deleteEntry(hash: string) {\n await sqlStore.delete(hash);\n },\n\n async clearAll() {\n await sqlStore.clear();\n },\n };\n}\n","import type { DedupeStore } from '@http-client-toolkit/core';\nimport type { DedupeStoreAdapter, DedupeJobInfo } from '../types.js';\n\nexport function createGenericDedupeAdapter(\n _store: DedupeStore,\n): DedupeStoreAdapter {\n return {\n type: 'generic',\n capabilities: {\n canList: false,\n canGetStats: false,\n },\n\n async getStats() {\n return { message: 'Stats not available for this store type' };\n },\n\n async listJobs(): Promise<{ jobs: Array<DedupeJobInfo> }> {\n return { jobs: [] };\n },\n\n async getJob(): Promise<DedupeJobInfo | undefined> {\n return undefined;\n },\n };\n}\n","import type { DedupeStore } from '@http-client-toolkit/core';\nimport type { DedupeStoreAdapter, DedupeJobInfo } from '../types.js';\n\ninterface InMemoryDedupeStoreLike extends DedupeStore {\n getStats(): {\n activeJobs: number;\n totalJobsProcessed: number;\n expiredJobs: number;\n oldestJobAgeMs: number;\n };\n listJobs(\n offset?: number,\n limit?: number,\n ): Array<{\n hash: string;\n jobId: string;\n status: 'pending' | 'completed' | 'failed';\n createdAt: number;\n }>;\n}\n\nexport function createMemoryDedupeAdapter(\n store: DedupeStore,\n): DedupeStoreAdapter {\n const memStore = store as InMemoryDedupeStoreLike;\n\n return {\n type: 'memory',\n capabilities: {\n canList: true,\n canGetStats: true,\n },\n\n async getStats() {\n return memStore.getStats();\n },\n\n async listJobs(\n page: number,\n limit: number,\n ): Promise<{ jobs: Array<DedupeJobInfo> }> {\n const offset = page * limit;\n const jobs = memStore.listJobs(offset, limit);\n return { jobs };\n },\n\n async getJob(hash: string): Promise<DedupeJobInfo | undefined> {\n const jobs = memStore.listJobs(0, 1000);\n return jobs.find((j) => j.hash === hash);\n },\n };\n}\n","import type { DedupeStore } from '@http-client-toolkit/core';\nimport type { DedupeStoreAdapter, DedupeJobInfo } from '../types.js';\n\ninterface SQLiteDedupeStoreLike extends DedupeStore {\n getStats(): Promise<{\n totalJobs: number;\n pendingJobs: number;\n completedJobs: number;\n failedJobs: number;\n expiredJobs: number;\n }>;\n listJobs(\n offset?: number,\n limit?: number,\n ): Promise<\n Array<{\n hash: string;\n jobId: string;\n status: string;\n createdAt: number;\n }>\n >;\n}\n\nexport function createSqliteDedupeAdapter(\n store: DedupeStore,\n): DedupeStoreAdapter {\n const sqlStore = store as SQLiteDedupeStoreLike;\n\n return {\n type: 'sqlite',\n capabilities: {\n canList: true,\n canGetStats: true,\n },\n\n async getStats() {\n return sqlStore.getStats();\n },\n\n async listJobs(\n page: number,\n limit: number,\n ): Promise<{ jobs: Array<DedupeJobInfo> }> {\n const offset = page * limit;\n const results = await sqlStore.listJobs(offset, limit);\n return { jobs: results };\n },\n\n async getJob(hash: string): Promise<DedupeJobInfo | undefined> {\n const results = await sqlStore.listJobs(0, 1000);\n return results.find((j) => j.hash === hash);\n },\n };\n}\n","import type { RateLimitStore } from '@http-client-toolkit/core';\nimport type { RateLimitStoreAdapter, RateLimitResourceInfo } from '../types.js';\n\nexport function createGenericRateLimitAdapter(\n store: RateLimitStore,\n): RateLimitStoreAdapter {\n return {\n type: 'generic',\n capabilities: {\n canList: false,\n canGetStats: false,\n canUpdateConfig: false,\n canReset: true,\n },\n\n async getStats() {\n return { message: 'Stats not available for this store type' };\n },\n\n async listResources(): Promise<Array<RateLimitResourceInfo>> {\n return [];\n },\n\n async getResourceStatus(name: string) {\n return store.getStatus(name);\n },\n\n async updateResourceConfig() {\n throw new Error('Config updates not supported for this store type');\n },\n\n async resetResource(name: string) {\n await store.reset(name);\n },\n };\n}\n","import type { RateLimitStore } from '@http-client-toolkit/core';\nimport type { RateLimitStoreAdapter, RateLimitResourceInfo } from '../types.js';\n\ninterface InMemoryRateLimitStoreLike extends RateLimitStore {\n getStats(): {\n totalResources: number;\n activeResources: number;\n rateLimitedResources: number;\n totalRequests: number;\n };\n listResources(): Array<{\n resource: string;\n requestCount: number;\n limit: number;\n windowMs: number;\n }>;\n setResourceConfig(\n resource: string,\n config: { limit: number; windowMs: number },\n ): void;\n getResourceConfig(resource: string): { limit: number; windowMs: number };\n}\n\nexport function createMemoryRateLimitAdapter(\n store: RateLimitStore,\n): RateLimitStoreAdapter {\n const memStore = store as InMemoryRateLimitStoreLike;\n\n return {\n type: 'memory',\n capabilities: {\n canList: true,\n canGetStats: true,\n canUpdateConfig: true,\n canReset: true,\n },\n\n async getStats() {\n return memStore.getStats();\n },\n\n async listResources(): Promise<Array<RateLimitResourceInfo>> {\n return memStore.listResources();\n },\n\n async getResourceStatus(name: string) {\n return memStore.getStatus(name);\n },\n\n async updateResourceConfig(\n name: string,\n config: { limit: number; windowMs: number },\n ) {\n memStore.setResourceConfig(name, config);\n },\n\n async resetResource(name: string) {\n await memStore.reset(name);\n },\n };\n}\n","import type { RateLimitStore } from '@http-client-toolkit/core';\nimport type { RateLimitStoreAdapter, RateLimitResourceInfo } from '../types.js';\n\ninterface SQLiteRateLimitStoreLike extends RateLimitStore {\n getStats(): Promise<{\n totalRequests: number;\n uniqueResources: number;\n rateLimitedResources: Array<string>;\n }>;\n listResources(): Promise<\n Array<{\n resource: string;\n requestCount: number;\n limit: number;\n windowMs: number;\n }>\n >;\n setResourceConfig(\n resource: string,\n config: { limit: number; windowMs: number },\n ): void;\n getResourceConfig(resource: string): { limit: number; windowMs: number };\n}\n\nexport function createSqliteRateLimitAdapter(\n store: RateLimitStore,\n): RateLimitStoreAdapter {\n const sqlStore = store as SQLiteRateLimitStoreLike;\n\n return {\n type: 'sqlite',\n capabilities: {\n canList: true,\n canGetStats: true,\n canUpdateConfig: true,\n canReset: true,\n },\n\n async getStats() {\n return sqlStore.getStats();\n },\n\n async listResources(): Promise<Array<RateLimitResourceInfo>> {\n return sqlStore.listResources();\n },\n\n async getResourceStatus(name: string) {\n return sqlStore.getStatus(name);\n },\n\n async updateResourceConfig(\n name: string,\n config: { limit: number; windowMs: number },\n ) {\n sqlStore.setResourceConfig(name, config);\n },\n\n async resetResource(name: string) {\n await sqlStore.reset(name);\n },\n };\n}\n","import type {\n CacheStore,\n DedupeStore,\n RateLimitStore,\n} from '@http-client-toolkit/core';\nimport { createGenericCacheAdapter } from './cache/generic.js';\nimport { createMemoryCacheAdapter } from './cache/memory.js';\nimport { createSqliteCacheAdapter } from './cache/sqlite.js';\nimport { createGenericDedupeAdapter } from './dedup/generic.js';\nimport { createMemoryDedupeAdapter } from './dedup/memory.js';\nimport { createSqliteDedupeAdapter } from './dedup/sqlite.js';\nimport { createGenericRateLimitAdapter } from './rate-limit/generic.js';\nimport { createMemoryRateLimitAdapter } from './rate-limit/memory.js';\nimport { createSqliteRateLimitAdapter } from './rate-limit/sqlite.js';\nimport type {\n CacheStoreAdapter,\n DedupeStoreAdapter,\n RateLimitStoreAdapter,\n} from './types.js';\n\nfunction isMemoryStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.cleanup === 'function' &&\n typeof s.getLRUItems === 'function'\n );\n}\n\nfunction isSqliteStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.close === 'function'\n );\n}\n\nfunction isMemoryDedupeStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.listJobs === 'function' &&\n typeof s.cleanup === 'function' &&\n !('close' in s && typeof s.close === 'function')\n );\n}\n\nfunction isSqliteDedupeStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.close === 'function' &&\n typeof s.listJobs === 'function'\n );\n}\n\nfunction isMemoryRateLimitStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.listResources === 'function' &&\n typeof s.setResourceConfig === 'function' &&\n !('close' in s && typeof s.close === 'function')\n );\n}\n\nfunction isSqliteRateLimitStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.close === 'function' &&\n typeof s.listResources === 'function' &&\n typeof s.setResourceConfig === 'function'\n );\n}\n\nexport function detectCacheAdapter(store: CacheStore): CacheStoreAdapter {\n if (isMemoryStore(store)) {\n return createMemoryCacheAdapter(store);\n }\n if (isSqliteStore(store)) {\n return createSqliteCacheAdapter(store);\n }\n return createGenericCacheAdapter(store);\n}\n\nexport function detectDedupeAdapter(store: DedupeStore): DedupeStoreAdapter {\n if (isMemoryDedupeStore(store)) {\n return createMemoryDedupeAdapter(store);\n }\n if (isSqliteDedupeStore(store)) {\n return createSqliteDedupeAdapter(store);\n }\n return createGenericDedupeAdapter(store);\n}\n\nexport function detectRateLimitAdapter(\n store: RateLimitStore,\n): RateLimitStoreAdapter {\n if (isMemoryRateLimitStore(store)) {\n return createMemoryRateLimitAdapter(store);\n }\n if (isSqliteRateLimitStore(store)) {\n return createSqliteRateLimitAdapter(store);\n }\n return createGenericRateLimitAdapter(store);\n}\n","import type {\n CacheStore,\n DedupeStore,\n RateLimitStore,\n} from '@http-client-toolkit/core';\nimport { z } from 'zod';\n\nconst CLIENT_NAME_REGEX = /^[a-zA-Z0-9_-]+$/;\n\nconst ClientConfigSchema = z\n .object({\n name: z\n .string()\n .min(1, 'Client name must not be empty')\n .regex(\n CLIENT_NAME_REGEX,\n 'Client name must be URL-safe (a-z, 0-9, -, _)',\n ),\n cacheStore: z.custom<CacheStore>().optional(),\n dedupeStore: z.custom<DedupeStore>().optional(),\n rateLimitStore: z.custom<RateLimitStore>().optional(),\n })\n .refine(\n (data) => data.cacheStore || data.dedupeStore || data.rateLimitStore,\n { message: 'At least one store must be provided per client' },\n );\n\nconst DashboardOptionsSchema = z\n .object({\n clients: z\n .array(ClientConfigSchema)\n .min(1, 'At least one client is required'),\n basePath: z.string().default('/'),\n pollIntervalMs: z.number().int().positive().default(5000),\n })\n .refine(\n (data) => {\n const names = data.clients.map((c) => c.name);\n return new Set(names).size === names.length;\n },\n { message: 'Client names must be unique' },\n );\n\nconst StandaloneDashboardOptionsSchema = DashboardOptionsSchema.and(\n z.object({\n port: z.number().int().nonnegative().default(4000),\n host: z.string().default('localhost'),\n }),\n);\n\nexport type ClientConfig = z.input<typeof ClientConfigSchema>;\nexport type DashboardOptions = z.input<typeof DashboardOptionsSchema>;\nexport type StandaloneDashboardOptions = z.input<\n typeof StandaloneDashboardOptionsSchema\n>;\n\nexport function validateDashboardOptions(options: DashboardOptions) {\n return DashboardOptionsSchema.parse(options);\n}\n\nexport function validateStandaloneOptions(options: StandaloneDashboardOptions) {\n return StandaloneDashboardOptionsSchema.parse(options);\n}\n","import type { IncomingMessage } from 'http';\n\nexport function parseUrl(\n req: IncomingMessage,\n basePath: string,\n): { pathname: string; query: URLSearchParams } {\n const raw = req.url ?? '/';\n const url = new URL(raw, 'http://localhost');\n\n let pathname = url.pathname;\n if (basePath !== '/' && pathname.startsWith(basePath)) {\n pathname = pathname.slice(basePath.length) || '/';\n }\n\n return { pathname, query: url.searchParams };\n}\n\nexport function extractParam(\n pathname: string,\n pattern: string,\n): string | undefined {\n // pattern like \"/api/cache/entries/:hash\"\n const patternParts = pattern.split('/');\n const pathParts = pathname.split('/');\n\n if (patternParts.length !== pathParts.length) return undefined;\n\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i]!;\n if (pp.startsWith(':')) continue;\n if (pp !== pathParts[i]) return undefined;\n }\n\n const paramIndex = patternParts.findIndex((p) => p.startsWith(':'));\n if (paramIndex === -1) return undefined;\n return pathParts[paramIndex];\n}\n\nexport async function readJsonBody<T>(req: IncomingMessage): Promise<T> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n resolve(JSON.parse(body) as T);\n } catch {\n reject(new Error('Invalid JSON body'));\n }\n });\n req.on('error', reject);\n });\n}\n","import type { ServerResponse } from 'http';\n\nexport function sendJson(\n res: ServerResponse,\n data: unknown,\n status: number = 200,\n): void {\n const body = JSON.stringify(data);\n res.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(body),\n 'Cache-Control': 'no-store',\n });\n res.end(body);\n}\n\nexport function sendError(\n res: ServerResponse,\n message: string,\n status: number = 500,\n): void {\n sendJson(res, { error: message }, status);\n}\n\nexport function sendNotFound(res: ServerResponse): void {\n sendError(res, 'Not found', 404);\n}\n\nexport function sendMethodNotAllowed(res: ServerResponse): void {\n sendError(res, 'Method not allowed', 405);\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { CacheStoreAdapter } from '../../adapters/types.js';\nimport { extractParam } from '../request-helpers.js';\nimport { sendJson, sendError, sendNotFound } from '../response-helpers.js';\n\nexport async function handleCacheStats(\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n): Promise<void> {\n try {\n const stats = await adapter.getStats();\n sendJson(res, { stats, capabilities: adapter.capabilities });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleCacheEntries(\n _req: IncomingMessage,\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n query: URLSearchParams,\n): Promise<void> {\n try {\n const page = parseInt(query.get('page') ?? '0', 10);\n const limit = parseInt(query.get('limit') ?? '50', 10);\n const result = await adapter.listEntries(page, limit);\n sendJson(res, result);\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleCacheEntry(\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const hash = extractParam(pathname, '/cache/entries/:hash');\n if (!hash) {\n sendNotFound(res);\n return;\n }\n const entry = await adapter.getEntry(hash);\n if (entry === undefined) {\n sendNotFound(res);\n return;\n }\n sendJson(res, { hash, value: entry });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleDeleteCacheEntry(\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const hash = extractParam(pathname, '/cache/entries/:hash');\n if (!hash) {\n sendNotFound(res);\n return;\n }\n await adapter.deleteEntry(hash);\n sendJson(res, { deleted: true });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleClearCache(\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n): Promise<void> {\n try {\n await adapter.clearAll();\n sendJson(res, { cleared: true });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { DedupeStoreAdapter } from '../../adapters/types.js';\nimport { extractParam } from '../request-helpers.js';\nimport { sendJson, sendError, sendNotFound } from '../response-helpers.js';\n\nexport async function handleDedupeStats(\n res: ServerResponse,\n adapter: DedupeStoreAdapter,\n): Promise<void> {\n try {\n const stats = await adapter.getStats();\n sendJson(res, { stats, capabilities: adapter.capabilities });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleDedupeJobs(\n _req: IncomingMessage,\n res: ServerResponse,\n adapter: DedupeStoreAdapter,\n query: URLSearchParams,\n): Promise<void> {\n try {\n const page = parseInt(query.get('page') ?? '0', 10);\n const limit = parseInt(query.get('limit') ?? '50', 10);\n const result = await adapter.listJobs(page, limit);\n sendJson(res, result);\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleDedupeJob(\n res: ServerResponse,\n adapter: DedupeStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const hash = extractParam(pathname, '/dedup/jobs/:hash');\n if (!hash) {\n sendNotFound(res);\n return;\n }\n const job = await adapter.getJob(hash);\n if (!job) {\n sendNotFound(res);\n return;\n }\n sendJson(res, job);\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n","import type { ServerResponse } from 'http';\nimport type {\n CacheStoreAdapter,\n DedupeStoreAdapter,\n RateLimitStoreAdapter,\n} from '../../adapters/types.js';\nimport { sendJson } from '../response-helpers.js';\n\nexport interface ClientContext {\n name: string;\n cache?: CacheStoreAdapter;\n dedup?: DedupeStoreAdapter;\n rateLimit?: RateLimitStoreAdapter;\n}\n\nexport interface MultiClientContext {\n clients: Map<string, ClientContext>;\n pollIntervalMs: number;\n}\n\nfunction clientStoreInfo(client: ClientContext) {\n return {\n cache: client.cache\n ? { type: client.cache.type, capabilities: client.cache.capabilities }\n : null,\n dedup: client.dedup\n ? { type: client.dedup.type, capabilities: client.dedup.capabilities }\n : null,\n rateLimit: client.rateLimit\n ? {\n type: client.rateLimit.type,\n capabilities: client.rateLimit.capabilities,\n }\n : null,\n };\n}\n\nexport function handleHealth(\n res: ServerResponse,\n ctx: MultiClientContext,\n): void {\n const clients: Record<string, ReturnType<typeof clientStoreInfo>> = {};\n for (const [name, client] of ctx.clients) {\n clients[name] = clientStoreInfo(client);\n }\n\n sendJson(res, {\n status: 'ok',\n clients,\n pollIntervalMs: ctx.pollIntervalMs,\n });\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { RateLimitStoreAdapter } from '../../adapters/types.js';\nimport { extractParam, readJsonBody } from '../request-helpers.js';\nimport { sendJson, sendError, sendNotFound } from '../response-helpers.js';\n\nexport async function handleRateLimitStats(\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n): Promise<void> {\n try {\n const stats = await adapter.getStats();\n sendJson(res, { stats, capabilities: adapter.capabilities });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleRateLimitResources(\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n): Promise<void> {\n try {\n const resources = await adapter.listResources();\n sendJson(res, { resources });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleRateLimitResource(\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const name = extractParam(pathname, '/rate-limit/resources/:name');\n if (!name) {\n sendNotFound(res);\n return;\n }\n const status = await adapter.getResourceStatus(name);\n sendJson(res, { resource: name, ...status });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleUpdateRateLimitConfig(\n req: IncomingMessage,\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const name = extractParam(pathname, '/rate-limit/resources/:name/config');\n if (!name) {\n sendNotFound(res);\n return;\n }\n const body = await readJsonBody<{ limit: number; windowMs: number }>(req);\n await adapter.updateResourceConfig(name, body);\n sendJson(res, { updated: true });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleResetRateLimitResource(\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const name = extractParam(pathname, '/rate-limit/resources/:name/reset');\n if (!name) {\n sendNotFound(res);\n return;\n }\n await adapter.resetResource(name);\n sendJson(res, { reset: true });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n","import type { ServerResponse } from 'http';\nimport type { MultiClientContext } from './health.js';\nimport { sendJson } from '../response-helpers.js';\n\nexport function handleClients(\n res: ServerResponse,\n ctx: MultiClientContext,\n): void {\n const clients: Array<{\n name: string;\n stores: {\n cache: { type: string; capabilities: Record<string, boolean> } | null;\n dedup: { type: string; capabilities: Record<string, boolean> } | null;\n rateLimit: { type: string; capabilities: Record<string, boolean> } | null;\n };\n }> = [];\n\n for (const [name, client] of ctx.clients) {\n clients.push({\n name,\n stores: {\n cache: client.cache\n ? { type: client.cache.type, capabilities: client.cache.capabilities }\n : null,\n dedup: client.dedup\n ? { type: client.dedup.type, capabilities: client.dedup.capabilities }\n : null,\n rateLimit: client.rateLimit\n ? {\n type: client.rateLimit.type,\n capabilities: client.rateLimit.capabilities,\n }\n : null,\n },\n });\n }\n\n sendJson(res, { clients });\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport {\n handleCacheStats,\n handleCacheEntries,\n handleCacheEntry,\n handleDeleteCacheEntry,\n handleClearCache,\n} from './handlers/cache.js';\nimport {\n handleDedupeStats,\n handleDedupeJobs,\n handleDedupeJob,\n} from './handlers/dedup.js';\nimport {\n type ClientContext,\n type MultiClientContext,\n handleHealth,\n} from './handlers/health.js';\nimport {\n handleRateLimitStats,\n handleRateLimitResources,\n handleRateLimitResource,\n handleUpdateRateLimitConfig,\n handleResetRateLimitResource,\n} from './handlers/rate-limit.js';\nimport { handleClients } from './handlers/stores.js';\nimport {\n sendNotFound,\n sendMethodNotAllowed,\n sendError,\n} from './response-helpers.js';\n\nconst CLIENT_ROUTE_REGEX = /^\\/api\\/clients\\/([a-zA-Z0-9_-]+)(\\/.*)?$/;\n\nexport function createApiRouter(ctx: MultiClientContext) {\n return async (\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n query: URLSearchParams,\n ): Promise<boolean> => {\n const method = req.method?.toUpperCase() ?? 'GET';\n\n // Health (aggregate)\n if (pathname === '/api/health' && method === 'GET') {\n handleHealth(res, ctx);\n return true;\n }\n\n // List clients\n if (pathname === '/api/clients' && method === 'GET') {\n handleClients(res, ctx);\n return true;\n }\n\n // Per-client routes: /api/clients/:name/...\n const clientMatch = pathname.match(CLIENT_ROUTE_REGEX);\n if (clientMatch) {\n const clientName = clientMatch[1]!;\n const subPath = clientMatch[2] ?? '';\n const client = ctx.clients.get(clientName);\n\n if (!client) {\n sendError(res, `Unknown client: ${clientName}`, 404);\n return true;\n }\n\n return routeClientApi(req, res, client, subPath, method, query);\n }\n\n // No API route matched\n if (pathname.startsWith('/api/')) {\n sendNotFound(res);\n return true;\n }\n\n return false;\n };\n}\n\nasync function routeClientApi(\n req: IncomingMessage,\n res: ServerResponse,\n client: ClientContext,\n subPath: string,\n method: string,\n query: URLSearchParams,\n): Promise<boolean> {\n // Cache routes\n if (subPath.startsWith('/cache')) {\n if (!client.cache) {\n sendError(res, 'Cache store not configured', 404);\n return true;\n }\n\n if (subPath === '/cache/stats' && method === 'GET') {\n await handleCacheStats(res, client.cache);\n return true;\n }\n\n if (subPath === '/cache/entries' && method === 'GET') {\n await handleCacheEntries(req, res, client.cache, query);\n return true;\n }\n\n if (subPath === '/cache/entries' && method === 'DELETE') {\n await handleClearCache(res, client.cache);\n return true;\n }\n\n const isSingleEntry =\n subPath.startsWith('/cache/entries/') && subPath.split('/').length === 4;\n\n if (isSingleEntry && method === 'GET') {\n await handleCacheEntry(res, client.cache, subPath);\n return true;\n }\n\n if (isSingleEntry && method === 'DELETE') {\n await handleDeleteCacheEntry(res, client.cache, subPath);\n return true;\n }\n\n if (isSingleEntry) {\n sendMethodNotAllowed(res);\n return true;\n }\n }\n\n // Dedup routes\n if (subPath.startsWith('/dedup')) {\n if (!client.dedup) {\n sendError(res, 'Dedup store not configured', 404);\n return true;\n }\n\n if (subPath === '/dedup/stats' && method === 'GET') {\n await handleDedupeStats(res, client.dedup);\n return true;\n }\n\n if (subPath === '/dedup/jobs' && method === 'GET') {\n await handleDedupeJobs(req, res, client.dedup, query);\n return true;\n }\n\n const isSingleJob =\n subPath.startsWith('/dedup/jobs/') && subPath.split('/').length === 4;\n\n if (isSingleJob && method === 'GET') {\n await handleDedupeJob(res, client.dedup, subPath);\n return true;\n }\n\n if (isSingleJob) {\n sendMethodNotAllowed(res);\n return true;\n }\n }\n\n // Rate limit routes\n if (subPath.startsWith('/rate-limit')) {\n if (!client.rateLimit) {\n sendError(res, 'Rate limit store not configured', 404);\n return true;\n }\n\n if (subPath === '/rate-limit/stats' && method === 'GET') {\n await handleRateLimitStats(res, client.rateLimit);\n return true;\n }\n\n if (subPath === '/rate-limit/resources' && method === 'GET') {\n await handleRateLimitResources(res, client.rateLimit);\n return true;\n }\n\n if (subPath.endsWith('/config') && method === 'PUT') {\n await handleUpdateRateLimitConfig(req, res, client.rateLimit, subPath);\n return true;\n }\n\n if (subPath.endsWith('/reset') && method === 'POST') {\n await handleResetRateLimitResource(res, client.rateLimit, subPath);\n return true;\n }\n\n const isSingleResource =\n subPath.startsWith('/rate-limit/resources/') &&\n subPath.split('/').length === 4;\n\n if (isSingleResource && method === 'GET') {\n await handleRateLimitResource(res, client.rateLimit, subPath);\n return true;\n }\n\n if (isSingleResource) {\n sendMethodNotAllowed(res);\n return true;\n }\n }\n\n sendNotFound(res);\n return true;\n}\n","import { readFileSync, existsSync } from 'fs';\nimport type { ServerResponse } from 'http';\nimport { join, dirname, extname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nlet cachedIndexHtml: string | undefined;\nlet clientDir: string | undefined;\n\nfunction getCurrentDir(): string {\n // ESM: use import.meta.url; CJS: use __dirname\n try {\n return dirname(fileURLToPath(import.meta.url));\n } catch {\n // Fallback for CJS\n return typeof __dirname !== 'undefined' ? __dirname : process.cwd();\n }\n}\n\nfunction getClientDir(): string {\n if (clientDir) return clientDir;\n const currentDir = getCurrentDir();\n // In built output: lib/index.js → dist/client/\n // Navigate from lib/ up to package root, then into dist/client\n clientDir = join(currentDir, '..', 'dist', 'client');\n return clientDir;\n}\n\nfunction getIndexHtml(): string {\n if (cachedIndexHtml) return cachedIndexHtml;\n const indexPath = join(getClientDir(), 'index.html');\n if (existsSync(indexPath)) {\n cachedIndexHtml = readFileSync(indexPath, 'utf-8');\n } else {\n cachedIndexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head><meta charset=\"UTF-8\"><title>Dashboard</title></head>\n<body>\n<div id=\"root\">\n <p style=\"font-family:sans-serif;text-align:center;margin-top:4rem\">\n Dashboard client not built. Run <code>vite build</code> first.\n </p>\n</div>\n</body>\n</html>`;\n }\n return cachedIndexHtml;\n}\n\nexport function serveStatic(res: ServerResponse, pathname: string): boolean {\n const dir = getClientDir();\n\n // Try to serve a static file\n if (pathname !== '/' && pathname !== '/index.html') {\n const filePath = join(dir, pathname);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath);\n const ext = extname(pathname);\n const mimeType = MIME_TYPES[ext] ?? 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mimeType,\n 'Content-Length': content.length,\n 'Cache-Control': pathname.includes('/assets/')\n ? 'public, max-age=31536000, immutable'\n : 'no-cache',\n });\n res.end(content);\n return true;\n } catch {\n // Fall through to SPA fallback\n }\n }\n }\n\n // SPA fallback: serve index.html\n const html = getIndexHtml();\n res.writeHead(200, {\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(html),\n 'Cache-Control': 'no-cache',\n });\n res.end(html);\n return true;\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport {\n detectCacheAdapter,\n detectDedupeAdapter,\n detectRateLimitAdapter,\n} from '../adapters/detect.js';\nimport { validateDashboardOptions, type DashboardOptions } from '../config.js';\nimport { createApiRouter } from './api-router.js';\nimport type { ClientContext, MultiClientContext } from './handlers/health.js';\nimport { parseUrl } from './request-helpers.js';\nimport { serveStatic } from './static-server.js';\n\nexport type DashboardMiddleware = (\n req: IncomingMessage,\n res: ServerResponse,\n next?: () => void,\n) => void;\n\nexport function createDashboard(\n options: DashboardOptions,\n): DashboardMiddleware {\n const opts = validateDashboardOptions(options);\n\n const clients = new Map<string, ClientContext>();\n for (const clientConfig of opts.clients) {\n clients.set(clientConfig.name, {\n name: clientConfig.name,\n cache: clientConfig.cacheStore\n ? detectCacheAdapter(clientConfig.cacheStore)\n : undefined,\n dedup: clientConfig.dedupeStore\n ? detectDedupeAdapter(clientConfig.dedupeStore)\n : undefined,\n rateLimit: clientConfig.rateLimitStore\n ? detectRateLimitAdapter(clientConfig.rateLimitStore)\n : undefined,\n });\n }\n\n const ctx: MultiClientContext = {\n clients,\n pollIntervalMs: opts.pollIntervalMs,\n };\n\n const apiRouter = createApiRouter(ctx);\n\n return (req: IncomingMessage, res: ServerResponse, _next?: () => void) => {\n const { pathname, query } = parseUrl(req, opts.basePath);\n\n // Handle API routes\n apiRouter(req, res, pathname, query)\n .then((handled) => {\n if (!handled) {\n // Serve static files / SPA\n serveStatic(res, pathname);\n }\n })\n .catch(() => {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Internal server error' }));\n });\n };\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join, dirname, extname } from 'path';\nimport { fileURLToPath } from 'url';\nimport {\n detectCacheAdapter,\n detectDedupeAdapter,\n detectRateLimitAdapter,\n} from '../adapters/detect.js';\nimport { validateDashboardOptions, type DashboardOptions } from '../config.js';\nimport type { ClientContext, MultiClientContext } from './handlers/health.js';\nimport { extractParam } from './request-helpers.js';\n\nexport type DashboardFetchHandler = (request: Request) => Promise<Response>;\n\n// --- Response helpers ---\n\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store',\n} as const;\n\nfunction jsonResponse(data: unknown, status: number = 200): Response {\n return new Response(JSON.stringify(data), { status, headers: JSON_HEADERS });\n}\n\nfunction errorResponse(message: string, status: number = 500): Response {\n return jsonResponse({ error: message }, status);\n}\n\n// --- Static file serving ---\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nlet cachedIndexHtml: string | undefined;\nlet clientDir: string | undefined;\n\nfunction getCurrentDir(): string {\n try {\n return dirname(fileURLToPath(import.meta.url));\n } catch {\n return typeof __dirname !== 'undefined' ? __dirname : process.cwd();\n }\n}\n\nfunction getClientDir(): string {\n if (clientDir) return clientDir;\n const currentDir = getCurrentDir();\n clientDir = join(currentDir, '..', 'dist', 'client');\n return clientDir;\n}\n\nfunction getIndexHtml(): string {\n if (cachedIndexHtml) return cachedIndexHtml;\n const indexPath = join(getClientDir(), 'index.html');\n if (existsSync(indexPath)) {\n cachedIndexHtml = readFileSync(indexPath, 'utf-8');\n } else {\n cachedIndexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head><meta charset=\"UTF-8\"><title>Dashboard</title></head>\n<body>\n<div id=\"root\">\n <p style=\"font-family:sans-serif;text-align:center;margin-top:4rem\">\n Dashboard client not built. Run <code>vite build</code> first.\n </p>\n</div>\n</body>\n</html>`;\n }\n return cachedIndexHtml;\n}\n\nfunction serveStaticWeb(pathname: string): Response {\n const dir = getClientDir();\n\n if (pathname !== '/' && pathname !== '/index.html') {\n const filePath = join(dir, pathname);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath);\n const ext = extname(pathname);\n const mimeType = MIME_TYPES[ext] ?? 'application/octet-stream';\n return new Response(content, {\n status: 200,\n headers: {\n 'Content-Type': mimeType,\n 'Content-Length': String(content.length),\n 'Cache-Control': pathname.includes('/assets/')\n ? 'public, max-age=31536000, immutable'\n : 'no-cache',\n },\n });\n } catch {\n // Fall through to SPA fallback\n }\n }\n }\n\n const html = getIndexHtml();\n return new Response(html, {\n status: 200,\n headers: {\n 'Content-Type': 'text/html',\n 'Cache-Control': 'no-cache',\n },\n });\n}\n\n// --- API routing ---\n\nconst CLIENT_ROUTE_REGEX = /^\\/api\\/clients\\/([a-zA-Z0-9_-]+)(\\/.*)?$/;\n\nfunction clientStoreInfo(client: ClientContext) {\n return {\n cache: client.cache\n ? { type: client.cache.type, capabilities: client.cache.capabilities }\n : null,\n dedup: client.dedup\n ? { type: client.dedup.type, capabilities: client.dedup.capabilities }\n : null,\n rateLimit: client.rateLimit\n ? {\n type: client.rateLimit.type,\n capabilities: client.rateLimit.capabilities,\n }\n : null,\n };\n}\n\nasync function routeApi(\n request: Request,\n pathname: string,\n query: URLSearchParams,\n ctx: MultiClientContext,\n): Promise<Response | null> {\n const method = request.method.toUpperCase();\n\n // Health (aggregate)\n if (pathname === '/api/health' && method === 'GET') {\n const clients: Record<string, ReturnType<typeof clientStoreInfo>> = {};\n for (const [name, client] of ctx.clients) {\n clients[name] = clientStoreInfo(client);\n }\n return jsonResponse({\n status: 'ok',\n clients,\n pollIntervalMs: ctx.pollIntervalMs,\n });\n }\n\n // List clients\n if (pathname === '/api/clients' && method === 'GET') {\n const clientList: Array<{\n name: string;\n stores: ReturnType<typeof clientStoreInfo>;\n }> = [];\n for (const [name, client] of ctx.clients) {\n clientList.push({ name, stores: clientStoreInfo(client) });\n }\n return jsonResponse({ clients: clientList });\n }\n\n // Per-client routes: /api/clients/:name/...\n const clientMatch = pathname.match(CLIENT_ROUTE_REGEX);\n if (clientMatch) {\n const clientName = clientMatch[1]!;\n const subPath = clientMatch[2] ?? '';\n const client = ctx.clients.get(clientName);\n\n if (!client) {\n return errorResponse(`Unknown client: ${clientName}`, 404);\n }\n\n return routeClientApi(request, subPath, method, client, query);\n }\n\n // Unknown API route\n if (pathname.startsWith('/api/')) {\n return errorResponse('Not found', 404);\n }\n\n return null;\n}\n\nasync function routeClientApi(\n request: Request,\n subPath: string,\n method: string,\n client: ClientContext,\n query: URLSearchParams,\n): Promise<Response> {\n // Cache routes\n if (subPath.startsWith('/cache')) {\n if (!client.cache) return errorResponse('Cache store not configured', 404);\n return routeCache(subPath, method, client.cache, query);\n }\n\n // Dedup routes\n if (subPath.startsWith('/dedup')) {\n if (!client.dedup) return errorResponse('Dedup store not configured', 404);\n return routeDedup(subPath, method, client.dedup, query);\n }\n\n // Rate limit routes\n if (subPath.startsWith('/rate-limit')) {\n if (!client.rateLimit)\n return errorResponse('Rate limit store not configured', 404);\n return routeRateLimit(request, subPath, method, client.rateLimit);\n }\n\n return errorResponse('Not found', 404);\n}\n\nasync function routeCache(\n pathname: string,\n method: string,\n adapter: NonNullable<ClientContext['cache']>,\n query: URLSearchParams,\n): Promise<Response> {\n try {\n if (pathname === '/cache/stats' && method === 'GET') {\n const stats = await adapter.getStats();\n return jsonResponse({ stats, capabilities: adapter.capabilities });\n }\n\n if (pathname === '/cache/entries' && method === 'GET') {\n const page = parseInt(query.get('page') ?? '0', 10);\n const limit = parseInt(query.get('limit') ?? '50', 10);\n return jsonResponse(await adapter.listEntries(page, limit));\n }\n\n if (pathname === '/cache/entries' && method === 'DELETE') {\n await adapter.clearAll();\n return jsonResponse({ cleared: true });\n }\n\n const isSingleEntry =\n pathname.startsWith('/cache/entries/') &&\n pathname.split('/').length === 4;\n\n if (isSingleEntry && method === 'GET') {\n const hash = extractParam(pathname, '/cache/entries/:hash');\n if (!hash) return errorResponse('Not found', 404);\n const entry = await adapter.getEntry(hash);\n if (entry === undefined) return errorResponse('Not found', 404);\n return jsonResponse({ hash, value: entry });\n }\n\n if (isSingleEntry && method === 'DELETE') {\n const hash = extractParam(pathname, '/cache/entries/:hash');\n if (!hash) return errorResponse('Not found', 404);\n await adapter.deleteEntry(hash);\n return jsonResponse({ deleted: true });\n }\n\n if (isSingleEntry) {\n return errorResponse('Method not allowed', 405);\n }\n } catch (err) {\n return errorResponse(err instanceof Error ? err.message : 'Unknown error');\n }\n\n return errorResponse('Not found', 404);\n}\n\nasync function routeDedup(\n pathname: string,\n method: string,\n adapter: NonNullable<ClientContext['dedup']>,\n query: URLSearchParams,\n): Promise<Response> {\n try {\n if (pathname === '/dedup/stats' && method === 'GET') {\n const stats = await adapter.getStats();\n return jsonResponse({ stats, capabilities: adapter.capabilities });\n }\n\n if (pathname === '/dedup/jobs' && method === 'GET') {\n const page = parseInt(query.get('page') ?? '0', 10);\n const limit = parseInt(query.get('limit') ?? '50', 10);\n return jsonResponse(await adapter.listJobs(page, limit));\n }\n\n const isSingleJob =\n pathname.startsWith('/dedup/jobs/') && pathname.split('/').length === 4;\n\n if (isSingleJob && method === 'GET') {\n const hash = extractParam(pathname, '/dedup/jobs/:hash');\n if (!hash) return errorResponse('Not found', 404);\n const job = await adapter.getJob(hash);\n if (!job) return errorResponse('Not found', 404);\n return jsonResponse(job);\n }\n\n if (isSingleJob) {\n return errorResponse('Method not allowed', 405);\n }\n } catch (err) {\n return errorResponse(err instanceof Error ? err.message : 'Unknown error');\n }\n\n return errorResponse('Not found', 404);\n}\n\nasync function routeRateLimit(\n request: Request,\n pathname: string,\n method: string,\n adapter: NonNullable<ClientContext['rateLimit']>,\n): Promise<Response> {\n try {\n if (pathname === '/rate-limit/stats' && method === 'GET') {\n const stats = await adapter.getStats();\n return jsonResponse({ stats, capabilities: adapter.capabilities });\n }\n\n if (pathname === '/rate-limit/resources' && method === 'GET') {\n const resources = await adapter.listResources();\n return jsonResponse({ resources });\n }\n\n // Config update: PUT /rate-limit/resources/:name/config\n if (pathname.endsWith('/config') && method === 'PUT') {\n const name = extractParam(pathname, '/rate-limit/resources/:name/config');\n if (!name) return errorResponse('Not found', 404);\n const body = (await request.json()) as {\n limit: number;\n windowMs: number;\n };\n await adapter.updateResourceConfig(name, body);\n return jsonResponse({ updated: true });\n }\n\n // Reset: POST /rate-limit/resources/:name/reset\n if (pathname.endsWith('/reset') && method === 'POST') {\n const name = extractParam(pathname, '/rate-limit/resources/:name/reset');\n if (!name) return errorResponse('Not found', 404);\n await adapter.resetResource(name);\n return jsonResponse({ reset: true });\n }\n\n // Single resource: GET /rate-limit/resources/:name\n const isSingleResource =\n pathname.startsWith('/rate-limit/resources/') &&\n pathname.split('/').length === 4;\n\n if (isSingleResource && method === 'GET') {\n const name = extractParam(pathname, '/rate-limit/resources/:name');\n if (!name) return errorResponse('Not found', 404);\n const status = await adapter.getResourceStatus(name);\n return jsonResponse({ resource: name, ...status });\n }\n\n if (isSingleResource) {\n return errorResponse('Method not allowed', 405);\n }\n } catch (err) {\n return errorResponse(err instanceof Error ? err.message : 'Unknown error');\n }\n\n return errorResponse('Not found', 404);\n}\n\n// --- Main export ---\n\nexport function createDashboardHandler(\n options: DashboardOptions,\n): DashboardFetchHandler {\n const opts = validateDashboardOptions(options);\n\n const clients = new Map<string, ClientContext>();\n for (const clientConfig of opts.clients) {\n clients.set(clientConfig.name, {\n name: clientConfig.name,\n cache: clientConfig.cacheStore\n ? detectCacheAdapter(clientConfig.cacheStore)\n : undefined,\n dedup: clientConfig.dedupeStore\n ? detectDedupeAdapter(clientConfig.dedupeStore)\n : undefined,\n rateLimit: clientConfig.rateLimitStore\n ? detectRateLimitAdapter(clientConfig.rateLimitStore)\n : undefined,\n });\n }\n\n const ctx: MultiClientContext = {\n clients,\n pollIntervalMs: opts.pollIntervalMs,\n };\n\n return async (request: Request): Promise<Response> => {\n try {\n const url = new URL(request.url);\n let pathname = url.pathname;\n if (opts.basePath !== '/' && pathname.startsWith(opts.basePath)) {\n pathname = pathname.slice(opts.basePath.length) || '/';\n }\n\n const apiResponse = await routeApi(\n request,\n pathname,\n url.searchParams,\n ctx,\n );\n if (apiResponse) return apiResponse;\n\n return serveStaticWeb(pathname);\n } catch {\n return errorResponse('Internal server error', 500);\n }\n };\n}\n","import { createServer, type Server } from 'http';\nimport {\n validateStandaloneOptions,\n type StandaloneDashboardOptions,\n} from '../config.js';\nimport { createDashboard } from './middleware.js';\n\nexport interface StandaloneDashboardServer {\n server: Server;\n close(): Promise<void>;\n}\n\nexport async function startDashboard(\n options: StandaloneDashboardOptions,\n): Promise<StandaloneDashboardServer> {\n const opts = validateStandaloneOptions(options);\n\n const middleware = createDashboard(options);\n\n const server = createServer((req, res) => {\n middleware(req, res);\n });\n\n return new Promise((resolve, reject) => {\n server.on('error', reject);\n\n server.listen(opts.port, opts.host, () => {\n const addr = server.address();\n const url =\n typeof addr === 'string' ? addr : `http://${opts.host}:${opts.port}`;\n\n console.log(`Dashboard running at ${url}`);\n\n resolve({\n server,\n async close() {\n return new Promise<void>((res, rej) => {\n server.close((err) => {\n if (err) rej(err);\n else res();\n });\n });\n },\n });\n });\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/cache/generic.ts","../src/adapters/cache/memory.ts","../src/adapters/cache/sqlite.ts","../src/adapters/dedup/generic.ts","../src/adapters/dedup/memory.ts","../src/adapters/dedup/sqlite.ts","../src/adapters/rate-limit/generic.ts","../src/adapters/rate-limit/memory.ts","../src/adapters/rate-limit/sqlite.ts","../src/adapters/detect.ts","../src/config.ts","../src/server/request-helpers.ts","../src/server/response-helpers.ts","../src/server/handlers/cache.ts","../src/server/handlers/dedup.ts","../src/server/handlers/health.ts","../src/server/handlers/rate-limit.ts","../src/server/handlers/stores.ts","../src/server/api-router.ts","../src/server/static-server.ts","../src/server/middleware.ts","../src/server/web-handler.ts","../src/server/standalone.ts"],"names":["MIME_TYPES","cachedIndexHtml","clientDir","getCurrentDir","dirname","fileURLToPath","getClientDir","join","getIndexHtml","existsSync","readFileSync","extname","CLIENT_ROUTE_REGEX","clientStoreInfo","routeClientApi"],"mappings":"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","file":"index.js","sourcesContent":["import type { CacheStore } from '@http-client-toolkit/core';\nimport type { CacheStoreAdapter, CacheEntryInfo } from '../types.js';\n\nexport function createGenericCacheAdapter(\n store: CacheStore,\n): CacheStoreAdapter {\n return {\n type: 'generic',\n capabilities: {\n canList: false,\n canDelete: true,\n canClear: true,\n canGetStats: false,\n },\n\n async getStats() {\n return { message: 'Stats not available for this store type' };\n },\n\n async listEntries(): Promise<{ entries: Array<CacheEntryInfo> }> {\n return { entries: [] };\n },\n\n async getEntry(hash: string) {\n return store.get(hash);\n },\n\n async deleteEntry(hash: string) {\n await store.delete(hash);\n },\n\n async clearAll() {\n await store.clear();\n },\n };\n}\n","import type { CacheStore } from '@http-client-toolkit/core';\nimport type { CacheStoreAdapter, CacheEntryInfo } from '../types.js';\n\ninterface InMemoryCacheStoreLike extends CacheStore {\n getStats(): {\n totalItems: number;\n expired: number;\n memoryUsageBytes: number;\n maxItems: number;\n maxMemoryBytes: number;\n memoryUtilization: number;\n itemUtilization: number;\n };\n listEntries(\n offset?: number,\n limit?: number,\n ): Array<{\n hash: string;\n expiresAt: number;\n lastAccessed: number;\n size: number;\n }>;\n}\n\nexport function createMemoryCacheAdapter(store: CacheStore): CacheStoreAdapter {\n const memStore = store as InMemoryCacheStoreLike;\n\n return {\n type: 'memory',\n capabilities: {\n canList: true,\n canDelete: true,\n canClear: true,\n canGetStats: true,\n },\n\n async getStats() {\n return memStore.getStats();\n },\n\n async listEntries(\n page: number,\n limit: number,\n ): Promise<{ entries: Array<CacheEntryInfo> }> {\n const offset = page * limit;\n const entries = memStore.listEntries(offset, limit);\n return { entries };\n },\n\n async getEntry(hash: string) {\n return memStore.get(hash);\n },\n\n async deleteEntry(hash: string) {\n await memStore.delete(hash);\n },\n\n async clearAll() {\n await memStore.clear();\n },\n };\n}\n","import type { CacheStore } from '@http-client-toolkit/core';\nimport type { CacheStoreAdapter, CacheEntryInfo } from '../types.js';\n\ninterface SQLiteCacheStoreLike extends CacheStore {\n getStats(): Promise<{\n totalItems: number;\n expiredItems: number;\n databaseSizeKB: number;\n }>;\n listEntries(\n offset?: number,\n limit?: number,\n ): Promise<\n Array<{\n hash: string;\n expiresAt: number;\n createdAt: number;\n }>\n >;\n}\n\nexport function createSqliteCacheAdapter(store: CacheStore): CacheStoreAdapter {\n const sqlStore = store as SQLiteCacheStoreLike;\n\n return {\n type: 'sqlite',\n capabilities: {\n canList: true,\n canDelete: true,\n canClear: true,\n canGetStats: true,\n },\n\n async getStats() {\n return sqlStore.getStats();\n },\n\n async listEntries(\n page: number,\n limit: number,\n ): Promise<{ entries: Array<CacheEntryInfo> }> {\n const offset = page * limit;\n const results = await sqlStore.listEntries(offset, limit);\n const entries: Array<CacheEntryInfo> = results.map((r) => ({\n hash: r.hash,\n expiresAt: r.expiresAt,\n createdAt: r.createdAt,\n }));\n return { entries };\n },\n\n async getEntry(hash: string) {\n return sqlStore.get(hash);\n },\n\n async deleteEntry(hash: string) {\n await sqlStore.delete(hash);\n },\n\n async clearAll() {\n await sqlStore.clear();\n },\n };\n}\n","import type { DedupeStore } from '@http-client-toolkit/core';\nimport type { DedupeStoreAdapter, DedupeJobInfo } from '../types.js';\n\nexport function createGenericDedupeAdapter(\n _store: DedupeStore,\n): DedupeStoreAdapter {\n return {\n type: 'generic',\n capabilities: {\n canList: false,\n canGetStats: false,\n },\n\n async getStats() {\n return { message: 'Stats not available for this store type' };\n },\n\n async listJobs(): Promise<{ jobs: Array<DedupeJobInfo> }> {\n return { jobs: [] };\n },\n\n async getJob(): Promise<DedupeJobInfo | undefined> {\n return undefined;\n },\n };\n}\n","import type { DedupeStore } from '@http-client-toolkit/core';\nimport type { DedupeStoreAdapter, DedupeJobInfo } from '../types.js';\n\ninterface InMemoryDedupeStoreLike extends DedupeStore {\n getStats(): {\n activeJobs: number;\n totalJobsProcessed: number;\n expiredJobs: number;\n oldestJobAgeMs: number;\n };\n listJobs(\n offset?: number,\n limit?: number,\n ): Array<{\n hash: string;\n jobId: string;\n status: 'pending' | 'completed' | 'failed';\n createdAt: number;\n }>;\n}\n\nexport function createMemoryDedupeAdapter(\n store: DedupeStore,\n): DedupeStoreAdapter {\n const memStore = store as InMemoryDedupeStoreLike;\n\n return {\n type: 'memory',\n capabilities: {\n canList: true,\n canGetStats: true,\n },\n\n async getStats() {\n return memStore.getStats();\n },\n\n async listJobs(\n page: number,\n limit: number,\n ): Promise<{ jobs: Array<DedupeJobInfo> }> {\n const offset = page * limit;\n const jobs = memStore.listJobs(offset, limit);\n return { jobs };\n },\n\n async getJob(hash: string): Promise<DedupeJobInfo | undefined> {\n const jobs = memStore.listJobs(0, 1000);\n return jobs.find((j) => j.hash === hash);\n },\n };\n}\n","import type { DedupeStore } from '@http-client-toolkit/core';\nimport type { DedupeStoreAdapter, DedupeJobInfo } from '../types.js';\n\ninterface SQLiteDedupeStoreLike extends DedupeStore {\n getStats(): Promise<{\n totalJobs: number;\n pendingJobs: number;\n completedJobs: number;\n failedJobs: number;\n expiredJobs: number;\n }>;\n listJobs(\n offset?: number,\n limit?: number,\n ): Promise<\n Array<{\n hash: string;\n jobId: string;\n status: string;\n createdAt: number;\n }>\n >;\n}\n\nexport function createSqliteDedupeAdapter(\n store: DedupeStore,\n): DedupeStoreAdapter {\n const sqlStore = store as SQLiteDedupeStoreLike;\n\n return {\n type: 'sqlite',\n capabilities: {\n canList: true,\n canGetStats: true,\n },\n\n async getStats() {\n return sqlStore.getStats();\n },\n\n async listJobs(\n page: number,\n limit: number,\n ): Promise<{ jobs: Array<DedupeJobInfo> }> {\n const offset = page * limit;\n const results = await sqlStore.listJobs(offset, limit);\n return { jobs: results };\n },\n\n async getJob(hash: string): Promise<DedupeJobInfo | undefined> {\n const results = await sqlStore.listJobs(0, 1000);\n return results.find((j) => j.hash === hash);\n },\n };\n}\n","import type { RateLimitStore } from '@http-client-toolkit/core';\nimport type { RateLimitStoreAdapter, RateLimitResourceInfo } from '../types.js';\n\nexport function createGenericRateLimitAdapter(\n store: RateLimitStore,\n): RateLimitStoreAdapter {\n return {\n type: 'generic',\n capabilities: {\n canList: false,\n canGetStats: false,\n canUpdateConfig: false,\n canReset: true,\n },\n\n async getStats() {\n return { message: 'Stats not available for this store type' };\n },\n\n async listResources(): Promise<Array<RateLimitResourceInfo>> {\n return [];\n },\n\n async getResourceStatus(name: string) {\n return store.getStatus(name);\n },\n\n async updateResourceConfig() {\n throw new Error('Config updates not supported for this store type');\n },\n\n async resetResource(name: string) {\n await store.reset(name);\n },\n };\n}\n","import type { RateLimitStore } from '@http-client-toolkit/core';\nimport type { RateLimitStoreAdapter, RateLimitResourceInfo } from '../types.js';\n\ninterface InMemoryRateLimitStoreLike extends RateLimitStore {\n getStats(): {\n totalResources: number;\n activeResources: number;\n rateLimitedResources: number;\n totalRequests: number;\n };\n listResources(): Array<{\n resource: string;\n requestCount: number;\n limit: number;\n windowMs: number;\n }>;\n setResourceConfig(\n resource: string,\n config: { limit: number; windowMs: number },\n ): void;\n getResourceConfig(resource: string): { limit: number; windowMs: number };\n}\n\nexport function createMemoryRateLimitAdapter(\n store: RateLimitStore,\n): RateLimitStoreAdapter {\n const memStore = store as InMemoryRateLimitStoreLike;\n\n return {\n type: 'memory',\n capabilities: {\n canList: true,\n canGetStats: true,\n canUpdateConfig: true,\n canReset: true,\n },\n\n async getStats() {\n return memStore.getStats();\n },\n\n async listResources(): Promise<Array<RateLimitResourceInfo>> {\n return memStore.listResources();\n },\n\n async getResourceStatus(name: string) {\n return memStore.getStatus(name);\n },\n\n async updateResourceConfig(\n name: string,\n config: { limit: number; windowMs: number },\n ) {\n memStore.setResourceConfig(name, config);\n },\n\n async resetResource(name: string) {\n await memStore.reset(name);\n },\n };\n}\n","import type { RateLimitStore } from '@http-client-toolkit/core';\nimport type { RateLimitStoreAdapter, RateLimitResourceInfo } from '../types.js';\n\ninterface SQLiteRateLimitStoreLike extends RateLimitStore {\n getStats(): Promise<{\n totalRequests: number;\n uniqueResources: number;\n rateLimitedResources: Array<string>;\n }>;\n listResources(): Promise<\n Array<{\n resource: string;\n requestCount: number;\n limit: number;\n windowMs: number;\n }>\n >;\n setResourceConfig(\n resource: string,\n config: { limit: number; windowMs: number },\n ): void;\n getResourceConfig(resource: string): { limit: number; windowMs: number };\n}\n\nexport function createSqliteRateLimitAdapter(\n store: RateLimitStore,\n): RateLimitStoreAdapter {\n const sqlStore = store as SQLiteRateLimitStoreLike;\n\n return {\n type: 'sqlite',\n capabilities: {\n canList: true,\n canGetStats: true,\n canUpdateConfig: true,\n canReset: true,\n },\n\n async getStats() {\n return sqlStore.getStats();\n },\n\n async listResources(): Promise<Array<RateLimitResourceInfo>> {\n return sqlStore.listResources();\n },\n\n async getResourceStatus(name: string) {\n return sqlStore.getStatus(name);\n },\n\n async updateResourceConfig(\n name: string,\n config: { limit: number; windowMs: number },\n ) {\n sqlStore.setResourceConfig(name, config);\n },\n\n async resetResource(name: string) {\n await sqlStore.reset(name);\n },\n };\n}\n","import type {\n CacheStore,\n DedupeStore,\n RateLimitStore,\n} from '@http-client-toolkit/core';\nimport { createGenericCacheAdapter } from './cache/generic.js';\nimport { createMemoryCacheAdapter } from './cache/memory.js';\nimport { createSqliteCacheAdapter } from './cache/sqlite.js';\nimport { createGenericDedupeAdapter } from './dedup/generic.js';\nimport { createMemoryDedupeAdapter } from './dedup/memory.js';\nimport { createSqliteDedupeAdapter } from './dedup/sqlite.js';\nimport { createGenericRateLimitAdapter } from './rate-limit/generic.js';\nimport { createMemoryRateLimitAdapter } from './rate-limit/memory.js';\nimport { createSqliteRateLimitAdapter } from './rate-limit/sqlite.js';\nimport type {\n CacheStoreAdapter,\n DedupeStoreAdapter,\n RateLimitStoreAdapter,\n} from './types.js';\n\nfunction isMemoryStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.cleanup === 'function' &&\n typeof s.getLRUItems === 'function'\n );\n}\n\nfunction isSqliteStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.close === 'function'\n );\n}\n\nfunction isMemoryDedupeStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.listJobs === 'function' &&\n typeof s.cleanup === 'function' &&\n !('close' in s && typeof s.close === 'function')\n );\n}\n\nfunction isSqliteDedupeStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.close === 'function' &&\n typeof s.listJobs === 'function'\n );\n}\n\nfunction isMemoryRateLimitStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.listResources === 'function' &&\n typeof s.setResourceConfig === 'function' &&\n !('close' in s && typeof s.close === 'function')\n );\n}\n\nfunction isSqliteRateLimitStore(store: unknown): boolean {\n if (!store || typeof store !== 'object') return false;\n const s = store as Record<string, unknown>;\n return (\n typeof s.destroy === 'function' &&\n typeof s.getStats === 'function' &&\n typeof s.close === 'function' &&\n typeof s.listResources === 'function' &&\n typeof s.setResourceConfig === 'function'\n );\n}\n\nexport function detectCacheAdapter(store: CacheStore): CacheStoreAdapter {\n if (isMemoryStore(store)) {\n return createMemoryCacheAdapter(store);\n }\n if (isSqliteStore(store)) {\n return createSqliteCacheAdapter(store);\n }\n return createGenericCacheAdapter(store);\n}\n\nexport function detectDedupeAdapter(store: DedupeStore): DedupeStoreAdapter {\n if (isMemoryDedupeStore(store)) {\n return createMemoryDedupeAdapter(store);\n }\n if (isSqliteDedupeStore(store)) {\n return createSqliteDedupeAdapter(store);\n }\n return createGenericDedupeAdapter(store);\n}\n\nexport function detectRateLimitAdapter(\n store: RateLimitStore,\n): RateLimitStoreAdapter {\n if (isMemoryRateLimitStore(store)) {\n return createMemoryRateLimitAdapter(store);\n }\n if (isSqliteRateLimitStore(store)) {\n return createSqliteRateLimitAdapter(store);\n }\n return createGenericRateLimitAdapter(store);\n}\n","import type {\n CacheStore,\n DedupeStore,\n HttpClient,\n RateLimitStore,\n} from '@http-client-toolkit/core';\nimport { z } from 'zod';\n\nconst CLIENT_NAME_REGEX = /^[a-zA-Z0-9_-]+$/;\n\nconst ClientConfigSchema = z\n .object({\n client: z.custom<HttpClient>(\n (val) =>\n val != null &&\n typeof val === 'object' &&\n 'stores' in val &&\n 'get' in val,\n 'Must be an HttpClient instance',\n ),\n name: z\n .string()\n .min(1, 'Client name must not be empty')\n .regex(CLIENT_NAME_REGEX, 'Client name must be URL-safe (a-z, 0-9, -, _)')\n .optional(),\n })\n .refine(\n (data) => {\n const { stores } = data.client;\n return stores.cache || stores.dedupe || stores.rateLimit;\n },\n { message: 'HttpClient must have at least one store configured' },\n );\n\nfunction resolveClientName(c: { client: HttpClient; name?: string }): string {\n return c.name ?? c.client.name;\n}\n\nconst DashboardOptionsSchema = z\n .object({\n clients: z\n .array(ClientConfigSchema)\n .min(1, 'At least one client is required'),\n basePath: z.string().default('/'),\n pollIntervalMs: z.number().int().positive().default(5000),\n })\n .refine(\n (data) => {\n const names = data.clients.map(resolveClientName);\n return new Set(names).size === names.length;\n },\n { message: 'Client names must be unique' },\n );\n\nconst StandaloneDashboardOptionsSchema = DashboardOptionsSchema.and(\n z.object({\n port: z.number().int().nonnegative().default(4000),\n host: z.string().default('localhost'),\n }),\n);\n\nexport interface NormalizedClientConfig {\n name: string;\n cacheStore?: CacheStore;\n dedupeStore?: DedupeStore;\n rateLimitStore?: RateLimitStore;\n}\n\nexport function normalizeClient(config: {\n client: HttpClient;\n name?: string;\n}): NormalizedClientConfig {\n const name = config.name ?? config.client.name;\n const { stores } = config.client;\n return {\n name,\n cacheStore: stores.cache,\n dedupeStore: stores.dedupe,\n rateLimitStore: stores.rateLimit,\n };\n}\n\nexport type ClientConfig = z.input<typeof ClientConfigSchema>;\nexport type DashboardOptions = z.input<typeof DashboardOptionsSchema>;\nexport type StandaloneDashboardOptions = z.input<\n typeof StandaloneDashboardOptionsSchema\n>;\n\nexport function validateDashboardOptions(options: DashboardOptions) {\n return DashboardOptionsSchema.parse(options);\n}\n\nexport function validateStandaloneOptions(options: StandaloneDashboardOptions) {\n return StandaloneDashboardOptionsSchema.parse(options);\n}\n","import type { IncomingMessage } from 'http';\n\nexport function parseUrl(\n req: IncomingMessage,\n basePath: string,\n): { pathname: string; query: URLSearchParams } {\n const raw = req.url ?? '/';\n const url = new URL(raw, 'http://localhost');\n\n let pathname = url.pathname;\n if (basePath !== '/' && pathname.startsWith(basePath)) {\n pathname = pathname.slice(basePath.length) || '/';\n }\n\n return { pathname, query: url.searchParams };\n}\n\nexport function extractParam(\n pathname: string,\n pattern: string,\n): string | undefined {\n // pattern like \"/api/cache/entries/:hash\"\n const patternParts = pattern.split('/');\n const pathParts = pathname.split('/');\n\n if (patternParts.length !== pathParts.length) return undefined;\n\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i]!;\n if (pp.startsWith(':')) continue;\n if (pp !== pathParts[i]) return undefined;\n }\n\n const paramIndex = patternParts.findIndex((p) => p.startsWith(':'));\n if (paramIndex === -1) return undefined;\n return pathParts[paramIndex];\n}\n\nexport async function readJsonBody<T>(req: IncomingMessage): Promise<T> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n resolve(JSON.parse(body) as T);\n } catch {\n reject(new Error('Invalid JSON body'));\n }\n });\n req.on('error', reject);\n });\n}\n","import type { ServerResponse } from 'http';\n\nexport function sendJson(\n res: ServerResponse,\n data: unknown,\n status: number = 200,\n): void {\n const body = JSON.stringify(data);\n res.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(body),\n 'Cache-Control': 'no-store',\n });\n res.end(body);\n}\n\nexport function sendError(\n res: ServerResponse,\n message: string,\n status: number = 500,\n): void {\n sendJson(res, { error: message }, status);\n}\n\nexport function sendNotFound(res: ServerResponse): void {\n sendError(res, 'Not found', 404);\n}\n\nexport function sendMethodNotAllowed(res: ServerResponse): void {\n sendError(res, 'Method not allowed', 405);\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { CacheStoreAdapter } from '../../adapters/types.js';\nimport { extractParam } from '../request-helpers.js';\nimport { sendJson, sendError, sendNotFound } from '../response-helpers.js';\n\nexport async function handleCacheStats(\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n): Promise<void> {\n try {\n const stats = await adapter.getStats();\n sendJson(res, { stats, capabilities: adapter.capabilities });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleCacheEntries(\n _req: IncomingMessage,\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n query: URLSearchParams,\n): Promise<void> {\n try {\n const page = parseInt(query.get('page') ?? '0', 10);\n const limit = parseInt(query.get('limit') ?? '50', 10);\n const result = await adapter.listEntries(page, limit);\n sendJson(res, result);\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleCacheEntry(\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const hash = extractParam(pathname, '/cache/entries/:hash');\n if (!hash) {\n sendNotFound(res);\n return;\n }\n const entry = await adapter.getEntry(hash);\n if (entry === undefined) {\n sendNotFound(res);\n return;\n }\n sendJson(res, { hash, value: entry });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleDeleteCacheEntry(\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const hash = extractParam(pathname, '/cache/entries/:hash');\n if (!hash) {\n sendNotFound(res);\n return;\n }\n await adapter.deleteEntry(hash);\n sendJson(res, { deleted: true });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleClearCache(\n res: ServerResponse,\n adapter: CacheStoreAdapter,\n): Promise<void> {\n try {\n await adapter.clearAll();\n sendJson(res, { cleared: true });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { DedupeStoreAdapter } from '../../adapters/types.js';\nimport { extractParam } from '../request-helpers.js';\nimport { sendJson, sendError, sendNotFound } from '../response-helpers.js';\n\nexport async function handleDedupeStats(\n res: ServerResponse,\n adapter: DedupeStoreAdapter,\n): Promise<void> {\n try {\n const stats = await adapter.getStats();\n sendJson(res, { stats, capabilities: adapter.capabilities });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleDedupeJobs(\n _req: IncomingMessage,\n res: ServerResponse,\n adapter: DedupeStoreAdapter,\n query: URLSearchParams,\n): Promise<void> {\n try {\n const page = parseInt(query.get('page') ?? '0', 10);\n const limit = parseInt(query.get('limit') ?? '50', 10);\n const result = await adapter.listJobs(page, limit);\n sendJson(res, result);\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleDedupeJob(\n res: ServerResponse,\n adapter: DedupeStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const hash = extractParam(pathname, '/dedup/jobs/:hash');\n if (!hash) {\n sendNotFound(res);\n return;\n }\n const job = await adapter.getJob(hash);\n if (!job) {\n sendNotFound(res);\n return;\n }\n sendJson(res, job);\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n","import type { ServerResponse } from 'http';\nimport type {\n CacheStoreAdapter,\n DedupeStoreAdapter,\n RateLimitStoreAdapter,\n} from '../../adapters/types.js';\nimport { sendJson } from '../response-helpers.js';\n\nexport interface ClientContext {\n name: string;\n cache?: CacheStoreAdapter;\n dedup?: DedupeStoreAdapter;\n rateLimit?: RateLimitStoreAdapter;\n}\n\nexport interface MultiClientContext {\n clients: Map<string, ClientContext>;\n pollIntervalMs: number;\n}\n\nfunction clientStoreInfo(client: ClientContext) {\n return {\n cache: client.cache\n ? { type: client.cache.type, capabilities: client.cache.capabilities }\n : null,\n dedup: client.dedup\n ? { type: client.dedup.type, capabilities: client.dedup.capabilities }\n : null,\n rateLimit: client.rateLimit\n ? {\n type: client.rateLimit.type,\n capabilities: client.rateLimit.capabilities,\n }\n : null,\n };\n}\n\nexport function handleHealth(\n res: ServerResponse,\n ctx: MultiClientContext,\n): void {\n const clients: Record<string, ReturnType<typeof clientStoreInfo>> = {};\n for (const [name, client] of ctx.clients) {\n clients[name] = clientStoreInfo(client);\n }\n\n sendJson(res, {\n status: 'ok',\n clients,\n pollIntervalMs: ctx.pollIntervalMs,\n });\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { RateLimitStoreAdapter } from '../../adapters/types.js';\nimport { extractParam, readJsonBody } from '../request-helpers.js';\nimport { sendJson, sendError, sendNotFound } from '../response-helpers.js';\n\nexport async function handleRateLimitStats(\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n): Promise<void> {\n try {\n const stats = await adapter.getStats();\n sendJson(res, { stats, capabilities: adapter.capabilities });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleRateLimitResources(\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n): Promise<void> {\n try {\n const resources = await adapter.listResources();\n sendJson(res, { resources });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleRateLimitResource(\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const name = extractParam(pathname, '/rate-limit/resources/:name');\n if (!name) {\n sendNotFound(res);\n return;\n }\n const status = await adapter.getResourceStatus(name);\n sendJson(res, { resource: name, ...status });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleUpdateRateLimitConfig(\n req: IncomingMessage,\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const name = extractParam(pathname, '/rate-limit/resources/:name/config');\n if (!name) {\n sendNotFound(res);\n return;\n }\n const body = await readJsonBody<{ limit: number; windowMs: number }>(req);\n await adapter.updateResourceConfig(name, body);\n sendJson(res, { updated: true });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n\nexport async function handleResetRateLimitResource(\n res: ServerResponse,\n adapter: RateLimitStoreAdapter,\n pathname: string,\n): Promise<void> {\n try {\n const name = extractParam(pathname, '/rate-limit/resources/:name/reset');\n if (!name) {\n sendNotFound(res);\n return;\n }\n await adapter.resetResource(name);\n sendJson(res, { reset: true });\n } catch (err) {\n sendError(res, err instanceof Error ? err.message : 'Unknown error');\n }\n}\n","import type { ServerResponse } from 'http';\nimport type { MultiClientContext } from './health.js';\nimport { sendJson } from '../response-helpers.js';\n\nexport function handleClients(\n res: ServerResponse,\n ctx: MultiClientContext,\n): void {\n const clients: Array<{\n name: string;\n stores: {\n cache: { type: string; capabilities: Record<string, boolean> } | null;\n dedup: { type: string; capabilities: Record<string, boolean> } | null;\n rateLimit: { type: string; capabilities: Record<string, boolean> } | null;\n };\n }> = [];\n\n for (const [name, client] of ctx.clients) {\n clients.push({\n name,\n stores: {\n cache: client.cache\n ? { type: client.cache.type, capabilities: client.cache.capabilities }\n : null,\n dedup: client.dedup\n ? { type: client.dedup.type, capabilities: client.dedup.capabilities }\n : null,\n rateLimit: client.rateLimit\n ? {\n type: client.rateLimit.type,\n capabilities: client.rateLimit.capabilities,\n }\n : null,\n },\n });\n }\n\n sendJson(res, { clients });\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport {\n handleCacheStats,\n handleCacheEntries,\n handleCacheEntry,\n handleDeleteCacheEntry,\n handleClearCache,\n} from './handlers/cache.js';\nimport {\n handleDedupeStats,\n handleDedupeJobs,\n handleDedupeJob,\n} from './handlers/dedup.js';\nimport {\n type ClientContext,\n type MultiClientContext,\n handleHealth,\n} from './handlers/health.js';\nimport {\n handleRateLimitStats,\n handleRateLimitResources,\n handleRateLimitResource,\n handleUpdateRateLimitConfig,\n handleResetRateLimitResource,\n} from './handlers/rate-limit.js';\nimport { handleClients } from './handlers/stores.js';\nimport {\n sendNotFound,\n sendMethodNotAllowed,\n sendError,\n} from './response-helpers.js';\n\nconst CLIENT_ROUTE_REGEX = /^\\/api\\/clients\\/([a-zA-Z0-9_-]+)(\\/.*)?$/;\n\nexport function createApiRouter(ctx: MultiClientContext) {\n return async (\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n query: URLSearchParams,\n ): Promise<boolean> => {\n const method = req.method?.toUpperCase() ?? 'GET';\n\n // Health (aggregate)\n if (pathname === '/api/health' && method === 'GET') {\n handleHealth(res, ctx);\n return true;\n }\n\n // List clients\n if (pathname === '/api/clients' && method === 'GET') {\n handleClients(res, ctx);\n return true;\n }\n\n // Per-client routes: /api/clients/:name/...\n const clientMatch = pathname.match(CLIENT_ROUTE_REGEX);\n if (clientMatch) {\n const clientName = clientMatch[1]!;\n const subPath = clientMatch[2] ?? '';\n const client = ctx.clients.get(clientName);\n\n if (!client) {\n sendError(res, `Unknown client: ${clientName}`, 404);\n return true;\n }\n\n return routeClientApi(req, res, client, subPath, method, query);\n }\n\n // No API route matched\n if (pathname.startsWith('/api/')) {\n sendNotFound(res);\n return true;\n }\n\n return false;\n };\n}\n\nasync function routeClientApi(\n req: IncomingMessage,\n res: ServerResponse,\n client: ClientContext,\n subPath: string,\n method: string,\n query: URLSearchParams,\n): Promise<boolean> {\n // Cache routes\n if (subPath.startsWith('/cache')) {\n if (!client.cache) {\n sendError(res, 'Cache store not configured', 404);\n return true;\n }\n\n if (subPath === '/cache/stats' && method === 'GET') {\n await handleCacheStats(res, client.cache);\n return true;\n }\n\n if (subPath === '/cache/entries' && method === 'GET') {\n await handleCacheEntries(req, res, client.cache, query);\n return true;\n }\n\n if (subPath === '/cache/entries' && method === 'DELETE') {\n await handleClearCache(res, client.cache);\n return true;\n }\n\n const isSingleEntry =\n subPath.startsWith('/cache/entries/') && subPath.split('/').length === 4;\n\n if (isSingleEntry && method === 'GET') {\n await handleCacheEntry(res, client.cache, subPath);\n return true;\n }\n\n if (isSingleEntry && method === 'DELETE') {\n await handleDeleteCacheEntry(res, client.cache, subPath);\n return true;\n }\n\n if (isSingleEntry) {\n sendMethodNotAllowed(res);\n return true;\n }\n }\n\n // Dedup routes\n if (subPath.startsWith('/dedup')) {\n if (!client.dedup) {\n sendError(res, 'Dedup store not configured', 404);\n return true;\n }\n\n if (subPath === '/dedup/stats' && method === 'GET') {\n await handleDedupeStats(res, client.dedup);\n return true;\n }\n\n if (subPath === '/dedup/jobs' && method === 'GET') {\n await handleDedupeJobs(req, res, client.dedup, query);\n return true;\n }\n\n const isSingleJob =\n subPath.startsWith('/dedup/jobs/') && subPath.split('/').length === 4;\n\n if (isSingleJob && method === 'GET') {\n await handleDedupeJob(res, client.dedup, subPath);\n return true;\n }\n\n if (isSingleJob) {\n sendMethodNotAllowed(res);\n return true;\n }\n }\n\n // Rate limit routes\n if (subPath.startsWith('/rate-limit')) {\n if (!client.rateLimit) {\n sendError(res, 'Rate limit store not configured', 404);\n return true;\n }\n\n if (subPath === '/rate-limit/stats' && method === 'GET') {\n await handleRateLimitStats(res, client.rateLimit);\n return true;\n }\n\n if (subPath === '/rate-limit/resources' && method === 'GET') {\n await handleRateLimitResources(res, client.rateLimit);\n return true;\n }\n\n if (subPath.endsWith('/config') && method === 'PUT') {\n await handleUpdateRateLimitConfig(req, res, client.rateLimit, subPath);\n return true;\n }\n\n if (subPath.endsWith('/reset') && method === 'POST') {\n await handleResetRateLimitResource(res, client.rateLimit, subPath);\n return true;\n }\n\n const isSingleResource =\n subPath.startsWith('/rate-limit/resources/') &&\n subPath.split('/').length === 4;\n\n if (isSingleResource && method === 'GET') {\n await handleRateLimitResource(res, client.rateLimit, subPath);\n return true;\n }\n\n if (isSingleResource) {\n sendMethodNotAllowed(res);\n return true;\n }\n }\n\n sendNotFound(res);\n return true;\n}\n","import { readFileSync, existsSync } from 'fs';\nimport type { ServerResponse } from 'http';\nimport { join, dirname, extname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nlet cachedIndexHtml: string | undefined;\nlet clientDir: string | undefined;\n\nfunction getCurrentDir(): string {\n // ESM: use import.meta.url; CJS: use __dirname\n try {\n return dirname(fileURLToPath(import.meta.url));\n } catch {\n // Fallback for CJS\n return typeof __dirname !== 'undefined' ? __dirname : process.cwd();\n }\n}\n\nfunction getClientDir(): string {\n if (clientDir) return clientDir;\n const currentDir = getCurrentDir();\n // In built output: lib/index.js → dist/client/\n // Navigate from lib/ up to package root, then into dist/client\n clientDir = join(currentDir, '..', 'dist', 'client');\n return clientDir;\n}\n\nfunction getIndexHtml(): string {\n if (cachedIndexHtml) return cachedIndexHtml;\n const indexPath = join(getClientDir(), 'index.html');\n if (existsSync(indexPath)) {\n cachedIndexHtml = readFileSync(indexPath, 'utf-8');\n } else {\n cachedIndexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head><meta charset=\"UTF-8\"><title>Dashboard</title></head>\n<body>\n<div id=\"root\">\n <p style=\"font-family:sans-serif;text-align:center;margin-top:4rem\">\n Dashboard client not built. Run <code>vite build</code> first.\n </p>\n</div>\n</body>\n</html>`;\n }\n return cachedIndexHtml;\n}\n\nexport function serveStatic(res: ServerResponse, pathname: string): boolean {\n const dir = getClientDir();\n\n // Try to serve a static file\n if (pathname !== '/' && pathname !== '/index.html') {\n const filePath = join(dir, pathname);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath);\n const ext = extname(pathname);\n const mimeType = MIME_TYPES[ext] ?? 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mimeType,\n 'Content-Length': content.length,\n 'Cache-Control': pathname.includes('/assets/')\n ? 'public, max-age=31536000, immutable'\n : 'no-cache',\n });\n res.end(content);\n return true;\n } catch {\n // Fall through to SPA fallback\n }\n }\n }\n\n // SPA fallback: serve index.html\n const html = getIndexHtml();\n res.writeHead(200, {\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(html),\n 'Cache-Control': 'no-cache',\n });\n res.end(html);\n return true;\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport {\n detectCacheAdapter,\n detectDedupeAdapter,\n detectRateLimitAdapter,\n} from '../adapters/detect.js';\nimport {\n normalizeClient,\n validateDashboardOptions,\n type DashboardOptions,\n} from '../config.js';\nimport { createApiRouter } from './api-router.js';\nimport type { ClientContext, MultiClientContext } from './handlers/health.js';\nimport { parseUrl } from './request-helpers.js';\nimport { serveStatic } from './static-server.js';\n\nexport type DashboardMiddleware = (\n req: IncomingMessage,\n res: ServerResponse,\n next?: () => void,\n) => void;\n\nexport function createDashboard(\n options: DashboardOptions,\n): DashboardMiddleware {\n const opts = validateDashboardOptions(options);\n\n const clients = new Map<string, ClientContext>();\n for (const clientConfig of opts.clients) {\n const normalized = normalizeClient(clientConfig);\n clients.set(normalized.name, {\n name: normalized.name,\n cache: normalized.cacheStore\n ? detectCacheAdapter(normalized.cacheStore)\n : undefined,\n dedup: normalized.dedupeStore\n ? detectDedupeAdapter(normalized.dedupeStore)\n : undefined,\n rateLimit: normalized.rateLimitStore\n ? detectRateLimitAdapter(normalized.rateLimitStore)\n : undefined,\n });\n }\n\n const ctx: MultiClientContext = {\n clients,\n pollIntervalMs: opts.pollIntervalMs,\n };\n\n const apiRouter = createApiRouter(ctx);\n\n return (req: IncomingMessage, res: ServerResponse, _next?: () => void) => {\n const { pathname, query } = parseUrl(req, opts.basePath);\n\n // Handle API routes\n apiRouter(req, res, pathname, query)\n .then((handled) => {\n if (!handled) {\n // Serve static files / SPA\n serveStatic(res, pathname);\n }\n })\n .catch(() => {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Internal server error' }));\n });\n };\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join, dirname, extname } from 'path';\nimport { fileURLToPath } from 'url';\nimport {\n detectCacheAdapter,\n detectDedupeAdapter,\n detectRateLimitAdapter,\n} from '../adapters/detect.js';\nimport {\n normalizeClient,\n validateDashboardOptions,\n type DashboardOptions,\n} from '../config.js';\nimport type { ClientContext, MultiClientContext } from './handlers/health.js';\nimport { extractParam } from './request-helpers.js';\n\nexport type DashboardFetchHandler = (request: Request) => Promise<Response>;\n\n// --- Response helpers ---\n\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store',\n} as const;\n\nfunction jsonResponse(data: unknown, status: number = 200): Response {\n return new Response(JSON.stringify(data), { status, headers: JSON_HEADERS });\n}\n\nfunction errorResponse(message: string, status: number = 500): Response {\n return jsonResponse({ error: message }, status);\n}\n\n// --- Static file serving ---\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nlet cachedIndexHtml: string | undefined;\nlet clientDir: string | undefined;\n\nfunction getCurrentDir(): string {\n try {\n return dirname(fileURLToPath(import.meta.url));\n } catch {\n return typeof __dirname !== 'undefined' ? __dirname : process.cwd();\n }\n}\n\nfunction getClientDir(): string {\n if (clientDir) return clientDir;\n const currentDir = getCurrentDir();\n clientDir = join(currentDir, '..', 'dist', 'client');\n return clientDir;\n}\n\nfunction getIndexHtml(): string {\n if (cachedIndexHtml) return cachedIndexHtml;\n const indexPath = join(getClientDir(), 'index.html');\n if (existsSync(indexPath)) {\n cachedIndexHtml = readFileSync(indexPath, 'utf-8');\n } else {\n cachedIndexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n<head><meta charset=\"UTF-8\"><title>Dashboard</title></head>\n<body>\n<div id=\"root\">\n <p style=\"font-family:sans-serif;text-align:center;margin-top:4rem\">\n Dashboard client not built. Run <code>vite build</code> first.\n </p>\n</div>\n</body>\n</html>`;\n }\n return cachedIndexHtml;\n}\n\nfunction serveStaticWeb(pathname: string): Response {\n const dir = getClientDir();\n\n if (pathname !== '/' && pathname !== '/index.html') {\n const filePath = join(dir, pathname);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath);\n const ext = extname(pathname);\n const mimeType = MIME_TYPES[ext] ?? 'application/octet-stream';\n return new Response(content, {\n status: 200,\n headers: {\n 'Content-Type': mimeType,\n 'Content-Length': String(content.length),\n 'Cache-Control': pathname.includes('/assets/')\n ? 'public, max-age=31536000, immutable'\n : 'no-cache',\n },\n });\n } catch {\n // Fall through to SPA fallback\n }\n }\n }\n\n const html = getIndexHtml();\n return new Response(html, {\n status: 200,\n headers: {\n 'Content-Type': 'text/html',\n 'Cache-Control': 'no-cache',\n },\n });\n}\n\n// --- API routing ---\n\nconst CLIENT_ROUTE_REGEX = /^\\/api\\/clients\\/([a-zA-Z0-9_-]+)(\\/.*)?$/;\n\nfunction clientStoreInfo(client: ClientContext) {\n return {\n cache: client.cache\n ? { type: client.cache.type, capabilities: client.cache.capabilities }\n : null,\n dedup: client.dedup\n ? { type: client.dedup.type, capabilities: client.dedup.capabilities }\n : null,\n rateLimit: client.rateLimit\n ? {\n type: client.rateLimit.type,\n capabilities: client.rateLimit.capabilities,\n }\n : null,\n };\n}\n\nasync function routeApi(\n request: Request,\n pathname: string,\n query: URLSearchParams,\n ctx: MultiClientContext,\n): Promise<Response | null> {\n const method = request.method.toUpperCase();\n\n // Health (aggregate)\n if (pathname === '/api/health' && method === 'GET') {\n const clients: Record<string, ReturnType<typeof clientStoreInfo>> = {};\n for (const [name, client] of ctx.clients) {\n clients[name] = clientStoreInfo(client);\n }\n return jsonResponse({\n status: 'ok',\n clients,\n pollIntervalMs: ctx.pollIntervalMs,\n });\n }\n\n // List clients\n if (pathname === '/api/clients' && method === 'GET') {\n const clientList: Array<{\n name: string;\n stores: ReturnType<typeof clientStoreInfo>;\n }> = [];\n for (const [name, client] of ctx.clients) {\n clientList.push({ name, stores: clientStoreInfo(client) });\n }\n return jsonResponse({ clients: clientList });\n }\n\n // Per-client routes: /api/clients/:name/...\n const clientMatch = pathname.match(CLIENT_ROUTE_REGEX);\n if (clientMatch) {\n const clientName = clientMatch[1]!;\n const subPath = clientMatch[2] ?? '';\n const client = ctx.clients.get(clientName);\n\n if (!client) {\n return errorResponse(`Unknown client: ${clientName}`, 404);\n }\n\n return routeClientApi(request, subPath, method, client, query);\n }\n\n // Unknown API route\n if (pathname.startsWith('/api/')) {\n return errorResponse('Not found', 404);\n }\n\n return null;\n}\n\nasync function routeClientApi(\n request: Request,\n subPath: string,\n method: string,\n client: ClientContext,\n query: URLSearchParams,\n): Promise<Response> {\n // Cache routes\n if (subPath.startsWith('/cache')) {\n if (!client.cache) return errorResponse('Cache store not configured', 404);\n return routeCache(subPath, method, client.cache, query);\n }\n\n // Dedup routes\n if (subPath.startsWith('/dedup')) {\n if (!client.dedup) return errorResponse('Dedup store not configured', 404);\n return routeDedup(subPath, method, client.dedup, query);\n }\n\n // Rate limit routes\n if (subPath.startsWith('/rate-limit')) {\n if (!client.rateLimit)\n return errorResponse('Rate limit store not configured', 404);\n return routeRateLimit(request, subPath, method, client.rateLimit);\n }\n\n return errorResponse('Not found', 404);\n}\n\nasync function routeCache(\n pathname: string,\n method: string,\n adapter: NonNullable<ClientContext['cache']>,\n query: URLSearchParams,\n): Promise<Response> {\n try {\n if (pathname === '/cache/stats' && method === 'GET') {\n const stats = await adapter.getStats();\n return jsonResponse({ stats, capabilities: adapter.capabilities });\n }\n\n if (pathname === '/cache/entries' && method === 'GET') {\n const page = parseInt(query.get('page') ?? '0', 10);\n const limit = parseInt(query.get('limit') ?? '50', 10);\n return jsonResponse(await adapter.listEntries(page, limit));\n }\n\n if (pathname === '/cache/entries' && method === 'DELETE') {\n await adapter.clearAll();\n return jsonResponse({ cleared: true });\n }\n\n const isSingleEntry =\n pathname.startsWith('/cache/entries/') &&\n pathname.split('/').length === 4;\n\n if (isSingleEntry && method === 'GET') {\n const hash = extractParam(pathname, '/cache/entries/:hash');\n if (!hash) return errorResponse('Not found', 404);\n const entry = await adapter.getEntry(hash);\n if (entry === undefined) return errorResponse('Not found', 404);\n return jsonResponse({ hash, value: entry });\n }\n\n if (isSingleEntry && method === 'DELETE') {\n const hash = extractParam(pathname, '/cache/entries/:hash');\n if (!hash) return errorResponse('Not found', 404);\n await adapter.deleteEntry(hash);\n return jsonResponse({ deleted: true });\n }\n\n if (isSingleEntry) {\n return errorResponse('Method not allowed', 405);\n }\n } catch (err) {\n return errorResponse(err instanceof Error ? err.message : 'Unknown error');\n }\n\n return errorResponse('Not found', 404);\n}\n\nasync function routeDedup(\n pathname: string,\n method: string,\n adapter: NonNullable<ClientContext['dedup']>,\n query: URLSearchParams,\n): Promise<Response> {\n try {\n if (pathname === '/dedup/stats' && method === 'GET') {\n const stats = await adapter.getStats();\n return jsonResponse({ stats, capabilities: adapter.capabilities });\n }\n\n if (pathname === '/dedup/jobs' && method === 'GET') {\n const page = parseInt(query.get('page') ?? '0', 10);\n const limit = parseInt(query.get('limit') ?? '50', 10);\n return jsonResponse(await adapter.listJobs(page, limit));\n }\n\n const isSingleJob =\n pathname.startsWith('/dedup/jobs/') && pathname.split('/').length === 4;\n\n if (isSingleJob && method === 'GET') {\n const hash = extractParam(pathname, '/dedup/jobs/:hash');\n if (!hash) return errorResponse('Not found', 404);\n const job = await adapter.getJob(hash);\n if (!job) return errorResponse('Not found', 404);\n return jsonResponse(job);\n }\n\n if (isSingleJob) {\n return errorResponse('Method not allowed', 405);\n }\n } catch (err) {\n return errorResponse(err instanceof Error ? err.message : 'Unknown error');\n }\n\n return errorResponse('Not found', 404);\n}\n\nasync function routeRateLimit(\n request: Request,\n pathname: string,\n method: string,\n adapter: NonNullable<ClientContext['rateLimit']>,\n): Promise<Response> {\n try {\n if (pathname === '/rate-limit/stats' && method === 'GET') {\n const stats = await adapter.getStats();\n return jsonResponse({ stats, capabilities: adapter.capabilities });\n }\n\n if (pathname === '/rate-limit/resources' && method === 'GET') {\n const resources = await adapter.listResources();\n return jsonResponse({ resources });\n }\n\n // Config update: PUT /rate-limit/resources/:name/config\n if (pathname.endsWith('/config') && method === 'PUT') {\n const name = extractParam(pathname, '/rate-limit/resources/:name/config');\n if (!name) return errorResponse('Not found', 404);\n const body = (await request.json()) as {\n limit: number;\n windowMs: number;\n };\n await adapter.updateResourceConfig(name, body);\n return jsonResponse({ updated: true });\n }\n\n // Reset: POST /rate-limit/resources/:name/reset\n if (pathname.endsWith('/reset') && method === 'POST') {\n const name = extractParam(pathname, '/rate-limit/resources/:name/reset');\n if (!name) return errorResponse('Not found', 404);\n await adapter.resetResource(name);\n return jsonResponse({ reset: true });\n }\n\n // Single resource: GET /rate-limit/resources/:name\n const isSingleResource =\n pathname.startsWith('/rate-limit/resources/') &&\n pathname.split('/').length === 4;\n\n if (isSingleResource && method === 'GET') {\n const name = extractParam(pathname, '/rate-limit/resources/:name');\n if (!name) return errorResponse('Not found', 404);\n const status = await adapter.getResourceStatus(name);\n return jsonResponse({ resource: name, ...status });\n }\n\n if (isSingleResource) {\n return errorResponse('Method not allowed', 405);\n }\n } catch (err) {\n return errorResponse(err instanceof Error ? err.message : 'Unknown error');\n }\n\n return errorResponse('Not found', 404);\n}\n\n// --- Main export ---\n\nexport function createDashboardHandler(\n options: DashboardOptions,\n): DashboardFetchHandler {\n const opts = validateDashboardOptions(options);\n\n const clients = new Map<string, ClientContext>();\n for (const clientConfig of opts.clients) {\n const normalized = normalizeClient(clientConfig);\n clients.set(normalized.name, {\n name: normalized.name,\n cache: normalized.cacheStore\n ? detectCacheAdapter(normalized.cacheStore)\n : undefined,\n dedup: normalized.dedupeStore\n ? detectDedupeAdapter(normalized.dedupeStore)\n : undefined,\n rateLimit: normalized.rateLimitStore\n ? detectRateLimitAdapter(normalized.rateLimitStore)\n : undefined,\n });\n }\n\n const ctx: MultiClientContext = {\n clients,\n pollIntervalMs: opts.pollIntervalMs,\n };\n\n return async (request: Request): Promise<Response> => {\n try {\n const url = new URL(request.url);\n let pathname = url.pathname;\n if (opts.basePath !== '/' && pathname.startsWith(opts.basePath)) {\n pathname = pathname.slice(opts.basePath.length) || '/';\n }\n\n const apiResponse = await routeApi(\n request,\n pathname,\n url.searchParams,\n ctx,\n );\n if (apiResponse) return apiResponse;\n\n return serveStaticWeb(pathname);\n } catch {\n return errorResponse('Internal server error', 500);\n }\n };\n}\n","import { createServer, type Server } from 'http';\nimport {\n validateStandaloneOptions,\n type StandaloneDashboardOptions,\n} from '../config.js';\nimport { createDashboard } from './middleware.js';\n\nexport interface StandaloneDashboardServer {\n server: Server;\n close(): Promise<void>;\n}\n\nexport async function startDashboard(\n options: StandaloneDashboardOptions,\n): Promise<StandaloneDashboardServer> {\n const opts = validateStandaloneOptions(options);\n\n const middleware = createDashboard(options);\n\n const server = createServer((req, res) => {\n middleware(req, res);\n });\n\n return new Promise((resolve, reject) => {\n server.on('error', reject);\n\n server.listen(opts.port, opts.host, () => {\n const addr = server.address();\n const url =\n typeof addr === 'string' ? addr : `http://${opts.host}:${opts.port}`;\n\n console.log(`Dashboard running at ${url}`);\n\n resolve({\n server,\n async close() {\n return new Promise<void>((res, rej) => {\n server.close((err) => {\n if (err) rej(err);\n else res();\n });\n });\n },\n });\n });\n });\n}\n"]}
package/package.json CHANGED
@@ -21,22 +21,22 @@
21
21
  "typescript": "5.8.3",
22
22
  "vite": "^6.0.0",
23
23
  "vitest": "3.2.4",
24
- "@http-client-toolkit/store-memory": "0.10.0",
25
- "@http-client-toolkit/store-sqlite": "0.10.0",
24
+ "@http-client-toolkit/store-memory": "0.12.1",
25
+ "@http-client-toolkit/store-sqlite": "0.12.1",
26
+ "@repo/tsup-config": "0.0.1",
26
27
  "@repo/eslint-config": "0.0.1",
27
- "@repo/vitest-config": "0.0.1",
28
- "@repo/tsup-config": "0.0.1"
28
+ "@repo/vitest-config": "0.0.1"
29
29
  },
30
30
  "dependencies": {
31
31
  "react": "^19.0.0",
32
32
  "react-dom": "^19.0.0",
33
33
  "zod": "^3.24.1",
34
- "@http-client-toolkit/core": "0.10.0"
34
+ "@http-client-toolkit/core": "0.12.1"
35
35
  },
36
36
  "peerDependencies": {
37
- "@http-client-toolkit/store-memory": "0.10.0",
38
- "@http-client-toolkit/store-sqlite": "0.10.0",
39
- "@http-client-toolkit/store-dynamodb": "0.10.0"
37
+ "@http-client-toolkit/store-memory": "0.12.1",
38
+ "@http-client-toolkit/store-sqlite": "0.12.1",
39
+ "@http-client-toolkit/store-dynamodb": "0.12.1"
40
40
  },
41
41
  "peerDependenciesMeta": {
42
42
  "@http-client-toolkit/store-memory": {
@@ -67,7 +67,7 @@
67
67
  "dist/client/**"
68
68
  ],
69
69
  "homepage": "https://github.com/AllyMurray/http-client-toolkit#readme",
70
- "version": "0.1.0",
70
+ "version": "0.12.1",
71
71
  "bugs": {
72
72
  "url": "https://github.com/AllyMurray/http-client-toolkit/issues"
73
73
  },