@ngn-net/nestjs-telescope 0.1.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.
Files changed (45) hide show
  1. package/README.md +110 -0
  2. package/dist/constants.d.ts +3 -0
  3. package/dist/constants.js +7 -0
  4. package/dist/controllers/telescope.controller.d.ts +17 -0
  5. package/dist/controllers/telescope.controller.js +126 -0
  6. package/dist/enums/entry-type.enum.d.ts +14 -0
  7. package/dist/enums/entry-type.enum.js +19 -0
  8. package/dist/guards/telescope-jwt.guard.d.ts +7 -0
  9. package/dist/guards/telescope-jwt.guard.js +44 -0
  10. package/dist/index.d.ts +8 -0
  11. package/dist/index.js +25 -0
  12. package/dist/interfaces/entry.interface.d.ts +10 -0
  13. package/dist/interfaces/entry.interface.js +2 -0
  14. package/dist/interfaces/telescope-options.interface.d.ts +13 -0
  15. package/dist/interfaces/telescope-options.interface.js +2 -0
  16. package/dist/storage/entities/telescope-entry.entity.d.ts +10 -0
  17. package/dist/storage/entities/telescope-entry.entity.js +56 -0
  18. package/dist/storage/telescope-repository.service.d.ts +18 -0
  19. package/dist/storage/telescope-repository.service.js +77 -0
  20. package/dist/telescope.module.d.ts +4 -0
  21. package/dist/telescope.module.js +84 -0
  22. package/dist/telescope.service.d.ts +13 -0
  23. package/dist/telescope.service.js +62 -0
  24. package/dist/watchers/cache.watcher.d.ts +7 -0
  25. package/dist/watchers/cache.watcher.js +62 -0
  26. package/dist/watchers/event.watcher.d.ts +13 -0
  27. package/dist/watchers/event.watcher.js +51 -0
  28. package/dist/watchers/exception.watcher.d.ts +8 -0
  29. package/dist/watchers/exception.watcher.js +44 -0
  30. package/dist/watchers/http-request.watcher.d.ts +8 -0
  31. package/dist/watchers/http-request.watcher.js +52 -0
  32. package/dist/watchers/log.watcher.d.ts +7 -0
  33. package/dist/watchers/log.watcher.js +63 -0
  34. package/dist/watchers/mail.watcher.d.ts +12 -0
  35. package/dist/watchers/mail.watcher.js +90 -0
  36. package/dist/watchers/query.watcher.d.ts +10 -0
  37. package/dist/watchers/query.watcher.js +52 -0
  38. package/dist/watchers/queue.watcher.d.ts +10 -0
  39. package/dist/watchers/queue.watcher.js +66 -0
  40. package/dist/watchers/redis.watcher.d.ts +7 -0
  41. package/dist/watchers/redis.watcher.js +74 -0
  42. package/dist/watchers/schedule.watcher.d.ts +9 -0
  43. package/dist/watchers/schedule.watcher.js +92 -0
  44. package/package.json +49 -0
  45. package/ui/index.html +1268 -0
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var TelescopeModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TelescopeModule = void 0;
11
+ // src/telescope.module.ts
12
+ const common_1 = require("@nestjs/common");
13
+ const typeorm_1 = require("@nestjs/typeorm");
14
+ const bullmq_1 = require("@nestjs/bullmq");
15
+ const config_1 = require("@nestjs/config");
16
+ const jwt_1 = require("@nestjs/jwt");
17
+ const telescope_service_1 = require("./telescope.service");
18
+ const telescope_controller_1 = require("./controllers/telescope.controller");
19
+ const telescope_repository_service_1 = require("./storage/telescope-repository.service");
20
+ const telescope_entry_entity_1 = require("./storage/entities/telescope-entry.entity");
21
+ const http_request_watcher_1 = require("./watchers/http-request.watcher");
22
+ const query_watcher_1 = require("./watchers/query.watcher");
23
+ const cache_watcher_1 = require("./watchers/cache.watcher");
24
+ const queue_watcher_1 = require("./watchers/queue.watcher");
25
+ const event_watcher_1 = require("./watchers/event.watcher");
26
+ const mail_watcher_1 = require("./watchers/mail.watcher");
27
+ const log_watcher_1 = require("./watchers/log.watcher");
28
+ const exception_watcher_1 = require("./watchers/exception.watcher");
29
+ const schedule_watcher_1 = require("./watchers/schedule.watcher");
30
+ const redis_watcher_1 = require("./watchers/redis.watcher");
31
+ const telescope_jwt_guard_1 = require("./guards/telescope-jwt.guard");
32
+ let TelescopeModule = TelescopeModule_1 = class TelescopeModule {
33
+ static forRoot(options = {}) {
34
+ return {
35
+ module: TelescopeModule_1,
36
+ imports: [
37
+ config_1.ConfigModule.forRoot({ isGlobal: true }),
38
+ typeorm_1.TypeOrmModule.forFeature([telescope_entry_entity_1.TelescopeEntry]),
39
+ bullmq_1.BullModule.registerQueue({
40
+ name: 'telescope-queue',
41
+ connection: {
42
+ // connection settings are read from env
43
+ host: process.env.REDIS_HOST || '127.0.0.1',
44
+ port: Number(process.env.REDIS_PORT) || 6379,
45
+ },
46
+ }),
47
+ jwt_1.JwtModule.registerAsync({
48
+ imports: [config_1.ConfigModule],
49
+ useFactory: async (config) => ({
50
+ secret: options.jwtSecret || config.get('TELESCOPE_JWT_SECRET') || 'change-me',
51
+ signOptions: { expiresIn: '1d' },
52
+ }),
53
+ inject: [config_1.ConfigService],
54
+ }),
55
+ ],
56
+ providers: [
57
+ {
58
+ provide: 'TELESCOPE_OPTIONS',
59
+ useValue: options,
60
+ },
61
+ telescope_service_1.TelescopeService,
62
+ telescope_repository_service_1.TelescopeRepository,
63
+ http_request_watcher_1.HttpRequestWatcher,
64
+ query_watcher_1.QueryWatcher,
65
+ cache_watcher_1.CacheWatcher,
66
+ queue_watcher_1.QueueWatcher,
67
+ event_watcher_1.EventWatcher,
68
+ mail_watcher_1.MailWatcher,
69
+ log_watcher_1.LogWatcher,
70
+ exception_watcher_1.ExceptionWatcher,
71
+ schedule_watcher_1.ScheduleWatcher,
72
+ redis_watcher_1.RedisWatcher,
73
+ telescope_jwt_guard_1.JwtAuthGuard,
74
+ ],
75
+ controllers: [telescope_controller_1.TelescopeController],
76
+ exports: [telescope_service_1.TelescopeService, telescope_repository_service_1.TelescopeRepository],
77
+ };
78
+ }
79
+ };
80
+ exports.TelescopeModule = TelescopeModule;
81
+ exports.TelescopeModule = TelescopeModule = TelescopeModule_1 = __decorate([
82
+ (0, common_1.Global)(),
83
+ (0, common_1.Module)({})
84
+ ], TelescopeModule);
@@ -0,0 +1,13 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { TelescopeRepository } from './storage/telescope-repository.service';
3
+ import { TelescopeEntry } from './storage/entities/telescope-entry.entity';
4
+ import { EntryType } from './enums/entry-type.enum';
5
+ export declare class TelescopeService implements OnModuleInit {
6
+ private readonly repo;
7
+ private readonly options?;
8
+ constructor(repo: TelescopeRepository, options?: any | undefined);
9
+ onModuleInit(): Promise<void>;
10
+ record(entry: Partial<TelescopeEntry> & {
11
+ type: EntryType;
12
+ }): Promise<void>;
13
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TelescopeService = void 0;
16
+ // src/telescope.service.ts
17
+ const common_1 = require("@nestjs/common");
18
+ const telescope_repository_service_1 = require("./storage/telescope-repository.service");
19
+ let TelescopeService = class TelescopeService {
20
+ repo;
21
+ options;
22
+ constructor(repo, options) {
23
+ this.repo = repo;
24
+ this.options = options;
25
+ }
26
+ async onModuleInit() {
27
+ // ensure database schema exists (TypeORM will sync)
28
+ }
29
+ async record(entry) {
30
+ // Check if the type is explicitly enabled (if enabledEntryTypes is configured)
31
+ if (this.options?.enabledEntryTypes) {
32
+ if (!this.options.enabledEntryTypes.includes(entry.type)) {
33
+ return;
34
+ }
35
+ }
36
+ const uuidStr = entry.uuid ?? `${Date.now()}-${Math.floor(Math.random() * 1000000)}`;
37
+ const fullEntry = {
38
+ uuid: uuidStr,
39
+ type: entry.type,
40
+ content: entry.content ?? {},
41
+ recordedAt: entry.recordedAt ?? new Date(),
42
+ familyHash: entry.familyHash ?? null,
43
+ batchId: entry.batchId,
44
+ };
45
+ await this.repo.save(fullEntry);
46
+ // Run pruning to stay within the limit
47
+ const maxEntries = this.options?.maxEntries ?? 1000;
48
+ try {
49
+ await this.repo.prune(maxEntries);
50
+ }
51
+ catch (e) {
52
+ // Ignore database errors during pruning
53
+ }
54
+ }
55
+ };
56
+ exports.TelescopeService = TelescopeService;
57
+ exports.TelescopeService = TelescopeService = __decorate([
58
+ (0, common_1.Injectable)(),
59
+ __param(1, (0, common_1.Inject)('TELESCOPE_OPTIONS')),
60
+ __param(1, (0, common_1.Optional)()),
61
+ __metadata("design:paramtypes", [telescope_repository_service_1.TelescopeRepository, Object])
62
+ ], TelescopeService);
@@ -0,0 +1,7 @@
1
+ import { Cache } from 'cache-manager';
2
+ import { TelescopeService } from '../telescope.service';
3
+ export declare class CacheWatcher {
4
+ private cacheManager;
5
+ private readonly telescope;
6
+ constructor(cacheManager: Cache, telescope: TelescopeService);
7
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CacheWatcher = void 0;
16
+ // src/watchers/cache.watcher.ts
17
+ const common_1 = require("@nestjs/common");
18
+ const cache_manager_1 = require("@nestjs/cache-manager");
19
+ const telescope_service_1 = require("../telescope.service");
20
+ const entry_type_enum_1 = require("../enums/entry-type.enum");
21
+ let CacheWatcher = class CacheWatcher {
22
+ cacheManager;
23
+ telescope;
24
+ constructor(cacheManager, telescope) {
25
+ this.cacheManager = cacheManager;
26
+ this.telescope = telescope;
27
+ // Wrap set/get/del to capture events
28
+ const originalSet = this.cacheManager.set.bind(this.cacheManager);
29
+ const originalGet = this.cacheManager.get.bind(this.cacheManager);
30
+ const originalDel = this.cacheManager.del.bind(this.cacheManager);
31
+ this.cacheManager.set = async (key, value, ttl) => {
32
+ const result = await originalSet(key, value, ttl);
33
+ this.telescope.record({
34
+ type: entry_type_enum_1.EntryType.CACHE,
35
+ content: { action: 'SET', key, value, ttl },
36
+ });
37
+ return result;
38
+ };
39
+ this.cacheManager.get = async (key) => {
40
+ const value = await originalGet(key);
41
+ this.telescope.record({
42
+ type: entry_type_enum_1.EntryType.CACHE,
43
+ content: { action: 'GET', key, value },
44
+ });
45
+ return value;
46
+ };
47
+ this.cacheManager.del = async (key) => {
48
+ const result = await originalDel(key);
49
+ this.telescope.record({
50
+ type: entry_type_enum_1.EntryType.CACHE,
51
+ content: { action: 'DEL', key },
52
+ });
53
+ return result;
54
+ };
55
+ }
56
+ };
57
+ exports.CacheWatcher = CacheWatcher;
58
+ exports.CacheWatcher = CacheWatcher = __decorate([
59
+ (0, common_1.Injectable)(),
60
+ __param(0, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)),
61
+ __metadata("design:paramtypes", [Object, telescope_service_1.TelescopeService])
62
+ ], CacheWatcher);
@@ -0,0 +1,13 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { EventEmitter2 } from '@nestjs/event-emitter';
3
+ import { TelescopeService } from '../telescope.service';
4
+ /**
5
+ * Hooks into EventEmitter2 at the 'onAny' listener level so every
6
+ * application event is captured without requiring per-event config.
7
+ */
8
+ export declare class EventWatcher implements OnModuleInit {
9
+ private readonly emitter;
10
+ private readonly telescope;
11
+ constructor(emitter: EventEmitter2, telescope: TelescopeService);
12
+ onModuleInit(): void;
13
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.EventWatcher = void 0;
13
+ // src/watchers/event.watcher.ts
14
+ const common_1 = require("@nestjs/common");
15
+ const event_emitter_1 = require("@nestjs/event-emitter");
16
+ const telescope_service_1 = require("../telescope.service");
17
+ const entry_type_enum_1 = require("../enums/entry-type.enum");
18
+ /**
19
+ * Hooks into EventEmitter2 at the 'onAny' listener level so every
20
+ * application event is captured without requiring per-event config.
21
+ */
22
+ let EventWatcher = class EventWatcher {
23
+ emitter;
24
+ telescope;
25
+ constructor(emitter, telescope) {
26
+ this.emitter = emitter;
27
+ this.telescope = telescope;
28
+ }
29
+ onModuleInit() {
30
+ this.emitter.onAny((event, payload) => {
31
+ const eventName = Array.isArray(event) ? event.join('.') : event;
32
+ // Ignore internal telescope events to avoid recursion
33
+ if (eventName.startsWith('telescope.'))
34
+ return;
35
+ this.telescope.record({
36
+ type: entry_type_enum_1.EntryType.EVENT,
37
+ content: {
38
+ event: eventName,
39
+ payload,
40
+ listeners: this.emitter.listeners(eventName).length,
41
+ },
42
+ });
43
+ });
44
+ }
45
+ };
46
+ exports.EventWatcher = EventWatcher;
47
+ exports.EventWatcher = EventWatcher = __decorate([
48
+ (0, common_1.Injectable)(),
49
+ __metadata("design:paramtypes", [event_emitter_1.EventEmitter2,
50
+ telescope_service_1.TelescopeService])
51
+ ], EventWatcher);
@@ -0,0 +1,8 @@
1
+ import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ import { TelescopeService } from '../telescope.service';
4
+ export declare class ExceptionWatcher implements NestInterceptor {
5
+ private readonly telescope;
6
+ constructor(telescope: TelescopeService);
7
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
8
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ExceptionWatcher = void 0;
13
+ // src/watchers/exception.watcher.ts
14
+ const common_1 = require("@nestjs/common");
15
+ const rxjs_1 = require("rxjs");
16
+ const operators_1 = require("rxjs/operators");
17
+ const telescope_service_1 = require("../telescope.service");
18
+ const entry_type_enum_1 = require("../enums/entry-type.enum");
19
+ let ExceptionWatcher = class ExceptionWatcher {
20
+ telescope;
21
+ constructor(telescope) {
22
+ this.telescope = telescope;
23
+ }
24
+ intercept(context, next) {
25
+ return next.handle().pipe((0, operators_1.catchError)((err) => {
26
+ // Only record if it looks like an error
27
+ this.telescope.record({
28
+ type: entry_type_enum_1.EntryType.EXCEPTION,
29
+ content: {
30
+ name: err.name || err.constructor?.name || 'Error',
31
+ message: err.message || String(err),
32
+ stack: err.stack || null,
33
+ status: err.status || err.statusCode || 500,
34
+ },
35
+ });
36
+ return (0, rxjs_1.throwError)(() => err);
37
+ }));
38
+ }
39
+ };
40
+ exports.ExceptionWatcher = ExceptionWatcher;
41
+ exports.ExceptionWatcher = ExceptionWatcher = __decorate([
42
+ (0, common_1.Injectable)(),
43
+ __metadata("design:paramtypes", [telescope_service_1.TelescopeService])
44
+ ], ExceptionWatcher);
@@ -0,0 +1,8 @@
1
+ import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ import { TelescopeService } from '../telescope.service';
4
+ export declare class HttpRequestWatcher implements NestInterceptor {
5
+ private readonly telescope;
6
+ constructor(telescope: TelescopeService);
7
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
8
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.HttpRequestWatcher = void 0;
13
+ // src/watchers/http-request.watcher.ts
14
+ const common_1 = require("@nestjs/common");
15
+ const operators_1 = require("rxjs/operators");
16
+ const telescope_service_1 = require("../telescope.service");
17
+ const entry_type_enum_1 = require("../enums/entry-type.enum");
18
+ let HttpRequestWatcher = class HttpRequestWatcher {
19
+ telescope;
20
+ constructor(telescope) {
21
+ this.telescope = telescope;
22
+ }
23
+ intercept(context, next) {
24
+ const request = context.switchToHttp().getRequest();
25
+ const start = Date.now();
26
+ const requestData = {
27
+ method: request.method,
28
+ url: request.originalUrl,
29
+ headers: request.headers,
30
+ body: request.body,
31
+ query: request.query,
32
+ ip: request.ip,
33
+ };
34
+ return next.handle().pipe((0, operators_1.tap)((responseData) => {
35
+ const duration = Date.now() - start;
36
+ const entry = {
37
+ type: entry_type_enum_1.EntryType.REQUEST,
38
+ content: {
39
+ request: requestData,
40
+ response: responseData,
41
+ duration,
42
+ },
43
+ };
44
+ this.telescope.record(entry);
45
+ }));
46
+ }
47
+ };
48
+ exports.HttpRequestWatcher = HttpRequestWatcher;
49
+ exports.HttpRequestWatcher = HttpRequestWatcher = __decorate([
50
+ (0, common_1.Injectable)(),
51
+ __metadata("design:paramtypes", [telescope_service_1.TelescopeService])
52
+ ], HttpRequestWatcher);
@@ -0,0 +1,7 @@
1
+ import { OnApplicationBootstrap } from '@nestjs/common';
2
+ import { TelescopeService } from '../telescope.service';
3
+ export declare class LogWatcher implements OnApplicationBootstrap {
4
+ private readonly telescope;
5
+ constructor(telescope: TelescopeService);
6
+ onApplicationBootstrap(): void;
7
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LogWatcher = void 0;
13
+ // src/watchers/log.watcher.ts
14
+ const common_1 = require("@nestjs/common");
15
+ const telescope_service_1 = require("../telescope.service");
16
+ const entry_type_enum_1 = require("../enums/entry-type.enum");
17
+ let LogWatcher = class LogWatcher {
18
+ telescope;
19
+ constructor(telescope) {
20
+ this.telescope = telescope;
21
+ }
22
+ onApplicationBootstrap() {
23
+ // Patch the global console to capture log calls
24
+ const originalLog = console.log.bind(console);
25
+ const originalError = console.error.bind(console);
26
+ const originalWarn = console.warn.bind(console);
27
+ const originalDebug = console.debug.bind(console);
28
+ const self = this;
29
+ console.log = function (...args) {
30
+ self.telescope.record({
31
+ type: entry_type_enum_1.EntryType.LOG,
32
+ content: { level: 'log', message: args.map(a => (typeof a === 'object' ? JSON.stringify(a) : String(a))).join(' ') },
33
+ });
34
+ return originalLog(...args);
35
+ };
36
+ console.error = function (...args) {
37
+ self.telescope.record({
38
+ type: entry_type_enum_1.EntryType.LOG,
39
+ content: { level: 'error', message: args.map(a => (typeof a === 'object' ? JSON.stringify(a) : String(a))).join(' ') },
40
+ });
41
+ return originalError(...args);
42
+ };
43
+ console.warn = function (...args) {
44
+ self.telescope.record({
45
+ type: entry_type_enum_1.EntryType.LOG,
46
+ content: { level: 'warn', message: args.map(a => (typeof a === 'object' ? JSON.stringify(a) : String(a))).join(' ') },
47
+ });
48
+ return originalWarn(...args);
49
+ };
50
+ console.debug = function (...args) {
51
+ self.telescope.record({
52
+ type: entry_type_enum_1.EntryType.LOG,
53
+ content: { level: 'debug', message: args.map(a => (typeof a === 'object' ? JSON.stringify(a) : String(a))).join(' ') },
54
+ });
55
+ return originalDebug(...args);
56
+ };
57
+ }
58
+ };
59
+ exports.LogWatcher = LogWatcher;
60
+ exports.LogWatcher = LogWatcher = __decorate([
61
+ (0, common_1.Injectable)(),
62
+ __metadata("design:paramtypes", [telescope_service_1.TelescopeService])
63
+ ], LogWatcher);
@@ -0,0 +1,12 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { TelescopeService } from '../telescope.service';
3
+ /**
4
+ * Wraps Nodemailer transport's `sendMail` method to capture outgoing e‑mails.
5
+ * The original transport is replaced with a proxy that records each call.
6
+ */
7
+ export declare class MailWatcher implements OnModuleInit {
8
+ private readonly telescope;
9
+ private originalCreateTransport;
10
+ constructor(telescope: TelescopeService);
11
+ onModuleInit(): void;
12
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.MailWatcher = void 0;
46
+ // src/watchers/mail.watcher.ts
47
+ const common_1 = require("@nestjs/common");
48
+ const nodemailer = __importStar(require("nodemailer"));
49
+ const telescope_service_1 = require("../telescope.service");
50
+ const entry_type_enum_1 = require("../enums/entry-type.enum");
51
+ /**
52
+ * Wraps Nodemailer transport's `sendMail` method to capture outgoing e‑mails.
53
+ * The original transport is replaced with a proxy that records each call.
54
+ */
55
+ let MailWatcher = class MailWatcher {
56
+ telescope;
57
+ originalCreateTransport = nodemailer.createTransport;
58
+ constructor(telescope) {
59
+ this.telescope = telescope;
60
+ }
61
+ onModuleInit() {
62
+ const self = this;
63
+ // Proxy the global createTransport function
64
+ nodemailer.createTransport = function (...args) {
65
+ const transport = self.originalCreateTransport.apply(this, args);
66
+ const originalSendMail = transport.sendMail.bind(transport);
67
+ transport.sendMail = async function (mailOptions) {
68
+ const info = await originalSendMail(mailOptions);
69
+ self.telescope.record({
70
+ type: entry_type_enum_1.EntryType.MAIL,
71
+ content: {
72
+ from: mailOptions.from,
73
+ to: mailOptions.to,
74
+ subject: mailOptions.subject,
75
+ text: mailOptions.text,
76
+ html: mailOptions.html,
77
+ messageId: info.messageId,
78
+ },
79
+ });
80
+ return info;
81
+ };
82
+ return transport;
83
+ };
84
+ }
85
+ };
86
+ exports.MailWatcher = MailWatcher;
87
+ exports.MailWatcher = MailWatcher = __decorate([
88
+ (0, common_1.Injectable)(),
89
+ __metadata("design:paramtypes", [telescope_service_1.TelescopeService])
90
+ ], MailWatcher);
@@ -0,0 +1,10 @@
1
+ import { InsertEvent, UpdateEvent, RemoveEvent } from 'typeorm';
2
+ import { TelescopeService } from '../telescope.service';
3
+ export declare class QueryWatcher {
4
+ private readonly telescope;
5
+ constructor(telescope: TelescopeService);
6
+ afterInsert(event: InsertEvent<any>): void;
7
+ afterUpdate(event: UpdateEvent<any>): void;
8
+ afterRemove(event: RemoveEvent<any>): void;
9
+ private capture;
10
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QueryWatcher = void 0;
13
+ // src/watchers/query.watcher.ts
14
+ const common_1 = require("@nestjs/common");
15
+ const typeorm_1 = require("typeorm");
16
+ const telescope_service_1 = require("../telescope.service");
17
+ const entry_type_enum_1 = require("../enums/entry-type.enum");
18
+ let QueryWatcher = class QueryWatcher {
19
+ telescope;
20
+ constructor(telescope) {
21
+ this.telescope = telescope;
22
+ }
23
+ afterInsert(event) {
24
+ this.capture(event, 'INSERT');
25
+ }
26
+ afterUpdate(event) {
27
+ this.capture(event, 'UPDATE');
28
+ }
29
+ afterRemove(event) {
30
+ this.capture(event, 'REMOVE');
31
+ }
32
+ capture(event, operation) {
33
+ const entry = {
34
+ type: entry_type_enum_1.EntryType.QUERY,
35
+ content: {
36
+ operation,
37
+ entity: event.metadata.tableName,
38
+ primaryKey: event.entity?.id || null,
39
+ data: event.entity,
40
+ query: event.query,
41
+ parameters: event.parameters,
42
+ },
43
+ };
44
+ this.telescope.record(entry);
45
+ }
46
+ };
47
+ exports.QueryWatcher = QueryWatcher;
48
+ exports.QueryWatcher = QueryWatcher = __decorate([
49
+ (0, typeorm_1.EventSubscriber)(),
50
+ (0, common_1.Injectable)(),
51
+ __metadata("design:paramtypes", [telescope_service_1.TelescopeService])
52
+ ], QueryWatcher);