@node-telescope/nestjs 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/telescope.constants.ts","../src/telescope.interceptor.ts","../src/telescope.guard.ts","../src/telescope.controller.ts","../src/telescope.gateway.ts","../src/telescope.dashboard.ts","../src/telescope.module.ts"],"names":["Injectable","Inject","EntryType","require"],"mappings":"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","file":"index.js","sourcesContent":["// Injection tokens for the Telescope NestJS module\n// String tokens are used (standard NestJS convention) for DI container compatibility\n\n/** Injection token for the Telescope configuration options */\nexport const TELESCOPE_OPTIONS = 'TELESCOPE_OPTIONS';\n\n/** Injection token for the Telescope instance */\nexport const TELESCOPE_INSTANCE = 'TELESCOPE_INSTANCE';\n","// TelescopeInterceptor — NestJS interceptor that captures request/response data\n// Equivalent to the Express middleware: wraps each request in AsyncLocalStorage context,\n// captures response body via tap operator, and records via RequestWatcher\n\nimport {\n Injectable,\n type NestInterceptor,\n type ExecutionContext,\n type CallHandler,\n Inject,\n} from '@nestjs/common';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport type { Request, Response } from 'express';\nimport {\n type Telescope,\n runWithContext,\n getContext,\n HeaderFilter,\n EntryType,\n IncomingEntry,\n} from '@node-telescope/core';\nimport { TELESCOPE_INSTANCE } from './telescope.constants.js';\n\nconst MAX_RESPONSE_BODY_SIZE = 64 * 1024; // 64 KB\n\n@Injectable()\nexport class TelescopeInterceptor implements NestInterceptor {\n private readonly headerFilter: HeaderFilter;\n\n constructor(\n @Inject(TELESCOPE_INSTANCE)\n private readonly telescope: Telescope,\n ) {\n this.headerFilter = new HeaderFilter(this.telescope.config.hiddenRequestHeaders);\n }\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n // Only handle HTTP requests\n if (context.getType() !== 'http') {\n return next.handle();\n }\n\n const httpCtx = context.switchToHttp();\n const req = httpCtx.getRequest<Request>();\n const res = httpCtx.getResponse<Response>();\n\n // Skip telescope's own paths\n const requestPath = req.path || req.url;\n if (this.telescope.shouldIgnorePath(requestPath)) {\n return next.handle();\n }\n\n // Skip if telescope is not recording\n if (!this.telescope.isRecording()) {\n return next.handle();\n }\n\n // Run the rest of the request inside an AsyncLocalStorage context\n return new Observable<unknown>((subscriber) => {\n runWithContext(() => {\n const ctx = getContext();\n const startTime = ctx?.startTime ?? performance.now();\n const batchId = ctx?.batchId ?? '';\n\n // Monkey-patch res.write and res.end to capture response body\n const chunks: Buffer[] = [];\n let responseBodySize = 0;\n\n const originalWrite = res.write.bind(res);\n const originalEnd = res.end.bind(res);\n\n res.write = function telescopeWrite(\n chunk: unknown,\n ...args: unknown[]\n ): boolean {\n try {\n if (chunk && responseBodySize < MAX_RESPONSE_BODY_SIZE) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as string);\n responseBodySize += buf.length;\n if (responseBodySize <= MAX_RESPONSE_BODY_SIZE) {\n chunks.push(buf);\n }\n }\n } catch {\n // Never crash the host app\n }\n return originalWrite(chunk, ...(args as []));\n } as typeof res.write;\n\n res.end = function telescopeEnd(\n chunk?: unknown,\n ...args: unknown[]\n ): Response {\n try {\n if (chunk && responseBodySize < MAX_RESPONSE_BODY_SIZE) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as string);\n responseBodySize += buf.length;\n if (responseBodySize <= MAX_RESPONSE_BODY_SIZE) {\n chunks.push(buf);\n }\n }\n } catch {\n // Never crash the host app\n }\n return originalEnd(chunk, ...(args as []));\n } as typeof res.end;\n\n // Record on response finish\n res.on('finish', () => {\n try {\n // Verify the request watcher is registered\n if (!this.telescope.watchers.has(EntryType.Request)) return;\n\n const duration = performance.now() - startTime;\n\n // Parse response body\n let responseBody: unknown = null;\n try {\n const raw = Buffer.concat(chunks).toString('utf-8');\n const contentType = res.getHeader('content-type');\n if (typeof contentType === 'string' && contentType.includes('application/json')) {\n responseBody = JSON.parse(raw);\n } else {\n responseBody = raw;\n }\n } catch {\n responseBody = '[unparseable]';\n }\n\n // Filter sensitive headers\n const filteredHeaders = this.headerFilter.filter(\n req.headers as Record<string, string | string[] | undefined>,\n );\n\n // Capture response headers\n const rawResponseHeaders = res.getHeaders();\n const responseHeaders: Record<string, string | string[] | undefined> = {};\n for (const [key, value] of Object.entries(rawResponseHeaders)) {\n if (typeof value === 'number') {\n responseHeaders[key] = String(value);\n } else {\n responseHeaders[key] = value;\n }\n }\n\n // Create the entry manually with the captured batchId\n // (the finish event may fire outside the AsyncLocalStorage context)\n const entry = new IncomingEntry(EntryType.Request, {\n method: req.method,\n url: req.originalUrl || req.url,\n path: req.path,\n headers: filteredHeaders,\n payload: req.body ?? null,\n query: (req.query as Record<string, unknown>) ?? {},\n ipAddress: req.ip || req.socket?.remoteAddress || 'unknown',\n responseStatus: res.statusCode,\n responseHeaders,\n response: responseBody,\n duration: Math.round(duration * 100) / 100,\n memory: process.memoryUsage().heapUsed,\n });\n entry.setBatchId(batchId);\n this.telescope.recordEntry(entry);\n } catch (error) {\n console.warn('[Telescope] Error recording request:', error);\n }\n });\n\n // Subscribe to the next handler within the context\n next.handle().pipe(\n tap({\n error: () => {\n // Error is still recorded via res 'finish' event\n },\n }),\n ).subscribe(subscriber);\n });\n });\n }\n}\n","// TelescopeAuthGuard — NestJS guard that checks the config.gate authorization function\n// If no gate is configured, access is allowed by default (matches Laravel Telescope behavior)\n\nimport { Injectable, type CanActivate, type ExecutionContext, Inject } from '@nestjs/common';\nimport type { Telescope } from '@node-telescope/core';\nimport { TELESCOPE_INSTANCE } from './telescope.constants.js';\n\n@Injectable()\nexport class TelescopeAuthGuard implements CanActivate {\n constructor(\n @Inject(TELESCOPE_INSTANCE)\n private readonly telescope: Telescope,\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const gate = this.telescope.config.gate;\n if (!gate) {\n return true;\n }\n\n try {\n const request = context.switchToHttp().getRequest();\n const result = await gate(request);\n return !!result;\n } catch (error) {\n console.warn('[Telescope] Gate check error:', error);\n return false;\n }\n }\n}\n","// TelescopeController — REST API endpoints for querying and managing telescope entries\n// Mirrors the Express api-router: entries CRUD + status toggling\n// Mounted at config.path (default /__telescope)\n\nimport {\n Controller,\n Get,\n Post,\n Delete,\n Param,\n Query,\n Body,\n Req,\n Inject,\n HttpException,\n HttpStatus,\n UseGuards,\n} from '@nestjs/common';\nimport type { Request } from 'express';\nimport { EntryType, type Telescope, type EntryFilter } from '@node-telescope/core';\nimport { TELESCOPE_INSTANCE } from './telescope.constants.js';\nimport { TelescopeAuthGuard } from './telescope.guard.js';\n\n/** Map URL segment names to EntryType enum values */\nconst ENTRY_TYPE_MAP: Record<string, EntryType> = {\n requests: EntryType.Request,\n exceptions: EntryType.Exception,\n queries: EntryType.Query,\n logs: EntryType.Log,\n models: EntryType.Model,\n events: EntryType.Event,\n jobs: EntryType.Job,\n mail: EntryType.Mail,\n notifications: EntryType.Notification,\n cache: EntryType.Cache,\n redis: EntryType.Redis,\n gates: EntryType.Gate,\n 'http-client': EntryType.HttpClient,\n commands: EntryType.Command,\n schedule: EntryType.Schedule,\n schedules: EntryType.Schedule,\n dumps: EntryType.Dump,\n batches: EntryType.Batch,\n views: EntryType.View,\n};\n\n@Controller('__telescope')\n@UseGuards(TelescopeAuthGuard)\nexport class TelescopeController {\n constructor(\n @Inject(TELESCOPE_INSTANCE)\n private readonly telescope: Telescope,\n ) {}\n\n @Get('api/status')\n getStatus(): { recording: boolean } {\n try {\n return { recording: this.telescope.isRecording() };\n } catch (error) {\n console.warn('[Telescope] Status error:', error);\n throw new HttpException('Internal server error', HttpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n @Post('api/status')\n toggleStatus(@Body() body: { recording?: boolean }): { recording: boolean } {\n try {\n if (typeof body?.recording === 'boolean') {\n if (body.recording) {\n this.telescope.resume();\n } else {\n this.telescope.pause();\n }\n }\n return { recording: this.telescope.isRecording() };\n } catch (error) {\n console.warn('[Telescope] Status toggle error:', error);\n throw new HttpException('Internal server error', HttpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n @Delete('api/entries')\n async clearEntries(): Promise<{ success: boolean }> {\n try {\n const storage = this.telescope.getStorage();\n if (!storage) {\n throw new HttpException('Storage not available', HttpStatus.SERVICE_UNAVAILABLE);\n }\n\n await storage.truncate();\n return { success: true };\n } catch (error) {\n if (error instanceof HttpException) throw error;\n console.warn('[Telescope] Truncate error:', error);\n throw new HttpException('Internal server error', HttpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n @Get('api/entries/:id/batch')\n async getBatchEntries(@Param('id') id: string): Promise<{ entries: unknown[] }> {\n try {\n const storage = this.telescope.getStorage();\n if (!storage) {\n throw new HttpException('Storage not available', HttpStatus.SERVICE_UNAVAILABLE);\n }\n\n const entry = await storage.find(id);\n if (!entry) {\n throw new HttpException('Entry not found', HttpStatus.NOT_FOUND);\n }\n\n const batchEntries = await storage.findByBatchId(entry.batchId);\n return { entries: batchEntries };\n } catch (error) {\n if (error instanceof HttpException) throw error;\n console.warn('[Telescope] Batch query error:', error);\n throw new HttpException('Internal server error', HttpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n @Post('api/replay/:id')\n async replayRequest(\n @Param('id') id: string,\n @Req() req: Request,\n ): Promise<unknown> {\n try {\n const storage = this.telescope.getStorage();\n if (!storage) {\n throw new HttpException('Storage not available', HttpStatus.SERVICE_UNAVAILABLE);\n }\n\n const entry = await storage.find(id);\n if (!entry) {\n throw new HttpException('Entry not found', HttpStatus.NOT_FOUND);\n }\n\n if (entry.type !== EntryType.Request) {\n throw new HttpException('Only request entries can be replayed', HttpStatus.BAD_REQUEST);\n }\n\n const content = entry.content as Record<string, unknown>;\n const method = String(content['method'] ?? 'GET').toUpperCase();\n const path = String(content['path'] ?? content['url'] ?? '/');\n const headers = (content['headers'] ?? {}) as Record<string, string>;\n const payload = content['payload'];\n\n const host = req.get('host') ?? 'localhost';\n const protocol = req.protocol;\n const targetUrl = `${protocol}://${host}${path}`;\n\n const fetchOptions: RequestInit = {\n method,\n headers: { ...headers },\n };\n\n if (payload && method !== 'GET' && method !== 'HEAD') {\n fetchOptions.body = typeof payload === 'string' ? payload : JSON.stringify(payload);\n if (!headers['content-type']) {\n (fetchOptions.headers as Record<string, string>)['content-type'] = 'application/json';\n }\n }\n\n const skipHeaders = ['host', 'connection', 'content-length', 'transfer-encoding'];\n for (const h of skipHeaders) {\n delete (fetchOptions.headers as Record<string, string>)[h];\n }\n\n const response = await fetch(targetUrl, fetchOptions);\n let responseBody: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n return {\n success: true,\n replay: {\n method,\n url: targetUrl,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n body: responseBody,\n },\n };\n } catch (error) {\n if (error instanceof HttpException) throw error;\n console.warn('[Telescope] Replay error:', error);\n const message = error instanceof Error ? error.message : 'Replay failed';\n throw new HttpException(message, HttpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n @Get('api/:type')\n async listEntries(\n @Param('type') typeParam: string,\n @Query('before') before?: string,\n @Query('take') take?: string,\n @Query('tag') tag?: string,\n @Query('familyHash') familyHash?: string,\n ): Promise<unknown> {\n try {\n const storage = this.telescope.getStorage();\n if (!storage) {\n throw new HttpException('Storage not available', HttpStatus.SERVICE_UNAVAILABLE);\n }\n\n const entryType = ENTRY_TYPE_MAP[typeParam];\n if (!entryType) {\n throw new HttpException(`Unknown entry type: ${typeParam}`, HttpStatus.BAD_REQUEST);\n }\n\n const filter: EntryFilter = {\n type: entryType,\n };\n\n if (before) filter.beforeId = before;\n if (take) filter.take = Math.min(parseInt(take, 10) || 50, 100);\n else filter.take = 50;\n if (tag) filter.tag = tag;\n if (familyHash) filter.familyHash = familyHash;\n\n return await storage.query(filter);\n } catch (error) {\n if (error instanceof HttpException) throw error;\n console.warn('[Telescope] Query error:', error);\n throw new HttpException('Internal server error', HttpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n @Get('api/:type/:id')\n async getEntry(\n @Param('type') typeParam: string,\n @Param('id') id: string,\n ): Promise<{ entry: unknown; batch: unknown[] }> {\n try {\n const storage = this.telescope.getStorage();\n if (!storage) {\n throw new HttpException('Storage not available', HttpStatus.SERVICE_UNAVAILABLE);\n }\n\n const entry = await storage.find(id);\n if (!entry) {\n throw new HttpException('Entry not found', HttpStatus.NOT_FOUND);\n }\n\n // Verify the entry type matches the URL segment\n const expectedType = ENTRY_TYPE_MAP[typeParam];\n if (expectedType && entry.type !== expectedType) {\n throw new HttpException('Entry not found', HttpStatus.NOT_FOUND);\n }\n\n // Fetch related batch entries\n let batch: unknown[] = [];\n try {\n const batchEntries = await storage.findByBatchId(entry.batchId);\n batch = batchEntries.filter((e: { id: string }) => e.id !== entry.id);\n } catch {\n // Batch fetch is non-critical\n }\n\n return { entry, batch };\n } catch (error) {\n if (error instanceof HttpException) throw error;\n console.warn('[Telescope] Entry lookup error:', error);\n throw new HttpException('Internal server error', HttpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n}\n","// TelescopeGateway — WebSocket server for real-time entry broadcasting\n// Uses the ws library directly (NOT @nestjs/websockets) to keep dependencies minimal\n// Listens for telescope 'entry' events and broadcasts to connected clients\n\nimport { Injectable, Inject, type OnModuleInit, type OnModuleDestroy } from '@nestjs/common';\nimport { HttpAdapterHost } from '@nestjs/core';\nimport { WebSocketServer } from 'ws';\nimport type WebSocket from 'ws';\nimport type { Server as HttpServer } from 'node:http';\nimport type { Telescope, TelescopeEntryData } from '@node-telescope/core';\nimport { TELESCOPE_INSTANCE } from './telescope.constants.js';\n\n@Injectable()\nexport class TelescopeGateway implements OnModuleInit, OnModuleDestroy {\n private wss: WebSocketServer | null = null;\n private entryHandler: ((entry: TelescopeEntryData) => void) | null = null;\n\n constructor(\n @Inject(TELESCOPE_INSTANCE)\n private readonly telescope: Telescope,\n private readonly httpAdapterHost: HttpAdapterHost,\n ) {}\n\n onModuleInit(): void {\n try {\n this.setupWebSocketServer();\n } catch (error) {\n console.warn('[Telescope] WebSocket setup error:', error);\n }\n }\n\n async onModuleDestroy(): Promise<void> {\n try {\n if (this.entryHandler) {\n this.telescope.off('entry', this.entryHandler);\n this.entryHandler = null;\n }\n\n if (this.wss) {\n // Close all client connections\n for (const client of this.wss.clients) {\n try {\n client.close();\n } catch {\n // Client already closed\n }\n }\n\n await new Promise<void>((resolve) => {\n this.wss!.close(() => resolve());\n });\n this.wss = null;\n }\n } catch (error) {\n console.warn('[Telescope] WebSocket cleanup error:', error);\n }\n }\n\n private setupWebSocketServer(): void {\n const httpAdapter = this.httpAdapterHost?.httpAdapter;\n if (!httpAdapter) {\n console.warn('[Telescope] No HTTP adapter found — WebSocket server not started');\n return;\n }\n\n const server = httpAdapter.getHttpServer() as HttpServer;\n if (!server) {\n console.warn('[Telescope] No HTTP server found — WebSocket server not started');\n return;\n }\n\n const telescopePath = this.telescope.config.path;\n const wsPath = `${telescopePath}/ws`;\n\n this.wss = new WebSocketServer({ noServer: true });\n\n // Handle HTTP upgrade requests for the telescope WebSocket path\n server.on('upgrade', (request, socket, head) => {\n try {\n const url = new URL(\n request.url || '',\n `http://${request.headers['host'] || 'localhost'}`,\n );\n\n if (url.pathname === wsPath) {\n this.wss!.handleUpgrade(request, socket, head, (ws) => {\n this.wss!.emit('connection', ws, request);\n });\n }\n // If the path doesn't match, let other handlers deal with it\n } catch (error) {\n console.warn('[Telescope] WebSocket upgrade error:', error);\n try {\n socket.destroy();\n } catch {\n // Socket already destroyed\n }\n }\n });\n\n // Handle new WebSocket connections\n this.wss.on('connection', (ws: WebSocket) => {\n try {\n ws.send(\n JSON.stringify({ type: 'connected', message: 'Telescope WebSocket connected' }),\n );\n } catch (error) {\n console.warn('[Telescope] WebSocket welcome error:', error);\n }\n\n ws.on('error', (error) => {\n console.warn('[Telescope] WebSocket client error:', error);\n });\n });\n\n // Listen for new telescope entries and broadcast to all connected clients\n this.entryHandler = (entry: TelescopeEntryData): void => {\n try {\n if (!this.wss || this.wss.clients.size === 0) return;\n\n const message = JSON.stringify({ type: 'entry', data: entry });\n\n for (const client of this.wss.clients) {\n if (client.readyState === 1 /* WebSocket.OPEN */) {\n try {\n client.send(message);\n } catch {\n // Individual client send failure\n }\n }\n }\n } catch (error) {\n console.warn('[Telescope] WebSocket broadcast error:', error);\n }\n };\n\n this.telescope.on('entry', this.entryHandler);\n }\n}\n","// TelescopeDashboardMiddleware — serves the @node-telescope/dashboard static files\n// Same CSP headers and SPA catch-all behavior as the Express dashboard-router\n// Falls back gracefully if the dashboard package is not installed\n\nimport { Injectable, type NestMiddleware, Inject } from '@nestjs/common';\nimport type { Request, Response, NextFunction } from 'express';\nimport { createRequire } from 'node:module';\nimport { join, dirname } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport type { Telescope } from '@node-telescope/core';\nimport { TELESCOPE_INSTANCE } from './telescope.constants.js';\n\nconst CSP_HEADER = [\n \"default-src 'self'\",\n \"script-src 'self' 'unsafe-inline'\",\n \"style-src 'self' 'unsafe-inline'\",\n \"img-src 'self' data: blob:\",\n \"font-src 'self' data:\",\n \"connect-src 'self' ws: wss:\",\n].join('; ');\n\nconst FALLBACK_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Telescope Dashboard</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: #1a1a2e; color: #e0e0e0; }\n .container { text-align: center; max-width: 500px; padding: 2rem; }\n h1 { color: #7c3aed; margin-bottom: 1rem; }\n p { line-height: 1.6; color: #a0a0b0; }\n code { background: #2a2a3e; padding: 0.2em 0.5em; border-radius: 4px; font-size: 0.9em; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Telescope Dashboard</h1>\n <p>The dashboard package is not installed.</p>\n <p>Install it with:</p>\n <p><code>npm install @node-telescope/dashboard</code></p>\n <p>The Telescope API is still operational at the <code>/api</code> endpoints.</p>\n </div>\n</body>\n</html>`;\n\n/**\n * Resolves the dashboard package's dist directory.\n * Returns the path to the dist folder, or null if not found.\n */\nfunction resolveDashboardDist(): string | null {\n try {\n // Resolve the package.json to find the package root\n const require = createRequire(import.meta.url);\n const pkgJsonPath = require.resolve('@node-telescope/dashboard/package.json');\n const packageRoot = dirname(pkgJsonPath);\n\n // The dist directory with index.html should be at {root}/dist\n const distDir = join(packageRoot, 'dist');\n if (existsSync(join(distDir, 'index.html'))) {\n return distDir;\n }\n\n // Fallback: check package root directly\n if (existsSync(join(packageRoot, 'index.html'))) {\n return packageRoot;\n }\n\n return null;\n } catch {\n // Package not installed\n return null;\n }\n}\n\n@Injectable()\nexport class TelescopeDashboardMiddleware implements NestMiddleware {\n private readonly dashboardDist: string | null;\n private readonly telescopePath: string;\n\n constructor(\n @Inject(TELESCOPE_INSTANCE)\n private readonly telescope: Telescope,\n ) {\n this.dashboardDist = resolveDashboardDist();\n this.telescopePath = this.telescope.config.path;\n }\n\n async use(req: Request, res: Response, next: NextFunction): Promise<void> {\n try {\n // Only handle requests to the telescope dashboard path\n if (!req.path.startsWith(this.telescopePath)) {\n next();\n return;\n }\n\n // Skip API routes — those are handled by TelescopeController\n const relativePath = req.path.slice(this.telescopePath.length);\n if (relativePath.startsWith('/api')) {\n next();\n return;\n }\n\n // Set security headers\n res.setHeader('Content-Security-Policy', CSP_HEADER);\n res.setHeader('X-Content-Type-Options', 'nosniff');\n res.setHeader('X-Frame-Options', 'DENY');\n\n if (!this.dashboardDist) {\n // Dashboard not installed — serve fallback HTML\n res.status(200).type('html').send(FALLBACK_HTML);\n return;\n }\n\n // Try to serve the static file\n const filePath = relativePath || '/index.html';\n\n // If the request looks like a file with an extension (not html), try to serve it\n if (filePath.includes('.') && !filePath.endsWith('.html')) {\n const fullPath = join(this.dashboardDist, filePath);\n if (existsSync(fullPath)) {\n res.sendFile(fullPath);\n return;\n }\n res.status(404).send('Not found');\n return;\n }\n\n // SPA catch-all — serve index.html\n const indexPath = join(this.dashboardDist, 'index.html');\n const html = await readFile(indexPath, 'utf-8');\n res.type('html').send(html);\n } catch (error) {\n console.warn('[Telescope] Dashboard serve error:', error);\n next();\n }\n }\n}\n","// TelescopeModule — NestJS DynamicModule for Node-Telescope\n// Provides TelescopeModule.forRoot(config?) and TelescopeModule.forRootAsync(options)\n// Auto-resolves storage, registers interceptor globally, manages lifecycle\n\nimport {\n Module,\n type DynamicModule,\n type OnModuleInit,\n type OnModuleDestroy,\n type MiddlewareConsumer,\n type NestModule,\n type Provider,\n Inject,\n} from '@nestjs/common';\nimport { APP_INTERCEPTOR } from '@nestjs/core';\nimport { Telescope, type StorageRepository } from '@node-telescope/core';\nimport { TELESCOPE_OPTIONS, TELESCOPE_INSTANCE } from './telescope.constants.js';\nimport type {\n TelescopeModuleOptions,\n TelescopeModuleAsyncOptions,\n TelescopeOptionsFactory,\n} from './telescope.interfaces.js';\nimport { TelescopeInterceptor } from './telescope.interceptor.js';\nimport { TelescopeController } from './telescope.controller.js';\nimport { TelescopeAuthGuard } from './telescope.guard.js';\nimport { TelescopeGateway } from './telescope.gateway.js';\nimport { TelescopeDashboardMiddleware } from './telescope.dashboard.js';\n\n/**\n * Tries to auto-resolve and instantiate @node-telescope/storage-sqlite.\n * Returns the storage instance or null if the package is not installed.\n */\nasync function autoResolveStorage(config: TelescopeModuleOptions): Promise<StorageRepository | null> {\n try {\n const { SqliteStorage } = await import('@node-telescope/storage-sqlite');\n const storage = new SqliteStorage(config.databasePath) as unknown as StorageRepository;\n return storage;\n } catch {\n return null;\n }\n}\n\n@Module({})\nexport class TelescopeModule implements NestModule, OnModuleInit, OnModuleDestroy {\n constructor(\n @Inject(TELESCOPE_INSTANCE)\n private readonly telescope: Telescope,\n @Inject(TELESCOPE_OPTIONS)\n private readonly options: TelescopeModuleOptions,\n ) {}\n\n /**\n * Register TelescopeModule synchronously with configuration options.\n *\n * Usage:\n * ```ts\n * TelescopeModule.forRoot({ enabled: true, path: '/__telescope' })\n * ```\n */\n static forRoot(config: TelescopeModuleOptions = {}): DynamicModule {\n const optionsProvider: Provider = {\n provide: TELESCOPE_OPTIONS,\n useValue: config,\n };\n\n const telescopeProvider: Provider = {\n provide: TELESCOPE_INSTANCE,\n useFactory: () => {\n const telescope = new Telescope(config);\n\n if (config.storage) {\n telescope.setStorage(config.storage);\n }\n\n return telescope;\n },\n };\n\n return {\n module: TelescopeModule,\n global: true,\n providers: [\n optionsProvider,\n telescopeProvider,\n TelescopeAuthGuard,\n TelescopeGateway,\n TelescopeDashboardMiddleware,\n {\n provide: APP_INTERCEPTOR,\n useClass: TelescopeInterceptor,\n },\n ],\n controllers: [TelescopeController],\n exports: [TELESCOPE_INSTANCE, TELESCOPE_OPTIONS],\n };\n }\n\n /**\n * Register TelescopeModule asynchronously.\n * Supports useFactory, useClass, and useExisting patterns.\n *\n * Usage:\n * ```ts\n * TelescopeModule.forRootAsync({\n * useFactory: (configService) => ({\n * enabled: configService.get('TELESCOPE_ENABLED'),\n * }),\n * inject: [ConfigService],\n * })\n * ```\n */\n static forRootAsync(options: TelescopeModuleAsyncOptions): DynamicModule {\n const asyncProviders = TelescopeModule.createAsyncProviders(options);\n\n const telescopeProvider: Provider = {\n provide: TELESCOPE_INSTANCE,\n useFactory: (config: TelescopeModuleOptions) => {\n const telescope = new Telescope(config);\n\n if (config.storage) {\n telescope.setStorage(config.storage);\n }\n\n return telescope;\n },\n inject: [TELESCOPE_OPTIONS],\n };\n\n return {\n module: TelescopeModule,\n global: true,\n imports: options.imports || [],\n providers: [\n ...asyncProviders,\n telescopeProvider,\n TelescopeAuthGuard,\n TelescopeGateway,\n TelescopeDashboardMiddleware,\n {\n provide: APP_INTERCEPTOR,\n useClass: TelescopeInterceptor,\n },\n ],\n controllers: [TelescopeController],\n exports: [TELESCOPE_INSTANCE, TELESCOPE_OPTIONS],\n };\n }\n\n /**\n * Configure middleware — mounts the dashboard middleware.\n */\n configure(consumer: MiddlewareConsumer): void {\n const telescopePath = this.telescope.config.path;\n consumer\n .apply(TelescopeDashboardMiddleware)\n .forRoutes(`${telescopePath}`, `${telescopePath}/*`);\n }\n\n /**\n * Lifecycle: start telescope when the module initializes.\n * Auto-resolves storage if none was provided.\n */\n async onModuleInit(): Promise<void> {\n try {\n // Auto-resolve storage if none configured\n if (!this.options.storage && !this.telescope.getStorage()) {\n const storage = await autoResolveStorage(this.options);\n if (storage) {\n this.telescope.setStorage(storage);\n } else {\n console.warn(\n '[Telescope] No storage configured. Install @node-telescope/storage-sqlite for automatic setup.',\n );\n }\n }\n\n // Start telescope — register watchers, begin recording\n this.telescope.start();\n } catch (error) {\n console.warn('[Telescope] Module init error:', error);\n }\n }\n\n /**\n * Lifecycle: stop telescope when the module is destroyed.\n */\n async onModuleDestroy(): Promise<void> {\n try {\n await this.telescope.stop();\n } catch (error) {\n console.warn('[Telescope] Module destroy error:', error);\n }\n }\n\n /**\n * Creates async providers for useFactory, useClass, or useExisting patterns.\n */\n private static createAsyncProviders(options: TelescopeModuleAsyncOptions): Provider[] {\n if (options.useFactory) {\n return [\n {\n provide: TELESCOPE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n },\n ];\n }\n\n if (options.useClass) {\n return [\n {\n provide: options.useClass,\n useClass: options.useClass,\n },\n {\n provide: TELESCOPE_OPTIONS,\n useFactory: async (factory: TelescopeOptionsFactory) => factory.createTelescopeOptions(),\n inject: [options.useClass],\n },\n ];\n }\n\n if (options.useExisting) {\n return [\n {\n provide: TELESCOPE_OPTIONS,\n useFactory: async (factory: TelescopeOptionsFactory) => factory.createTelescopeOptions(),\n inject: [options.useExisting],\n },\n ];\n }\n\n // Fallback — empty config\n return [\n {\n provide: TELESCOPE_OPTIONS,\n useValue: {},\n },\n ];\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "@node-telescope/nestjs",
3
+ "version": "0.1.0",
4
+ "description": "NestJS module adapter for Node-Telescope — Laravel Telescope for Node.js",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "LICENSE"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "dev": "tsup --watch",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest",
30
+ "clean": "rm -rf dist"
31
+ },
32
+ "dependencies": {
33
+ "ws": "^8.18.0"
34
+ },
35
+ "peerDependencies": {
36
+ "@node-telescope/core": "^0.1.0",
37
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
38
+ "@nestjs/core": "^10.0.0 || ^11.0.0",
39
+ "rxjs": "^7.0.0",
40
+ "@node-telescope/storage-sqlite": "^0.1.0",
41
+ "@node-telescope/dashboard": "^0.1.0"
42
+ },
43
+ "peerDependenciesMeta": {
44
+ "@node-telescope/storage-sqlite": {
45
+ "optional": true
46
+ },
47
+ "@node-telescope/dashboard": {
48
+ "optional": true
49
+ }
50
+ },
51
+ "devDependencies": {
52
+ "@node-telescope/core": "workspace:*",
53
+ "@node-telescope/storage-sqlite": "workspace:*",
54
+ "@node-telescope/dashboard": "workspace:*",
55
+ "@nestjs/common": "^10.4.15",
56
+ "@nestjs/core": "^10.4.15",
57
+ "@nestjs/testing": "^10.4.15",
58
+ "@nestjs/platform-express": "^10.4.15",
59
+ "rxjs": "^7.8.1",
60
+ "reflect-metadata": "^0.2.2",
61
+ "express": "^4.21.0",
62
+ "@types/express": "^5.0.0",
63
+ "@types/ws": "^8.5.0",
64
+ "supertest": "^7.0.0",
65
+ "@types/supertest": "^6.0.0",
66
+ "@types/node": "^20.0.0",
67
+ "tsup": "^8.0.0",
68
+ "vitest": "^3.0.0",
69
+ "typescript": "^5.7.0"
70
+ },
71
+ "keywords": [
72
+ "telescope",
73
+ "debugging",
74
+ "monitoring",
75
+ "nestjs",
76
+ "module",
77
+ "node"
78
+ ],
79
+ "license": "MIT",
80
+ "repository": {
81
+ "type": "git",
82
+ "url": "https://github.com/node-telescope/node-telescope.git",
83
+ "directory": "packages/nestjs"
84
+ },
85
+ "author": "Ali Hassan",
86
+ "homepage": "https://github.com/node-telescope/node-telescope#readme",
87
+ "bugs": {
88
+ "url": "https://github.com/node-telescope/node-telescope/issues"
89
+ },
90
+ "engines": {
91
+ "node": ">=18.0.0"
92
+ },
93
+ "publishConfig": {
94
+ "access": "public"
95
+ }
96
+ }