nest-monitor 0.2.8 → 0.3.2

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/Readme.md ADDED
@@ -0,0 +1 @@
1
+ Это моя библиотека nest-monitor
@@ -0,0 +1 @@
1
+ export declare const AUTO_TEST_METADATA = "auto_test:metadata";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AUTO_TEST_METADATA = void 0;
4
+ exports.AUTO_TEST_METADATA = 'auto_test:metadata';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Помечает GET-эндпоинт для автоматического тестирования.
3
+ * @param path Относительный путь к эндпоинту (например, '/health')
4
+ */
5
+ export declare const AutoTest: (path: string) => MethodDecorator;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AutoTest = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const auto_test_constants_1 = require("./auto-test.constants");
6
+ /**
7
+ * Помечает GET-эндпоинт для автоматического тестирования.
8
+ * @param path Относительный путь к эндпоинту (например, '/health')
9
+ */
10
+ const AutoTest = (path) => {
11
+ return (0, common_1.SetMetadata)(auto_test_constants_1.AUTO_TEST_METADATA, {
12
+ path,
13
+ method: 'GET',
14
+ });
15
+ };
16
+ exports.AutoTest = AutoTest;
@@ -0,0 +1,10 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { DiscoveryService, Reflector } from '@nestjs/core';
3
+ import { AutoTestService } from './auto-test.service';
4
+ export declare class AutoTestModule implements OnModuleInit {
5
+ private readonly discoveryService;
6
+ private readonly autoTestService;
7
+ private readonly reflector;
8
+ constructor(discoveryService: DiscoveryService, autoTestService: AutoTestService, reflector: Reflector);
9
+ onModuleInit(): void;
10
+ }
@@ -0,0 +1,50 @@
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.AutoTestModule = void 0;
13
+ const axios_1 = require("@nestjs/axios");
14
+ const common_1 = require("@nestjs/common");
15
+ const core_1 = require("@nestjs/core");
16
+ const auto_test_constants_1 = require("./auto-test.constants");
17
+ const auto_test_service_1 = require("./auto-test.service");
18
+ let AutoTestModule = class AutoTestModule {
19
+ constructor(discoveryService, autoTestService, reflector) {
20
+ this.discoveryService = discoveryService;
21
+ this.autoTestService = autoTestService;
22
+ this.reflector = reflector;
23
+ }
24
+ onModuleInit() {
25
+ const controllers = this.discoveryService.getControllers();
26
+ for (const controller of controllers) {
27
+ const instance = controller.instance;
28
+ const prototype = Object.getPrototypeOf(instance);
29
+ const methodNames = Object.getOwnPropertyNames(prototype).filter((name) => name !== 'constructor' && typeof prototype[name] === 'function');
30
+ for (const methodName of methodNames) {
31
+ const methodRef = prototype[methodName];
32
+ const metadata = this.reflector.get(auto_test_constants_1.AUTO_TEST_METADATA, methodRef);
33
+ if (metadata && metadata.method === 'GET' && metadata.path) {
34
+ this.autoTestService.registerEndpoint(metadata, controller.metatype, methodName);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ };
40
+ exports.AutoTestModule = AutoTestModule;
41
+ exports.AutoTestModule = AutoTestModule = __decorate([
42
+ (0, common_1.Module)({
43
+ imports: [axios_1.HttpModule, core_1.DiscoveryModule],
44
+ providers: [auto_test_service_1.AutoTestService],
45
+ exports: [auto_test_service_1.AutoTestService],
46
+ }),
47
+ __metadata("design:paramtypes", [core_1.DiscoveryService,
48
+ auto_test_service_1.AutoTestService,
49
+ core_1.Reflector])
50
+ ], AutoTestModule);
@@ -0,0 +1,12 @@
1
+ import { HttpService } from '@nestjs/axios';
2
+ import { OnApplicationBootstrap } from '@nestjs/common';
3
+ import { Reflector } from '@nestjs/core';
4
+ import { IAutoTestMetadata } from '../interfaces/auto-test-metadata.interface';
5
+ export declare class AutoTestService implements OnApplicationBootstrap {
6
+ private readonly httpService;
7
+ private readonly reflector;
8
+ private endpoints;
9
+ constructor(httpService: HttpService, reflector: Reflector);
10
+ registerEndpoint(metadata: IAutoTestMetadata, controller: unknown, methodName: string): void;
11
+ onApplicationBootstrap(): Promise<void>;
12
+ }
@@ -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.AutoTestService = void 0;
13
+ const axios_1 = require("@nestjs/axios");
14
+ const common_1 = require("@nestjs/common");
15
+ const core_1 = require("@nestjs/core");
16
+ const rxjs_1 = require("rxjs");
17
+ let AutoTestService = class AutoTestService {
18
+ constructor(httpService, reflector) {
19
+ this.httpService = httpService;
20
+ this.reflector = reflector;
21
+ this.endpoints = [];
22
+ }
23
+ registerEndpoint(metadata, controller, methodName) {
24
+ this.endpoints.push({
25
+ ...metadata,
26
+ controller,
27
+ methodName,
28
+ });
29
+ }
30
+ async onApplicationBootstrap() {
31
+ if (this.endpoints.length === 0) {
32
+ console.log('[AutoTest] Нет эндпоинтов для автоматического тестирования.');
33
+ return;
34
+ }
35
+ console.log(`\n[AutoTest] Запуск автоматических тестов для ${this.endpoints.length} GET-эндпоинтов...\n`);
36
+ const host = process.env.HOST || '127.0.0.1';
37
+ const port = process.env.PORT || '3000';
38
+ const baseUrl = `http://${host}:${port}`;
39
+ for (const endpoint of this.endpoints) {
40
+ const url = `${baseUrl}${endpoint.path}`;
41
+ const start = Date.now();
42
+ try {
43
+ console.log(`[AutoTest] Тестирую: GET ${url}`);
44
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(url));
45
+ const duration = Date.now() - start;
46
+ console.log(`✅ [AutoTest] УСПЕХ: ${url} → статус ${response.status} (${duration}мс)`);
47
+ }
48
+ catch (error) {
49
+ const duration = Date.now() - start;
50
+ const status = error.response?.status || '???';
51
+ const message = error.message || 'Неизвестная ошибка';
52
+ console.error(`❌ [AutoTest] ОШИБКА: ${url} → статус ${status} (${duration}мс) — ${message}`);
53
+ }
54
+ }
55
+ console.log('[AutoTest] Автоматическое тестирование завершено.\n');
56
+ }
57
+ };
58
+ exports.AutoTestService = AutoTestService;
59
+ exports.AutoTestService = AutoTestService = __decorate([
60
+ (0, common_1.Injectable)(),
61
+ __metadata("design:paramtypes", [axios_1.HttpService,
62
+ core_1.Reflector])
63
+ ], AutoTestService);
@@ -0,0 +1 @@
1
+ export declare function Info(): MethodDecorator & ClassDecorator;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Info = Info;
4
+ const common_1 = require("@nestjs/common");
5
+ const request_logging_interceptor_1 = require("../interceptors/request-logging.interceptor");
6
+ function Info() {
7
+ return (0, common_1.UseInterceptors)(request_logging_interceptor_1.RequestLoggingInterceptor);
8
+ }
package/dist/index.d.ts CHANGED
@@ -0,0 +1,4 @@
1
+ export { Info } from './decorators/info.decorator';
2
+ export { RequestLoggingInterceptor } from './interceptors/request-logging.interceptor';
3
+ export { AutoTest } from './auto-test/auto-test.decorator';
4
+ export { AutoTestModule } from './auto-test/auto-test.module';
package/dist/index.js CHANGED
@@ -1 +1,11 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AutoTestModule = exports.AutoTest = exports.RequestLoggingInterceptor = exports.Info = void 0;
4
+ var info_decorator_1 = require("./decorators/info.decorator");
5
+ Object.defineProperty(exports, "Info", { enumerable: true, get: function () { return info_decorator_1.Info; } });
6
+ var request_logging_interceptor_1 = require("./interceptors/request-logging.interceptor");
7
+ Object.defineProperty(exports, "RequestLoggingInterceptor", { enumerable: true, get: function () { return request_logging_interceptor_1.RequestLoggingInterceptor; } });
8
+ var auto_test_decorator_1 = require("./auto-test/auto-test.decorator");
9
+ Object.defineProperty(exports, "AutoTest", { enumerable: true, get: function () { return auto_test_decorator_1.AutoTest; } });
10
+ var auto_test_module_1 = require("./auto-test/auto-test.module");
11
+ Object.defineProperty(exports, "AutoTestModule", { enumerable: true, get: function () { return auto_test_module_1.AutoTestModule; } });
@@ -0,0 +1,5 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ export declare class RequestLoggingInterceptor implements NestInterceptor {
4
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> | Promise<Observable<unknown>>;
5
+ }
@@ -0,0 +1,39 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RequestLoggingInterceptor = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const rxjs_1 = require("rxjs");
12
+ let RequestLoggingInterceptor = class RequestLoggingInterceptor {
13
+ intercept(context, next) {
14
+ const now = Date.now();
15
+ const request = context.switchToHttp().getRequest();
16
+ const userAgent = request.headers['user-agent'] || 'Unknown User Agent';
17
+ const method = request.method;
18
+ const url = request.url;
19
+ const query = request.query || 'Unknown params';
20
+ const body = request.body || 'Unknown body';
21
+ console.log(`[${method}] ${url} - Начало запроса, User-Agent: ${userAgent}`);
22
+ return next.handle().pipe((0, rxjs_1.tap)(() => {
23
+ const duration = Date.now() - now;
24
+ console.log(`[${method}] ${url} - Запрос завершен за ${duration}мс.`);
25
+ console.log('--- Метрики запроса ---');
26
+ console.log(` Метод: ${method}`);
27
+ console.log(` URL: ${url}`);
28
+ console.log(` User Agent: ${userAgent}`);
29
+ console.log(` Params: ${JSON.stringify(query)}`);
30
+ console.log(` Body: ${JSON.stringify(body)}`);
31
+ console.log(` Время выполнения: ${duration}мс`);
32
+ console.log('------------------------');
33
+ }));
34
+ }
35
+ };
36
+ exports.RequestLoggingInterceptor = RequestLoggingInterceptor;
37
+ exports.RequestLoggingInterceptor = RequestLoggingInterceptor = __decorate([
38
+ (0, common_1.Injectable)()
39
+ ], RequestLoggingInterceptor);
@@ -0,0 +1,6 @@
1
+ export interface IAutoTestMetadata {
2
+ path: string;
3
+ method: 'GET';
4
+ controller: unknown;
5
+ methodName: string;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nest-monitor",
3
3
  "type": "commonjs",
4
- "version": "0.2.8",
4
+ "version": "0.3.2",
5
5
  "description": "Библиотека для сбора метрик с высоконагруженного приложения на Nest.js",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -12,7 +12,7 @@
12
12
  "lint": "eslint \"src/**/*.ts\"",
13
13
  "lint:fix": "eslint \"src/**/*.ts\" --fix",
14
14
  "format": "prettier --write \"src/**/*.ts\"",
15
- "hook:path": "git config core.hooksPath .hooks || echo 'Not in a git repo'",
15
+ "hook:path": "git config core.hooksPath .git-hooks || echo 'Not in a git repo'",
16
16
  "version:update": "node scripts/version-updater.js",
17
17
  "version:major": "node scripts/version-updater.js major",
18
18
  "version:minor": "node scripts/version-updater.js minor",
@@ -36,6 +36,9 @@
36
36
  },
37
37
  "devDependencies": {
38
38
  "@eslint/js": "^9.37.0",
39
+ "@nestjs/axios": "^4.0.1",
40
+ "@nestjs/common": "^10.0.0",
41
+ "@nestjs/core": "^10.0.0",
39
42
  "@types/commander": "^2.12.0",
40
43
  "@types/eslint__js": "^8.42.3",
41
44
  "@types/node": "^20.10.0",
@@ -49,6 +52,7 @@
49
52
  "typescript-eslint": "^8.46.0"
50
53
  },
51
54
  "peerDependencies": {
55
+ "@nestjs/axios": "^4.0.1",
52
56
  "@nestjs/common": "^9.0.0 || ^10.0.0",
53
57
  "@nestjs/core": "^9.0.0 || ^10.0.0",
54
58
  "rxjs": "^7.8.0 || ^8.0.0"
@@ -57,5 +61,18 @@
57
61
  "dist",
58
62
  "LICENSE",
59
63
  "README.md"
60
- ]
64
+ ],
65
+ "dependencies": {
66
+ "@faker-js/faker": "^10.1.0",
67
+ "class-transformer": "^0.5.1",
68
+ "class-validator": "^0.14.3",
69
+ "lint-staged": "^16.2.7",
70
+ "typeorm": "^0.3.27"
71
+ },
72
+ "lint-staged": {
73
+ "*.{ts,tsx,js,jsx}": [
74
+ "eslint --cache --fix",
75
+ "prettier --write"
76
+ ]
77
+ }
61
78
  }